From 96face82a6f19beb186604cc3ed0ee4026931f40 Mon Sep 17 00:00:00 2001 From: hs <873121290@qq.com> Date: Fri, 5 Sep 2025 09:16:54 +0800 Subject: [PATCH] .. --- .../BaiDuMap/BaiduMapWebView.dart | 2 +- lib/customWidget/BaiDuMap/Map_page.dart | 46 +- lib/customWidget/custom_button.dart | 60 +- lib/customWidget/photo_picker_row.dart | 63 +- lib/customWidget/promise/promise_page.dart | 2 +- lib/customWidget/remote_file_page.dart | 6 +- lib/http/ApiService.dart | 1 + lib/http/HttpManager.dart | 5 +- lib/main.dart | 44 +- .../SafeCheck/check_list_page.dart | 8 +- .../SafeCheck/custom/safeCheck_table.dart | 140 +++-- .../SafeCheck/custom/safe_drawer_page.dart | 23 +- .../SafeCheck/safeCheck_detail.dart | 570 +++++++++++------- .../check_record_detail_page.dart | 1 - lib/pages/app/danger_wait_list_page.dart | 3 +- lib/pages/home/NFC/home_nfc_detail_page.dart | 2 +- .../home/NFC/nfc_check_danger_detail.dart | 8 +- .../safecheck_sign_detail.dart | 2 +- .../CheckPersonSure/check_person_detail.dart | 4 - .../safeCheck_assignment_detail_page.dart | 21 +- .../DangeCheck/safeCheck_assignment_list.dart | 2 +- .../home/SafeCheck/SafeCheckFormView.dart | 4 +- .../Start/safeCheck_defend_set_page.dart | 1 - .../Start/safeCheck_drawer_page.dart | 19 +- .../Start/safeCheck_start_detail.dart | 71 ++- .../company_safety_commitment_detail.dart | 5 +- .../safety_meeting_detail_page.dart | 1 - lib/pages/home/home_page.dart | 13 +- lib/pages/home/study/study_detail_page.dart | 340 +++++++---- lib/pages/home/study/study_my_task_page.dart | 37 +- lib/pages/home/tap/item_list_widget.dart | 91 ++- .../special_wrok/MeasuresListWidget.dart | 34 +- .../special_wrok/dangerous_options_page.dart | 4 +- .../dh_work/HotWorkDetailFormWidget.dart | 12 +- .../hotwork_safe_func_sure.dart | 3 - .../aqgl_work_detail/hotwork_aqgl_detail.dart | 1 - .../aqjd_work_detail/hotwork_aqjd_detail.dart | 1 - .../dbbz_work_detail/hotwork_dbbz_detail.dart | 1 - .../dh_work_detai/hotwork_apply_detail.dart | 35 +- .../dhsp_work_detail/hotwork_dhsp_detail.dart | 1 - .../dh_work/hotwork_list_page.dart | 192 ++++-- .../jhr_work_detail/hotwork_jhr_detail.dart | 1 - .../jsjd_work_detail/hotwork_jsjd_detail.dart | 1 - .../jszy_work_detail/hotwork_jszy_detail.dart | 1 - .../kszy_work_detail/hotwork_kszy_detail.dart | 1 - .../qtfx_work_detail/hotwork_gas_list.dart | 39 +- .../hotwork_set_safe_detail.dart | 2 - .../szdw_work_detail/hotwork_szdw_detail.dart | 1 - .../ysgd_work_detail/hotwork_ysgd_detail.dart | 3 +- .../zyfz_work_detail/hotwork_zyfz_detail.dart | 1 - .../dl_work/CutroadDetailFormWidget.dart | 4 +- .../cutroad_safe_func_sure.dart | 4 +- .../aqjd_work_detail/cutroad_aqjd_detail.dart | 1 - .../dl_work/cutroad_list_page.dart | 47 +- .../dl_work_detai/cutroad_apply_detail.dart | 24 +- .../jhr_work_detail/cutroad_jhr_detail.dart | 1 - .../jsjd_work_detail/cutroad_jsjd_detail.dart | 1 - .../jszy_work_detail/cutroad_jszy_detail.dart | 1 - .../kszy_work_detail/cutroad_kszy_detail.dart | 1 - .../shbm_work_detail/cutroad_shbm_detail.dart | 1 - .../spbm_work_detail/cutroad_spbm_detail.dart | 1 - .../cutroad_set_safe_detail.dart | 1 - .../szdw_work_detail/cutroad_szdw_detail.dart | 1 - .../ysgd_work_detail/cutroad_ysgd_detail.dart | 3 +- .../zyfz_work_detail/cutroad_zyfz_detail.dart | 1 - .../zyr_work_detail/cutroad_zyr_detail.dart | 1 - .../dt_work/BreakgroundDetailFormWidget.dart | 4 +- .../breakground_safe_func_sure.dart | 4 +- .../breakground_aqjd_detail.dart | 1 - .../dt_work/breakground_list_page.dart | 174 +++++- .../breakground_apply_detail.dart | 26 +- .../breakground_dzzh_detail.dart | 1 - .../breakground_jhr_detail.dart | 1 - .../breakground_jsjd_detail.dart | 1 - .../breakground_jszy_detail.dart | 1 - .../breakground_kszy_detail.dart | 1 - .../breakground_shbm_detail.dart | 1 - .../breakground_spbm_detail.dart | 1 - .../breakground_ssr_detail.dart | 1 - .../breakground_set_safe_detail.dart | 1 - .../breakground_szdw_detail.dart | 1 - .../breakground_ysgd_detail.dart | 3 +- .../breakground_zyfz_detail.dart | 1 - .../breakground_zyr_detail.dart | 1 - .../dz_work/HoistworkDetailFormWidget.dart | 4 +- .../hoistwork_safe_func_sure.dart | 4 +- .../hoistwork_aqjd_detail.dart | 1 - .../dz_work_detai/hoistwork_apply_detail.dart | 27 +- .../hoistwork_dzzh_detail.dart | 1 - .../dz_work/hoistwork_list_page.dart | 37 +- .../jhr_work_detail/hoistwork_jhr_detail.dart | 1 - .../hoistwork_jsjd_detail.dart | 1 - .../hoistwork_jszy_detail.dart | 1 - .../hoistwork_kszy_detail.dart | 1 - .../hoistwork_shbm_detail.dart | 1 - .../hoistwork_spbm_detail.dart | 1 - .../ssr_work_detail/hoistwork_ssr_detail.dart | 1 - .../hoistwork_set_safe_detail.dart | 1 - .../hoistwork_szdw_detail.dart | 1 - .../hoistwork_ysgd_detail.dart | 3 +- .../hoistwork_zyfz_detail.dart | 1 - .../zyr_work_detail/hoistwork_zyr_detail.dart | 1 - .../gc_work/HighWorkDetailFormWidget.dart | 4 +- .../highwork_safe_func_sure.dart | 4 +- .../highwork_aqjd_detail.dart | 1 - .../gc_work_detai/highwork_apply_detail.dart | 29 +- .../gc_work/highwork_list_page.dart | 37 +- .../jhr_work_detail/highwork_jhr_detail.dart | 1 - .../highwork_jsjd_detail.dart | 1 - .../highwork_jszy_detail.dart | 1 - .../highwork_kszy_detail.dart | 1 - .../highwork_shbm_detail.dart | 1 - .../highwork_spbm_detail.dart | 1 - .../highwork_set_safe_detail.dart | 1 - .../highwork_szdw_detail.dart | 1 - .../highwork_ysgd_detail.dart | 3 +- .../highwork_zyfz_detail.dart | 1 - .../zyr_work_detail/highwork_zyr_detail.dart | 1 - .../special_wrok/home_gas_test_page.dart | 145 ++++- .../ElectricityDetailFormWidget.dart | 6 +- .../lsyd_work/SpecialWorkFormBaseWork.dart | 3 +- .../electricity_safe_func_sure.dart | 2 - .../electricity_aqjd_detail.dart | 1 - .../electricity_dbbz_detail.dart | 1 - .../lsyd_work/electricity_list_page.dart | 31 +- .../electricity_jhr_detail.dart | 1 - .../electricity_jsjd_detail.dart | 1 - .../electricity_jszy_detail.dart | 1 - .../electricity_kszy_detail.dart | 16 +- .../electricity_apply_detail.dart | 24 +- .../electricity_psdw_detail.dart | 1 - .../electricity_gas_list.dart | 27 +- .../electricity_gas_test_page.dart | 414 ++++++++----- .../electricity_set_safe_detail.dart | 1 - .../electricity_yddw_detail.dart | 1 - .../electricity_ydr_detail.dart | 1 - .../electricity_ysgd_detail.dart | 3 +- .../electricity_zyfz_detail.dart | 1 - .../electricity_zyr_detail.dart | 1 - .../mbcd_work/BlindboardDetailFormWidget.dart | 4 +- .../blindboard_safe_func_sure.dart | 4 +- .../blindboard_aqjd_detail.dart | 1 - .../mbcd_work/blindboard_list_page.dart | 21 +- .../blindboard_cjry_detail.dart | 1 - .../blindboard_jhr_detail.dart | 1 - .../blindboard_jsjd_detail.dart | 1 - .../blindboard_jszy_detail.dart | 1 - .../blindboard_kszy_detail.dart | 1 - .../blindboard_apply_detail.dart | 27 +- .../blindboard_shbm_detail.dart | 1 - .../blindboard_spbm_detail.dart | 1 - .../blindboard_set_safe_detail.dart | 1 - .../blindboard_szdw_detail.dart | 1 - .../blindboard_ysgd_detail.dart | 3 +- .../blindboard_zyfz_detail.dart | 1 - .../blindboard_zyr_detail.dart | 1 - .../sxkj_work/SpaceWorkDetailFormWidget.dart | 6 +- .../spacework_safe_func_sure.dart | 2 - .../spacework_aqgl_detail.dart | 1 - .../spacework_aqjd_detail.dart | 1 - .../spacework_dbbz_detail.dart | 1 - .../spacework_dhsp_detail.dart | 1 - .../jhr_work_detail/spacework_jhr_detail.dart | 1 - .../spacework_jsjd_detail.dart | 1 - .../spacework_jszy_detail.dart | 1 - .../spacework_kszy_detail.dart | 1 - .../qtfx_work_detail/spacework_gas_list.dart | 36 +- .../spacework_gas_test_page.dart | 209 +++++-- .../spacework_apply_detail.dart | 20 +- .../sxkj_work/spacework_list_page.dart | 30 +- .../spacework_set_safe_detail.dart | 1 - .../spacework_szdw_detail.dart | 1 - .../spacework_ysgd_detail.dart | 3 +- .../spacework_zyfz_detail.dart | 1 - .../zyr_work_detail/spacework_zyr_detail.dart | 1 - .../special_wrok/work_area_helper.dart | 15 +- .../home/tap/tabList/work_tab_mbcd_list.dart | 3 +- lib/pages/login_page.dart | 35 +- lib/pages/mine/mine_sign_page.dart | 5 +- lib/tools/coord_convert.dart | 103 +++- lib/tools/tools.dart | 13 +- pubspec.lock | 28 +- pubspec.yaml | 3 +- 183 files changed, 2408 insertions(+), 1290 deletions(-) diff --git a/lib/customWidget/BaiDuMap/BaiduMapWebView.dart b/lib/customWidget/BaiDuMap/BaiduMapWebView.dart index 1287f44..1079e85 100644 --- a/lib/customWidget/BaiDuMap/BaiduMapWebView.dart +++ b/lib/customWidget/BaiDuMap/BaiduMapWebView.dart @@ -60,7 +60,7 @@ class BaiduMapWebView extends StatelessWidget { const SizedBox(height: 8), const Text('地图未初始化'), const SizedBox(height: 12), - ElevatedButton(onPressed: onRetry, child: const Text('重试初始化')), + CustomButton(text: '重试初始化', backgroundColor: Colors.blue, onPressed: onRetry,), ], ), ); diff --git a/lib/customWidget/BaiDuMap/Map_page.dart b/lib/customWidget/BaiDuMap/Map_page.dart index 4210252..98f0dd0 100644 --- a/lib/customWidget/BaiDuMap/Map_page.dart +++ b/lib/customWidget/BaiDuMap/Map_page.dart @@ -30,32 +30,20 @@ class _MapPageState extends State { @override void initState() { super.initState(); - _initLocation(); + _loadWebView(); } /// 获取定位(并初始化 WebView 控制器) - Future _initLocation() async { - setState(() { - _isLoading = true; - _errorMessage = null; - }); - try { - await fetchAndSaveBd09(context); - - final prefs = await SharedPreferences.getInstance(); - String latitude = prefs.getString('bd_lat') ?? ''; - String longitude = prefs.getString('bd_lon') ?? ''; - _loadWebView(LocationResult(latitude: latitude, longitude: longitude)); - - } catch (e, st) { - - final prefs = await SharedPreferences.getInstance(); - String latitude = prefs.getString('bd_lat') ?? ''; - String longitude = prefs.getString('bd_lon') ?? ''; - _loadWebView(LocationResult(latitude: latitude, longitude: longitude)); - } - } - Future _loadWebView(LocationResult loc) async { + // Future _initLocation() async { + // setState(() { + // _isLoading = true; + // _errorMessage = null; + // }); + // Map prefs = geographicCentroid(_gsonList); + // _loadWebView(LocationResult(latitude: prefs['lat'].toString(), longitude: prefs['lon'].toString())); + // + // } + Future _loadWebView() async { // 解析 gson try { final parsed = jsonDecode(widget.gson); @@ -69,11 +57,14 @@ class _MapPageState extends State { _gsonList = []; } if (!mounted) return; - + Map prefs = geographicCentroid(_gsonList); + // _loadWebView(LocationResult(latitude: prefs['lat'].toString(), longitude: prefs['lon'].toString())); setState(() { - _longitude = loc.longitudeAsDouble; - _latitude = loc.latitudeAsDouble; + _longitude = prefs['lon']; + _latitude = prefs['lat']; }); + + // 初始化 WebViewController 并加载本地页面 _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) @@ -132,6 +123,7 @@ class _MapPageState extends State { 'GSON': _gsonList, 't': DateTime.now().millisecondsSinceEpoch, }; + debugPrint('网页初始化参数: ${jsonEncode(params)}'); final jsonParams = jsonEncode(params); @@ -198,7 +190,7 @@ class _MapPageState extends State { controller: _isLoading || _errorMessage != null ? null : _controller, isLoading: _isLoading, errorMessage: _errorMessage, - onRetry: _initLocation, + onRetry: _loadWebView, ),), ); } diff --git a/lib/customWidget/custom_button.dart b/lib/customWidget/custom_button.dart index 1034012..2ca97a9 100644 --- a/lib/customWidget/custom_button.dart +++ b/lib/customWidget/custom_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -/// 自定义默认按钮(支持不可点击/禁用状态) -class CustomButton extends StatelessWidget { + +/// 自定义默认按钮(支持不可点击/禁用状态和防连点功能) +class CustomButton extends StatefulWidget { final String text; // 按钮文字 final Color backgroundColor; // 按钮背景色 final double borderRadius; // 圆角半径(默认5) @@ -20,6 +21,9 @@ class CustomButton extends StatelessWidget { /// 新增:禁用时的文字颜色(可选) final Color? disabledTextColor; + /// 新增:防连点间隔时间(毫秒) + final int debounceInterval; + const CustomButton({ super.key, required this.text, @@ -33,51 +37,75 @@ class CustomButton extends StatelessWidget { this.enabled = true, this.disabledBackgroundColor, this.disabledTextColor, + this.debounceInterval = 1000, // 默认1秒防连点 }); + @override + State createState() => _CustomButtonState(); +} + +class _CustomButtonState extends State { + // 记录最后一次点击时间 + DateTime _lastClickTime = DateTime(0); + @override Widget build(BuildContext context) { // 如果 enabled 为 false 或 onPressed 为 null,则视为不可点击 - final bool isEnabled = enabled && onPressed != null; + final bool isEnabled = widget.enabled && widget.onPressed != null; // 计算展示用背景色与文字样式 final Color bgColor = isEnabled - ? backgroundColor - : (disabledBackgroundColor ?? Colors.grey.shade400); + ? widget.backgroundColor + : (widget.disabledBackgroundColor ?? Colors.grey.shade400); TextStyle finalTextStyle; - if (textStyle != null) { + if (widget.textStyle != null) { finalTextStyle = isEnabled - ? textStyle! - : textStyle!.copyWith( - color: disabledTextColor ?? textStyle!.color?.withOpacity(0.8) ?? Colors.white70, + ? widget.textStyle! + : widget.textStyle!.copyWith( + color: widget.disabledTextColor ?? widget.textStyle!.color?.withOpacity(0.8) ?? Colors.white70, ); } else { finalTextStyle = TextStyle( - color: isEnabled ? Colors.white : (disabledTextColor ?? Colors.white70), + color: isEnabled ? Colors.white : (widget.disabledTextColor ?? Colors.white70), fontSize: 14, fontWeight: FontWeight.bold, ); } + // 处理点击事件(添加防连点逻辑) + void handleOnPressed() { + final now = DateTime.now(); + if (now.difference(_lastClickTime).inMilliseconds < widget.debounceInterval) { + // 在防连点间隔内,不执行操作 + return; + } + + _lastClickTime = now; + + if (widget.onPressed != null) { + widget.onPressed!(); + } + } + // 点击拦截器 + 视觉反馈(禁用时降低不透明度) return Opacity( opacity: isEnabled ? 1.0 : 0.65, child: AbsorbPointer( absorbing: !isEnabled, child: GestureDetector( - onTap: isEnabled ? onPressed : null, + onTap: isEnabled ? handleOnPressed : null, child: Container( - height: height ?? 45, // 默认高度45 - padding: padding ?? const EdgeInsets.all(6), // 默认内边距 - margin: margin ?? const EdgeInsets.symmetric(horizontal: 5), // 默认外边距 + height: widget.height ?? 45, // 默认高度45 + padding: widget.padding ?? const EdgeInsets.all(6), // 默认内边距 + margin: widget.margin ?? const EdgeInsets.symmetric(horizontal: 5), // 默认外边距 decoration: BoxDecoration( - borderRadius: BorderRadius.circular(borderRadius), + borderRadius: BorderRadius.circular(widget.borderRadius), color: bgColor, ), child: Center( child: Text( - text, + widget.text, style: finalTextStyle, ), ), diff --git a/lib/customWidget/photo_picker_row.dart b/lib/customWidget/photo_picker_row.dart index e67b603..c3c20f8 100644 --- a/lib/customWidget/photo_picker_row.dart +++ b/lib/customWidget/photo_picker_row.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; @@ -6,6 +7,7 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/full_screen_video_page.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:video_compress/video_compress.dart'; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; @@ -95,9 +97,7 @@ class _MediaPickerGridState extends State { } catch (e) { debugPrint('❌ 视频转码失败: $e'); if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('视频转码失败: ${e.toString()}')), - ); + ToastUtil.showNormal(context, '视频转码失败'); } return; } finally { @@ -206,9 +206,7 @@ class _MediaPickerGridState extends State { if (permission != PermissionState.authorized && permission != PermissionState.limited) { if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('请到设置中开启相册访问权限')), - ); + ToastUtil.showNormal(context, '请到设置中开启相册访问权限'); } return; } @@ -245,24 +243,41 @@ class _MediaPickerGridState extends State { } } else { - // Android: 使用 permission_handler 请求存储权限(简单处理) - final PermissionStatus current = await Permission.storage.status; - PermissionStatus status; - if (current.isGranted) { - status = PermissionStatus.granted; + // Android: 更可靠地请求权限(适配不同 Android 版本) + final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + final int sdkInt = androidInfo.version.sdkInt ?? 0; + + PermissionStatus permissionStatus = PermissionStatus.denied; + + if (sdkInt >= 33) { + // Android 13+: 使用更细粒度的媒体权限 + // 如果应用只选图片,request photos;只选视频则 request videos;若两者都可能同时需要,可请求两个。 + if (widget.mediaType == MediaType.image) { + permissionStatus = await Permission.photos.request(); // maps to READ_MEDIA_IMAGES on Android + } else if (widget.mediaType == MediaType.video) { + permissionStatus = await Permission.videos.request(); // maps to READ_MEDIA_VIDEO + } else { + // 两者皆可(同时请求会合并成单个系统对话) + final statuses = await [Permission.photos, Permission.videos].request(); + permissionStatus = statuses[Permission.photos] ?? statuses[Permission.videos] ?? PermissionStatus.denied; + } + } else if (sdkInt >= 30) { + // Android 11/12: 通常仍然使用 READ_EXTERNAL_STORAGE;若需要“全部文件访问”,要 request manageExternalStorage(慎用) + permissionStatus = await Permission.storage.request(); } else { - status = await Permission.storage.request(); + // Android 10 及以下 + permissionStatus = await Permission.storage.request(); } - debugPrint('Android storage permission: $status'); - - if (status == PermissionStatus.granted) { + // 处理结果 + if (permissionStatus.isGranted) { + // 有权限:继续打开 AssetPicker final remaining = widget.maxCount - _mediaPaths.length; final List? assets = await AssetPicker.pickAssets( context, pickerConfig: AssetPickerConfig( - requestType: - widget.mediaType == MediaType.image ? RequestType.image : RequestType.video, + requestType: widget.mediaType == MediaType.image ? RequestType.image : RequestType.video, maxAssets: remaining, gridCount: 4, ), @@ -286,19 +301,18 @@ class _MediaPickerGridState extends State { if (mounted) setState(() {}); widget.onChanged(_mediaPaths.map((p) => File(p)).toList()); } - } else if (status == PermissionStatus.permanentlyDenied) { + } else if (permissionStatus.isPermanentlyDenied) { + // 用户点了“不再询问”或系统拒绝弹窗,跳转设置页并提示 if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('请到设置中开启相册访问权限')), - ); + ToastUtil.showNormal(context, '请到设置中开启相册访问权限'); } await openAppSettings(); + return; } else { if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('相册访问权限被拒绝')), - ); + ToastUtil.showNormal(context, '相册访问权限被拒绝'); } + return; } } } catch (e, st) { @@ -326,7 +340,6 @@ class _MediaPickerGridState extends State { } return; } - try { if (widget.mediaType == MediaType.image) { XFile? picked = await _picker.pickImage(source: ImageSource.camera); diff --git a/lib/customWidget/promise/promise_page.dart b/lib/customWidget/promise/promise_page.dart index 488e0ee..e6d681a 100644 --- a/lib/customWidget/promise/promise_page.dart +++ b/lib/customWidget/promise/promise_page.dart @@ -100,7 +100,7 @@ class _PromisePageState extends State { setState(() { info['FILEPATH'] = path; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } } diff --git a/lib/customWidget/remote_file_page.dart b/lib/customWidget/remote_file_page.dart index 1446ad5..3cc8803 100644 --- a/lib/customWidget/remote_file_page.dart +++ b/lib/customWidget/remote_file_page.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:pdfx/pdfx.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:dio/dio.dart'; @@ -69,9 +70,8 @@ class _RemoteFilePageState extends State { setState(() { _isLoading = false; }); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('文件加载失败: $e')), - ); + + ToastUtil.showNormal(context, '文件加载失败: $e'); } } diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart index 4390111..e24887a 100644 --- a/lib/http/ApiService.dart +++ b/lib/http/ApiService.dart @@ -1282,6 +1282,7 @@ U6Hzm1ninpWeE+awIDAQAB static Future> safeKeyprojectCheckSubmit(Map data) { return HttpManager().request( basePath, + // 'http://192.168.0.45:28199', '/app/keyprojectcheck/add', method: Method.post, data: {...data}, diff --git a/lib/http/HttpManager.dart b/lib/http/HttpManager.dart index 08a3ac1..9d8c1fb 100644 --- a/lib/http/HttpManager.dart +++ b/lib/http/HttpManager.dart @@ -21,8 +21,8 @@ enum Method { get, post, put, delete } class HttpManager { HttpManager._internal() { _dio = Dio(BaseOptions( - connectTimeout: const Duration(milliseconds: 10000), - receiveTimeout: const Duration(milliseconds: 10000), + connectTimeout: const Duration(milliseconds: 20000), + receiveTimeout: const Duration(milliseconds: 20000), headers: { 'Content-Type': Headers.formUrlEncodedContentType, }, @@ -96,7 +96,6 @@ class HttpManager { ); try { - print("======>$data"); switch (method) { case Method.get: resp = await _dio.get(url, diff --git a/lib/main.dart b/lib/main.dart index 20b4fa9..5f32e5b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,9 +36,9 @@ class GlobalMessage { /// 全局 helper:在弹窗前取消焦点并尽量隐藏键盘,避免弹窗后键盘自动弹起 Future showDialogAfterUnfocus( - BuildContext context, - Widget dialog, -) async { + BuildContext context, + Widget dialog, + ) async { // 取消焦点并尝试隐藏键盘 FocusScope.of(context).unfocus(); try { @@ -96,7 +96,7 @@ void main() async { await prefs.remove('token'); navigatorKey.currentState?.pushNamedAndRemoveUntil( '/login', - (route) => false, + (route) => false, ); Future.delayed(const Duration(milliseconds: 100), () { @@ -136,9 +136,9 @@ class MyApp extends StatelessWidget { GlobalWidgetsLocalizations.delegate, // 如果使用了其他本地化包,请添加对应的 delegate ], - supportedLocales: [ - const Locale('zh', 'CN'), // 中文 - const Locale('en', 'US'), // 英文(备用) + supportedLocales: const [ + Locale('zh', 'CN'), // 中文 + Locale('en', 'US'), // 英文(备用) ], locale: const Locale('zh', 'CN'), // 强制使用中文 @@ -146,19 +146,27 @@ class MyApp extends StatelessWidget { // 在路由变化时统一取消焦点(防止 push/pop 时焦点回到 TextField) navigatorObservers: [KeyboardUnfocusNavigatorObserver(), routeObserver], builder: (context, child) { + // 使用 EasyLoading.init,同时在其内部把 textScaleFactor 固定为 1.0 return EasyLoading.init( builder: (context, widget) { - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - // 全局点击空白处取消焦点(隐藏键盘) - try { - FocusManager.instance.primaryFocus?.unfocus(); - } catch (e) { - debugPrint('NavigatorObserver unfocus error: $e'); - } - }, - child: widget, + // 拿到当前 MediaQuery 并创建一个 textScaleFactor = 1.0 的副本 + final mq = MediaQuery.maybeOf(context) ?? MediaQueryData.fromWindow(WidgetsBinding.instance.window); + final fixed = mq.copyWith(textScaleFactor: 1.0); + + return MediaQuery( + data: fixed, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + // 全局点击空白处取消焦点(隐藏键盘) + try { + FocusManager.instance.primaryFocus?.unfocus(); + } catch (e) { + debugPrint('NavigatorObserver unfocus error: $e'); + } + }, + child: widget, + ), ); }, )(context, child); diff --git a/lib/pages/KeyProjects/SafeCheck/check_list_page.dart b/lib/pages/KeyProjects/SafeCheck/check_list_page.dart index cd1681b..a2e1e2b 100644 --- a/lib/pages/KeyProjects/SafeCheck/check_list_page.dart +++ b/lib/pages/KeyProjects/SafeCheck/check_list_page.dart @@ -90,7 +90,8 @@ class _CheckListPageState extends State { } void _goToDetail(Map item) async { - pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: item['KEYPROJECTCHECK_ID'], isEdit: false,), context); + await pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: item['KEYPROJECTCHECK_ID'], isEdit: false,), context); + _fetchData(); } Widget _buildListItem(Map item) { @@ -199,8 +200,9 @@ class _CheckListPageState extends State { return Scaffold( key: _scaffoldKey, appBar: MyAppbar(title: '安全检查记录', actions: [ - TextButton(onPressed: () { - pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: '', isEdit: true,), context); + TextButton(onPressed: () async { + await pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: '', isEdit: true,), context); + _fetchData(); }, child: Text('发起', style: TextStyle(color: Colors.white, fontSize: 16),)) ],), diff --git a/lib/pages/KeyProjects/SafeCheck/custom/safeCheck_table.dart b/lib/pages/KeyProjects/SafeCheck/custom/safeCheck_table.dart index 55f1319..2330ec1 100644 --- a/lib/pages/KeyProjects/SafeCheck/custom/safeCheck_table.dart +++ b/lib/pages/KeyProjects/SafeCheck/custom/safeCheck_table.dart @@ -11,9 +11,9 @@ Widget HiddenListTable({ required void Function(Map item, int index) removeHidden, required BuildContext context, }) { - Widget _buildCell(String text, {bool isHeader = false, Alignment alignment = Alignment.center, double minWidth = 50}) { + Widget _buildCell(String text, {bool isHeader = false, Alignment alignment = Alignment.center, double minWidth = 40}) { return Container( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 5), alignment: alignment, child: ConstrainedBox( constraints: BoxConstraints(minWidth: minWidth), @@ -29,7 +29,6 @@ Widget HiddenListTable({ ); } - // 仍保留 Table 的 header 用法(用于有数据时) TableRow _buildHeader() { return TableRow( decoration: BoxDecoration(color: Colors.grey.shade200), @@ -59,38 +58,41 @@ Widget HiddenListTable({ _buildCell(descr), Padding( padding: const EdgeInsets.symmetric(vertical: 6), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IconButton( - icon: const Icon(Icons.info_outline, size: 22, color: Colors.blue), - onPressed: () => showHidden(item, index), - tooltip: '查看', - padding: EdgeInsets.zero, - constraints: const BoxConstraints(), - ), - if (forbidEdit) // 注意:原逻辑保留,如需反向请改为 if (!forbidEdit) + child: Align( + alignment: Alignment.center, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ IconButton( - icon: const Icon(Icons.delete_outline, size: 22, color: Colors.red), - onPressed: () => removeHidden(item, index), - tooltip: '删除', - padding: EdgeInsets.zero, - constraints: const BoxConstraints(), + icon: const Icon(Icons.info_outline, size: 20, color: Colors.blue,), + onPressed: () => showHidden(item, index), + padding: const EdgeInsets.all(4), + constraints: const BoxConstraints(minWidth: 24, minHeight: 24), + visualDensity: VisualDensity.compact, ), - ], + if (forbidEdit) + IconButton( + icon: const Icon(Icons.delete_outline, size: 20, color: Colors.red,), + onPressed: () => removeHidden(item, index), + padding: const EdgeInsets.all(4), + constraints: const BoxConstraints(minWidth: 24, minHeight: 24), + visualDensity: VisualDensity.compact, + ), + ], + ), ), ), + ], ); } - // 当 hiddenList 为空时,单独渲染表头(使用 Row + Expanded 来模仿 Table 的列宽) Widget _buildHeaderRowWidget() { return Container( decoration: BoxDecoration(color: Colors.grey.shade200), child: Row( children: [ - Expanded(flex: 2, child: _buildCell('序号', isHeader: true, alignment: Alignment.center)), + Expanded(flex: 1, child: _buildCell('序号', isHeader: true, alignment: Alignment.center)), Expanded(flex: 3, child: _buildCell('隐患部位', isHeader: true)), Expanded(flex: 3, child: _buildCell('隐患描述', isHeader: true)), Expanded(flex: 3, child: _buildCell('操作', isHeader: true, alignment: Alignment.center)), @@ -99,58 +101,64 @@ Widget HiddenListTable({ ); } - final tableWidth = MediaQuery.of(context).size.width - 50; + // 用 LayoutBuilder 安全获取可用宽度(避免直接依赖 MediaQuery.of(context) 的 null 问题) + return LayoutBuilder(builder: (ctx, constraints) { + // 优先使用父级给出的约束宽度,否则退回到可选的 MediaQuery,再 fallback 一个合理值 + final double availableWidth = (constraints.maxWidth != double.infinity && constraints.maxWidth > 0) + ? constraints.maxWidth + : ((MediaQuery.maybeOf(ctx)?.size.width ?? 400.0)); + final tableWidth = (availableWidth - 20).clamp(200.0, double.infinity); + + if (hiddenList.isEmpty) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox( + width: tableWidth, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildHeaderRowWidget(), + Container( + height: 56, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), + ), + ), + alignment: Alignment.center, + child: Text( + '暂无数据', + style: TextStyle(fontSize: 14, color: Colors.black54), + ), + ), + ], + ), + ), + ); + } - // 如果没有数据,返回“表头 + 跨列居中显示暂无数据”的布局 - if (hiddenList.isEmpty) { return SingleChildScrollView( scrollDirection: Axis.horizontal, child: SizedBox( width: tableWidth, - child: Column( - mainAxisSize: MainAxisSize.min, + child: Table( + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + columnWidths: const { + 0: FlexColumnWidth(1), + 1: FlexColumnWidth(3), + 2: FlexColumnWidth(3), + 3: FlexColumnWidth(3), + }, + border: TableBorder.symmetric( + inside: BorderSide(color: Colors.grey.shade300, width: 0.5), + ), + // 把 map 转成 List 更明确、避免惰性展开可能的问题 children: [ - _buildHeaderRowWidget(), - Container( - height: 56, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide(color: Colors.grey.shade300, width: 0.5), - ), - ), - alignment: Alignment.center, - child: Text( - '暂无数据', - style: TextStyle(fontSize: 14, color: Colors.black54), - ), - ), + _buildHeader(), + ...hiddenList.asMap().entries.map((e) => _buildRow(e.value, e.key)).toList(), ], ), ), ); - } - - // 否则,使用原来的 Table 渲染有数据的行 - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: SizedBox( - width: tableWidth, - child: Table( - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - columnWidths: const { - 0: FlexColumnWidth(2), // 序号 - 1: FlexColumnWidth(3), // 隐患部位 - 2: FlexColumnWidth(3), // 隐患描述 - 3: FlexColumnWidth(3), // 操作按钮 - }, - border: TableBorder.symmetric( - inside: BorderSide(color: Colors.grey.shade300, width: 0.5), - ), - children: [ - _buildHeader(), - ...hiddenList.asMap().entries.map((e) => _buildRow(e.value, e.key)), - ], - ), - ), - ); + }); } diff --git a/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart b/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart index 149f2f3..5b128df 100644 --- a/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart +++ b/lib/pages/KeyProjects/SafeCheck/custom/safe_drawer_page.dart @@ -2,21 +2,14 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/bottom_picker.dart'; -import 'package:qhd_prevention/customWidget/bottom_picker_two.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; -import 'package:qhd_prevention/customWidget/date_picker_dialog.dart'; -import 'package:qhd_prevention/customWidget/department_person_picker.dart'; import 'package:qhd_prevention/customWidget/department_picker_hidden_type.dart'; -import 'package:qhd_prevention/customWidget/department_picker_two.dart'; -import 'package:qhd_prevention/customWidget/full_screen_video_page.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; -import 'package:qhd_prevention/customWidget/video_player_widget.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; import 'package:qhd_prevention/tools/tools.dart'; import '../../../../customWidget/photo_picker_row.dart'; @@ -428,18 +421,14 @@ class _SafeDrawerPageState extends State { Future _pickHazardLevel() async { if (_hazardLevels.isEmpty) return ToastUtil.showNormal(context, '隐患级别数据为空'); - final choice = await BottomPickerTwo.show( + final found = await BottomPicker.show( context, items: _hazardLevels, itemBuilder: (i) => Text(i['NAME'], textAlign: TextAlign.center), initialIndex: 0, ); - FocusHelper.clearFocus(context); - if (choice == null) return; - final found = _hazardLevels.firstWhere( - (e) => e['NAME'] == choice, - orElse: () => null, - ); + //FocusHelper.clearFocus(context); + if (found != null) { setState(() { hiddenForm['HIDDENLEVEL'] = found['BIANMA'] ?? found['id'] ?? ''; @@ -503,7 +492,7 @@ class _SafeDrawerPageState extends State { hiddenForm['RECTIFICATIONDEPT'] = target?['UNITS_ID'] ?? ''; _getUnitPerson(); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -537,7 +526,7 @@ class _SafeDrawerPageState extends State { orElse: () => {}, ); hiddenForm['RECTIFICATIONOR'] = target?['PERSONNELMANAGEMENT_ID']; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -549,7 +538,7 @@ class _SafeDrawerPageState extends State { final selectData = DateFormat('yyyy-MM-dd HH:mm').format(picked); hiddenForm['RECTIFICATIONDEADLINE'] = selectData; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } } diff --git a/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart b/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart index 94ed40a..ee20230 100644 --- a/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart +++ b/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -169,7 +170,9 @@ class _SafecheckDetailState extends State { Future _getData() async { try { - final result = await ApiService.getSafeCheckGoEdit(widget.KEYPROJECTCHECK_ID); + final result = await ApiService.getSafeCheckGoEdit( + widget.KEYPROJECTCHECK_ID, + ); // 在 await 之后检查 mounted,避免页面已经被 pop 导致 setState 报错 if (!mounted) return; setState(() { @@ -228,15 +231,19 @@ class _SafecheckDetailState extends State { } try { - final toUnitListData = await ApiService.getSafeCheckToUnitList(widget.OUTSOURCED_ID); + final toUnitListData = await ApiService.getSafeCheckToUnitList( + widget.OUTSOURCED_ID, + ); if (!mounted) return; setState(() { toCheckUnitList = toUnitListData['varList'] ?? []; // 仅在没有选择时自动回填 - if (!FormUtils.hasValue(form, 'UNITS_NAME') && toCheckUnitList.isNotEmpty) { + if (!FormUtils.hasValue(form, 'UNITS_NAME') && + toCheckUnitList.isNotEmpty) { form['UNITS_NAME'] = toCheckUnitList.first['UNITS_NAME']; } - if (!FormUtils.hasValue(form, 'UNITS_ID') && toCheckUnitList.isNotEmpty) { + if (!FormUtils.hasValue(form, 'UNITS_ID') && + toCheckUnitList.isNotEmpty) { form['UNITS_ID'] = toCheckUnitList.first['UNITS_ID']; } }); @@ -266,7 +273,7 @@ class _SafecheckDetailState extends State { form['PERSONNELMANAGEMENT_ID'] = data['PERSONNELMANAGEMENT_ID']; form['INSPECTED_SITEUSER_INDEX'] = personList.indexOf(data); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -285,7 +292,7 @@ class _SafecheckDetailState extends State { final data = FormUtils.findMapForKeyValue(typeList, 'name', choice); form['INSPECTION_TYPE'] = data['id']; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -412,7 +419,6 @@ class _SafecheckDetailState extends State { Future _submit() async { if (!widget.isEdit) { Navigator.of(context).pop(); - return; } bool required = true; @@ -537,11 +543,17 @@ class _SafecheckDetailState extends State { 'INSPECTION_USER_NAME': loginUser['NAME'] ?? '', }); } + // 使用 Expando 标记已访问对象,防止循环引用 + final seen = Expando(); + final sanitized = _sanitizeForJson(origHiddenList, seen); + // 如果 sanitized 为 null(极少见),退回到空列表 + final safeForJson = sanitized ?? []; + String HIDDENJSON = jsonEncode(safeForJson); // 准备 form 字段(JSON 字符串等) form['INSPECTORJSON'] = jsonEncode(inspectors); form['SITUATIONJSON'] = jsonEncode(situations); - form['HIDDENJSON'] = jsonEncode(origHiddenList); + form['HIDDENJSON'] = HIDDENJSON; form['delInspectors'] = delInspectors.join(','); form['delSituations'] = delSituations.join(','); form['delHiddens'] = delHiddens.join(','); @@ -549,15 +561,11 @@ class _SafecheckDetailState extends State { form['CREATOR'] = loginUser['USER_ID'] ?? loginUserId; form['CORPINFO_ID'] = SessionService.instance.corpinfoId ?? ''; form['ACTION_USER'] = loginUser['NAME'] ?? ''; - LoadingDialogHelper.show(); // 显示 loading // 提交主表 try { - final requestData = { - 'CORPINFO_ID': form['CORPINFO_ID'], - ...form, - }; - final res = await ApiService.safeKeyprojectCheckSubmit(requestData); + LoadingDialogHelper.show(); + final res = await ApiService.safeKeyprojectCheckSubmit(form); // 如果你的 ApiService 返回结构不同,请按实际调整判断 if (res != null && res['result'] == 'success') { final pd = res['pd'] ?? {}; @@ -613,6 +621,63 @@ class _SafecheckDetailState extends State { } } + // Helper: 将任意结构"净化"成可 JSON 序列化的形式(打断循环、替换 File 等) + dynamic _sanitizeForJson(dynamic value, Expando seen) { + // 常量直接返回 + if (value == null || value is num || value is bool || value is String) + return value; + + // 防止循环引用:如果已经访问过,直接返回 null 或一个占位符 + try { + if (seen[value] == true) { + // 已访问 -> 打断循环。返回 null 也可以改为返回字符串 "(circular)" + return null; + } + } catch (_) { + // 某些原始类型可能不能作为 Expando key ——忽略 + } + + // 标记为已访问(仅对引用类型有意义) + try { + seen[value] = true; + } catch (_) {} + + // 特殊类型处理 + if (value is File) { + return value.path; // 或者 path 的 basename: p.basename(value.path) + } + if (value is DateTime) return value.toIso8601String(); + if (value is Uri) return value.toString(); + + // Map -> 递归处理键值(键转成字符串) + if (value is Map) { + final out = {}; + for (final entry in value.entries) { + final k = entry.key?.toString() ?? ''; + final v = _sanitizeForJson(entry.value, seen); + if (v != null) out[k] = v; + } + return out; + } + + // List/Iterable -> 递归处理元素,过滤 null + if (value is Iterable) { + final listOut = []; + for (final e in value) { + final s = _sanitizeForJson(e, seen); + if (s != null) listOut.add(s); + } + return listOut; + } + + // 其他不可直接序列化的对象:尝试用 toString() 作为备选(或返回 null) + try { + return value.toString(); + } catch (_) { + return null; + } + } + // ========== 上传附件的方法 ========== Future uploadHiddenFiles( List>> hiddenFilesPerHidden, @@ -695,235 +760,272 @@ class _SafecheckDetailState extends State { body: SafeArea( child: Padding( padding: EdgeInsets.symmetric(horizontal: 12, vertical: 12), - child: form.isNotEmpty ? ListView( - children: [ - Column( - children: [ - ItemListWidget.itemContainer( - horizontal: 0, - Column( - children: [ - ListItemFactory.createYesNoSection( - title: '检查题目:', - groupValue: chooseTitleType, - yesLabel: '安全', - noLabel: '综合', - isEdit: widget.isEdit, - isRequired: true, - horizontalPadding: 5, - verticalPadding: 0, - text: form['INSPECTION_CATEGORY'] ?? '', - onChanged: (val) { - setState(() { - chooseTitleType = val; - form['INSPECTION_CATEGORY'] = - val == true ? '安全' : '综合'; - }); - }, - ), - const Divider(), - ItemListWidget.singleLineTitleText( - label: '被检查单位:', - isEditable: false, - text: form['UNITS_NAME'], - onChanged: (val) { - setState(() { - form['UNITS_NAME'] = val; - }); - }, - ), - const Divider(), - - ItemListWidget.selectableLineTitleTextRightButton( - label: '被检查单位现场负责人:', - isEditable: widget.isEdit, - onTap: () { - _choosePerson(); - }, - text: form['PERSON_NAME'] ?? '', - ), - const Divider(), - - ItemListWidget.singleLineTitleText( - label: '检查场所:', - isEditable: widget.isEdit, - text: form['INSPECTION_PLACE'], - hintText: '请输入检查场所', - onChanged: (val) { - setState(() { - form['INSPECTION_PLACE'] = val; - }); - }, - ), - const Divider(), - - ItemListWidget.selectableLineTitleTextRightButton( - label: '检查类型:', - onTap: () { - _chooseType(); - }, - isEditable: widget.isEdit, - text: form['INSPECTION_TYPE_NAME'] ?? '', - ), - const Divider(), - - ItemListWidget.selectableLineTitleTextRightButton( - label: '检查开始时间:', - isEditable: widget.isEdit, - text: form['INSPECTION_TIME_START'] ?? '', - onTap: () async { - DateTime? picked = - await BottomDateTimePicker.showDate(context,mode: BottomPickerMode.dateTimeWithSeconds,); - if (picked != null) { - setState(() { - form['INSPECTION_TIME_START'] = DateFormat( - 'yyyy-MM-dd HH:mm', - ).format(picked); - }); - FocusHelper.clearFocus(context); - } - }, - ), - const Divider(), - - ItemListWidget.selectableLineTitleTextRightButton( - label: '检查结束时间:', - isEditable: widget.isEdit, - text: form['INSPECTION_TIME_END'] ?? '', - onTap: () async { - DateTime? picked = - await BottomDateTimePicker.showDate(context,mode: BottomPickerMode.dateTimeWithSeconds,); - if (picked != null) { - setState(() { - form['INSPECTION_TIME_END'] = DateFormat( - 'yyyy-MM-dd HH:mm', - ).format(picked); - }); - FocusHelper.clearFocus(context); - } - }, - ), - - const Divider(), - MultiTextFieldWithTitle( - label: "检查情况", - // 更合适的标题 - isEditable: widget.isEdit, - // 使用父组件的编辑状态 - hintText: "请输入检查情况...", - texts: multiTexts, - onTextsChanged: (texts) { - setState(() { - multiTexts = texts; // 保存到状态变量 - form['situationList'] = _stringsToSituationList( - texts, - ); - }); - }, - ), - - const Divider(), - ItemListWidget.multiLineTitleTextField( - label: '检查人员', - text: form['INSPECTION_USERS'] ?? '', - isEditable: widget.isEdit, - onChanged: (val) { - setState(() { - form['INSPECTION_USERS'] = val; - }); - }, - ), - const Divider(), - ItemListWidget.itemContainer( - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ListItemFactory.headerTitle('发现问题'), - if (widget.isEdit) - CustomButton( - text: " 添加 ", - height: 30, - padding: const EdgeInsets.symmetric( - vertical: 2, - horizontal: 5, - ), - backgroundColor: Colors.blue, - onPressed: () { - _openDrawer(form, -1); // 添加括号和 await - FocusHelper.clearFocus(context); + child: + form.isNotEmpty + ? ListView( + children: [ + Column( + children: [ + ItemListWidget.itemContainer( + horizontal: 0, + Column( + children: [ + ListItemFactory.createYesNoSection( + title: '检查题目:', + groupValue: chooseTitleType, + yesLabel: '安全', + noLabel: '综合', + isEdit: widget.isEdit, + isRequired: true, + horizontalPadding: 5, + verticalPadding: 0, + text: form['INSPECTION_CATEGORY'] ?? '', + onChanged: (val) { + setState(() { + chooseTitleType = val; + form['INSPECTION_CATEGORY'] = + val == true ? '安全' : '综合'; + }); }, ), - ], - ), - ), - HiddenListTable( - hiddenList: form['hiddenList'] ?? [], - forbidEdit: widget.isEdit, - baseImgPath: ApiService.baseImgPath, - personSignImg: form['PERSON_SIGN_IMG'] ?? '', - personSignTime: form['PERSON_SIGN_TIME'] ?? '', - showHidden: (item, idx) { - _openDrawer(item, idx); - }, - removeHidden: (item, idx) { - /* 删除逻辑 */ - }, - context: context, - ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '被检查单位:', + isEditable: false, + text: form['UNITS_NAME'], + onChanged: (val) { + setState(() { + form['UNITS_NAME'] = val; + }); + }, + ), + const Divider(), - if (!widget.isEdit) - Column(children: [ - const Divider(), - ItemListWidget.twoRowTitleAndImages( - title: '签字', - onTapCallBack: (p) { - presentOpaque(SingleImageViewer(imageUrl: p), context); - }, - imageUrls: [ - '${form['PERSON_SIGN_IMG'] ?? ''}', + ItemListWidget.selectableLineTitleTextRightButton( + label: '被检查单位现场负责人:', + isEditable: widget.isEdit, + onTap: () { + _choosePerson(); + }, + text: form['PERSON_NAME'] ?? '', + ), + const Divider(), + + ItemListWidget.singleLineTitleText( + label: '检查场所:', + isEditable: widget.isEdit, + text: form['INSPECTION_PLACE'], + hintText: '请输入检查场所', + onChanged: (val) { + setState(() { + form['INSPECTION_PLACE'] = val; + }); + }, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '检查类型:', + onTap: () { + _chooseType(); + }, + isEditable: widget.isEdit, + text: form['INSPECTION_TYPE_NAME'] ?? '', + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '检查开始时间:', + isEditable: widget.isEdit, + text: form['INSPECTION_TIME_START'] ?? '', + onTap: () async { + DateTime? picked = + await BottomDateTimePicker.showDate( + context, + mode: + BottomPickerMode + .dateTime, + ); + if (picked != null) { + setState(() { + form['INSPECTION_TIME_START'] = + DateFormat( + 'yyyy-MM-dd HH:mm', + ).format(picked); + /// 开始时间必须早于结束时间 + if (FormUtils.hasValue(form, 'INSPECTION_TIME_END') && + !isBeforeStr( + form['INSPECTION_TIME_START'], + form['INSPECTION_TIME_END'], + )) { + form['INSPECTION_TIME_END'] = ''; + } + }); + //FocusHelper.clearFocus(context); + } + }, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '检查结束时间:', + isEditable: widget.isEdit, + text: form['INSPECTION_TIME_END'] ?? '', + onTap: () async { + DateTime? picked = + await BottomDateTimePicker.showDate( + context, + minTimeStr: form['INSPECTION_TIME_START'] ?? '', + mode: + BottomPickerMode + .dateTime, + ); + if (picked != null) { + setState(() { + form['INSPECTION_TIME_END'] = + DateFormat( + 'yyyy-MM-dd HH:mm', + ).format(picked); + + }); + //FocusHelper.clearFocus(context); + } + }, + ), + const Divider(), + MultiTextFieldWithTitle( + label: "检查情况", + // 更合适的标题 + isEditable: widget.isEdit, + // 使用父组件的编辑状态 + hintText: "请输入检查情况...", + texts: multiTexts, + onTextsChanged: (texts) { + setState(() { + multiTexts = texts; // 保存到状态变量 + form['situationList'] = + _stringsToSituationList(texts); + }); + }, + ), + + const Divider(), + ItemListWidget.multiLineTitleTextField( + label: '检查人员', + text: form['INSPECTION_USERS'] ?? '', + isEditable: widget.isEdit, + onChanged: (val) { + setState(() { + form['INSPECTION_USERS'] = val; + }); + }, + ), + const Divider(), + ItemListWidget.itemContainer( + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.headerTitle('发现问题'), + if (widget.isEdit) + CustomButton( + text: " 添加 ", + height: 30, + padding: const EdgeInsets.symmetric( + vertical: 2, + horizontal: 5, + ), + backgroundColor: Colors.blue, + onPressed: () { + _openDrawer( + {}, + -1, + ); // 添加括号和 await + //FocusHelper.clearFocus(context); + }, + ), + ], + ), + ), + HiddenListTable( + hiddenList: form['hiddenList'] ?? [], + forbidEdit: widget.isEdit, + baseImgPath: ApiService.baseImgPath, + personSignImg: form['PERSON_SIGN_IMG'] ?? '', + personSignTime: + form['PERSON_SIGN_TIME'] ?? '', + showHidden: (item, idx) { + _openDrawer(item, idx); + }, + removeHidden: (item, idx) { + /* 删除逻辑 */ + }, + context: context, + ), + + if (!widget.isEdit) + Column( + children: [ + const Divider(), + ItemListWidget.twoRowTitleAndImages( + title: '签字', + onTapCallBack: (p) { + presentOpaque( + SingleImageViewer(imageUrl: p), + context, + ); + }, + imageUrls: [ + '${form['PERSON_SIGN_IMG'] ?? ''}', + ], + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '签字时间', + isEditable: false, + text: form['PERSON_SIGN_TIME'] ?? '', + ), + ], + ), ], ), - const Divider(), - ItemListWidget.singleLineTitleText(label: '签字时间', isEditable: false, text: form['PERSON_SIGN_TIME'] ?? '') - ],) - ], - ), - ), - SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (widget.isEdit) - SizedBox( - width: 150, - child: CustomButton( - text: '返回', - textStyle: TextStyle( - color: Colors.white, - fontSize: 17, - ), - backgroundColor: Colors.black38, - onPressed: () => Navigator.pop(context), ), - ), - SizedBox( - width: 150, - child: CustomButton( - text: widget.isEdit ? '提交' : '返回', - textStyle: TextStyle( - color: Colors.white, - fontSize: 17, + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (widget.isEdit) + SizedBox( + width: 150, + child: CustomButton( + text: '返回', + textStyle: TextStyle( + color: Colors.white, + fontSize: 17, + ), + backgroundColor: Colors.black38, + onPressed: () => Navigator.pop(context), + ), + ), + SizedBox( + width: 150, + child: CustomButton( + text: widget.isEdit ? '提交' : '返回', + textStyle: TextStyle( + color: Colors.white, + fontSize: 17, + ), + backgroundColor: Colors.blue, + onPressed: _submit, + ), + ), + ], ), - backgroundColor: Colors.blue, - onPressed: _submit, - ), + ], ), ], - ), - ], - ), - ], - ): SizedBox(), + ) + : SizedBox(), ), ), ); diff --git a/lib/pages/app/Danger_paicha/check_record_detail_page.dart b/lib/pages/app/Danger_paicha/check_record_detail_page.dart index 6ca0c69..9625115 100644 --- a/lib/pages/app/Danger_paicha/check_record_detail_page.dart +++ b/lib/pages/app/Danger_paicha/check_record_detail_page.dart @@ -61,7 +61,6 @@ class _CheckRecordDetailPageState extends State { super.initState(); // 启动时并行请求,UI 使用 setState 更新 _fetchAll(); - _initLocation(); } @override void dispose() { diff --git a/lib/pages/app/danger_wait_list_page.dart b/lib/pages/app/danger_wait_list_page.dart index c5a4b05..952d4f4 100644 --- a/lib/pages/app/danger_wait_list_page.dart +++ b/lib/pages/app/danger_wait_list_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/app/pending_rectification_detail_page.dart'; import 'package:qhd_prevention/pages/home/work/custom_driver_drawer.dart'; import 'package:qhd_prevention/pages/home/risk/risk_detail_page.dart'; @@ -467,7 +468,7 @@ class _DangerWaitListPageState extends State { } void _showMessage(String msg) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg))); + ToastUtil.showNormal(context, msg); } diff --git a/lib/pages/home/NFC/home_nfc_detail_page.dart b/lib/pages/home/NFC/home_nfc_detail_page.dart index cdd829f..f0f83d9 100644 --- a/lib/pages/home/NFC/home_nfc_detail_page.dart +++ b/lib/pages/home/NFC/home_nfc_detail_page.dart @@ -125,7 +125,7 @@ class _HomeNfcDetailPageState extends State { void _showMessage(String msg) { if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg))); + ToastUtil.showNormal(context, msg); } Future _startCheckItem(Map item, int index) async { diff --git a/lib/pages/home/NFC/nfc_check_danger_detail.dart b/lib/pages/home/NFC/nfc_check_danger_detail.dart index 69c861a..c82b6a1 100644 --- a/lib/pages/home/NFC/nfc_check_danger_detail.dart +++ b/lib/pages/home/NFC/nfc_check_danger_detail.dart @@ -139,7 +139,7 @@ class _NfcCheckDangerDetailState extends State { pd['HIDDENTYPE'] = ids; pd['HIDDENTYPE_NAME'] = names.join('/'); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } catch (_) {} }, ), @@ -198,7 +198,7 @@ class _NfcCheckDangerDetailState extends State { pd['RECTIFICATIONDEPT'] = id; pd['RECTIFICATIONDEPTNAME'] = name; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); _getPersonListForUnitId(typeStr); }, ), @@ -214,7 +214,7 @@ class _NfcCheckDangerDetailState extends State { result['userList'] as List, ); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } /// 弹出人员选择,需先选择单位 @@ -233,7 +233,7 @@ class _NfcCheckDangerDetailState extends State { pd['RECTIFICATIONOR'] = userId; pd['RECTIFICATIONORNAME'] = name; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, ).then((_) {}); } diff --git a/lib/pages/home/SafeCheck/CheckPersonSign/safecheck_sign_detail.dart b/lib/pages/home/SafeCheck/CheckPersonSign/safecheck_sign_detail.dart index 816e50e..e9e566e 100644 --- a/lib/pages/home/SafeCheck/CheckPersonSign/safecheck_sign_detail.dart +++ b/lib/pages/home/SafeCheck/CheckPersonSign/safecheck_sign_detail.dart @@ -286,7 +286,7 @@ setState(() { signImages.add(path); signTimes.add(now); inspectedForm['INSPECTED_SITEUSER_SIGN_TIME'] = now; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart b/lib/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart index a20fe11..f7f7057 100644 --- a/lib/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart +++ b/lib/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart @@ -206,8 +206,6 @@ class _CheckPersonDetailState extends State { ToastUtil.showNormal(context, '请求失败:${e.toString()}'); } - - } // ========== 罚单提交方法 @@ -271,7 +269,6 @@ setState(() { signTimes = []; signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -369,7 +366,6 @@ setState(() { }); }, ), - if (inspectorForm['INSPECTION_STATUS'] == '-1') Column( children: [ const Divider(), diff --git a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart index 95ef6bc..caaacbe 100644 --- a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart +++ b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart @@ -33,7 +33,7 @@ class SafecheckAssignmentDetailPage extends StatefulWidget { class _SafecheckAssignmentDetailPageState extends State { - late bool _isEdit = false; + late bool _isEdit = widget.HIDDEN_ID == '-2'; late Map form = {}; late List files = []; late List hiddenVideo = []; @@ -57,9 +57,8 @@ class _SafecheckAssignmentDetailPageState void initState() { // TODO: implement initState super.initState(); - if (widget.HIDDEN_ID == '-2') { - _isEdit = true; - } + _isEdit = widget.HIDDEN_STATUS == '-2'; + WidgetsBinding.instance.addPostFrameCallback((_) { _getData(); }); @@ -79,6 +78,7 @@ class _SafecheckAssignmentDetailPageState .map((item) => '${ApiService.baseImgPath}${item['FILEPATH']}') .toList(); files = data['hImgs']; + }); } } @@ -97,7 +97,7 @@ class _SafecheckAssignmentDetailPageState form['RECTIFICATIONDEPT'] = id; form['RECTIFICATIONDEPTNAME'] = name; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); _getPersonListForUnitId(typeStr); }, ), @@ -113,7 +113,7 @@ class _SafecheckAssignmentDetailPageState result['userList'] as List, ); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } /// 弹出人员选择,需先选择单位 @@ -132,7 +132,7 @@ class _SafecheckAssignmentDetailPageState form['RECTIFICATIONOR'] = userId; form['RECTIFICATIONORNAME'] = name; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, ).then((_) {}); } @@ -154,14 +154,9 @@ class _SafecheckAssignmentDetailPageState } } Map data = { - 'HIDDEN_ID': form['HIDDEN_ID'], - 'HIDDENLEVEL': form['HIDDENLEVEL'], - 'RECTIFICATIONDEPT': form['RECTIFICATIONDEPT'], - 'RECTIFICATIONDEADLINE': form['RECTIFICATIONDEADLINE'], - 'RECTIFICATIONOR': form['RECTIFICATIONOR'], + ...form, 'HIDDEN_STATUS': widget.HIDDEN_STATUS, 'INSPECTION_ID': widget.INSPECTION_ID, - 'HIDDENDESCR': form['HIDDENDESCR'], }; try { LoadingDialogHelper.show(); diff --git a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_list.dart b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_list.dart index ab84848..553a20f 100644 --- a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_list.dart +++ b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_list.dart @@ -342,7 +342,7 @@ class _SafecheckAssignmentListState extends State { ), ), - body: SafeArea(child: Expanded(child: _buildListContent()),), + body: SafeArea(child: _buildListContent(),), ); } } diff --git a/lib/pages/home/SafeCheck/SafeCheckFormView.dart b/lib/pages/home/SafeCheck/SafeCheckFormView.dart index 8b8f472..0355d2d 100644 --- a/lib/pages/home/SafeCheck/SafeCheckFormView.dart +++ b/lib/pages/home/SafeCheck/SafeCheckFormView.dart @@ -98,11 +98,11 @@ class _SafeCheckFormViewState extends State { const Divider(), ItemListWidget.OneRowImageTitle( label: '检查人签字', - text: item['INSPECTION_USER_SIGN_TIME'], + text: item['INSPECTION_USER_SIGN_TIME'] ?? '', onTapCallBack: (path) { presentOpaque(SingleImageViewer(imageUrl: path), context); }, - imgPath: item['INSPECTION_USER_SIGN_IMG'], + imgPath: item['INSPECTION_USER_SIGN_IMG'] ?? '', ), ], ); diff --git a/lib/pages/home/SafeCheck/Start/safeCheck_defend_set_page.dart b/lib/pages/home/SafeCheck/Start/safeCheck_defend_set_page.dart index cb181bb..5504813 100644 --- a/lib/pages/home/SafeCheck/Start/safeCheck_defend_set_page.dart +++ b/lib/pages/home/SafeCheck/Start/safeCheck_defend_set_page.dart @@ -72,7 +72,6 @@ setState(() { signTimes = []; signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart b/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart index d2cd89d..30e4b7b 100644 --- a/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart +++ b/lib/pages/home/SafeCheck/Start/safeCheck_drawer_page.dart @@ -173,25 +173,28 @@ class _SafeCheckDrawerPageState extends State { hiddenForm['CREATTIME'] = DateFormat('yyyy-MM-dd HH:mm').format(picked); }); } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } /// 隐患发现人 Future _pickDangerPerson() async { + List inspectorList = hiddenForm['inspectorList']; final choice = await BottomPicker.show( context, - items: [SessionService.instance.username as String], + items: inspectorList.map((val) => val['INSPECTION_USER_NAME'] as String).toList(), itemBuilder: (item) => Text(item, textAlign: TextAlign.center), initialIndex: 0, ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); if (choice != null) { setState(() { hiddenForm['CREATOR_INDEX'] = 0; - hiddenForm['CREATOR'] = SessionService.instance.loginUserId; - hiddenForm['CREATOR_NAME'] = SessionService.instance.username; + final data = FormUtils.findMapForKeyValue(inspectorList, 'INSPECTION_USER_NAME', choice); + hiddenForm['CREATOR'] = data['INSPECTION_USER_ID']; + + hiddenForm['CREATOR_NAME'] = choice; }); } } @@ -376,7 +379,7 @@ class _SafeCheckDrawerPageState extends State { itemBuilder: (i) => Text(i['NAME'], textAlign: TextAlign.center), initialIndex: 0, ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); if (choice == null) return; final found = _hazardLevels.firstWhere( (e) => e['NAME'] == choice, @@ -395,7 +398,7 @@ class _SafeCheckDrawerPageState extends State { } }); } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } Future _pickHazardType() async { @@ -416,7 +419,7 @@ class _SafeCheckDrawerPageState extends State { hiddenForm['HIDDENTYPE_NAME'] = names.join('/'); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } catch (_) {} }, diff --git a/lib/pages/home/SafeCheck/Start/safeCheck_start_detail.dart b/lib/pages/home/SafeCheck/Start/safeCheck_start_detail.dart index cb486dd..3da0c63 100644 --- a/lib/pages/home/SafeCheck/Start/safeCheck_start_detail.dart +++ b/lib/pages/home/SafeCheck/Start/safeCheck_start_detail.dart @@ -191,13 +191,25 @@ class _SafecheckStartDetailState extends State { final data = FormUtils.findMapForKeyValue(typeList, 'name', choice); form['INSPECTION_TYPE'] = data['id']; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } Future _openDrawer(Map hiddenForm, int index) async { try { + if (hiddenForm.length == 0) { + hiddenForm = { + 'ISRELEVANT': '2', + 'SOURCE': '5', + 'hiddenImgs': >[], + 'zgImgs': >[], + 'hiddenVideos': >[], + 'RECTIFICATIONTYPE': '2', + 'inspectorList': form['inspectorList'], + + }; + } final result = await openCustomDrawer( context, SafeCheckDrawerPage( @@ -600,7 +612,6 @@ class _SafecheckStartDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -792,7 +803,7 @@ class _SafecheckStartDetailState extends State { hiddenList.removeAt(index); form['hiddenList'] = hiddenList; }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } } @@ -814,9 +825,11 @@ class _SafecheckStartDetailState extends State { final int index = int.parse(typeStr); inspectorList[index]['INSPECTION_DEPARTMENT_NAME'] = name; inspectorList[index]['INSPECTION_DEPARTMENT_ID'] = id; + form['inspectorList'] = inspectorList; + } }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); _getPersonListForUnitId(typeStr); }, ), @@ -837,7 +850,7 @@ class _SafecheckStartDetailState extends State { result['userList'] as List, ); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } /// 弹出人员选择,需先选择单位 @@ -863,9 +876,10 @@ class _SafecheckStartDetailState extends State { item['INSPECTION_USER_INDEX'] = '$index'; item['INSPECTION_USER_NAME'] = name; item['INSPECTION_USER_ID'] = userId; + form['inspectorList'] = inspectorList; } }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, ).then((_) {}); } @@ -1032,7 +1046,7 @@ class _SafecheckStartDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), @@ -1053,7 +1067,7 @@ class _SafecheckStartDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), @@ -1138,7 +1152,7 @@ class _SafecheckStartDetailState extends State { backgroundColor: Colors.blue, onPressed: () { _openDrawer({}, -1); // 添加括号和 await - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, ), ], @@ -1210,7 +1224,9 @@ class _SafecheckStartDetailState extends State { isRequired: false, hintText: '检查人意见', onChanged: (val) { - form['INSPECTION_USER_OPINION'] = val; + setState(() { + form['INSPECTION_USER_OPINION'] = val; + }); }, text: form['INSPECTION_USER_OPINION'] ?? '', ), @@ -1218,22 +1234,27 @@ class _SafecheckStartDetailState extends State { .toString() .isNotEmpty && _isEdit) - ItemListWidget.itemContainer( - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ListItemFactory.headerTitle('签字'), - CustomButton( - text: '手写签字', - height: 36, - backgroundColor: Colors.green, - onPressed: () { - _sign(); - }, + Column( + children: [ + const Divider(), + ItemListWidget.itemContainer( + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.headerTitle('签字'), + CustomButton( + text: '手写签字', + height: 36, + backgroundColor: Colors.green, + onPressed: () { + _sign(); + }, + ), + ], ), - ], - ), - ), + ), + ], + ) ], ), if (signImages.isNotEmpty) _signListWidget(), diff --git a/lib/pages/home/SafetyCommitment/company_safety_commitment_detail.dart b/lib/pages/home/SafetyCommitment/company_safety_commitment_detail.dart index 8c2521c..2af6bc8 100644 --- a/lib/pages/home/SafetyCommitment/company_safety_commitment_detail.dart +++ b/lib/pages/home/SafetyCommitment/company_safety_commitment_detail.dart @@ -5,6 +5,7 @@ import 'package:http/http.dart' as http; import 'package:photo_view/photo_view.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/tools/tools.dart'; @@ -49,9 +50,7 @@ class _CompanySafetyCommitmentDetailState extends State isLoading = false); } diff --git a/lib/pages/home/Safetymeeting/safety_meeting_detail_page.dart b/lib/pages/home/Safetymeeting/safety_meeting_detail_page.dart index 4a71da6..81ab899 100644 --- a/lib/pages/home/Safetymeeting/safety_meeting_detail_page.dart +++ b/lib/pages/home/Safetymeeting/safety_meeting_detail_page.dart @@ -312,7 +312,6 @@ class _SafetyMeetingDetailPageState extends State { setState(() { signImages.add(path); // signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 6ab5033..364e79d 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -185,14 +185,13 @@ class HomePageState extends State { void initState() { super.initState(); // 使用初始化加载:先恢复缓存(若存在则直接显示),然后再发起网络请求(成功则覆盖缓存) - _initialLoad(); BadgeManager().initAllModules(); + _initialLoad(); } /// 首次加载:先恢复缓存(如果有),然后在后台去刷新(只有当无缓存时才显示 loading) Future _initialLoad() async { - /// 清单列表 final data = await ApiService.getListData(); if (data['result'] == 'success') { @@ -239,11 +238,11 @@ class HomePageState extends State { return; } - await _loadHiddenCache(); + _loadHiddenCache(); // 拉取其他数据 + 隐患列表(当 hiddenList 为空时显示 loading,否则不显示) - await _fetchData(); - await _fetchHiddenList(showLoading: hiddenList.isEmpty); - await fetchAndSaveBd09(context); + _fetchData(); + _fetchHiddenList(showLoading: hiddenList.isEmpty); + fetchAndSaveBd09(context); } @@ -706,7 +705,9 @@ class HomePageState extends State { return GestureDetector( onTap: () async { if (index == 1) { + LoadingDialogHelper.show(); bool isRest= await _getIsRest(); + LoadingDialogHelper.hide(); if(isRest){ ToastUtil.showNormal(context, "您已经处于离岗状态中"); return; diff --git a/lib/pages/home/study/study_detail_page.dart b/lib/pages/home/study/study_detail_page.dart index c67ecd7..fd0003b 100644 --- a/lib/pages/home/study/study_detail_page.dart +++ b/lib/pages/home/study/study_detail_page.dart @@ -1,7 +1,9 @@ + import 'dart:async'; import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:qhd_prevention/customWidget/remote_file_page.dart'; import 'package:qhd_prevention/pages/home/study/take_exam_page.dart'; import 'package:qhd_prevention/pages/home/study/study_practise_page.dart'; @@ -54,7 +56,10 @@ class _StudyDetailPageState extends State // 上报控制相关字段 bool _endReported = false; // 确保最终结束上报只执行一次 Future? _ongoingSubmit; // 用于串行化提交请求 - final int _uploadIntervalSeconds = 1; // 周期性上报间隔(秒) + final int _uploadIntervalSeconds = 5; // 周期性上报间隔(秒) + + // 新增:防止并发加载视频 + bool _isLoadingVideo = false; @override void initState() { @@ -74,7 +79,7 @@ class _StudyDetailPageState extends State _tabController.dispose(); WakelockPlus.disable(); - // 最佳努力:让未完成的提交完成(非阻塞) + // 让未完成的提交完成(非阻塞) if (_ongoingSubmit != null) { _ongoingSubmit!.whenComplete(() {}); } @@ -95,7 +100,8 @@ class _StudyDetailPageState extends State final ok = await CustomAlertDialog.showConfirm( context, title: '温馨提示', - content: '重要提醒:尊敬的用户,根据规定我们会在您学习过程中多次进行人脸识别认证,为了保护您的隐私请您在摄像设备视野内确保衣冠整齐。', + content: + '重要提醒:尊敬的用户,根据规定我们会在您学习过程中多次进行人脸识别认证,为了保护您的隐私请您在摄像设备视野内确保衣冠整齐。', cancelText: '取消', confirmText: '同意并继续', ); @@ -156,16 +162,32 @@ class _StudyDetailPageState extends State } Future _onVideoTap( - Map data, - bool hasNodes, - int fi, - int ni, - ) async { + Map data, + bool hasNodes, + int fi, + int ni, + ) async { + if (_isLoadingVideo) { + debugPrint('_onVideoTap ignored because a video is loading'); + return; + } + // 后端清除人脸计时 await ApiService.fnClearUserFaceTime(); _faceTimer?.cancel(); + + // 如果当前有视频播放且有未上报的进度,先做一次快照上报(避免丢失) if (_currentVideoData != null && _lastReported > Duration.zero) { - await _submitPlayTime(end: false, seconds: _lastReported.inSeconds); + final prevSnapshot = { + 'VIDEOCOURSEWARE_ID': _currentVideoData?['VIDEOCOURSEWARE_ID'] ?? '', + 'CURRICULUM_ID': _currentVideoData?['CURRICULUM_ID'] ?? '', + 'CHAPTER_ID': _currentVideoData?['CHAPTER_ID'] ?? '', + 'VIDEOTIME': _currentVideoData?['VIDEOTIME'] ?? 0, + 'IS_NODE': _hasNodes, + 'FIRST_INDEX': _currentFirstIndex, + 'NODE_INDEX': _currentNodeIndex, + }; + await _submitPlayTime(snapshot: prevSnapshot, end: false, seconds: _lastReported.inSeconds); } _lastReported = Duration.zero; @@ -174,14 +196,20 @@ class _StudyDetailPageState extends State _currentFirstIndex = fi; _currentNodeIndex = ni; - // 暂停已有播放器 - _videoController?.pause(); + // 暂停已有播放器(安全) + try { + if (_videoController != null && _videoController!.value.isPlaying) { + await _videoController!.pause(); + } + } catch (_) {} await _navigateFaceIfNeeded(() async { if ((data['IS_VIDEO'] ?? 0) == 1) { // 文档 if (data['VIDEOFILES'] != null) { - _videoController?.pause(); + try { + await _videoController?.pause(); + } catch (_) {} await pushPage( RemoteFilePage( fileUrl: ApiService.baseImgPath + data['VIDEOFILES'], @@ -189,10 +217,17 @@ class _StudyDetailPageState extends State ), context, ); - await _submitPlayTime( - end: true, - seconds: int.parse(data['VIDEOTIME'] ?? '0'), - ); + // 对文档直接上报完整时长(用 data 做快照) + final docSnapshot = { + 'VIDEOCOURSEWARE_ID': data['VIDEOCOURSEWARE_ID'] ?? '', + 'CURRICULUM_ID': data['CURRICULUM_ID'] ?? '', + 'CHAPTER_ID': data['CHAPTER_ID'] ?? '', + 'VIDEOTIME': data['VIDEOTIME'] ?? 0, + 'IS_NODE': hasNodes, + 'FIRST_INDEX': fi, + 'NODE_INDEX': ni, + }; + await _submitPlayTime(snapshot: docSnapshot, end: true, seconds: int.parse('${data['VIDEOTIME'] ?? '0'}')); } else { ScaffoldMessenger.of( context, @@ -213,10 +248,15 @@ class _StudyDetailPageState extends State LoadingDialogHelper.hide(); final pd_data = resData['pd']; if (FormUtils.hasValue(pd_data, 'USERAVATARURL')) { + // 先退出可能的全屏并锁定为竖屏,避免横屏导致人脸页面布局错乱 + await _exitTopRouteAndWait(); + await _lockPortrait(); final passed = await pushPage( FaceRecognitionPage(studentId: widget.studentId, mode: FaceMode.auto), context, ); + await _restoreDefaultOrientations(); + if (passed == true) { await ApiService.fnSetUserFaceTime(_faceTime); await onPass(); @@ -231,12 +271,14 @@ class _StudyDetailPageState extends State cancelText: '取消', ); if (ok) { + await _exitTopRouteAndWait(); + await _lockPortrait(); await pushPage( const FaceRecognitionPage(studentId: '', mode: FaceMode.manual), context, ); + await _restoreDefaultOrientations(); } - } } else { await onPass(); @@ -244,53 +286,79 @@ class _StudyDetailPageState extends State } Future _getVideoPlayInfo(String vidId) async { - final res = await ApiService.fnGetVideoPlayInfo(vidId); - final url = res['videoList']?[0]?['playURL'] ?? ''; - _videoCoverUrl = res['videoBase']?['coverURL'] ?? ''; + if (_isLoadingVideo) { + debugPrint('_getVideoPlayInfo blocked: already loading a video'); + return; + } + _isLoadingVideo = true; - final prog = await ApiService.fnGetVideoPlayProgress( - vidId, - _currentVideoData!['CURRICULUM_ID'], - _classId, - widget.studentId, - ); - - final raw = prog['pd']?['RESOURCETIME']; - final seen = - (() { - if (raw == null) return 0; - // 如果本身就是数字 - if (raw is num) return raw.toInt(); - // 否则转成字符串再 parse - final s = raw.toString(); - return (double.tryParse(s) ?? 0.0).toInt(); - })(); - - // 先销毁旧 controller try { - _videoController?.removeListener(_onTimeUpdate); - } catch (_) {} - try { - _videoController?.dispose(); - } catch (_) {} - _videoController = null; + final res = await ApiService.fnGetVideoPlayInfo(vidId); + final url = res['videoList']?[0]?['playURL'] ?? ''; + _videoCoverUrl = res['videoBase']?['coverURL'] ?? ''; - // 创建新 controller - _videoController = VideoPlayerController.networkUrl(Uri.parse(url)); - await _videoController!.initialize(); + final prog = await ApiService.fnGetVideoPlayProgress( + vidId, + _currentVideoData?['CURRICULUM_ID'], + _classId, + widget.studentId, + ); - // 新增:为新视频重置上报相关标志 - _endReported = false; - _lastReported = Duration.zero; - _ongoingSubmit = null; + final raw = prog['pd']?['RESOURCETIME']; + final seen = + (() { + if (raw == null) return 0; + // 如果本身就是数字 + if (raw is num) return raw.toInt(); + // 否则转成字符串再 parse + final s = raw.toString(); + return (double.tryParse(s) ?? 0.0).toInt(); + })(); - setState(() {}); + // 先销毁旧 controller(安全顺序:removeListener -> pause -> dispose -> null) + if (_videoController != null) { + try { + _videoController!.removeListener(_onTimeUpdate); + } catch (_) {} + try { + if (_videoController!.value.isPlaying) { + await _videoController!.pause(); + } + } catch (_) {} + try { + await _videoController!.dispose(); + } catch (_) {} + _videoController = null; + } - // 直接从上次播放点 seek,并立即播放 - _videoController! - ..seekTo(Duration(seconds: seen)) - ..play() - ..addListener(_onTimeUpdate); + // 创建新 controller + _videoController = VideoPlayerController.networkUrl(Uri.parse(url)); + await _videoController!.initialize(); + + // 新增:为新视频重置上报相关标志 + _endReported = false; + _lastReported = Duration.zero; + _ongoingSubmit = null; + + if (mounted) setState(() {}); + + // 直接从上次播放点 seek,并立即播放 + try { + await _videoController!.seekTo(Duration(seconds: seen)); + await _videoController!.play(); + // 移除(防止重复)后再添加 + try { + _videoController!.removeListener(_onTimeUpdate); + } catch (_) {} + _videoController!.addListener(_onTimeUpdate); + } catch (e, st) { + debugPrint('Error during play/seek/addListener: $e\n$st'); + } + } catch (e, st) { + debugPrint('_getVideoPlayInfo error: $e\n$st'); + } finally { + _isLoadingVideo = false; + } } // 改进版本的 _onTimeUpdate,包含周期性上报 + 接近结束时的最终上报 @@ -306,15 +374,27 @@ class _StudyDetailPageState extends State final secondsSinceLast = (pos - _lastReported).inSeconds; if (secondsSinceLast >= _uploadIntervalSeconds && !_endReported) { _lastReported = pos; + + // 创建快照:避免 _currentVideoData 后续被替换影响上报 + final snapshot = { + 'VIDEOCOURSEWARE_ID': _currentVideoData?['VIDEOCOURSEWARE_ID'] ?? '', + 'CURRICULUM_ID': _currentVideoData?['CURRICULUM_ID'] ?? '', + 'CHAPTER_ID': _currentVideoData?['CHAPTER_ID'] ?? '', + 'VIDEOTIME': _currentVideoData?['VIDEOTIME'] ?? 0, + 'IS_NODE': _hasNodes, + 'FIRST_INDEX': _currentFirstIndex, + 'NODE_INDEX': _currentNodeIndex, + }; + // 串行上报:通过 _ongoingSubmit 链式调用来保证顺序 _ongoingSubmit = (_ongoingSubmit ?? Future.value()) .then((_) { - return _submitPlayTime(end: false, seconds: pos.inSeconds); - }) + return _submitPlayTime(snapshot: snapshot, end: false, seconds: pos.inSeconds); + }) .whenComplete(() { - // 完成后清理引用 - _ongoingSubmit = null; - }); + // 完成后清理引用 + _ongoingSubmit = null; + }); } // 接近结束的检测,容差 800ms,触发一次最终结束上报 @@ -324,15 +404,26 @@ class _StudyDetailPageState extends State if (endedOrClose && !_endReported) { _endReported = true; final finalSeconds = (dur.inMilliseconds / 1000.0).ceil(); + + final snapshot = { + 'VIDEOCOURSEWARE_ID': _currentVideoData?['VIDEOCOURSEWARE_ID'] ?? '', + 'CURRICULUM_ID': _currentVideoData?['CURRICULUM_ID'] ?? '', + 'CHAPTER_ID': _currentVideoData?['CHAPTER_ID'] ?? '', + 'VIDEOTIME': _currentVideoData?['VIDEOTIME'] ?? 0, + 'IS_NODE': _hasNodes, + 'FIRST_INDEX': _currentFirstIndex, + 'NODE_INDEX': _currentNodeIndex, + }; + _ongoingSubmit = (_ongoingSubmit ?? Future.value()) .then((_) async { - await _submitPlayTime(end: true, seconds: finalSeconds); - }) + await _submitPlayTime(snapshot: snapshot, end: true, seconds: finalSeconds); + }) .whenComplete(() { - _ongoingSubmit = null; - // 最终上报完成后尝试退出顶层 route(退出全屏) - _exitTopRouteIfPresent(); - }); + _ongoingSubmit = null; + // 最终上报完成后尝试退出顶层 route(退出全屏) + _exitTopRouteIfPresent(); + }); ApiService.fnClearUserFaceTime(); _faceTimer?.cancel(); @@ -341,18 +432,20 @@ class _StudyDetailPageState extends State } Future _submitPlayTime({ + required Map snapshot, required bool end, required int seconds, }) async { - if (_currentVideoData == null) return; + // snapshot 中应该包含 VIDEOCOURSEWARE_ID, CURRICULUM_ID, CHAPTER_ID, VIDEOTIME, ... + if (snapshot['VIDEOCOURSEWARE_ID'] == null || snapshot['VIDEOCOURSEWARE_ID'] == '') return; // 如果已经上报结束并且当前不是结束上报,则跳过非结束上报 if (_endReported && !end) return; Map data = { - 'VIDEOCOURSEWARE_ID': _currentVideoData!['VIDEOCOURSEWARE_ID'] ?? '', - 'CURRICULUM_ID': _currentVideoData!['CURRICULUM_ID'] ?? '', - 'CHAPTER_ID': _currentVideoData!['CHAPTER_ID'] ?? '', + 'VIDEOCOURSEWARE_ID': snapshot['VIDEOCOURSEWARE_ID'] ?? '', + 'CURRICULUM_ID': snapshot['CURRICULUM_ID'] ?? '', + 'CHAPTER_ID': snapshot['CHAPTER_ID'] ?? '', 'RESOURCETIME': seconds, 'IS_END': end ? '1' : '0', 'CLASS_ID': _classId, @@ -372,31 +465,40 @@ class _StudyDetailPageState extends State // 解析后端返回的 RESOURCETIME(可能是数字或字符串) final resTraw = pd['RESOURCETIME']; final resT = - (resTraw is num) - ? resTraw.toDouble() - : double.tryParse('$resTraw') ?? seconds.toDouble(); + (resTraw is num) + ? resTraw.toDouble() + : double.tryParse('$resTraw') ?? seconds.toDouble(); - // 从当前视频数据中安全解析 videoTime - final videoTimeRaw = _currentVideoData!['VIDEOTIME']; + final videoTimeRaw = snapshot['VIDEOTIME']; final videoTime = - (videoTimeRaw is String) - ? double.tryParse(videoTimeRaw) ?? 1.0 - : (videoTimeRaw is num ? videoTimeRaw.toDouble() : 1.0); + (videoTimeRaw is String) + ? double.tryParse(videoTimeRaw) ?? 1.0 + : (videoTimeRaw is num ? videoTimeRaw.toDouble() : 1.0); final comp = pd['PLAYCOUNT'] != null && pd['PLAYCOUNT'] > 0; final pctDouble = - comp ? 100.0 : ((resT / (videoTime > 0 ? videoTime : 1.0)) * 100.0); + comp ? 100.0 : ((resT / (videoTime > 0 ? videoTime : 1.0)) * 100.0); final pct = (pctDouble.clamp(0.00, 100.00) * 100).round() / 100; final str = '${pct}%'; if (mounted) { setState(() { - if (_hasNodes) { - _videoList[_currentFirstIndex]['nodes'][_currentNodeIndex]['percent'] = - str; + if (snapshot['IS_NODE'] == true) { + final fi = snapshot['FIRST_INDEX'] as int? ?? _currentFirstIndex; + final ni = snapshot['NODE_INDEX'] as int? ?? _currentNodeIndex; + // 保护性检查,避免索引越界 + if (fi >= 0 && fi < _videoList.length) { + final nodes = _videoList[fi]['nodes'] as List?; + if (nodes != null && ni >= 0 && ni < nodes.length) { + _videoList[fi]['nodes'][ni]['percent'] = str; + } + } } else { - _videoList[_currentFirstIndex]['percent'] = str; + final fi = snapshot['FIRST_INDEX'] as int? ?? _currentFirstIndex; + if (fi >= 0 && fi < _videoList.length) { + _videoList[fi]['percent'] = str; + } } }); } @@ -458,7 +560,7 @@ class _StudyDetailPageState extends State 'POST_ID': pd['POST_ID'] ?? '', 'STUDENT_ID': widget.studentId, 'STRENGTHEN_PAPER_QUESTION_ID': - paper['STAGEEXAMPAPERINPUT_ID'] ?? '', + paper['STAGEEXAMPAPERINPUT_ID'] ?? '', ...data, }, examType: TakeExamType.video_study, @@ -484,6 +586,26 @@ class _StudyDetailPageState extends State } } + /// 退出顶部路由并短暂等待(用于退出全屏播放器等) + Future _exitTopRouteAndWait({int waitMs = 300}) async { + _exitTopRouteIfPresent(); + await Future.delayed(Duration(milliseconds: waitMs)); + } + + /// 锁定为竖屏 + Future _lockPortrait() async { + await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + } + + /// 恢复允许横竖(你可以按需修改恢复策略) + Future _restoreDefaultOrientations() async { + await SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); + } + void _startFaceTimer() { _faceTimer = Timer.periodic(Duration(seconds: _faceTime), (_) async { final res = await ApiService.fnGetUserFaceTime(); @@ -505,11 +627,17 @@ class _StudyDetailPageState extends State _faceTimer?.cancel(); _faceTimer = null; + // 退出横屏/全屏并锁定竖屏,然后 push 人脸识别页面 + await _exitTopRouteAndWait(); + await _lockPortrait(); + final passed = await pushPage( FaceRecognitionPage(studentId: widget.studentId, mode: FaceMode.auto), context, ); + await _restoreDefaultOrientations(); + if (passed == true) { await ApiService.fnSetUserFaceTime(_faceTime); // 认证通过后 —— 恢复播放、重新添加 listener,并更新上报基准 @@ -555,22 +683,19 @@ class _StudyDetailPageState extends State _videoController = null; } _faceTimer?.cancel(); - setState(() { - }); + setState(() {}); } } - Widget _buildVideoOrCover(double containerW, double containerH) { final c = _videoController; if (c != null && c.value.isInitialized) { return VideoPlayerWidget( allowSeek: false, controller: _videoController, - coverUrl: - _videoCoverUrl.isNotEmpty - ? ApiService.baseImgPath + _videoCoverUrl - : ApiService.baseImgPath + (_info?['COVERPATH'] ?? ''), + coverUrl: _videoCoverUrl.isNotEmpty + ? ApiService.baseImgPath + _videoCoverUrl + : ApiService.baseImgPath + (_info?['COVERPATH'] ?? ''), aspectRatio: _videoController?.value.aspectRatio ?? 16 / 9, ); } else { @@ -652,7 +777,7 @@ class _StudyDetailPageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ ...nodes.asMap().entries.map( - (e) => _buildVideoItem( + (e) => _buildVideoItem( item, e.value as Map, true, @@ -671,12 +796,12 @@ class _StudyDetailPageState extends State } Widget _buildVideoItem( - Map item, - Map m, - bool hasNodes, - int fi, - int ni, - ) { + Map item, + Map m, + bool hasNodes, + int fi, + int ni, + ) { return Container( color: Colors.white, padding: const EdgeInsets.all(20), @@ -730,13 +855,12 @@ class _StudyDetailPageState extends State ], SizedBox(width: 20), CustomButton( - onPressed: - () => pushPage( - StudyPractisePage( - videoCoursewareId: m['VIDEOCOURSEWARE_ID'], - ), - context, - ), + onPressed: () => pushPage( + StudyPractisePage( + videoCoursewareId: m['VIDEOCOURSEWARE_ID'], + ), + context, + ), text: "课后练习", backgroundColor: Colors.blue, height: 30, diff --git a/lib/pages/home/study/study_my_task_page.dart b/lib/pages/home/study/study_my_task_page.dart index 8a0ff18..e4091fb 100644 --- a/lib/pages/home/study/study_my_task_page.dart +++ b/lib/pages/home/study/study_my_task_page.dart @@ -190,13 +190,42 @@ class _StudyMyTaskPageState extends State with RouteAware { await _uploadSignAndNavigate(item, imagePath); } } + Future _getImageBase64WithHeader(String imagePath) async { + final File file = File(imagePath); + final List bytes = await file.readAsBytes(); + final String base64Data = base64Encode(bytes); + // 根据文件扩展名确定MIME类型 + final extension = imagePath.split('.').last.toLowerCase(); + + String header; + switch (extension) { + case 'jpg': + case 'jpeg': + header = 'data:image/jpeg;base64,'; + break; + case 'png': + header = 'data:image/png;base64,'; + break; + case 'gif': + header = 'data:image/gif;base64,'; + break; + case 'webp': + header = 'data:image/webp;base64,'; + break; + case 'svg': + header = 'data:image/svg+xml;base64,'; + break; + default: + // 对于未知类型,使用通用的二进制数据头 + header = 'data:application/octet-stream;base64,'; + } + + return header + base64Data; + } Future _uploadSignAndNavigate(Map item, String imagePath) async { try { - final File file = File(imagePath); - final List bytes = await file.readAsBytes(); - final String signBase64 = base64Encode(bytes); - + final String signBase64 = await _getImageBase64WithHeader(imagePath); final result = await ApiService.signUpdate( signBase64, item['CLASS_ID'], diff --git a/lib/pages/home/tap/item_list_widget.dart b/lib/pages/home/tap/item_list_widget.dart index 627721e..aea2df2 100644 --- a/lib/pages/home/tap/item_list_widget.dart +++ b/lib/pages/home/tap/item_list_widget.dart @@ -5,6 +5,7 @@ import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/tools/tools.dart'; +import 'package:flutter/services.dart'; class ItemListWidget { static const Color detailtextColor = Colors.black54; @@ -28,16 +29,24 @@ class ItemListWidget { ValueChanged? onFieldSubmitted, int maxLines = 5, - /// 强制必选 不受是否可以编译和是否必选影响 + // 新增参数:数字输入控制 + bool isNumericInput = false, // 是否为数字输入 + int maxDecimalPlaces = 2, // 最大小数位数 TextInputType keyboardType = TextInputType.text, + + /// 强制必选 不受是否可以编译和是否必选影响 }) { + // 如果启用数字输入,使用数字键盘 + final actualKeyboardType = isNumericInput + ? const TextInputType.numberWithOptions(decimal: true) + : keyboardType; + return Container( padding: const EdgeInsets.symmetric(vertical: vertical_inset, horizontal: horizontal_inset), child: Row( - mainAxisAlignment: - isEditable - ? MainAxisAlignment.start - : MainAxisAlignment.spaceBetween, + mainAxisAlignment: isEditable + ? MainAxisAlignment.start + : MainAxisAlignment.spaceBetween, children: [ Row( children: [ @@ -55,28 +64,54 @@ class ItemListWidget { const SizedBox(width: 8), isEditable ? Expanded( - child: TextField( - autofocus: false, - controller: controller, - onChanged: onChanged, // <--- 直接回传实时值 - keyboardType: keyboardType, - style: TextStyle(fontSize: fontSize), - maxLines: 1, + child: TextField( + autofocus: false, + controller: controller, + onChanged: onChanged, + onSubmitted: onFieldSubmitted, + keyboardType: actualKeyboardType, + style: TextStyle(fontSize: fontSize), + maxLines: 1, + // 添加输入格式化器(如果是数字输入) + inputFormatters: isNumericInput + ? [ + // 过滤非数字和小数点字符 + FilteringTextInputFormatter.allow(RegExp(r'[\d\.]')), + // 自定义格式化器,限制小数位数 + TextInputFormatter.withFunction((oldValue, newValue) { + if (newValue.text.isEmpty) return newValue; - decoration: InputDecoration( - isDense: true, - hintText: hintText, - contentPadding: EdgeInsets.symmetric(vertical: 8), - ), - ), - ) - : Expanded(child: Text( - text ?? '', - maxLines: maxLines, - style: TextStyle(fontSize: fontSize, color: detailtextColor), - textAlign: TextAlign.right, - overflow: TextOverflow.ellipsis, // 超出省略 - )), + // 检查多个小数点的情况 + if (newValue.text.split('.').length > 2) { + return oldValue; + } + + // 使用正则表达式匹配有效输入 + if (RegExp(r'^\d*\.?\d{0,' + maxDecimalPlaces.toString() + r'}$') + .hasMatch(newValue.text)) { + return newValue; + } + + return oldValue; + }), + ] + : null, + decoration: InputDecoration( + isDense: true, + hintText: hintText, + contentPadding: EdgeInsets.symmetric(vertical: 8), + ), + ), + ) + : Expanded( + child: Text( + text ?? '', + maxLines: maxLines, + style: TextStyle(fontSize: fontSize, color: detailtextColor), + textAlign: TextAlign.right, + overflow: TextOverflow.ellipsis, // 超出省略 + ), + ), ], ), ); @@ -184,6 +219,7 @@ class ItemListWidget { Text('* ', style: TextStyle(color: Colors.red)), Text( label, + textAlign: TextAlign.right, style: TextStyle( fontSize: fontSize, fontWeight: FontWeight.bold, @@ -214,9 +250,10 @@ class ItemListWidget { children: [ Flexible( child: Text( - text.isNotEmpty ? text : '请选择', + text.isNotEmpty ? text : (isEditable ? '请选择' : '无'), maxLines: 5, overflow: TextOverflow.ellipsis, + textAlign: TextAlign.right, style: TextStyle( fontSize: fontSize, color: isEditable ? (text == '请选择' ? Colors.black87 :Colors.black) : detailtextColor, diff --git a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart index 68edf23..452ab08 100644 --- a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart @@ -599,19 +599,31 @@ class SignaturesListWidget extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 20), child: Wrap( spacing: 8, - children: - (first['IMG_PATH'] as List) - .cast() - .map( - (img) => Image.network( - '$baseImgPath$img', - width: 50, - height: 50, - ), - ) - .toList(), + children: (first['IMG_PATH'] as List) + .cast() + .map((img) { + final fullUrl = '$baseImgPath$img'; + return GestureDetector( + onTap: () { + presentOpaque(SingleImageViewer(imageUrl: fullUrl), context); + }, + child: Image.network( + fullUrl, + width: 50, + height: 50, + fit: BoxFit.cover, + errorBuilder: (ctx, err, st) => Container( + width: 50, + height: 50, + color: Colors.grey[200], + child: const Icon(Icons.broken_image, size: 20), + ), + ), + ); + }).toList(), ), ), + for (var i = 0; i < signPaths.length; i++) Padding( padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 20), diff --git a/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart b/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart index 5140ff4..9b54cb6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dangerous_options_page.dart @@ -116,6 +116,7 @@ class _DangerousOptionsPageState extends State { ToastUtil.showNormal(context, '请签字'); return; } + LoadingDialogHelper.show(); List filePaths = signImgList.map((img) => img.filePath ?? '').toList(); final result = await ApiService.saveDangerousOptionsFile(filePaths); @@ -143,6 +144,7 @@ class _DangerousOptionsPageState extends State { } } setState(() => buttonLoading = true); + LoadingDialogHelper.hide(); Navigator.pop(context, { 'imgList': imgList @@ -172,7 +174,7 @@ class _DangerousOptionsPageState extends State { signImgList.add(imageData); signTimes.add(now); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart index deee733..638c83e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart @@ -148,12 +148,12 @@ class _HotWorkDetailFormWidgetState extends State { ), ], const Divider(), - ItemListWidget.twoRowSelectableTitleText( + ItemListWidget.selectableLineTitleTextRightButton( + isRequired: widget.isEditable, label: '动火人及证书编号:', isEditable: widget.isEditable, + text:pd['WORK_USER'] ?? '', onTap: widget.onChooseHotworkUser, - text: pd['WORK_USER'] ?? '', - controller: widget.hotworkPersonController, ), const Divider(), ItemListWidget.twoRowButtonTitleText( @@ -175,7 +175,7 @@ class _HotWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -200,7 +200,7 @@ class _HotWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, @@ -318,7 +318,7 @@ class _HotWorkDetailFormWidgetState extends State { text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), - if (FormUtils.hasValue(pd, 'ANALYZE_TIME')) ...[ + if (FormUtils.hasValue(pd, 'ANALYZE_TIME') && !widget.isEditable) ...[ const Divider(), ItemListWidget.OneRowButtonTitleText( label: '分析人:', diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqcs_work_detail/hotwork_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqcs_work_detail/hotwork_safe_func_sure.dart index 3647762..d74d453 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqcs_work_detail/hotwork_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqcs_work_detail/hotwork_safe_func_sure.dart @@ -87,7 +87,6 @@ class _HotworkSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -95,11 +94,9 @@ class _HotworkSafeFuncSureState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); - setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqgl_work_detail/hotwork_aqgl_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqgl_work_detail/hotwork_aqgl_detail.dart index c1879c5..1e566e1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqgl_work_detail/hotwork_aqgl_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqgl_work_detail/hotwork_aqgl_detail.dart @@ -61,7 +61,6 @@ class _HotworkAqglDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart index 07bcdf7..8499447 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart @@ -90,7 +90,6 @@ class _HotworkAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/dbbz_work_detail/hotwork_dbbz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/dbbz_work_detail/hotwork_dbbz_detail.dart index 4417c8f..fd0d042 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/dbbz_work_detail/hotwork_dbbz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/dbbz_work_detail/hotwork_dbbz_detail.dart @@ -63,7 +63,6 @@ class _HotworkDbbzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart index ef87dda..eeeef7d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart @@ -100,7 +100,7 @@ class _HotworkApplyDetailState extends State { _getData(); } else { isEditable = true; - // pd['ANALYZE_TIME'] = 1; + pd['ANALYZE_TIME'] = 1; pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId; pd['APPLY_DEPARTMENT_NAME'] = SessionService.instance.loginUser!['DEPARTMENT_NAME'] ?? ''; @@ -187,7 +187,7 @@ class _HotworkApplyDetailState extends State { // 用户点击确定并选择了 choice setState(() { pd['WORK_LEVEL'] = choice; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -210,7 +210,7 @@ class _HotworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'USER_ID')) { pd['WORK_USER_ID'] = result['USER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -238,7 +238,7 @@ class _HotworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -261,7 +261,7 @@ class _HotworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -272,17 +272,18 @@ class _HotworkApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); + } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -297,7 +298,7 @@ class _HotworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -390,7 +391,7 @@ class _HotworkApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -409,7 +410,7 @@ class _HotworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -425,7 +426,7 @@ class _HotworkApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -464,7 +465,7 @@ class _HotworkApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -530,8 +531,8 @@ class _HotworkApplyDetailState extends State { ToastUtil.showNormal(context, '请选择预计作业开始时间'); return; } - if (!FormUtils.hasValue(pd, 'WORK_EXPECTED_START_TIME')) { - ToastUtil.showNormal(context, '请选择预计作业开始时间'); + if (!FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME')) { + ToastUtil.showNormal(context, '请选择预计作业结束时间'); return; } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/dhsp_work_detail/hotwork_dhsp_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/dhsp_work_detail/hotwork_dhsp_detail.dart index 8777c12..c758b72 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/dhsp_work_detail/hotwork_dhsp_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/dhsp_work_detail/hotwork_dhsp_detail.dart @@ -61,7 +61,6 @@ class _HotworkDhspDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart index c3ffeb3..16ce065 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart @@ -27,7 +27,12 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work/jsjd_ class HotWorkListPage extends StatefulWidget { final String flow; final String workTypeTitle; - const HotWorkListPage({Key? key, required this.flow, required this.workTypeTitle}) : super(key: key); + + const HotWorkListPage({ + Key? key, + required this.flow, + required this.workTypeTitle, + }) : super(key: key); @override _HotWorkListPageState createState() => _HotWorkListPageState(); @@ -131,6 +136,7 @@ class _HotWorkListPageState extends State { list.clear(); _fetchData(); } + /// 申请 void _handleApply() { // 处理申请按钮点击逻辑 @@ -140,7 +146,7 @@ class _HotWorkListPageState extends State { /// 打开流程图 Future _openFlowDrawer(String hotworkId) async { try { - final response = await ApiService.workGetFlowList('', hotworkId); + final response = await ApiService.workGetFlowList('hotwork', hotworkId); final List? newFlow = response['flowList']; if (newFlow == null || newFlow.isEmpty) { ToastUtil.showNormal(context, '暂无流程图数据'); @@ -161,7 +167,6 @@ class _HotWorkListPageState extends State { } } - void _goToDetail(Map item) async { final allowed = await WorkAreaHelper.checkInSpecialWorkArea( context: context, @@ -172,59 +177,110 @@ class _HotWorkListPageState extends State { switch (widget.flow) { case '提交申请': - await pushPage(HotworkApplyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkApplyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); _fetchData(); break; case '气体检测': - await pushPage(HotworkGasList(HOTWORK_ID: item['HOTWORK_ID'], addFlag:true), context); + await pushPage( + HotworkGasList(HOTWORK_ID: item['HOTWORK_ID'], addFlag: true), + context, + ); break; case '设置安全措施确认人': - await pushPage(HotworkSetSafeDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkSetSafeDetail( + HOTWORK_ID: item['HOTWORK_ID'], + flow: widget.flow, + ), + context, + ); break; case '安全措施确认': - await pushPage(HotworkSafeFuncSure(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkSafeFuncSure( + HOTWORK_ID: item['HOTWORK_ID'], + flow: widget.flow, + ), + context, + ); break; case '监护人签字': - await pushPage(HotworkJhrDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkJhrDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '安全交底人签字': - await pushPage(HotworkAqjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkAqjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '接受交底人签字': - await pushPage(HotworkJsjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkJsjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '作业负责人签字': - await pushPage(HotworkZyfzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkZyfzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '所在单位签字': - await pushPage(HotworkSzdwDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkSzdwDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '安全管理部门签字': - await pushPage(HotworkAqglDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkAqglDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '审批人签字': - await pushPage(HotworkDhspDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkDhspDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '当班班长验票': - await pushPage(HotworkDbbzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkDbbzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '开始作业': - await pushPage(HotworkKszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkKszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '结束作业': - await pushPage(HotworkJszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkJszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; case '验收签字': - await pushPage(HotworkYsgdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); + await pushPage( + HotworkYsgdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), + context, + ); break; default: @@ -246,9 +302,7 @@ class _HotWorkListPageState extends State { final Color dotColor = status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.grey); final Color textColor = - status == 1 - ? Colors.green - : (status == 0 ? Colors.blue : Colors.black); + status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.black); return ListTile( visualDensity: VisualDensity(vertical: -4), @@ -319,8 +373,14 @@ class _HotWorkListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),), - Text("作业级别: ${item['WORK_LEVEL'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),), + Text( + "编号: ${item['CHECK_NO'] ?? ''}", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), + ), + Text( + "作业级别: ${item['WORK_LEVEL'] ?? ''}", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), + ), ], ), const SizedBox(height: 8), @@ -340,32 +400,52 @@ class _HotWorkListPageState extends State { ], ), const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + ], + ), const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}"), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + ], + ), const SizedBox(height: 8), if (item['AUDIT_USER_NAME'] != null) Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("动火前在岗班长: ${item['MONITOR_USER_NAME'] ?? ''}"), - Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [Text("动火前在岗班长: ${item['MONITOR_USER_NAME'] ?? ''}")], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), + ), + ], + ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -379,17 +459,19 @@ class _HotWorkListPageState extends State { ], ), const SizedBox(height: 8), - Row(children: [ - CustomButton( - text: '查看流程图', - height: 35, - padding: EdgeInsets.symmetric(horizontal: 12), - margin: EdgeInsets.only(left: 0), - backgroundColor: Colors.blue, - onPressed: () => _openFlowDrawer(item['HOTWORK_ID']), - ), - SizedBox(width: 1,) - ],) + Row( + children: [ + CustomButton( + text: '查看流程图', + height: 35, + padding: EdgeInsets.symmetric(horizontal: 12), + margin: EdgeInsets.only(left: 0), + backgroundColor: Colors.blue, + onPressed: () => _openFlowDrawer(item['HOTWORK_ID']), + ), + SizedBox(width: 1), + ], + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/jhr_work_detail/hotwork_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/jhr_work_detail/hotwork_jhr_detail.dart index 89912d5..17dd2d5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/jhr_work_detail/hotwork_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/jhr_work_detail/hotwork_jhr_detail.dart @@ -60,7 +60,6 @@ class _HotworkJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/jsjd_work_detail/hotwork_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/jsjd_work_detail/hotwork_jsjd_detail.dart index 8daefc1..71c2da1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/jsjd_work_detail/hotwork_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/jsjd_work_detail/hotwork_jsjd_detail.dart @@ -61,7 +61,6 @@ class _HotworkJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart index 92c3022..adadabf 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart @@ -64,7 +64,6 @@ class _HotworkJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart index c28eb69..7c31837 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart @@ -65,7 +65,6 @@ class _HotworkKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart index dad8569..6e31953 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart @@ -26,6 +26,11 @@ class HotworkGasList extends StatefulWidget { class _HotworkGasListState extends State { late List list = []; bool isLoading = true; + List> GAS_TYPE_LIST = [ + {"NAME": "有毒", "VALUE": "1"}, + {"NAME": "可燃", "VALUE": "2"}, + {"NAME": "氧气", "VALUE": "3"}, + ]; Future _getListData() async { final data = await ApiService.workGasList('hotwork', widget.HOTWORK_ID); @@ -50,11 +55,19 @@ class _HotworkGasListState extends State { } } } - + String getGasTypeName(String type) { + for (Map item in GAS_TYPE_LIST) { + if (item['VALUE'] == type) { + return item['NAME']; + } + } + return ''; + } Widget _buildListItem(Map item) { final images = (item['SIGN_PATH'] as String?)?.split(',') ?? []; final baseImgPath = ApiService.baseImgPath; + String typeName = item['GAS_TYPE'] == '1' ? '有毒' : (item['GAS_TYPE'] == '2' ? '可燃' : (item['GAS_TYPE'] == '3' ? '氧气':'')); return Container( color: Colors.white, margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), @@ -64,6 +77,14 @@ class _HotworkGasListState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('气体类型: $typeName'), + ], + ), + const SizedBox(height: 6), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -72,6 +93,22 @@ class _HotworkGasListState extends State { ], ), const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('上限: ${item['UPPER_LIMIT'] ?? ''}'), + Text('下限: ${item['LOWER_LIMIT'] ?? ''}'), + ], + ), + const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('检测值: ${item['GAS_VALUE'] ?? ''}'), + Text('计量单位: ${item['GAS_UNIT'] ?? ''}'), + ], + ), + const SizedBox(height: 6), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart index 38bfd54..15dfa6b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart @@ -163,7 +163,6 @@ class _HotworkSetSafeDetailState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -175,7 +174,6 @@ class _HotworkSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/szdw_work_detail/hotwork_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/szdw_work_detail/hotwork_szdw_detail.dart index 29d9d2f..f36dee5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/szdw_work_detail/hotwork_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/szdw_work_detail/hotwork_szdw_detail.dart @@ -61,7 +61,6 @@ class _HotworkSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart index 47ee6e2..49b990d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart @@ -97,7 +97,6 @@ class _HotworkYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -376,7 +375,7 @@ class _HotworkYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/zyfz_work_detail/hotwork_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/zyfz_work_detail/hotwork_zyfz_detail.dart index 7251927..831f311 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/zyfz_work_detail/hotwork_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/zyfz_work_detail/hotwork_zyfz_detail.dart @@ -61,7 +61,6 @@ class _HotworkZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart index 79d9d82..399da6a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart @@ -326,7 +326,7 @@ class _CutroadDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -350,7 +350,7 @@ class _CutroadDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart index 2dc6bd2..65cd1e0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart @@ -90,7 +90,6 @@ class _CutroadSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -101,7 +100,6 @@ if (path != null) { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -331,7 +329,7 @@ if (path != null) { // 更新状态、序号等 measures['STATUS'] = result['status'].toString(); index = result['index'] as int; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart index 274e48e..e2c6798 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqjd_work_detail/cutroad_aqjd_detail.dart @@ -89,7 +89,6 @@ class _CutroadAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart index ed3768b..99ae1e6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart @@ -320,7 +320,7 @@ class _CutroadListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], @@ -329,35 +329,64 @@ class _CutroadListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"), - Text("作业项目负责人: ${item['PROJECT_MANAGER_USER_NAME'] ?? ''}"), + Expanded(child: Text("作业项目负责人: ${item['PROJECT_MANAGER_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"), - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), - Text("消防、安全管理部门: ${item['AUDIT_USER_NAME'] ?? ''}"), + Expanded(child: Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("消防、安全管理部门: ${item['AUDIT_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), - Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), + Expanded(child: Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + textAlign: TextAlign.right, + overflow: TextOverflow.visible,) + ), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart index 5a14c24..29ca4e7 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart @@ -199,7 +199,7 @@ class _CutroadApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -218,7 +218,7 @@ class _CutroadApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -234,7 +234,7 @@ class _CutroadApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -270,7 +270,7 @@ class _CutroadApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -414,7 +414,7 @@ class _CutroadApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -437,7 +437,7 @@ class _CutroadApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -449,17 +449,17 @@ class _CutroadApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -474,7 +474,7 @@ class _CutroadApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart index aa7b4bc..3cc841c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart @@ -60,7 +60,6 @@ if (path != null) { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/jsjd_work_detail/cutroad_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/jsjd_work_detail/cutroad_jsjd_detail.dart index fbc8e89..3a5a25f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/jsjd_work_detail/cutroad_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/jsjd_work_detail/cutroad_jsjd_detail.dart @@ -61,7 +61,6 @@ class _CutroadJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart index 026a235..66becc4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart @@ -64,7 +64,6 @@ class _CutroadJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart index 48549b7..6b52264 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart @@ -65,7 +65,6 @@ class _CutroadKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart index e074a4f..2e23ddb 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart @@ -61,7 +61,6 @@ class _CutroadShbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart index 8331251..e8a0e2c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart @@ -60,7 +60,6 @@ class _CutroadSpbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart index 1f22d62..820fc51 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart @@ -174,7 +174,6 @@ if (path != null) { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart index 34f415d..7058013 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart @@ -61,7 +61,6 @@ class _CutroadSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart index b6b0f63..2f181c8 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/ysgd_work_detail/cutroad_ysgd_detail.dart @@ -96,7 +96,6 @@ class _CutroadYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -367,7 +366,7 @@ class _CutroadYsgdDetailState extends State { 'yyyy-MM-dd HH:mm', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart index 67b9273..7c3091f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart @@ -61,7 +61,6 @@ class _CutroadZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart index 00eafda..242fe02 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart @@ -70,7 +70,6 @@ class _CutroadZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart index f7c40cd..bc6b221 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart @@ -372,7 +372,7 @@ class _BreakgroundDetailFormWidgetState }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -397,7 +397,7 @@ class _BreakgroundDetailFormWidgetState }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart index 83349d9..cbb663d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart @@ -87,7 +87,6 @@ class _BreakgroundSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -98,7 +97,6 @@ class _BreakgroundSafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -350,7 +348,7 @@ class _BreakgroundSafeFuncSureState extends State { // 更新状态、序号等 measures['STATUS'] = result['status'].toString(); index = result['index'] as int; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart index 460c088..bbb7104 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart @@ -89,7 +89,6 @@ class _BreakgroundAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart index f0e66ae..c7959d3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart @@ -23,7 +23,6 @@ import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; import 'package:qhd_prevention/http/ApiService.dart'; - class BreakgroundListPage extends StatefulWidget { final String flow; final String workTypeTitle; @@ -88,8 +87,7 @@ class _BreakgroundListPageState extends State { stepList = [ {'STEP_NAME': '全部', 'STEP_ID': ''}, ...response['list'] ?? [], - {"STEP_NAME": "验收归档", - "STEP_ID": "99"} + {"STEP_NAME": "验收归档", "STEP_ID": "99"}, ]; }); } catch (e) { @@ -142,13 +140,19 @@ class _BreakgroundListPageState extends State { /// 申请 void _handleApply() { // 处理申请按钮点击逻辑 - pushPage(BreakgroundApplyDetail(BREAKGROUND_ID: '', flow: widget.flow), context); + pushPage( + BreakgroundApplyDetail(BREAKGROUND_ID: '', flow: widget.flow), + context, + ); } /// 打开流程图 Future _openFlowDrawer(String hotworkId) async { try { - final response = await ApiService.workGetFlowList('breakground', hotworkId); + final response = await ApiService.workGetFlowList( + 'breakground', + hotworkId, + ); final List? newFlow = response['flowList']; if (newFlow == null || newFlow.isEmpty) { ToastUtil.showNormal(context, '暂无流程图数据'); @@ -179,49 +183,133 @@ class _BreakgroundListPageState extends State { switch (widget.flow) { case '提交申请': - await pushPage(BreakgroundApplyDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundApplyDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '作业人签字': - await pushPage(BreakgroundZyrDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundZyrDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '设置安全措施确认人': - await pushPage(BreakgroundSetSafeDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundSetSafeDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '安全措施确认': - await pushPage(BreakgroundSafeFuncSure(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundSafeFuncSure( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '监护人签字': - await pushPage(BreakgroundJhrDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundJhrDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '安全交底人签字': - await pushPage(BreakgroundAqjdDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundAqjdDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '接受交底人签字': - await pushPage(BreakgroundJsjdDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundJsjdDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '作业负责人签字': - await pushPage(BreakgroundZyfzDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundZyfzDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '所在单位签字': - await pushPage(BreakgroundSzdwDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundSzdwDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '有关水、电、汽、工艺、设备、消防安全等部门': - await pushPage(BreakgroundShbmDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundShbmDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '审批人签字': - await pushPage(BreakgroundSpbmDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundSpbmDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '开始作业': - await pushPage(BreakgroundKszyDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundKszyDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '结束作业': - await pushPage(BreakgroundJszyDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundJszyDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; case '验收签字': - await pushPage(BreakgroundYsgdDetail(BREAKGROUND_ID: item['BREAKGROUND_ID'], flow: widget.flow), context); + await pushPage( + BreakgroundYsgdDetail( + BREAKGROUND_ID: item['BREAKGROUND_ID'], + flow: widget.flow, + ), + context, + ); break; default: @@ -335,11 +423,7 @@ class _BreakgroundListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - Text( - "作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -353,29 +437,55 @@ class _BreakgroundListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), - Row( + if (FormUtils.hasValue(item, 'SAFETY_USER_NAME')) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "有关水、电、汽、工艺、设备、消防安全等部门: ${item['SAFETY_USER_NAME'] ?? ''}", + ), + ], + ), + if (FormUtils.hasValue(item, 'APPROVE_USER_NAME')) + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("审核部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), + Expanded(child: Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), - SizedBox() + SizedBox(), ], ), Row( diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart index f57b19f..abe5538 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart @@ -190,7 +190,7 @@ class _BreakgroundApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -213,7 +213,7 @@ class _BreakgroundApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -225,17 +225,17 @@ class _BreakgroundApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -250,7 +250,7 @@ class _BreakgroundApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -288,7 +288,7 @@ class _BreakgroundApplyDetailState extends State { setState(() { pd['WORK_LEVEL_NAME'] = choice; pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -339,7 +339,7 @@ class _BreakgroundApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -358,7 +358,7 @@ class _BreakgroundApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -374,7 +374,7 @@ class _BreakgroundApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -410,7 +410,7 @@ class _BreakgroundApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart index 18842df..7566825 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart @@ -61,7 +61,6 @@ class _BreakgroundDzzhDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart index 2280be4..7bc9423 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart @@ -62,7 +62,6 @@ class _BreakgroundJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart index 650d82a..8d6457c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart @@ -61,7 +61,6 @@ class _BreakgroundJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart index eba4619..aadc6f1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart @@ -64,7 +64,6 @@ class _BreakgroundJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart index 7c79cbe..3134c52 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart @@ -65,7 +65,6 @@ class _BreakgroundKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart index 631fbd7..3919ab3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart @@ -60,7 +60,6 @@ class _BreakgroundShbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart index b1ef3b4..0271ddb 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart @@ -60,7 +60,6 @@ class _BreakgroundSpbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart index a9b96ca..1eeede3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart @@ -60,7 +60,6 @@ class _BreakgroundSsrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart index 5088e6e..4057f4a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart @@ -175,7 +175,6 @@ class _BreakgroundSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart index acac4b3..31431d4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart @@ -61,7 +61,6 @@ class _BreakgroundSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart index 9aff356..feed9b1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart @@ -97,7 +97,6 @@ class _BreakgroundYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -370,7 +369,7 @@ class _BreakgroundYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart index e6dd928..4b456fe 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart @@ -61,7 +61,6 @@ class _BreakgroundZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart index e4ee1f7..74d5357 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart @@ -74,7 +74,6 @@ class _BreakgroundZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart index e056df1..0bd2c3e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart @@ -355,7 +355,7 @@ class _HoistworkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -379,7 +379,7 @@ class _HoistworkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/aqcs_work_detail/hoistwork_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/aqcs_work_detail/hoistwork_safe_func_sure.dart index de3392b..829ee84 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/aqcs_work_detail/hoistwork_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/aqcs_work_detail/hoistwork_safe_func_sure.dart @@ -86,7 +86,6 @@ class _HoistworkSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -97,7 +96,6 @@ class _HoistworkSafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -349,7 +347,7 @@ class _HoistworkSafeFuncSureState extends State { // 更新状态、序号等 measures['STATUS'] = result['status'].toString(); index = result['index'] as int; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/aqjd_work_detail/hoistwork_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/aqjd_work_detail/hoistwork_aqjd_detail.dart index 4cbe1e9..780c507 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/aqjd_work_detail/hoistwork_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/aqjd_work_detail/hoistwork_aqjd_detail.dart @@ -89,7 +89,6 @@ class _HoistworkAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart index b938683..16d850d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart @@ -152,7 +152,7 @@ class _HoistworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -175,7 +175,7 @@ class _HoistworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -187,17 +187,17 @@ class _HoistworkApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -212,7 +212,7 @@ class _HoistworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -290,7 +290,7 @@ class _HoistworkApplyDetailState extends State { setState(() { pd['WORK_LEVEL_NAME'] = choice; pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -345,7 +345,7 @@ class _HoistworkApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -364,7 +364,7 @@ class _HoistworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -380,7 +380,7 @@ class _HoistworkApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -416,7 +416,7 @@ class _HoistworkApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -504,7 +504,6 @@ class _HoistworkApplyDetailState extends State { } else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') { taskId = '11'; } - pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])]; pd['USER_ID'] = SessionService.instance.loginUserId; pd['STEP_ID'] = status; pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/dzzh_work_detail/hoistwork_dzzh_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/dzzh_work_detail/hoistwork_dzzh_detail.dart index 20138e9..6513e59 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/dzzh_work_detail/hoistwork_dzzh_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/dzzh_work_detail/hoistwork_dzzh_detail.dart @@ -61,7 +61,6 @@ class _HoistworkDzzhDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart index 58230e5..23e9dc5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart @@ -340,11 +340,11 @@ class _HoistworkListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), Text( "作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -358,22 +358,43 @@ class _HoistworkListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("审核部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), + Expanded(child: Text("审核部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/jhr_work_detail/hoistwork_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/jhr_work_detail/hoistwork_jhr_detail.dart index ca8457e..89e6379 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/jhr_work_detail/hoistwork_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/jhr_work_detail/hoistwork_jhr_detail.dart @@ -62,7 +62,6 @@ class _HoistworkJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/jsjd_work_detail/hoistwork_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/jsjd_work_detail/hoistwork_jsjd_detail.dart index 8c410f9..8a90a37 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/jsjd_work_detail/hoistwork_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/jsjd_work_detail/hoistwork_jsjd_detail.dart @@ -61,7 +61,6 @@ class _HoistworkJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart index 5bd8242..c6577b4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart @@ -64,7 +64,6 @@ class _HoistworkJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart index b80f67e..118e7da 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart @@ -65,7 +65,6 @@ class _HoistworkKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/shbm_work_detail/hoistwork_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/shbm_work_detail/hoistwork_shbm_detail.dart index 8963c22..fafab3b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/shbm_work_detail/hoistwork_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/shbm_work_detail/hoistwork_shbm_detail.dart @@ -60,7 +60,6 @@ class _HoistworkShbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/spbm_work_detail/hoistwork_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/spbm_work_detail/hoistwork_spbm_detail.dart index ae7e319..a33dbed 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/spbm_work_detail/hoistwork_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/spbm_work_detail/hoistwork_spbm_detail.dart @@ -60,7 +60,6 @@ class _HoistworkSpbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart index b0635f9..458420f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart @@ -60,7 +60,6 @@ class _HoistworkSsrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart index 83fc048..ad5eac0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart @@ -174,7 +174,6 @@ class _HoistworkSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/szdw_work_detail/hoistwork_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/szdw_work_detail/hoistwork_szdw_detail.dart index 0e5aeb0..13b2f80 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/szdw_work_detail/hoistwork_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/szdw_work_detail/hoistwork_szdw_detail.dart @@ -61,7 +61,6 @@ class _HoistworkSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/ysgd_work_detail/hoistwork_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/ysgd_work_detail/hoistwork_ysgd_detail.dart index 49a80ea..dcaba68 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/ysgd_work_detail/hoistwork_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/ysgd_work_detail/hoistwork_ysgd_detail.dart @@ -97,7 +97,6 @@ class _HoistworkYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -370,7 +369,7 @@ class _HoistworkYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/zyfz_work_detail/hoistwork_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/zyfz_work_detail/hoistwork_zyfz_detail.dart index ed9628c..97fe368 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/zyfz_work_detail/hoistwork_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/zyfz_work_detail/hoistwork_zyfz_detail.dart @@ -61,7 +61,6 @@ class _HoistworkZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/zyr_work_detail/hoistwork_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/zyr_work_detail/hoistwork_zyr_detail.dart index 5d9c6fe..4e063a3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/zyr_work_detail/hoistwork_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/zyr_work_detail/hoistwork_zyr_detail.dart @@ -60,7 +60,6 @@ class _HoistworkZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart index 7d8e406..154578e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart @@ -144,7 +144,7 @@ class _HighWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -168,7 +168,7 @@ class _HighWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart index 533adb5..d3f7293 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart @@ -85,7 +85,6 @@ class _HighworkSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -96,7 +95,6 @@ class _HighworkSafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -337,7 +335,7 @@ class _HighworkSafeFuncSureState extends State { // 更新状态、序号等 measures['STATUS'] = result['status'].toString(); index = result['index'] as int; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqjd_work_detail/highwork_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqjd_work_detail/highwork_aqjd_detail.dart index 0824c34..05d383a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqjd_work_detail/highwork_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqjd_work_detail/highwork_aqjd_detail.dart @@ -89,7 +89,6 @@ class _HighworkAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart index 9e6cfa4..ed2ee0a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart @@ -146,7 +146,7 @@ class _HighworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -169,7 +169,7 @@ class _HighworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -181,17 +181,17 @@ class _HighworkApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -206,7 +206,7 @@ class _HighworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -284,7 +284,7 @@ class _HighworkApplyDetailState extends State { setState(() { pd['WORK_LEVEL_NAME'] = choice; pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -345,7 +345,7 @@ class _HighworkApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -364,7 +364,7 @@ class _HighworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -380,7 +380,7 @@ class _HighworkApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -416,7 +416,7 @@ class _HighworkApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -505,8 +505,7 @@ class _HighworkApplyDetailState extends State { } else if (pd['WORK_LEVEL'] == '4') { taskId = '7'; } - pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])]; - pd['USER_ID'] = SessionService.instance.loginUserId; + pd['USER_ID'] = SessionService.instance.loginUserId ?? ''; pd['STEP_ID'] = status; pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; pd['OPERATOR'] = SessionService.instance.loginUserId; diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart index d194542..803c500 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart @@ -336,11 +336,11 @@ class _HighworkListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), Text( "作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -354,15 +354,29 @@ class _HighworkListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + textAlign: TextAlign.right, + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + textAlign: TextAlign.right, + overflow: TextOverflow.visible,) + ), ], ), @@ -372,8 +386,15 @@ class _HighworkListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ if (item['APPROVE_USER_NAME'] != null) - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), - Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), + Expanded(child: Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + textAlign: TextAlign.right, + overflow: TextOverflow.visible,) + ), ], ), Row( diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart index 7603d59..85b0cdc 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart @@ -62,7 +62,6 @@ class _HighworkJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/jsjd_work_detail/highwork_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/jsjd_work_detail/highwork_jsjd_detail.dart index e49c65d..253c277 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/jsjd_work_detail/highwork_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/jsjd_work_detail/highwork_jsjd_detail.dart @@ -61,7 +61,6 @@ class _HighworkJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart index c5861f7..471e8a1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart @@ -64,7 +64,6 @@ class _HighworkJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart index 1c9bb51..c07a86d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart @@ -65,7 +65,6 @@ class _HighworkKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart index b23d7f2..07a8bc6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart @@ -60,7 +60,6 @@ class _HighworkShbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart index 4f42a0b..90a71b0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart @@ -60,7 +60,6 @@ class _HighworkSpbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart index 7fb51b9..8eff2b3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart @@ -173,7 +173,6 @@ class _HighworkSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/szdw_work_detail/highwork_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/szdw_work_detail/highwork_szdw_detail.dart index 4c50dfd..7cc77fb 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/szdw_work_detail/highwork_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/szdw_work_detail/highwork_szdw_detail.dart @@ -61,7 +61,6 @@ class _HighworkSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/ysgd_work_detail/highwork_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/ysgd_work_detail/highwork_ysgd_detail.dart index a8362d1..6983536 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/ysgd_work_detail/highwork_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/ysgd_work_detail/highwork_ysgd_detail.dart @@ -97,7 +97,6 @@ class _HighworkYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -370,7 +369,7 @@ class _HighworkYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/zyfz_work_detail/highwork_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/zyfz_work_detail/highwork_zyfz_detail.dart index 3f226c8..cecca7e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/zyfz_work_detail/highwork_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/zyfz_work_detail/highwork_zyfz_detail.dart @@ -61,7 +61,6 @@ class _HighworkZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/zyr_work_detail/highwork_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/zyr_work_detail/highwork_zyr_detail.dart index 7dce01d..91e4465 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/zyr_work_detail/highwork_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/zyr_work_detail/highwork_zyr_detail.dart @@ -60,7 +60,6 @@ class _HighworkZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart b/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart index b0549f5..ff75cea 100644 --- a/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/http/ApiService.dart'; @@ -27,6 +28,28 @@ class _HomeGasTestPageState extends State { String _selectData = ''; List imagePaths = []; List signTimes = []; // 签字时间列表 + List> GAS_TYPE_LIST = [ + {"NAME": "有毒", "VALUE": "1"}, + {"NAME": "可燃", "VALUE": "2"}, + {"NAME": "氧气", "VALUE": "3"}, + ]; + List> RESULTS_UNIT_LIST = [ + {"NAME": "%", "VALUE": "1"}, + {"NAME": "ppm", "VALUE": "2"}, + {"NAME": "mg/m³", "VALUE": "3"}, + ]; + List> rules = [ + {"name": 'GAS_TYPE', "message": '请选择气体类型'}, + {"name": 'UPPER_LIMIT', "message": '请输入量程上限'}, + {"name": 'LOWER_LIMIT', "message": '请输入量程下限'}, + {"name": 'GAS_UNIT', "message": '请输入计量单位'}, + {"name": 'GAS_VALUE', "message": '请输入检测值'}, + {"name": 'ANALYZE_TIME', "message": '请输入分析时间'}, + {"name": 'ANALYZE_GAS', "message": '请输入代表性气体'}, + {"name": 'ANALYZE_RESULT', "message": '请输入分析结果'}, + {"name": 'ANALYZE_PLACE', "message": '请输入分析地点'}, + ]; + late Map pd = {}; final TextEditingController _gasController = TextEditingController(); final TextEditingController _resultController = TextEditingController(); @@ -47,6 +70,40 @@ class _HomeGasTestPageState extends State { } } + /// 选择气体类型 + Future _chooseGasType() async { + final choice = await BottomPicker.show( + context, + items: GAS_TYPE_LIST.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + pd['GAS_TYPE_NAME'] = choice; + + Map result = GAS_TYPE_LIST.firstWhere( + (item) => item['NAME'] == choice, + orElse: () => {}, // 避免找不到时报错 + ); + if (FormUtils.hasValue(result, 'VALUE')) { + pd['GAS_TYPE'] = result['VALUE']; + } + } + } + + /// 选择计量单位 + Future _chooseUnit() async { + final choice = await BottomPicker.show( + context, + items: RESULTS_UNIT_LIST.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + pd['GAS_UNIT'] = choice; + } + } + Future _sign() async { await NativeOrientation.setLandscape(); final path = await Navigator.push( @@ -59,7 +116,6 @@ class _HomeGasTestPageState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -128,11 +184,27 @@ class _HomeGasTestPageState extends State { return; } if (status == 1) { - if (_selectData.isEmpty || - _gasController.text.isEmpty || - _resultController.text.isEmpty || - _addressController.text.isEmpty) { - ToastUtil.showNormal(context, '请完善所有字段'); + + Map itemForm = { + 'ANALYZE_GAS': _gasController.text, + 'ANALYZE_RESULT': _resultController.text, + 'ANALYZE_PLACE': _addressController.text, + 'ANALYZE_TIME': _selectData, + ...pd, + }; + bool required = true; + for (final r in rules) { + final name = r['name'] ?? ''; + final message = r['message'] ?? '请完善表单'; + final v = itemForm[name]; + if (v == null || v.toString().isEmpty || v.toString() == '请选择') { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, message); + required = false; + break; + } + } + if (!required) { return; } } @@ -164,6 +236,7 @@ class _HomeGasTestPageState extends State { setState(() => _loading = true); final formData = { + ...pd, 'HOTWORK_ID': widget.HOTWORK_ID, 'ANALYZE_TIME': _selectData, 'ANALYZE_GAS': _gasController.text, @@ -188,8 +261,6 @@ class _HomeGasTestPageState extends State { } } - Future setRequest() async {} - @override Widget build(BuildContext context) { return Scaffold( @@ -218,6 +289,14 @@ class _HomeGasTestPageState extends State { onTap: _chooseDatePicker, ), const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '气体类型', + isEditable: true, + text: pd['GAS_TYPE_NAME'] ?? '请选择', + onTap: _chooseGasType, + ), + const Divider(), + ItemListWidget.singleLineTitleText( label: '代表性气体:', hintText: '请输入代表性气体', @@ -226,11 +305,59 @@ class _HomeGasTestPageState extends State { ), const Divider(), ItemListWidget.singleLineTitleText( - label: '分析结果:', + label: '上限:', isEditable: true, + isNumericInput: true, + text: pd['UPPER_LIMIT'] ?? '', + hintText: '请输入数字保留两位小数', + onChanged: (v) { + setState(() { + pd['UPPER_LIMIT'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '下限:', + isEditable: true, + isNumericInput: true, + text: pd['LOWER_LIMIT'] ?? '', + hintText: '请输入数字保留两位小数', + onChanged: (v) { + setState(() { + pd['LOWER_LIMIT'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '检测值:', + isEditable: true, + isNumericInput: true, + hintText: '请输入数字保留两位小数', + text: pd['GAS_VALUE'] ?? '', + onChanged: (v) { + setState(() { + pd['GAS_VALUE'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '分析结果:', + isNumericInput: true, + isEditable: true, + hintText: '请输入可燃气体检测结果,数字保留两位小数', controller: _resultController, ), const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '计量单位', + isEditable: true, + text: pd['GAS_UNIT'] ?? '请选择', + onTap: _chooseUnit, + ), + const Divider(), ItemListWidget.singleLineTitleText( label: '分析地点:', isEditable: true, diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart index a6a8376..e8fe049 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart @@ -211,7 +211,7 @@ class _ElectricityDetailFormWidgetState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -99,7 +98,6 @@ class _ElectricitySafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart index d86c219..8bddab3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart @@ -90,7 +90,6 @@ class _ElectricityAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/dbbz_work_detail/electricity_dbbz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/dbbz_work_detail/electricity_dbbz_detail.dart index 1afd9e9..656a494 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/dbbz_work_detail/electricity_dbbz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/dbbz_work_detail/electricity_dbbz_detail.dart @@ -63,7 +63,6 @@ class _ElectricityDbbzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart index c01b5c3..31cd714 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart @@ -148,7 +148,7 @@ class _ElectricityListPageState extends State { /// 打开流程图 Future _openFlowDrawer(String hotworkId) async { try { - final response = await ApiService.workGetFlowList('', hotworkId); + final response = await ApiService.workGetFlowList('electricity', hotworkId); final List? newFlow = response['flowList']; if (newFlow == null || newFlow.isEmpty) { ToastUtil.showNormal(context, '暂无流程图数据'); @@ -406,7 +406,7 @@ class _ElectricityListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -424,23 +424,40 @@ class _ElectricityListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"), - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("用电单位负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), - Text("配送电单位负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), + Expanded(child: Text("用电单位负责人: ${item['AUDIT_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("配送电单位负责人: ${item['APPROVE_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart index 4cf5cb9..2a6dd86 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart @@ -60,7 +60,6 @@ class _ElectricityJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jsjd_work_detail/electricity_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jsjd_work_detail/electricity_jsjd_detail.dart index 4cd6bad..a2bbfce 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jsjd_work_detail/electricity_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jsjd_work_detail/electricity_jsjd_detail.dart @@ -61,7 +61,6 @@ class _ElectricityJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart index 5067ca1..8c4adf9 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart @@ -64,7 +64,6 @@ class _ElectricityJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart index c1406e5..902e599 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart @@ -65,7 +65,6 @@ class _ElectricityKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -141,14 +140,17 @@ class _ElectricityKszyDetailState extends State { return; } final workStart = DateTime.parse(startTime); - final analyzeTime = DateTime.parse(pd['ANALYZE_TIME'] as String); - final intervalMs = workStart.difference(analyzeTime).inMilliseconds; - const thresholdMs = 30 * 60 * 1000; + if (FormUtils.hasValue(pd, 'ANALYZE_TIME')) { + final analyzeTime = DateTime.parse(pd['ANALYZE_TIME'] as String); + final intervalMs = workStart.difference(analyzeTime).inMilliseconds; + const thresholdMs = 30 * 60 * 1000; - if (intervalMs >= thresholdMs) { - ToastUtil.showNormal(context, '气体分析时间与开始时间间隔超过30分钟,请重新上传气体检测结果'); - return; + if (intervalMs >= thresholdMs) { + ToastUtil.showNormal(context, '气体分析时间与开始时间间隔超过30分钟,请重新上传气体检测结果'); + return; + } } + } else { reasonText = await CustomAlertDialog.showInput( context, diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart index 9961bde..cb52ee7 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart @@ -164,7 +164,7 @@ class _ElectricityApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -187,7 +187,7 @@ class _ElectricityApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -199,17 +199,17 @@ class _ElectricityApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -224,7 +224,7 @@ class _ElectricityApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -346,7 +346,7 @@ class _ElectricityApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -365,7 +365,7 @@ class _ElectricityApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -381,7 +381,7 @@ class _ElectricityApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -420,7 +420,7 @@ class _ElectricityApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart index 4b6f92b..73c1a5c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart @@ -61,7 +61,6 @@ class _ElectricityPsdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart index fff8f97..7855dbe 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart @@ -56,6 +56,7 @@ class _ElectricityGasListState extends State { Widget _buildListItem(Map item) { final images = (item['SIGN_PATH'] as String?)?.split(',') ?? []; final baseImgPath = ApiService.baseImgPath; + String typeName = item['GAS_TYPE'] == '1' ? '有毒' : (item['GAS_TYPE'] == '2' ? '可燃' : (item['GAS_TYPE'] == '3' ? '氧气':'')); return Container( color: Colors.white, @@ -66,6 +67,15 @@ class _ElectricityGasListState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('气体类型: $typeName'), + ], + ), + + const SizedBox(height: 6), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -75,11 +85,26 @@ class _ElectricityGasListState extends State { ], ), const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('上限: ${item['UPPER_LIMIT'] ?? ''}'), + Text('下限: ${item['LOWER_LIMIT'] ?? ''}'), + ], + ), + const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('检测值: ${item['GAS_VALUE'] ?? ''}'), + Text('计量单位: ${item['GAS_UNIT'] ?? ''}'), + ], + ), + const SizedBox(height: 6), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('可燃气体检测结果: ${item['ANALYZE_RESULT'] ?? ''}'), - ], ), const SizedBox(height: 6), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_test_page.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_test_page.dart index 2db6c84..0d02b18 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_test_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_test_page.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; @@ -14,7 +15,8 @@ import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; class ElectricityGasTestPage extends StatefulWidget { - const ElectricityGasTestPage({Key? key, required this.ELECTRICITY_ID}) : super(key: key); + const ElectricityGasTestPage({Key? key, required this.ELECTRICITY_ID}) + : super(key: key); final String ELECTRICITY_ID; @@ -29,6 +31,28 @@ class _ElectricityGasTestPageState extends State { final TextEditingController _pointController = TextEditingController(); final TextEditingController _resultController = TextEditingController(); bool _loading = false; + late Map pd = {}; + List> GAS_TYPE_LIST = [ + {"NAME": "有毒", "VALUE": "1"}, + {"NAME": "可燃", "VALUE": "2"}, + {"NAME": "氧气", "VALUE": "3"}, + ]; + List> RESULTS_UNIT_LIST = [ + {"NAME": "%", "VALUE": "1"}, + {"NAME": "ppm", "VALUE": "2"}, + {"NAME": "mg/m³", "VALUE": "3"}, + ]; + List> rules = [ + {'name': 'GAS_TYPE', 'message': '请选择气体类型'}, + {'name': 'GAS_NAME', 'message': '请输入气体名称'}, + {'name': 'UPPER_LIMIT', 'message': '请输入量程上限'}, + {'name': 'LOWER_LIMIT', 'message': '请输入量程下限'}, + {'name': 'GAS_UNIT', 'message': '请输入计量单位'}, + {'name': 'GAS_VALUE', 'message': '请输入检测值'}, + {'name': 'ANALYZE_TIME', 'message': '请输入分析时间'}, + {'name': 'ANALYZE_PLACE', 'message': '请输入分析点'}, + {'name': 'ANALYZE_RESULT', 'message': '请输入分析结果'}, + ]; @override void initState() { @@ -51,70 +75,70 @@ class _ElectricityGasTestPageState extends State { MaterialPageRoute(builder: (context) => MineSignPage()), ); await NativeOrientation.setPortrait(); -if (path != null) { + if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } Widget _signListWidget() { return Column( - children: imagePaths.map((path) { - return Column( - children: [ - const SizedBox(height: 10), - const Divider(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: + imagePaths.map((path) { + return Column( children: [ - GestureDetector( - child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain - ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - maxHeight: 150, - ), - child: Image.file( - File(path), - // 改为完整显示 - fit: BoxFit.contain, - ), - ), - onTap: () { - presentOpaque( - SingleImageViewer(imageUrl: path), - context, - ); - }, - ), - Column( + const SizedBox(height: 10), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - padding: const EdgeInsets.only(right: 5), - child: CustomButton( - text: 'X', - height: 30, - padding: const EdgeInsets.symmetric(horizontal: 10), - backgroundColor: Colors.red, - onPressed: () { - setState(() { - imagePaths.remove(path); - }); - }, + GestureDetector( + child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 200, + maxHeight: 150, + ), + child: Image.file( + File(path), + // 改为完整显示 + fit: BoxFit.contain, + ), ), + onTap: () { + presentOpaque( + SingleImageViewer(imageUrl: path), + context, + ); + }, + ), + Column( + children: [ + Container( + padding: const EdgeInsets.only(right: 5), + child: CustomButton( + text: 'X', + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 10), + backgroundColor: Colors.red, + onPressed: () { + setState(() { + imagePaths.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], ), - const SizedBox(height: 80), ], ), ], - ), - ], - ); - }).toList(), + ); + }).toList(), ); } @@ -124,8 +148,25 @@ if (path != null) { return; } if (status == 1) { - if (_selectData.isEmpty || _resultController.text.isEmpty || _pointController.text.isEmpty) { - ToastUtil.showNormal(context, '请完善所有字段'); + Map itemForm = { + 'ANALYZE_PLACE': _pointController.text, + 'ANALYZE_RESULT': _resultController.text, + 'ANALYZE_TIME': _selectData, + ...pd, + }; + bool required = true; + for (final r in rules) { + final name = r['name'] ?? ''; + final message = r['message'] ?? '请完善表单'; + final v = itemForm[name]; + if (v == null || v.toString().isEmpty || v.toString() == '请选择') { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, message); + required = false; + break; + } + } + if (!required) { return; } } @@ -157,21 +198,21 @@ if (path != null) { setState(() => _loading = true); final formData = { + ...pd, + 'ANALYZE_PLACE': _pointController.text, + 'ANALYZE_RESULT': _resultController.text, 'ELECTRICITY_ID': widget.ELECTRICITY_ID, 'ANALYZE_TIME': _selectData, 'ANALYZE_USER': SessionService.instance.username, - 'ANALYZE_PLACE': _pointController.text, - 'ANALYZE_RESULT': _resultController.text, - 'APPLY_STATUS': status, 'STEP_REASON': reasonText ?? '', - 'SIGNTIME':signTimes.join(','), + 'SIGNTIME': signTimes.join(','), 'CORPINFO_ID': SessionService.instance.corpinfoId, 'USER_ID': SessionService.instance.loginUserId, }; try { - await ApiService.saveGasTest('electricity',formData, imagePaths); + await ApiService.saveGasTest('electricity', formData, imagePaths); ToastUtil.showNormal(context, status == 1 ? '保存成功' : '作废成功'); Navigator.of(context).pop(status == 1); } catch (e) { @@ -181,96 +222,195 @@ if (path != null) { } } - Future setRequest() async { + /// 选择气体类型 + Future _chooseGasType() async { + final choice = await BottomPicker.show( + context, + items: GAS_TYPE_LIST.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + pd['GAS_TYPE_NAME'] = choice; + Map result = GAS_TYPE_LIST.firstWhere( + (item) => item['NAME'] == choice, + orElse: () => {}, // 避免找不到时报错 + ); + if (FormUtils.hasValue(result, 'VALUE')) { + pd['GAS_TYPE'] = result['VALUE']; + } + } + } + + /// 选择计量单位 + Future _chooseUnit() async { + final choice = await BottomPicker.show( + context, + items: RESULTS_UNIT_LIST.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + pd['GAS_UNIT'] = choice; + } } @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '气体检测'), - body: SafeArea(child: - _loading - ? const Center(child: CircularProgressIndicator()) - : SingleChildScrollView( - padding: const EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Container( - padding: const EdgeInsets.all(5), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10), - ), - child: Column( - children: [ - ItemListWidget.selectableLineTitleTextRightButton( - label: '分析时间', - isEditable: true, - text: _selectData, - onTap: _chooseDatePicker, - ), - - const Divider(), - ItemListWidget.singleLineTitleText( - label: '分析点:', - isEditable: true, - controller: _pointController, - ), - const Divider(), - - ItemListWidget.singleLineTitleText( - label: '可燃气体检测结果:', - isEditable: true, - controller: _resultController, - ), - const Divider(), - ItemListWidget.singleLineTitleText( - label: '分析人:', - isEditable: false, - text: SessionService.instance.username, - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - CustomButton( - text: '新增手写签字', - height: 40, - backgroundColor: Colors.blue, - onPressed: _sign, + appBar: MyAppbar(title: '气体检测'), + body: SafeArea( + child: + _loading + ? const Center(child: CircularProgressIndicator()) + : SingleChildScrollView( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: const EdgeInsets.all(5), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), ), - ], - ), - if (imagePaths.isNotEmpty) _signListWidget(), - ], + child: Column( + children: [ + ItemListWidget.selectableLineTitleTextRightButton( + label: '分析时间', + isEditable: true, + text: _selectData, + onTap: _chooseDatePicker, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '气体类型', + isEditable: true, + text: pd['GAS_TYPE_NAME'] ?? '请选择', + onTap: _chooseGasType, + ), + + const Divider(), + ItemListWidget.singleLineTitleText( + label: '代表性气体:', + hintText: '请输入代表性气体名称', + text: pd['GAS_NAME'] ?? '', + isEditable: true, + onChanged: (v) { + setState(() { + pd['GAS_NAME'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '上限:', + isEditable: true, + isNumericInput: true, + text: pd['UPPER_LIMIT'] ?? '', + hintText: '请输入量程上限,数字保留两位小数', + onChanged: (v) { + setState(() { + pd['UPPER_LIMIT'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '下限:', + isEditable: true, + isNumericInput: true, + text: pd['LOWER_LIMIT'] ?? '', + hintText: '请输入量程下限,数字保留两位小数', + onChanged: (v) { + setState(() { + pd['LOWER_LIMIT'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '检测值:', + isEditable: true, + isNumericInput: true, + hintText: '请输入检测值,数字保留两位小数', + text: pd['GAS_VALUE'] ?? '', + onChanged: (v) { + setState(() { + pd['GAS_VALUE'] = v; + }); + }, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '分析点:', + isEditable: true, + controller: _pointController, + ), + const Divider(), + + ItemListWidget.singleLineTitleText( + label: '可燃气体检测结果:', + hintText: '请输入可燃气体检测结果,数字保留两位小数', + isNumericInput: true, + isEditable: true, + controller: _resultController, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '计量单位', + isEditable: true, + text: pd['GAS_UNIT'] ?? '请选择', + onTap: _chooseUnit, + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '分析人:', + isEditable: false, + text: SessionService.instance.username, + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + CustomButton( + text: '新增手写签字', + height: 40, + backgroundColor: Colors.blue, + onPressed: _sign, + ), + ], + ), + if (imagePaths.isNotEmpty) _signListWidget(), + ], + ), + ), + const SizedBox(height: 20), + Row( + children: [ + Expanded( + child: CustomButton( + text: '作废', + backgroundColor: Colors.red, + onPressed: () => _submit(-1), + ), + ), + const SizedBox(width: 20), + Expanded( + child: CustomButton( + text: '保存', + backgroundColor: Colors.blue, + onPressed: () => _submit(1), + ), + ), + ], + ), + ], + ), ), - ), - const SizedBox(height: 20), - Row( - children: [ - Expanded( - child: CustomButton( - text: '作废', - backgroundColor: Colors.red, - onPressed: () => _submit(-1), - ), - ), - const SizedBox(width: 20), - Expanded( - child: CustomButton( - text: '保存', - backgroundColor: Colors.blue, - onPressed: () => _submit(1), - ), - ), - ], - ), - ], - ), - ), - ) + ), ); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart index 3514e77..3b530a1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart @@ -175,7 +175,6 @@ class _ElectricitySetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart index 7e0e48c..f84e72e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart @@ -61,7 +61,6 @@ class _ElectricityYddwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart index 4d5122c..560f86e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart @@ -57,7 +57,6 @@ if (path != null) { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart index 96375ed..cdcb7ae 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart @@ -97,7 +97,6 @@ class _ElectricityYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -376,7 +375,7 @@ class _ElectricityYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart index 0f40940..f739c5c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart @@ -61,7 +61,6 @@ class _ElectricityZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart index 53e8a65..d80b8d6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart @@ -58,7 +58,6 @@ class _ElectricityZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart index 2128415..a4c6584 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart @@ -321,7 +321,7 @@ class _BlindboardDetailFormWidgetState }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -346,7 +346,7 @@ class _BlindboardDetailFormWidgetState }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart index 6daaed4..7368160 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart @@ -87,7 +87,6 @@ class _BlindboardSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -98,7 +97,6 @@ class _BlindboardSafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -340,7 +338,7 @@ class _BlindboardSafeFuncSureState extends State { // 更新状态、序号等 measures['STATUS'] = result['status'].toString(); index = result['index'] as int; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqjd_work_detail/blindboard_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqjd_work_detail/blindboard_aqjd_detail.dart index 7b01748..8bfa543 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqjd_work_detail/blindboard_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/aqjd_work_detail/blindboard_aqjd_detail.dart @@ -90,7 +90,6 @@ class _BlindboardAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart index 8f9b9d1..8dc7f90 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart @@ -216,8 +216,7 @@ class _BlindboardListPageState extends State { await pushPage(BlindboardKszyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); break; case '结束作业': - await pushPage(BlindboardJszyDetail(BLINDBOARD_ID: item['CUTROAD_ID'], flow: widget.flow), context); - + await pushPage(BlindboardJszyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); break; case '验收签字': await pushPage(BlindboardYsgdDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); @@ -334,7 +333,7 @@ class _BlindboardListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -348,14 +347,24 @@ class _BlindboardListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart index 3bc1841..2d9f0f3 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart @@ -73,7 +73,6 @@ class _BlindboardCjryDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jhr_work_detail/blindboard_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jhr_work_detail/blindboard_jhr_detail.dart index 333ae50..fb710c9 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jhr_work_detail/blindboard_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jhr_work_detail/blindboard_jhr_detail.dart @@ -63,7 +63,6 @@ class _BlindboardJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart index 4ae5391..ea86f9c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart @@ -62,7 +62,6 @@ class _BlindboardJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart index 01d32dc..938ee47 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart @@ -65,7 +65,6 @@ class _BlindboardJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart index a698637..b3418c4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart @@ -66,7 +66,6 @@ class _BlindboardKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart index da91c5d..1d97c48 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart @@ -155,7 +155,7 @@ class _BlindboardApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -178,7 +178,7 @@ class _BlindboardApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -190,17 +190,17 @@ class _BlindboardApplyDetailState extends State { ToastUtil.showNormal(context, '请选择作业区域'); return; } - Map mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); + final mapData = await pushPage(MapPage(gson: pd['POSITIONS']), context); setState(() { - pd['LONGITUDE'] = mapData['longitue']; - pd['LATITUDE'] = mapData['latitude']; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue']},${mapData['latitude']}'; + pd['LONGITUDE'] = mapData['longitue'] ?? ''; + pd['LATITUDE'] = mapData['latitude'] ?? ''; + pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); } /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -215,7 +215,7 @@ class _BlindboardApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } /// 获取摄像头列表 @@ -293,7 +293,7 @@ class _BlindboardApplyDetailState extends State { setState(() { pd['WORK_TYPE_NAME'] = choice; pd['WORK_TYPE'] = (levelList.indexOf(choice) + 1).toString(); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -344,7 +344,7 @@ class _BlindboardApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -363,7 +363,7 @@ class _BlindboardApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -379,7 +379,7 @@ class _BlindboardApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -417,7 +417,7 @@ class _BlindboardApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -502,7 +502,6 @@ class _BlindboardApplyDetailState extends State { String taskId = '13'; - pd['WORK_TYPE_NAME'] = levelList[int.parse(pd['WORK_TYPE'])]; pd['USER_ID'] = SessionService.instance.loginUserId; pd['STEP_ID'] = status; pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/shbm_work_detail/blindboard_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/shbm_work_detail/blindboard_shbm_detail.dart index 5ce39bc..bf66c9c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/shbm_work_detail/blindboard_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/shbm_work_detail/blindboard_shbm_detail.dart @@ -61,7 +61,6 @@ class _BlindboardShbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/spbm_work_detail/blindboard_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/spbm_work_detail/blindboard_spbm_detail.dart index 604e025..b9e865c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/spbm_work_detail/blindboard_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/spbm_work_detail/blindboard_spbm_detail.dart @@ -61,7 +61,6 @@ class _BlindboardSpbmDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart index d6fbdc6..0ed1532 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart @@ -176,7 +176,6 @@ class _BlindboardSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szdw_work_detail/blindboard_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szdw_work_detail/blindboard_szdw_detail.dart index 8696661..1740293 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szdw_work_detail/blindboard_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szdw_work_detail/blindboard_szdw_detail.dart @@ -62,7 +62,6 @@ class _BlindboardSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/ysgd_work_detail/blindboard_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/ysgd_work_detail/blindboard_ysgd_detail.dart index 2a4d751..a04e04a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/ysgd_work_detail/blindboard_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/ysgd_work_detail/blindboard_ysgd_detail.dart @@ -98,7 +98,6 @@ class _BlindboardYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -363,7 +362,7 @@ class _BlindboardYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyfz_work_detail/blindboard_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyfz_work_detail/blindboard_zyfz_detail.dart index 8032e98..d1709b5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyfz_work_detail/blindboard_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyfz_work_detail/blindboard_zyfz_detail.dart @@ -62,7 +62,6 @@ class _BlindboardZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyr_work_detail/blindboard_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyr_work_detail/blindboard_zyr_detail.dart index 9fd63f2..abbf472 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyr_work_detail/blindboard_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/zyr_work_detail/blindboard_zyr_detail.dart @@ -61,7 +61,6 @@ class _BlindboardZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart index 5db1e16..2797560 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart @@ -198,7 +198,7 @@ class _SpaceWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入关联的其他特殊作业及安全作业票编号', controller: widget.relatedController, @@ -223,7 +223,7 @@ class _SpaceWorkDetailFormWidgetState extends State { }, ), ); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }, hintText: '请输入风险辨识结果', controller: widget.riskController, @@ -340,7 +340,7 @@ class _SpaceWorkDetailFormWidgetState extends State { hintText: '', text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), - if (FormUtils.hasValue(pd, 'ANALYZE_TIME')) ...[ + if (FormUtils.hasValue(pd, 'ANALYZE_TIME') && !widget.isEditable) ...[ const Divider(), ItemListWidget.OneRowButtonTitleText( label: '分析人:', diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart index 55a0207..8f96d5e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart @@ -86,7 +86,6 @@ class _SpaceworkSafeFuncSureState extends State { /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); - FocusHelper.clearFocus(context); final path = await Navigator.push( context, MaterialPageRoute(builder: (context) => MineSignPage()), @@ -97,7 +96,6 @@ class _SpaceworkSafeFuncSureState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqgl_work_detail/spacework_aqgl_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqgl_work_detail/spacework_aqgl_detail.dart index e135603..0870127 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqgl_work_detail/spacework_aqgl_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqgl_work_detail/spacework_aqgl_detail.dart @@ -63,7 +63,6 @@ class _SpaceworkAqglDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqjd_work_detail/spacework_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqjd_work_detail/spacework_aqjd_detail.dart index 0ae9a14..4dd077a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqjd_work_detail/spacework_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqjd_work_detail/spacework_aqjd_detail.dart @@ -91,7 +91,6 @@ class _SpaceworkAqjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dbbz_work_detail/spacework_dbbz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dbbz_work_detail/spacework_dbbz_detail.dart index 9090497..41639b6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dbbz_work_detail/spacework_dbbz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dbbz_work_detail/spacework_dbbz_detail.dart @@ -64,7 +64,6 @@ class _SpaceworkDbbzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dhsp_work_detail/spacework_dhsp_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dhsp_work_detail/spacework_dhsp_detail.dart index 0ed9fb0..b6b0e36 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dhsp_work_detail/spacework_dhsp_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/dhsp_work_detail/spacework_dhsp_detail.dart @@ -62,7 +62,6 @@ class _SpaceworkDhspDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart index b0d91ff..1c27286 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart @@ -61,7 +61,6 @@ class _SpaceworkJhrDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jsjd_work_detail/spacework_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jsjd_work_detail/spacework_jsjd_detail.dart index b354fd9..a27c235 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jsjd_work_detail/spacework_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jsjd_work_detail/spacework_jsjd_detail.dart @@ -62,7 +62,6 @@ class _SpaceworkJsjdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart index b79a14c..1a6dc1d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart @@ -65,7 +65,6 @@ class _SpaceworkJszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart index b2c5bd1..f84bdcd 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart @@ -67,7 +67,6 @@ class _SpaceworkKszyDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart index 4831489..12f5f9e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart @@ -45,7 +45,7 @@ class _SpaceworkGasListState extends State { cancelText: '取消', ); if (ok) { - final result = await ApiService.workGasDelete('electricity',id); + final result = await ApiService.workGasDelete('confinedspace',id); if (result['result'] == 'success') { _getListData(); ToastUtil.showNormal(context, '删除成功'); @@ -54,8 +54,30 @@ class _SpaceworkGasListState extends State { } + Widget _gas_new_widget(Map pd,String type) { + return FormUtils.hasValue(widget.saveParams, 'GAS_NAME$type') ? + Column( + children: [ + const SizedBox(height: 6), - Widget _buildListItem(Map item) { + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('${widget.saveParams['GAS_NAME$type']}: ${pd['DATA$type'] ?? ''}'), + Text('计量单位: ${pd['GAS_UNIT$type'] ?? ''}'), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('上限: ${pd['UPPER_LIMIT$type'] ?? ''}'), + Text('下限: ${pd['LOWER_LIMIT$type'] ?? ''}'), + ], + ), + ], + ) : const SizedBox(height: 0,); + } + Widget _buildListItem(Map item) { final images = (item['SIGN_PATH'] as String?)?.split(',') ?? []; final baseImgPath = ApiService.baseImgPath; @@ -72,14 +94,20 @@ class _SpaceworkGasListState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('分析时间: ${item['ANALYZE_TIME'] ?? ''}'), - Text('代表性气体: ${item['ANALYZE_GAS'] ?? ''}'), + Text('分析部位: ${item['ANALYZE_PART'] ?? ''}'), ], ), + + _gas_new_widget(item, '1'), + _gas_new_widget(item, '2'), + _gas_new_widget(item, '3'), + _gas_new_widget(item, '4'), + const SizedBox(height: 6), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('分析数据: ${item['ANALYZE_RESULT'] ?? ''}'), + Text('含氧量: ${item['OXYGEN_CONTENT'] ?? ''}'), if ((item['ANALYZE_PLACE'] ?? '').toString().isNotEmpty) Text('分析地点: ${item['ANALYZE_PLACE']}'), ], diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_test_page.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_test_page.dart index 620f03e..89d4776 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_test_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_test_page.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart'; import 'package:flutter/material.dart'; @@ -38,18 +39,25 @@ class _SpaceworkGasTestPageState extends State { final TextEditingController _addressController = TextEditingController(); // 地点 - final TextEditingController _gas1Controller = TextEditingController(); // 地点 - final TextEditingController _gas2Controller = TextEditingController(); // 地点 - final TextEditingController _gas3Controller = TextEditingController(); // 地点 - final TextEditingController _gas4Controller = TextEditingController(); // 地点 - + List> RESULTS_UNIT_LIST = [ + {"NAME": "%", "VALUE": "1"}, + {"NAME": "ppm", "VALUE": "2"}, + {"NAME": "mg/m³", "VALUE": "3"}, + ]; + List> rules = [ + {'name': 'ANALYZE_TIME', 'message': '请输入取样分析时间'}, + {'name': 'ANALYZE_PART', 'message': '请输入分析部位'}, + {'name': 'OXYGEN_CONTENT', 'message': '请输入氧气含量'}, + {'name': 'ANALYZE_PLACE', 'message': '请输入分析地点'}, + ]; bool _loading = false; @override void initState() { - super.initState(); pd['ANALYZE_USER'] = SessionService.instance.username; pd['CONFINEDSPACE_ID'] = widget.CONFINEDSPACE_ID; + super.initState(); + } Future _chooseDatePicker() async { @@ -61,6 +69,16 @@ class _SpaceworkGasTestPageState extends State { }); } } + List> _gas_new_rules(String type) { + String name = widget.saveParams['GAS_NAME$type']; + return [ + {'name': 'DATA$type', 'message': '请输入$name的检测值'}, + {'name': 'UPPER_LIMIT$type', 'message': '请输入$name的上限'}, + {'name': 'LOWER_LIMIT$type', 'message': '请输入$name的下限'}, + {'name': 'GAS_UNIT$type', 'message': '请输入$name的计量单位'}, + ]; + } + Future _sign() async { await NativeOrientation.setLandscape(); @@ -69,12 +87,11 @@ class _SpaceworkGasTestPageState extends State { MaterialPageRoute(builder: (context) => MineSignPage()), ); await NativeOrientation.setPortrait(); -if (path != null) { + if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -153,8 +170,44 @@ if (path != null) { ToastUtil.showNormal(context, '请完善所有字段'); return; } + final itemForm = { + ...pd, + 'ANALYZE_PART': _PartController.text, + 'OXYGEN_CONTENT': _O2Controller.text, + 'ANALYZE_PLACE': _addressController.text, + }; + bool required = true; + List> rule = []; + if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME1')) { + rule.addAll(_gas_new_rules('1')); + } + if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME2')) { + rule.addAll(_gas_new_rules('2')); + } + if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME3')) { + rule.addAll(_gas_new_rules('3')); + } + if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME4')) { + rule.addAll(_gas_new_rules('4')); + } + rules.addAll(rule); + for (final r in rules) { + final name = r['name'] ?? ''; + final message = r['message'] ?? '请完善表单'; + final v = itemForm[name]; + if (v == null || v.toString().isEmpty || v.toString() == '请选择') { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, message); + required = false; + break; + } + } + if (!required) { + return; + } } + String reasonText = ''; if (status != 1) { reasonText = await CustomAlertDialog.showInput( @@ -162,43 +215,13 @@ if (path != null) { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); return; } } - if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME1')) { - if (_gas1Controller.text.trim().isEmpty) { - pd['DATA1'] = 0; - } else { - pd['DATA1'] = _gas1Controller.text; - } - } - if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME2')) { - if (_gas2Controller.text.trim().isEmpty) { - pd['DATA2'] = 0; - } else { - pd['DATA2'] = _gas2Controller.text; - } - } - if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME3')) { - if (_gas3Controller.text.trim().isEmpty) { - pd['DATA3'] = 0; - } else { - pd['DATA3'] = _gas3Controller.text; - } - } - if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME4')) { - if (_gas4Controller.text.trim().isEmpty) { - pd['DATA4'] = 0; - } else { - pd['DATA4'] = _gas4Controller.text; - } - } - - bool isConfirm = false; setState(() => _loading = true); @@ -224,7 +247,7 @@ if (path != null) { if (!confirmed) return; try { - await ApiService.saveGasTest('confinedspace',formData, imagePaths); + await ApiService.saveGasTest('confinedspace', formData, imagePaths); ToastUtil.showNormal(context, status == 1 ? '保存成功' : '作废成功'); Navigator.of(context).pop(status == 1); } catch (e) { @@ -234,7 +257,63 @@ if (path != null) { } } - Future setRequest() async {} + /// 选择计量单位 + Future _chooseUnit(String type) async { + final choice = await BottomPicker.show( + context, + items: RESULTS_UNIT_LIST.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + pd['GAS_UNIT$type'] = choice; + } + } + + Widget _gas_new_widget(String type) { + return Column( + children: [ + // const Divider(), + ItemListWidget.singleLineTitleText( + label: '上限:', + isEditable: true, + isNumericInput: true, + text: pd['UPPER_LIMIT$type'] ?? '', + hintText: '请输入量程上线,数字保留两位小数', + onChanged: (v) { + setState(() { + pd['UPPER_LIMIT$type'] = v; + }); + }, + ), + // const Divider(), + ItemListWidget.singleLineTitleText( + label: '下限:', + isNumericInput: true, + isEditable: true, + text: pd['LOWER_LIMIT$type'] ?? '', + hintText: '请输入量程下限,数字保留两位小数', + onChanged: (v) { + setState(() { + pd['LOWER_LIMIT$type'] = v; + }); + }, + ), + + const SizedBox(height: 2,), + ItemListWidget.selectableLineTitleTextRightButton( + label: '计量单位', + isEditable: true, + text: pd['GAS_UNIT$type'] ?? '请选择', + onTap: () { + _chooseUnit(type); + }, + ), + const Divider(), + + ], + ); + } @override Widget build(BuildContext context) { @@ -265,12 +344,18 @@ if (path != null) { children: [ ItemListWidget.singleLineTitleText( label: '${widget.saveParams['GAS_NAME1']}:', + hintText: '请输入检测值,数字保留两位小数', isEditable: true, - isRequired: false, + isNumericInput: true, + isRequired: true, strongRequired: false, - controller: _gas1Controller, + onChanged: (v) { + setState(() { + pd['DATA1'] = v; + }); + } ), - const Divider(), + _gas_new_widget('1'), ], ), if (FormUtils.hasValue( @@ -282,11 +367,17 @@ if (path != null) { ItemListWidget.singleLineTitleText( label: '${widget.saveParams['GAS_NAME2']}:', isEditable: true, - isRequired: false, + hintText: '请输入检测值,数字保留两位小数', + isNumericInput: true, + isRequired: true, strongRequired: false, - controller: _gas2Controller, + onChanged: (v) { + setState(() { + pd['DATA2'] = v; + }); + } ), - const Divider(), + _gas_new_widget('2'), ], ), if (FormUtils.hasValue( @@ -298,11 +389,17 @@ if (path != null) { ItemListWidget.singleLineTitleText( label: '${widget.saveParams['GAS_NAME3']}:', isEditable: true, - isRequired: false, + hintText: '请输入检测值,数字保留两位小数', + isNumericInput: true, + isRequired: true, strongRequired: false, - controller: _gas3Controller, + onChanged: (v) { + setState(() { + pd['DATA3'] = v; + }); + } ), - const Divider(), + _gas_new_widget('3'), ], ), if (FormUtils.hasValue( @@ -313,12 +410,18 @@ if (path != null) { children: [ ItemListWidget.singleLineTitleText( label: '${widget.saveParams['GAS_NAME4']}:', + isNumericInput: true, + hintText: '请输入检测值,数字保留两位小数', isEditable: true, - isRequired: false, + isRequired: true, strongRequired: false, - controller: _gas4Controller, + onChanged: (v) { + setState(() { + pd['DATA4'] = v; + }); + } ), - const Divider(), + _gas_new_widget('4'), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart index 1abf650..2eda2cd 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart @@ -157,7 +157,7 @@ class _SpaceworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { pd['VIDEOMANAGER_ID'] = result['VIDEOMANAGER_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -181,7 +181,7 @@ class _SpaceworkApplyDetailState extends State { if (FormUtils.hasValue(result, 'UNITS_ID')) { pd['UNITS_ID'] = result['UNITS_ID']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -207,7 +207,7 @@ class _SpaceworkApplyDetailState extends State { /// 作业区域 Future _getWorkArea() async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -222,7 +222,7 @@ class _SpaceworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -303,7 +303,7 @@ class _SpaceworkApplyDetailState extends State { // 用户点击确定并选择了 choice setState(() { pd['WORK_LEVEL'] = choice; - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } @@ -354,7 +354,7 @@ class _SpaceworkApplyDetailState extends State { /// 弹出单位选择 void chooseUnitHandle(EditUserType type) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); showModalBottomSheet( context: context, isScrollControlled: true, @@ -373,7 +373,7 @@ class _SpaceworkApplyDetailState extends State { }, ), ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -389,7 +389,7 @@ class _SpaceworkApplyDetailState extends State { /// 弹出人员选择,需先选择单位 void choosePersonHandle(EditUserType type) async { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); String unitId = get_pd_DEPARTMENT_ID(type); final personList = _personCache[type] ?? []; @@ -428,7 +428,7 @@ class _SpaceworkApplyDetailState extends State { }); }, ).then((_) { - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } @@ -598,7 +598,7 @@ class _SpaceworkApplyDetailState extends State { pd['LIMITSPACE_NUMBER'] = result['NUMBER']; _spaceNumberController.text = pd['LIMITSPACE_NUMBER']; } - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart index b9564cf..a3fac0a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart @@ -428,7 +428,7 @@ class _SpaceworkListPageState extends State { children: [ Text( "编号: ${item['CHECK_NO'] ?? ''}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -445,23 +445,41 @@ class _SpaceworkListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"), - Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), + Expanded(child: Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), + Expanded(child: Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), - Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), + Expanded(child: Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}",softWrap: true, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), + Expanded(child: Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}",softWrap: true, + textAlign: TextAlign.right, + maxLines: null, // 不限制行数 + overflow: TextOverflow.visible,) + ), ], ), const SizedBox(height: 8), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart index bf71b51..28b123d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart @@ -175,7 +175,6 @@ class _SpaceworkSetSafeDetailState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szdw_work_detail/spacework_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szdw_work_detail/spacework_szdw_detail.dart index da8e666..eb41a2a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szdw_work_detail/spacework_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szdw_work_detail/spacework_szdw_detail.dart @@ -62,7 +62,6 @@ class _SpaceworkSzdwDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/ysgd_work_detail/spacework_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/ysgd_work_detail/spacework_ysgd_detail.dart index ad08b1e..e1cf97c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/ysgd_work_detail/spacework_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/ysgd_work_detail/spacework_ysgd_detail.dart @@ -98,7 +98,6 @@ class _SpaceworkYsgdDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } @@ -380,7 +379,7 @@ class _SpaceworkYsgdDetailState extends State { 'yyyy-MM-dd HH:mm:ss', ).format(picked); }); - FocusHelper.clearFocus(context); + //FocusHelper.clearFocus(context); } }, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyfz_work_detail/spacework_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyfz_work_detail/spacework_zyfz_detail.dart index 6ab5535..6cf54a1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyfz_work_detail/spacework_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyfz_work_detail/spacework_zyfz_detail.dart @@ -61,7 +61,6 @@ class _SpaceworkZyfzDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyr_work_detail/spacework_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyr_work_detail/spacework_zyr_detail.dart index 5184d28..d51eca8 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyr_work_detail/spacework_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/zyr_work_detail/spacework_zyr_detail.dart @@ -61,7 +61,6 @@ class _SpaceworkZyrDetailState extends State { setState(() { signImages.add(path); signTimes.add(now); - FocusHelper.clearFocus(context); }); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/work_area_helper.dart b/lib/pages/home/tap/tabList/special_wrok/work_area_helper.dart index fa54217..07af1f0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/work_area_helper.dart +++ b/lib/pages/home/tap/tabList/special_wrok/work_area_helper.dart @@ -2,7 +2,9 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/services/location_service.dart'; import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/tools/coord_convert.dart'; import 'package:qhd_prevention/tools/tools.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class WorkAreaHelper { /// 检查是否需要并且能否在作业区域内继续 @@ -10,7 +12,7 @@ class WorkAreaHelper { required BuildContext context, required String flow, required String areaId, - bool checkTapConfig = true, + bool checkTapConfig = false, Duration timeout = const Duration(seconds: 10), }) async { // 如果是提交申请 或 配置关闭,则直接允许 @@ -19,15 +21,16 @@ class WorkAreaHelper { } try { LoadingDialogHelper.show(); - + await fetchAndSaveBd09(context); // 获取经纬度(字符串形式) - final LocationResult loc = - await LocationService.getCurrentLocation(timeout: timeout); + final prefs = await SharedPreferences.getInstance(); + String latitude = prefs.getString('wgs84_lat') ?? ''; + String longitude = prefs.getString('wgs84_lon') ?? ''; // 调用后端检查 final result = await ApiService.checkSpecialWorkIsInPls( areaId ?? '', - loc.longitude, - loc.latitude, + longitude, + latitude, ); if (result != null && diff --git a/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart b/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart index 1914974..5e7cc5c 100644 --- a/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart +++ b/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart @@ -113,7 +113,8 @@ class _WorkTabMbcdListState extends State { case 8: title = '作业负责人签字'; break; case 9: title = '所在单位签字'; break; case 10: title = '开始作业'; break; - case 11: title = '验收签字'; break; + case 11: title = '结束作业'; break; + case 12: title = '验收签字'; break; default: print("按钮 $index 被点击"); diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 6a73380..dfd0300 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -52,10 +52,18 @@ class _LoginPageState extends State { @override void initState() { - // TODO: implement initState super.initState(); + _phoneController.addListener(_onTextChanged); _checkUpdata(); } + void dispose() { + _phoneController.removeListener(_onTextChanged); + _phoneController.dispose(); + super.dispose(); + } + void _onTextChanged() { + setState(() {}); // 文本变化时刷新UI + } Future _checkUpdata() async { final result = await AuthService.checkUpdate(); @@ -133,12 +141,14 @@ class _LoginPageState extends State { // return '请输入有效的手机号'; return null; }, + suffixIcon: _phoneController.text.isEmpty + ? const SizedBox(height: 20,) + : IconButton( + icon: Icon(Icons.cancel, size: 20,color: Colors.white,), + onPressed: () => _phoneController.clear(), + ), ), - const Divider( - height: 1, - thickness: 1, - color: Colors.white70, - ), + _buildInputSection( label: "密码", controller: _passwordController, @@ -161,11 +171,7 @@ class _LoginPageState extends State { return null; }, ), - const Divider( - height: 1, - thickness: 1, - color: Colors.white70, - ), + const SizedBox(height: 30), if (_errorMessage.isNotEmpty) Padding( @@ -305,7 +311,7 @@ class _LoginPageState extends State { color: Colors.white, ), ), - const SizedBox(height: 15), + const SizedBox(height: 0), TextFormField( controller: controller, obscureText: obscureText, @@ -321,6 +327,11 @@ class _LoginPageState extends State { ), style: const TextStyle(color: Colors.white), ), + const Divider( + height: 1, + thickness: 1, + color: Colors.white70, + ), ], ), ); diff --git a/lib/pages/mine/mine_sign_page.dart b/lib/pages/mine/mine_sign_page.dart index a18ec84..2250f83 100644 --- a/lib/pages/mine/mine_sign_page.dart +++ b/lib/pages/mine/mine_sign_page.dart @@ -6,6 +6,7 @@ import 'dart:ui' as ui; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/tools/tools.dart'; class MineSignPage extends StatelessWidget { @@ -43,9 +44,7 @@ class _SignatureConfirmPageState extends State { void _confirmSignature() { if (!_hasSignature) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('请先签名')), - ); + ToastUtil.showNormal(context, '请先签名'); return; } diff --git a/lib/tools/coord_convert.dart b/lib/tools/coord_convert.dart index 98cd0ef..2f76c9a 100644 --- a/lib/tools/coord_convert.dart +++ b/lib/tools/coord_convert.dart @@ -76,9 +76,9 @@ List wgs84ToBd09(double lat, double lon) { /// 定位请求超时时间(可根据需要调整) const Duration _locationTimeout = Duration(seconds: 10); -/// 获取 BD09 坐标(包含权限检查与多种后备方案) -/// 返回 [bdLat, bdLon] -Future> getBd09FromGeolocator({ +/// ============ 新增:获取 Position(带权限/超时/后备策略) ============ +/// 返回 Position(WGS84) +Future getPositionFromGeolocator({ LocationAccuracy accuracy = LocationAccuracy.high, }) async { // 1. 权限检查与请求(先请求权限) @@ -120,7 +120,6 @@ Future> getBd09FromGeolocator({ position = null; } } - // 5. 后备:在 Android 上尝试 forceAndroidLocationManager(某些设备/厂商兼容性问题) if (position == null) { try { @@ -138,9 +137,16 @@ Future> getBd09FromGeolocator({ throw Exception('无法获取位置信息,请检查设备定位设置或权限'); } - // 7. 转换 WGS84 -> BD09 并返回 [bdLat, bdLon] - final bd = wgs84ToBd09(position.latitude, position.longitude); - return bd; + return position; +} + +/// 获取 BD09 坐标(保持向后兼容:仍然返回 [bdLat, bdLon]) +/// 内部改为调用 getPositionFromGeolocator 并转换 +Future> getBd09FromGeolocator({ + LocationAccuracy accuracy = LocationAccuracy.high, +}) async { + final pos = await getPositionFromGeolocator(accuracy: accuracy); + return wgs84ToBd09(pos.latitude, pos.longitude); } /// ============ 错误提示(中文映射) ============ @@ -162,25 +168,88 @@ String _mapExceptionToChineseMessage(Object e) { // 默认返回空字符串,调用方根据空串决定是否显示 return '定位失败:${msg.replaceAll('Exception: ', '')}'; } +/// 点位数组计算中心点 +Map geographicCentroid(List points) { + if (points.isEmpty) { + throw ArgumentError('points 不能为空'); + } + double x = 0.0, y = 0.0, z = 0.0; + double altSum = 0.0; + int altCount = 0; + + for (var p in points) { + final lon = p[0]; + final lat = p[1]; + + final latR = lat * pi / 180.0; + final lonR = lon * pi / 180.0; + + final cx = cos(latR) * cos(lonR); + final cy = cos(latR) * sin(lonR); + final cz = sin(latR); + + x += cx; + y += cy; + z += cz; + + if (p.length > 2 && p[2] != null) { + altSum += p[2]; + altCount++; + } + } + + final cnt = points.length.toDouble(); + x /= cnt; + y /= cnt; + z /= cnt; + + final hyp = sqrt(x * x + y * y); + final centroidLat = atan2(z, hyp) * 180.0 / pi; + final centroidLon = atan2(y, x) * 180.0 / pi; + + final result = { + 'lon': centroidLon, + 'lat': centroidLat, + }; + + if (altCount > 0) { + result['alt'] = altSum / altCount; + } + + return result; +} /// ============ 主业务方法:获取并保存 BD09(同时处理 UI 提示/引导) ============ -/// 调用示例: await fetchAndSaveBd09(context); +/// 现在会同时保存:WGS84(原始) / GCJ02 / BD09,以及保存时间戳(bd_saved_at) Future fetchAndSaveBd09(BuildContext context) async { - // 显示 loading(若你项目有 LoadingDialogHelper 也可替换为它) - // 注意:若外层已显示 loading,请不要重复显示 try { + // 获取原始位置(WGS84) + final Position position = await getPositionFromGeolocator(); - // 获取 BD09 坐标(包含权限请求、可能弹系统权限对话) - final List bd = await getBd09FromGeolocator(); - final bdLat = bd[0]; - final bdLon = bd[1]; + final double wgsLat = position.latitude; + final double wgsLon = position.longitude; - // 保存到 SharedPreferences(以字符串保存,便于后续读取) + // 计算 GCJ02(在中国境内会偏移,否则返回原始) + final gcj = wgs84ToGcj02(wgsLat, wgsLon); + final double gcjLat = gcj[0]; + final double gcjLon = gcj[1]; + + // 计算 BD09 + final bd = gcj02ToBd09(gcjLat, gcjLon); + final double bdLat = bd[0]; + final double bdLon = bd[1]; + + // 保存到 SharedPreferences(同时保存原始 WGS84、GCJ02、BD09,以及保存时间) final prefs = await SharedPreferences.getInstance(); + await prefs.setString('wgs84_lat', wgsLat.toString()); + await prefs.setString('wgs84_lon', wgsLon.toString()); + await prefs.setString('gcj02_lat', gcjLat.toString()); + await prefs.setString('gcj02_lon', gcjLon.toString()); await prefs.setString('bd_lat', bdLat.toString()); await prefs.setString('bd_lon', bdLon.toString()); + await prefs.setInt('bd_saved_at', DateTime.now().millisecondsSinceEpoch); - // 成功提示 + // 成功提示(按需开启) // ToastUtil.showNormal(context, '定位成功:$bdLat, $bdLon'); } on Exception catch (e) { final msg = e.toString(); @@ -224,6 +293,6 @@ Future fetchAndSaveBd09(BuildContext context) async { // 捕获任何未预期异常 // ToastUtil.showError(context, '发生未知错误:${e.toString()}'); } finally { - + // 如需隐藏 loading 可在此处处理 } } diff --git a/lib/tools/tools.dart b/lib/tools/tools.dart index 1d315ed..2334d17 100644 --- a/lib/tools/tools.dart +++ b/lib/tools/tools.dart @@ -55,10 +55,15 @@ class FocusHelper { static final FocusNode _emptyNode = FocusNode(); /// 延迟一帧后再移交焦点,避免不生效的问题 static void clearFocus(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback((_) async { - FocusScope.of(context).requestFocus(_emptyNode); - await SystemChannels.textInput.invokeMethod('TextInput.hide'); - }); + try{ + WidgetsBinding.instance.addPostFrameCallback((_) async { + FocusScope.of(context).requestFocus(_emptyNode); + await SystemChannels.textInput.invokeMethod('TextInput.hide'); + }); + }catch(w) { + + } + } } diff --git a/pubspec.lock b/pubspec.lock index 82ef6a8..2435aa2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: e4aca5bccaf897b70cac87e5fdd789393310985202442837922fd40325e2733b + sha256: "951ef122d01ebba68b7a54bfe294e8b25585635a90465c311b2f875ae72c412f" url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.9.21+1" + version: "0.9.21+2" camera_platform_interface: dependency: transitive description: @@ -209,6 +209,22 @@ packages: url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.7.11" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "7.0.3" dio: dependency: "direct main" description: @@ -1346,6 +1362,14 @@ packages: url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.14.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "2.1.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 23941a9..1c7d5d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.1.2+3 +version: 2.1.2+5 environment: sdk: ^3.7.0 @@ -61,6 +61,7 @@ dependencies: mobile_scanner: ^7.0.1 #系统权限 permission_handler: ^12.0.1 + device_info_plus: ^11.5.0 # 相册 image_picker: ^1.1.2 wechat_assets_picker: ^9.5.1