From 72c9e8c00d43c217ba955b698c2df3856134644e Mon Sep 17 00:00:00 2001 From: hs <873121290@qq.com> Date: Mon, 11 Aug 2025 17:40:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AB=E9=A1=B9=E4=BD=9C=E4=B8=9A=E7=BF=BB?= =?UTF-8?q?=E7=89=88=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/customWidget/ItemWidgetFactory.dart | 9 +- lib/customWidget/photo_picker_row.dart | 10 +- lib/http/ApiService.dart | 1 + lib/main.dart | 22 +- lib/pages/home/tap/item_list_widget.dart | 109 ++++- .../special_wrok/MeasuresListWidget.dart | 3 +- .../qtfx_work_detail/hotwork_gas_list.dart | 2 +- .../dl_work/CutroadDetailFormWidget.dart | 259 ++++++++-- .../dl_work/CutroadFormBaseWork.dart | 5 +- .../dl_work/cutroad_list_page.dart | 63 ++- .../dl_work_detai/cutroad_apply_detail.dart | 105 +--- .../jhr_work_detail/cutroad_jhr_detail.dart | 1 + .../kszy_work_detail/cutroad_kszy_detail.dart | 1 - .../shbm_work_detail/cutroad_shbm_detail.dart | 8 +- .../zyr_work_detail/cutroad_zyr_detail.dart | 74 ++- .../hoistwork_kszy_detail.dart | 1 - .../highwork_kszy_detail.dart | 1 - .../ElectricityDetailFormWidget.dart | 116 +++-- .../lsyd_work/SpecialWorkFormBaseWork.dart | 3 +- .../electricity_safe_func_sure.dart | 4 +- .../electricity_aqjd_detail.dart | 2 +- .../electricity_dbbz_detail.dart | 2 +- .../lsyd_work/electricity_list_page.dart | 243 ++++++---- .../electricity_jhr_detail.dart | 4 +- .../electricity_jsjd_detail.dart | 2 +- .../electricity_jszy_detail.dart | 2 +- .../electricity_kszy_detail.dart | 2 +- .../electricity_apply_detail.dart | 357 +++++++------- .../electricity_psdw_detail.dart} | 18 +- .../electricity_gas_edit.dart | 272 ----------- .../electricity_gas_list.dart | 24 +- .../electricity_gas_test_page.dart | 453 +++++++----------- .../szaq_work_detail/SafeFunctionDialog.dart | 1 + .../electricity_set_safe_detail.dart | 6 +- .../electricity_yddw_detail.dart} | 20 +- .../electricity_ydr_detail.dart | 321 +++++++++++++ .../electricity_ysgd_detail.dart | 2 +- .../electricity_zyfz_detail.dart | 2 +- .../electricity_zyr_detail.dart | 308 ++++++++++++ .../mbcd_work/BlindboardDetailFormWidget.dart | 303 +++++++++--- .../mbcd_work/BlindboardFormBaseWork.dart | 4 + .../blindboard_safe_func_sure.dart | 4 + .../blindboard_aqjd_detail.dart | 7 +- .../mbcd_work/blindboard_list_page.dart | 37 +- .../blindboard_cjry_detail.dart | 371 ++++++++++++++ .../blindboard_jhr_detail.dart | 4 +- .../blindboard_jsjd_detail.dart | 7 +- .../blindboard_jszy_detail.dart | 7 +- .../blindboard_kszy_detail.dart | 8 +- .../blindboard_apply_detail.dart | 249 +++++----- .../blindboard_shbm_detail.dart | 7 +- .../blindboard_spbm_detail.dart | 25 +- .../blindboard_set_safe_detail.dart | 4 + .../blindboard_szdw_detail.dart | 7 +- .../blindboard_ysgd_detail.dart | 59 ++- .../blindboard_zyfz_detail.dart | 7 +- .../blindboard_zyr_detail.dart | 7 +- .../qtfx_work_detail/spacework_gas_list.dart | 2 +- .../home/tap/tabList/work_tab_dl_list.dart | 40 +- .../home/tap/tabList/work_tab_lsyd_list.dart | 13 +- .../home/tap/tabList/work_tab_mbcd_list.dart | 3 +- lib/pages/notif/notif_page.dart | 5 +- 62 files changed, 2602 insertions(+), 1416 deletions(-) rename lib/pages/home/tap/tabList/special_wrok/lsyd_work/{aqgl_work_detail/electricity_aqgl_detail.dart => psdw_work_detail/electricity_psdw_detail.dart} (95%) delete mode 100644 lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_edit.dart rename lib/pages/home/tap/tabList/special_wrok/lsyd_work/{szdw_work_detail/electricity_szdw_detail.dart => yddw_work_detail/electricity_yddw_detail.dart} (95%) create mode 100644 lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart create mode 100644 lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart create mode 100644 lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart diff --git a/lib/customWidget/ItemWidgetFactory.dart b/lib/customWidget/ItemWidgetFactory.dart index 313a42d..5e869b9 100644 --- a/lib/customWidget/ItemWidgetFactory.dart +++ b/lib/customWidget/ItemWidgetFactory.dart @@ -247,8 +247,8 @@ class ListItemFactory { /// YesNo static Widget createYesNoSection({ required String title, - required String yesLabel, - required String noLabel, + String yesLabel = '是', + String noLabel = '否', required bool groupValue, required ValueChanged onChanged, double verticalPadding = 15, @@ -313,14 +313,15 @@ class ListItemFactory { } /// 列表标题头(蓝色标识+文字) - static Widget createBuildSimpleSection(String title) { + static Widget createBuildSimpleSection(String title, {double horPadding = 10}) { + return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + padding: EdgeInsets.symmetric(horizontal: horPadding, vertical: 10), child: Row( children: [ Container(width: 3, height: 15, color: Colors.blue), diff --git a/lib/customWidget/photo_picker_row.dart b/lib/customWidget/photo_picker_row.dart index e6ab251..43f55f6 100644 --- a/lib/customWidget/photo_picker_row.dart +++ b/lib/customWidget/photo_picker_row.dart @@ -61,10 +61,12 @@ class _MediaPickerGridState extends State { Future _showPickerOptions() async { showModalBottomSheet( context: context, + backgroundColor: Colors.white, builder: (_) => SafeArea( child: Wrap( children: [ ListTile( + titleAlignment: ListTileTitleAlignment.center, leading: Icon( widget.mediaType == MediaType.image ? Icons.camera_alt @@ -79,6 +81,8 @@ class _MediaPickerGridState extends State { }, ), ListTile( + titleAlignment: ListTileTitleAlignment.center, + leading: Icon( widget.mediaType == MediaType.image ? Icons.photo_library @@ -95,6 +99,8 @@ class _MediaPickerGridState extends State { }, ), ListTile( + titleAlignment: ListTileTitleAlignment.center, + leading: const Icon(Icons.close), title: const Text('取消'), onTap: () => Navigator.of(context).pop(), @@ -212,7 +218,7 @@ class _MediaPickerGridState extends State { ), Positioned( top: -15, - right: -10, + right: -15, child: IconButton( icon: const Icon(Icons.cancel, size: 20, color: Colors.red), onPressed: () => _removeMedia(index), @@ -263,7 +269,7 @@ class RepairedPhotoSection extends StatefulWidget { this.isShowAI = false, required this.onChanged, required this.onAiIdentify, - this.horizontalPadding = 10, + this.horizontalPadding = 5, this.onMediaAdded, this.onMediaRemoved, this.isRequired = false, diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart index 161411f..bbd44f2 100644 --- a/lib/http/ApiService.dart +++ b/lib/http/ApiService.dart @@ -679,6 +679,7 @@ U6Hzm1ninpWeE+awIDAQAB }, ); } + /// 所有签名列表 static Future> listSignFinished(String workType,String hotworkId) { // 根据 workType 生成对应的字段名,比如 'hotwork' -> 'HOTWORK_ID' final idKey = '${workType.toUpperCase()}_ID'; diff --git a/lib/main.dart b/lib/main.dart index 57552a7..2211da6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,18 +31,18 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化 EasyLoading + // 配置 EasyLoading 全局实例 EasyLoading.instance - ..displayDuration = const Duration(milliseconds: 2000) - ..indicatorType = EasyLoadingIndicatorType.fadingCircle - ..loadingStyle = EasyLoadingStyle.dark - ..indicatorSize = 45.0 - ..radius = 10.0 - ..progressColor = Colors.blue - ..backgroundColor = Colors.black.withOpacity(0.7) - ..indicatorColor = Colors.blue - ..textColor = Colors.white - ..maskColor = Colors.black.withOpacity(0.3) - ..userInteractions = false + ..displayDuration = const Duration(seconds: 20) + ..indicatorType = EasyLoadingIndicatorType.ring // 使用环形指示器 + ..loadingStyle = EasyLoadingStyle.custom // 必须使用自定义样式 + ..indicatorSize = 36.0 // 接近系统默认大小 + ..radius = 0 // 无圆角 + ..progressColor = Colors.blue // 进度条颜色为系统蓝色 + ..backgroundColor = Colors.grey.shade100 + ..indicatorColor = Colors.blue // 指示器颜色为系统蓝色 + ..textColor = Colors.black // 隐藏文字 + ..userInteractions = false // 允许用户交互(系统指示器不阻止交互) ..dismissOnTap = false; await initializeDateFormatting('zh_CN', null); diff --git a/lib/pages/home/tap/item_list_widget.dart b/lib/pages/home/tap/item_list_widget.dart index cd13fa2..16fcef7 100644 --- a/lib/pages/home/tap/item_list_widget.dart +++ b/lib/pages/home/tap/item_list_widget.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; 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'; class ItemListWidget { static const Color detailtextColor = Colors.black54; @@ -19,8 +20,10 @@ class ItemListWidget { String hintText = '请输入', double fontSize = 15, // 字体大小 bool isRequired = true, - bool strongRequired = false, /// 强制必选 不受是否可以编译和是否必选影响 + bool strongRequired = false, + ValueChanged? onChanged, + /// 强制必选 不受是否可以编译和是否必选影响 TextInputType keyboardType = TextInputType.text, }) { return Container( @@ -50,6 +53,7 @@ class ItemListWidget { child: TextField( autofocus: false, controller: controller, + onChanged: onChanged, // <--- 直接回传实时值 keyboardType: keyboardType, style: TextStyle(fontSize: fontSize), maxLines: 1, @@ -152,8 +156,7 @@ class ItemListWidget { bool isClean = false, VoidCallback? onTapClean, // 清除回调 bool isRequired = true, - String cleanText = '清除' - + String cleanText = '清除', }) { return InkWell( onTap: isEditable ? onTap : null, @@ -184,7 +187,8 @@ class ItemListWidget { padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0), textStyle: TextStyle(fontSize: 11, color: Colors.white), borderRadius: 10, - backgroundColor: cleanText == '清除' ? Colors.red : Colors.green, + backgroundColor: + cleanText == '清除' ? Colors.red : Colors.green, onPressed: onTapClean, ), SizedBox(height: 20), @@ -269,10 +273,17 @@ class ItemListWidget { CustomButton( text: cleanText, height: 20, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0), - textStyle: TextStyle(fontSize: 11, color: Colors.white), + padding: EdgeInsets.symmetric( + horizontal: 10, + vertical: 0, + ), + textStyle: TextStyle( + fontSize: 11, + color: Colors.white, + ), borderRadius: 10, - backgroundColor: cleanText == '清除' ? Colors.red : Colors.green, + backgroundColor: + cleanText == '清除' ? Colors.red : Colors.green, onPressed: onTapClean, ), SizedBox(height: 20), @@ -292,7 +303,6 @@ class ItemListWidget { ), ), ), - ], ), ), @@ -302,7 +312,6 @@ class ItemListWidget { ); } - /// 两行垂直布局: /// 第一行:可点击选择(带箭头)或仅显示标题 /// 第二行:多行输入框或多行文本展示 @@ -541,7 +550,7 @@ class ItemListWidget { static Widget OneRowButtonTitle({ required String label, // 标题 required String buttonText, // 按钮文字 - required VoidCallback? onTap, // 第一行点击回调 + required VoidCallback onTap, // 第一行点击回调 double fontSize = 15, // 字体大小 Color btnColor = Colors.blue, bool isRequired = false, @@ -602,10 +611,11 @@ class ItemListWidget { ), GestureDetector( onTap: () { - if (imgPath.isNotEmpty) + if (imgPath.isNotEmpty) { SingleImageViewer( imageUrl: '${ApiService.baseImgPath}${imgPath}', ); + } }, child: imgPath.isNotEmpty @@ -621,6 +631,83 @@ class ItemListWidget { ); } + /// 两行垂直布局: + /// 标题 + /// 第二行:图片 + static Widget twoRowTitleAndImages({ + required String title, // 第一行标题 + required List? imageUrls, // 传入 pd['CONTENT_IMG_PATH'] + double row2Height = 80, // 第二行高度 + double fontSize = 15, // 字体大小 + void Function(String)? onTapCallBack, + bool isRequired = true, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + // 标题部分 + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12), + child: Text( + title, + style: TextStyle( + fontSize: fontSize, + fontWeight: FontWeight.bold, + ), + ), + ), + + // 图片横向滚动区域 + SizedBox( + height: 80, // 图片区域固定高度 + child: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 12), + scrollDirection: Axis.horizontal, + itemCount: imageUrls?.length, + itemBuilder: (context, index) { + return Container( + margin: const EdgeInsets.only(right: 8), // 图片间距 + child: ClipRRect( + + borderRadius: BorderRadius.circular(8), + child: GestureDetector( + onTap: () { + if (onTapCallBack != null) onTapCallBack('${ApiService.baseImgPath}${imageUrls![index] ?? ''}'); + }, + child: Image.network( + '${ApiService.baseImgPath}${imageUrls![index] ?? ''}', + width: 80, // 图片宽度 + height: 80, // 图片高度 + fit: BoxFit.cover, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return Container( + width: 80, + height: 80, + color: Colors.grey[200], + child: const Center(child: CircularProgressIndicator()), + ); + }, + errorBuilder: (context, error, stackTrace) { + return Container( + width: 80, + height: 80, + color: Colors.grey[200], + child: const Icon(Icons.broken_image, size: 40), + ); + }, + ), + ) + ), + ); + }, + ), + ), + ], + ); + } + static Widget itemContainer(Widget child) { return Container( decoration: BoxDecoration( diff --git a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart index f169ff8..532a498 100644 --- a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart @@ -19,7 +19,7 @@ class MeasuresListWidget extends StatelessWidget { required this.baseImgPath, required this.isAllowEdit, this.onSign, - this.isShowSign = false, + this.isShowSign = true, }); /// 接口返回的原始 Map 列表 @@ -164,6 +164,7 @@ class MeasuresListWidget extends StatelessWidget { (item['IMG_PATH'] as String).split(','), '', ), + ], ), ), 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 9f78997..73a7fb4 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 @@ -100,7 +100,7 @@ class _HotworkGasListState extends State { final img = baseImgPath + images[i]; return GestureDetector( onTap: () { - present( + presentOpaque( SingleImageViewer(imageUrl: img), 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 b786cd2..a79f7c9 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 @@ -1,36 +1,42 @@ +import 'dart:math' as math; + import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; import '../../../../../../tools/tools.dart'; import '../../../item_list_widget.dart'; import '../../special_Wrok/MeasuresListWidget.dart'; -/// 通用高处作业明细表单组件(支持编辑/只读) +/// 通用断路作业明细表单组件(支持编辑/只读) class CutroadDetailFormWidget extends StatefulWidget { final Map pd; final bool isEditable; final VoidCallback onChooseLevel; /// 编辑模式下需提供以下控制器,非编辑模式可不传 - final TextEditingController? locationController; // 地点 - final TextEditingController? hightController; // 高度 - final TextEditingController? contentController; // 内容 + final TextEditingController? unitController; // 涉及部门 + final TextEditingController? contentController; // 原因 final TextEditingController? relatedController; final TextEditingController? riskController; + /// 其他签字数据 + final signs; const CutroadDetailFormWidget({ Key? key, required this.pd, required this.isEditable, required this.onChooseLevel, - this.locationController, - this.hightController, + this.unitController, this.contentController, this.relatedController, this.riskController, + this.signs = null, + }) : assert( !isEditable || - (locationController != null && - hightController != null && + (unitController != null && contentController != null && relatedController != null && riskController != null), @@ -43,16 +49,180 @@ class CutroadDetailFormWidget extends StatefulWidget { } class _CutroadDetailFormWidgetState extends State { - String _getWorkLevelText(dynamic level) { - switch (level?.toString()) { - case '1': return 'I级高处作业'; - case '2': return 'II级高处作业'; - case '3': return 'III级高处作业'; - case '4': return 'IV级高处作业'; - default: return ''; - } + Widget _itemContainer(Widget child) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: child, + ); } + Widget signItemWidget( + String signKey, + String nameKey, + String name, + BuildContext context, + ) { + return _itemContainer( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题行 + Padding( + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + child: Row( + children: [ + Expanded( + child: ListItemFactory.headerTitle(name), + ), + if (FormUtils.hasValue(widget.pd, nameKey)) + Text( + widget.pd[nameKey]?.toString() ?? '', + style: const TextStyle(fontSize: 16), + ), + ], + ), + ), + const SizedBox(height: 8), + if (FormUtils.hasValue(widget.signs, signKey)) + ...((widget.signs[signKey] as List) + .cast>() + .map((item) { + // 解析 SIGN_PATH + List signPaths = []; + final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null; + if (rawSP is String && rawSP.isNotEmpty) { + signPaths = rawSP.split(',').map((s) => s.trim()).toList(); + } else if (rawSP is List) { + signPaths = rawSP.cast(); + } + + // 解析 SIGN_TIME 保留空格 + List signTimes = []; + final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null; + if (rawST is String && rawST.isNotEmpty) { + signTimes = rawST.split(','); + } else if (rawST is List) { + signTimes = rawST.cast(); + } + + final pairCount = math.min(signPaths.length, signTimes.length); + + // 解析 IMG_PATH, 最多 2 张 + List imgPaths = []; + final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null; + if (rawIP is String && rawIP.isNotEmpty) { + imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList(); + } else if (rawIP is List) { + imgPaths = rawIP.cast().take(2).toList(); + } + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (imgPaths.isNotEmpty) ...[ + Row( + children: imgPaths.map((p) { + final fullUrl = '${ApiService.baseImgPath}$p'; + return GestureDetector( + onTap: () => presentOpaque( + SingleImageViewer(imageUrl: fullUrl), + context, + ), + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(2), + child: Image.network( + fullUrl, + width: 50, + height: 50, + fit: BoxFit.cover, + errorBuilder: (_, __, ___) => const Icon( + Icons.broken_image, + size: 40, + ), + ), + ), + ), + ); + }).toList(), + ), + const SizedBox(height: 8), + ], + + // 签名及时间 + ...List.generate(pairCount, (index) { + final imgPath = signPaths[index]; + final timeLabel = signTimes[index]; + final fullUrl = '${ApiService.baseImgPath}$imgPath'; + const imageWidth = 200.0; + const imageHeight = 100.0; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: () => presentOpaque( + SingleImageViewer(imageUrl: fullUrl), + context, + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(4), + child: Image.network( + fullUrl, + width: imageWidth, + height: imageHeight, + fit: BoxFit.cover, + errorBuilder: (_, __, ___) => + const Icon(Icons.broken_image, size: 60), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: SizedBox( + height: imageHeight, + child: Align( + alignment: Alignment.bottomRight, + child: Text( + timeLabel, + style: const TextStyle( + fontSize: 14, + color: Colors.black87, + ), + ), + ), + ), + ), + ], + ), + if (index < pairCount - 1) + const Padding( + padding: EdgeInsets.only(top: 8.0), + child: Divider(height: 1), + ), + ], + ), + ); + }), + ], + ), + ); + }).toList()), + ], + ), + ); + } @override Widget build(BuildContext context) { final pd = widget.pd; @@ -74,36 +244,45 @@ class _CutroadDetailFormWidgetState extends State { const Divider(), ], ItemListWidget.singleLineTitleText( - label: '作业地点:', - isEditable: widget.isEditable, - controller: widget.locationController, - text: pd['WORK_PLACE'] ?? '', + label: '申请部门:', + isEditable: false, + text: pd['APPLY_DEPARTMENT_NAME'] ?? '', ), const Divider(), + ItemListWidget.singleLineTitleText( - label: '作业高度(米):', - keyboardType: TextInputType.numberWithOptions( - decimal: true, // 允许小数点 - signed: false, // 允许负号(如需) - ), + label: '涉及相关单位(部门):', isEditable: widget.isEditable, - controller: widget.hightController, - text: pd['WORK_HIGH'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '高处作业级别:', - isEditable: widget.isEditable, - onTap: widget.onChooseLevel, - text: _getWorkLevelText(pd['WORK_LEVEL']), + hintText: '请输入涉及相关单位(部门)', + controller: widget.unitController, + text: pd['OTHER_DEPT'] ?? '', ), const Divider(), ItemListWidget.multiLineTitleTextField( - label: '作业内容:', + label: '断路原因:', isEditable: widget.isEditable, controller: widget.contentController, - text: pd['WORK_CONTENT'] ?? '', + hintText: '请输入断路原因', + text: pd['WORK_REASON'] ?? '', ), + if (!widget.isEditable && FormUtils.hasValue(pd, 'WORK_CONTENT')) ...[ + ItemListWidget.singleLineTitleText( + label: '断路地段示意图相关说明:', + isEditable: false, + text: pd['WORK_CONTENT'] ?? '', + ), + const Divider(), + ], + if (!widget.isEditable && FormUtils.hasValue(pd, 'CONTENT_IMG_PATH')) ...[ + ItemListWidget.twoRowTitleAndImages( + onTapCallBack: (val) { + presentOpaque(SingleImageViewer(imageUrl: val), context); + }, + title: '断路地段示意图:', + imageUrls: pd['CONTENT_IMG_PATH'], + ), + const Divider(), + ], const Divider(), ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号:', @@ -152,6 +331,14 @@ class _CutroadDetailFormWidgetState extends State { controller: widget.riskController, text: pd['RISK_IDENTIFICATION'] ?? '', ), + + if (widget.signs != null && FormUtils.hasValue(widget.signs, 'PROJECT_MANAGER')) + Column( + children: [ + Divider(), + signItemWidget('PROJECT_MANAGER', 'PROJECT_MANAGER_USER_NAME', '作业项目负责人', context), + ], + ) ], ), ); diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart index 2d7366f..a40f77e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart @@ -224,6 +224,7 @@ class CutroadFormBaseWork extends StatelessWidget { children: [ // 1. 作业详情表单 CutroadDetailFormWidget( + signs: signs, pd: pd, isEditable: isEditable, onChooseLevel: onChooseLevel, @@ -324,7 +325,7 @@ class CutroadFormBaseWork extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),), + Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('消防、安全管理部门意见'),), Padding( padding: const EdgeInsets.all(8.0), child: Text(signs['AUDIT'][0]['DESCR'] ?? ''), @@ -333,7 +334,7 @@ class CutroadFormBaseWork extends StatelessWidget { ), ), Divider(height: 1,), - signItemWidget('AUDIT', 'AUDIT_USER_NAME', '安全管理部门负责人', context), + signItemWidget('AUDIT', 'AUDIT_USER_NAME', '消防、安全管理部门负责人', 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 5905ec8..40743f4 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 @@ -175,6 +175,9 @@ class _CutroadListPageState extends State { case '提交申请': await pushPage(CutroadApplyDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; + case '作业项目负责人': + await pushPage(CutroadZyrDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); + break; case '设置安全措施确认人': await pushPage(CutroadSetSafeDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; @@ -190,16 +193,13 @@ class _CutroadListPageState extends State { case '接受交底人签字': await pushPage(CutroadJsjdDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; - case '作业人签字': - await pushPage(CutroadZyrDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); - break; case '作业负责人签字': await pushPage(CutroadZyfzDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; case '所在单位签字': await pushPage(CutroadSzdwDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; - case '审核人签字': + case '消防、安全管理部门签字': await pushPage(CutroadShbmDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context); break; case '审批人签字': @@ -298,18 +298,7 @@ class _CutroadListPageState extends State { ); } - String _getWorkLevelText(dynamic level) { - switch (level?.toString()) { - case '1': - return 'I级高处作业'; - case '2': - return 'II级高处作业'; - case '3': - return 'III级高处作业'; - default: - return 'IV级高处作业'; - } - } + Widget _buildListItem(Map item) { return Card( @@ -330,44 +319,46 @@ class _CutroadListPageState extends State { "编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), - Text( - "作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), + ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"), + Text("作业项目负责人: ${item['PROJECT_MANAGER_USER_NAME'] ?? ''}"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), ], ), - - if (item['AUDIT_USER_NAME'] != null) - Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - if (item['APPROVE_USER_NAME'] != null) - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), + Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), + Text("消防、安全管理部门: ${item['AUDIT_USER_NAME'] ?? ''}"), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), ], ), + + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ 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 79ff762..5681b19 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 @@ -17,13 +17,13 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListW enum EditUserType { + PROJECT_MANAGER('作业人项目负责单位', '作业人项目负责人', true), GUARDIAN('监护人单位', '监护人', true), CONFESS('安全交底人单位', '安全交底人', true), ACCEPT_CONFESS('接受交底人单位', '接受交底人', true), - WORK_USER('作业人单位', '作业人', true), CONFIRM('作业负责人单位', '作业负责人', true), LEADER('所在单位', '所在单位负责人', true), - AUDIT('审核部门', '审核部门负责人', true), + AUDIT('安全管理部门', '安全管理部门负责人', true), APPROVE('审批部门', '审批部门负责人', true), WORK_START('作业开始负责人单位', '作业开始负责人', true), WORK_END('作业结束负责人单位', '作业结束负责人', true), @@ -53,8 +53,6 @@ class CutroadApplyDetail extends StatefulWidget { class _CutroadApplyDetailState extends State { late bool isEditable = false; - final levelList = ["I级高处作业", "II级高处作业", "III级高处作业","IV级高处作业"]; - /// 编辑还是新增 late String msg = 'add'; @@ -63,8 +61,7 @@ class _CutroadApplyDetailState extends State { late Map signs = {}; late List> measuresList = []; - final TextEditingController _locationController = TextEditingController(); - final TextEditingController _hightController = TextEditingController(); + final TextEditingController _unitController = TextEditingController(); final TextEditingController _contentController = TextEditingController(); final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); @@ -93,15 +90,13 @@ class _CutroadApplyDetailState extends State { _contentController.addListener(() { setState(() { - pd['WORK_CONTENT'] = _contentController.text.trim(); + pd['WORK_REASON'] = _contentController.text.trim(); }); }); - _locationController.addListener(() { - pd['WORK_PLACE'] = _locationController.text.trim(); - }); - _hightController.addListener(() { - pd['WORK_HIGH'] = _hightController.text.trim(); + _unitController.addListener(() { + pd['OTHER_DEPT'] = _unitController.text.trim(); }); + _relatedController.addListener(() { pd['SPECIAL_WORK'] = _relatedController.text.trim(); }); @@ -119,11 +114,7 @@ class _CutroadApplyDetailState extends State { } void set_pd_USER_ID(EditUserType type, String id) { - if (type == EditUserType.WORK_USER) { - pd['${type.name}_ID'] = id; - }else{ pd['${type.name}_USER_ID'] = id; - } } void set_pd_USER_Name(EditUserType type, String name) { @@ -139,34 +130,15 @@ class _CutroadApplyDetailState extends State { } String get_pd_USER_ID(EditUserType type) { - if (type == EditUserType.WORK_USER) { - return pd['${type.name}_ID'] ?? ''; - }else{ + return pd['${type.name}_USER_ID'] ?? ''; - } + } String get_pd_USER_Name(EditUserType type) { return pd['${type.name}_USER_NAME'] ?? ''; } - Future _chooseLevel() async { - final choice = await BottomPicker.show( - context, - items: levelList, - itemBuilder: (item) => Text(item, textAlign: TextAlign.center), - initialIndex: 0, - ); - if (choice != null) { - // 用户点击确定并选择了 choice - setState(() { - pd['WORK_LEVEL_NAME'] = choice; - pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); - FocusHelper.clearFocus(context); - }); - } - } - Widget _card(Widget child) { return Container( padding: EdgeInsets.symmetric(vertical: 5), @@ -181,16 +153,6 @@ class _CutroadApplyDetailState extends State { Widget _chooseItem(EditUserType type) { bool isClean = false; bool isRequird = true; - if (pd['WORK_LEVEL'] == '1' && type == EditUserType.AUDIT) { - isRequird = false; - isClean = true; - - } - if (pd['WORK_LEVEL'] != '4' && type == EditUserType.APPROVE) { - isRequird = false; - isClean = true; - - } return Column( children: [ @@ -302,31 +264,25 @@ class _CutroadApplyDetailState extends State { Future _submit(String status) async { // 通用文本字段校验规则 final textRules = >[ - {'value': _locationController.text.trim(), 'message': '请填写地点及部位'}, - {'value': _hightController.text.trim(), 'message': '请填写高度'}, + {'value': _unitController.text.trim(), 'message': '请输入涉及相关单位(部门)'}, - {'value': _contentController.text.trim(), 'message': '请填写作业内容'}, + {'value': _contentController.text.trim(), 'message': '请输入断路原因'}, { 'value': _relatedController.text.trim(), 'message': '请输入关联的其他特殊作业及安全作业票编号', }, {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, ]; - final level = pd['WORK_LEVEL'] ?? ''; - print('---level-$level'); - /// 各项负责人校验 final unitRules = [ + EditUserType.PROJECT_MANAGER, EditUserType.GUARDIAN, EditUserType.CONFESS, EditUserType.ACCEPT_CONFESS, EditUserType.CONFIRM, EditUserType.LEADER, - if (pd['WORK_LEVEL'] != '1') EditUserType.AUDIT, - if (pd['WORK_LEVEL'] == '4') EditUserType.APPROVE, - EditUserType.WORK_USER, EditUserType.WORK_START, EditUserType.WORK_END, EditUserType.ACCEPT, @@ -339,11 +295,7 @@ class _CutroadApplyDetailState extends State { return; } } - // 级别校验 - if (level.length == 0) { - ToastUtil.showNormal(context, '请输入高处作业级别'); - return; - } + for (var type in unitRules) { if (get_pd_DEPARTMENT_ID(type).length == 0) { @@ -358,15 +310,8 @@ class _CutroadApplyDetailState extends State { } // LoadingDialogHelper.show(); - String taskId = '0'; - if (pd['WORK_LEVEL'] == '1') { - taskId = '5'; - } else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') { - taskId = '6'; - } else if (pd['WORK_LEVEL'] == '4') { - taskId = '7'; - } - pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])]; + String taskId = '12'; + pd['USER_ID'] = SessionService.instance.loginUserId; pd['STEP_ID'] = status; pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; @@ -433,12 +378,9 @@ class _CutroadApplyDetailState extends State { _getSigns(pd['CUTROAD_ID'] ?? ''); _getMeasures(pd['CUTROAD_ID'] ?? ''); } - pd['WORK_LEVEL'] = pd['WORK_LEVEL']?.toString() ?? ''; - // 给所有输入框赋值 - _contentController.text = pd['WORK_CONTENT'] ?? ''; - _locationController.text = pd['WORK_PLACE'] ?? ''; - _hightController.text = pd['WORK_HIGH'] ?? ''; + _contentController.text = pd['WORK_REASON'] ?? ''; + _unitController.text = pd['OTHER_DEPT'] ?? ''; _relatedController.text = pd['SPECIAL_WORK'] ?? ''; _riskController.text = pd['RISK_IDENTIFICATION'] ?? ''; }); @@ -473,7 +415,7 @@ class _CutroadApplyDetailState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: h_backGroundColor(), - appBar: MyAppbar(title: '高处作业申请'), + appBar: MyAppbar(title: '断路作业申请'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -481,20 +423,21 @@ class _CutroadApplyDetailState extends State { children: [ _card( CutroadDetailFormWidget( + signs: signs, pd: pd, isEditable: isEditable, contentController: _contentController, - locationController: _locationController, - hightController: _hightController, + unitController: _unitController, relatedController: _relatedController, riskController: _riskController, - onChooseLevel: _chooseLevel, + onChooseLevel: (){}, ), ), if (isEditable) Column( children: [ - + SizedBox(height: 15), + _card(_chooseItem(EditUserType.PROJECT_MANAGER)), SizedBox(height: 15), _card(_chooseItem(EditUserType.GUARDIAN)), SizedBox(height: 15), @@ -502,8 +445,6 @@ class _CutroadApplyDetailState extends State { SizedBox(height: 15), _card(_chooseItem(EditUserType.ACCEPT_CONFESS)), SizedBox(height: 15), - _card(_chooseItem(EditUserType.WORK_USER)), - SizedBox(height: 15), _card(_chooseItem(EditUserType.CONFIRM)), SizedBox(height: 15), _card(_chooseItem(EditUserType.LEADER)), 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 b2e2cbb..93e110b 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 @@ -330,6 +330,7 @@ class _CutroadJhrDetailState extends State { children: [ // _card(_defaultDetail()), CutroadDetailFormWidget( + signs: signs, pd: pd, isEditable: false, onChooseLevel: (){}, 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 c5b082f..d5b7081 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 @@ -294,7 +294,6 @@ class _CutroadKszyDetailState extends State { GestureDetector( child: Row( children: [ - Text('* ', style: TextStyle(color: Colors.red)), Expanded( child: ListItemFactory.createRowSpaceBetweenItem( leftText: '作业开始时间', 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 0aad155..f314d36 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 @@ -14,7 +14,7 @@ import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; -/// 安全管理部门意见 +/// 消防、安全管理部门意见 class CutroadShbmDetail extends StatefulWidget { const CutroadShbmDetail({ super.key, @@ -263,7 +263,7 @@ class _CutroadShbmDetailState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '审核部门意见'), + appBar: MyAppbar(title: '消防、安全管理部门意见'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -284,7 +284,7 @@ class _CutroadShbmDetailState extends State { Column( children: [ ListItemFactory.createBuildMultilineInput( - '审核部门意见', + '消防、安全管理部门意见', '请输入意见', _contentController, isRequired: true @@ -295,7 +295,7 @@ class _CutroadShbmDetailState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ListItemFactory.headerTitle('审核部门负责人'), + ListItemFactory.headerTitle('消防、安全管理部门负责人'), CustomButton( text: '新增手写签字', height: 36, 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 b322147..dd5a511 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 @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart'; @@ -14,8 +15,14 @@ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart'; +/// 本地路径 + 线上路径模型 +class ImageData { + String localPath; + String serverPath; -/// 作业人意见 + ImageData({required this.localPath, required this.serverPath}); +} +/// 作业项目负责人意见 class CutroadZyrDetail extends StatefulWidget { const CutroadZyrDetail({ super.key, @@ -35,7 +42,9 @@ class _CutroadZyrDetailState extends State { /// 详情 late Map pd = {}; + final TextEditingController _contentController = TextEditingController(); + late List imgList = []; /// 安全防护措施列表 late List> measuresList = []; late Map signs = {}; @@ -132,6 +141,14 @@ class _CutroadZyrDetailState extends State { String reasonText = ''; if (status == '1') { + if (_contentController.text.trim().isEmpty) { + ToastUtil.showNormal(context, '请输入断路地段示意图相关说明'); + return; + } + if (imgList.isEmpty) { + ToastUtil.showNormal(context, '请上传缩略图'); + return; + } } else { await showDialog( context: context, @@ -152,10 +169,18 @@ class _CutroadZyrDetailState extends State { return; } } - + final serverPathString = imgList + .map((e) => e.serverPath) + .where((s) => s.isNotEmpty) + .map((s) => s) // 将 String? 转回 String + .join(','); // 存回 measures final Map formData = {}; // 提交参数 + formData['WORK_CONTENT'] = _contentController.text.trim(); + formData['CONIMG_PATH'] = serverPathString; + + formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ?pd['DESCR']: '无'; formData['CUTROAD_ID'] = widget.CUTROAD_ID; formData['SIGNTIME'] = signTimes.join(','); formData['USER_ID'] = SessionService.instance.loginUserId; @@ -222,7 +247,25 @@ class _CutroadZyrDetailState extends State { signs = data['signs'] ?? {}; }); } + /// 拍照或选图后的回调 + Future _onImageAdded(String localPath) async { + // 上传到服务器 + final res = await ApiService.uploadSaveFile(localPath); + final url = res['FILE_PATH'] as String; + setState(() { + imgList.add(ImageData(localPath: localPath, serverPath: url)); + }); + } + /// 删除图片处理:调用删除接口并更新列表 + Future _onImageRemoved(ImageData item) async { + if (item.serverPath != null) { + await ApiService.deleteSaveFile(item.serverPath!); + } + setState(() { + imgList.remove(item); + }); + } /// 底部按钮 Widget _bottomButtons() { return Row( @@ -257,7 +300,7 @@ class _CutroadZyrDetailState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '作业人意见'), + appBar: MyAppbar(title: '作业项目负责人意见'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -276,13 +319,34 @@ class _CutroadZyrDetailState extends State { ItemListWidget.itemContainer( Column( children: [ - + ListItemFactory.createBuildMultilineInput( + '断路地段示意图相关说明:', + '请输入断路地段示意图相关说明', + _contentController, + isRequired: true + ), + Divider(), + RepairedPhotoSection( + title: '断路地段示意图:', + maxCount: 100, + mediaType: MediaType.image, + onChanged: (paths) {}, + isShowNum: false, + horizontalPadding: 0, + isRequired: true, + onMediaAdded: _onImageAdded, + onMediaRemoved: (path) { + final item = imgList.firstWhere((e) => e.localPath == path); + _onImageRemoved(item); + }, + onAiIdentify: () {}, + ), Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ListItemFactory.headerTitle('作业人'), + ListItemFactory.headerTitle('作业项目负责人'), CustomButton( text: '新增手写签字', height: 36, 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 69bf62e..d5f31cc 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 @@ -294,7 +294,6 @@ class _HoistworkKszyDetailState extends State { GestureDetector( child: Row( children: [ - Text('* ', style: TextStyle(color: Colors.red)), Expanded( child: ListItemFactory.createRowSpaceBetweenItem( leftText: '作业开始时间', 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 152d07b..de3bea5 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 @@ -294,7 +294,6 @@ class _HighworkKszyDetailState extends State { GestureDetector( child: Row( children: [ - Text('* ', style: TextStyle(color: Colors.red)), Expanded( child: ListItemFactory.createRowSpaceBetweenItem( leftText: '作业开始时间', 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 e279cbf..6d29ae0 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 @@ -15,11 +15,12 @@ class ElectricityDetailFormWidget extends StatefulWidget { /// 编辑模式下需提供以下控制器,非编辑可不传 final TextEditingController? contentController; final TextEditingController? locationController; - final TextEditingController? methodController; - final TextEditingController? hotworkPersonController; + final TextEditingController? cardController; + final TextEditingController? powerController; + final TextEditingController? ratedPowerController; + final TextEditingController? VController; final TextEditingController? relatedController; final TextEditingController? riskController; - const ElectricityDetailFormWidget({ Key? key, required this.pd, @@ -29,18 +30,20 @@ class ElectricityDetailFormWidget extends StatefulWidget { required this.onAnalyzeTap, this.contentController, this.locationController, - this.methodController, - this.hotworkPersonController, + this.cardController, + this.powerController, + this.ratedPowerController, + this.VController, this.relatedController, this.riskController, }) : assert( !isEditable || (contentController != null && locationController != null && - methodController != null && - hotworkPersonController != null && - relatedController != null && - riskController != null), + cardController != null && + powerController != null && + ratedPowerController != null && + VController != null), 'Editable mode requires all TextEditingController parameters', ), super(key: key); @@ -82,49 +85,86 @@ class _ElectricityDetailFormWidgetState extends State { padding: EdgeInsets.all(12), child: Column( children: [ - HotWorkDetailFormWidget( + ElectricityDetailFormWidget( pd: pd, isEditable: false, onChooseLevel: () {}, 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 c23f36d..af4cd5b 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 @@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; 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 19a7847..ad6ef59 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 @@ -7,7 +7,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; 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 8af807b..cb38ff0 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 @@ -2,15 +2,17 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqcs_work_detail/electricity_safe_func_sure.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqgl_work_detail/electricity_aqgl_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szdw_work_detail/electricity_szdw_detail.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/bottom_picker.dart'; @@ -23,7 +25,12 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jsj class ElectricityListPage extends StatefulWidget { final String flow; final String workTypeTitle; - const ElectricityListPage({Key? key, required this.flow, required this.workTypeTitle}) : super(key: key); + + const ElectricityListPage({ + Key? key, + required this.flow, + required this.workTypeTitle, + }) : super(key: key); @override _ElectricityListPageState createState() => _ElectricityListPageState(); @@ -102,7 +109,7 @@ class _ElectricityListPageState extends State { 'KEYWORDS': searchKeywords, 'WORK_STATE': '0', }; - final url = '/app/hotwork/list?showCount=-1¤tPage=$currentPage'; + final url = '/app/electricity/list?showCount=-1¤tPage=$currentPage'; final response = await ApiService.specialCheckListWorkCount(data, url); setState(() { @@ -127,10 +134,14 @@ class _ElectricityListPageState extends State { list.clear(); _fetchData(); } + /// 申请 void _handleApply() { // 处理申请按钮点击逻辑 - pushPage(ElectricityApplyDetail(ELECTRICITY_ID: '', flow: widget.flow), context); + pushPage( + ElectricityApplyDetail(ELECTRICITY_ID: '', flow: widget.flow), + context, + ); } /// 打开流程图 @@ -156,82 +167,145 @@ class _ElectricityListPageState extends State { ).showSnackBar(SnackBar(content: Text('获取流程图失败: $e'))); } } - // case 0: title = '提交申请'; break; - // case 1: title = '气体检测'; break; - // case 2: title = '设置安全措施确认人'; break; - // case 3: title = '安全措施确认'; break; - // case 4: title = '监护人签字'; break; - // case 5: title = '用电人签字'; break; - // case 6: title = '安全交底人签字'; break; - // case 7: title = '接受交底人签字'; break; - // case 8: title = '作业人签字'; break; - // case 9: title = '作业负责人签字'; break; - // case 10: title = '用电单位签字'; break; - // case 11: title = '配送电单位签字'; break; - // case 12: title = '开始作业'; break; - // case 13: title = '结束作业'; break; - // case 14: title = '验收签字'; break; void _goToDetail(Map item) async { switch (widget.flow) { case '提交申请': - await pushPage(ElectricityApplyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityApplyDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); _fetchData(); break; case '气体检测': - await pushPage(ElectricityGasList(ELECTRICITY_ID: item['ELECTRICITY_ID'], addFlag:true), context); + await pushPage( + ElectricityGasList( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + addFlag: true, + ), + context, + ); break; case '设置安全措施确认人': - await pushPage(ElectricitySetSafeDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricitySetSafeDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '安全措施确认': - await pushPage(ElectricitySafeFuncSure(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricitySafeFuncSure( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '监护人签字': - await pushPage(ElectricityJhrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityJhrDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '用电人签字': - // await pushPage(ElectricityJhrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage(ElectricityYdrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); break; case '安全交底人签字': - await pushPage(ElectricityAqjdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityAqjdDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '接受交底人签字': - await pushPage(ElectricityJsjdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityJsjdDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '作业人签字': - // await pushPage(ElectricityZyfzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage(ElectricityZyrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); break; case '作业负责人签字': - await pushPage(ElectricityZyfzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityZyfzDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '用电单位签字': - await pushPage(ElectricitySzdwDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityYddwDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '配送电单位签字': - await pushPage(ElectricityAqglDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityPsdwDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; - // case '审批人签字': - // routeName = '/hotwork-approve-detail'; - // await pushPage(ElectricityDhspDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); - // - // break; - // case '当班班长验票': - // routeName = '/hotwork-monitor-detail'; - // await pushPage(ElectricityDbbzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + // case '审批人签字': + // routeName = '/hotwork-approve-detail'; + // await pushPage(ElectricityDhspDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + // + // break; + // case '当班班长验票': + // routeName = '/hotwork-monitor-detail'; + // await pushPage(ElectricityDbbzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); break; case '开始作业': - await pushPage(ElectricityKszyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityKszyDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '结束作业': - await pushPage(ElectricityJszyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityJszyDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; case '验收签字': - await pushPage(ElectricityYsgdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context); + await pushPage( + ElectricityYsgdDetail( + ELECTRICITY_ID: item['ELECTRICITY_ID'], + flow: widget.flow, + ), + context, + ); break; default: break; @@ -240,7 +314,6 @@ class _ElectricityListPageState extends State { _fetchSteps(); _fetchData(); }); - } Widget _buildFlowStepItem({ @@ -253,9 +326,7 @@ class _ElectricityListPageState 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), @@ -326,8 +397,10 @@ class _ElectricityListPageState 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: 16, fontWeight: FontWeight.bold), + ), ], ), const SizedBox(height: 8), @@ -335,7 +408,8 @@ class _ElectricityListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"), - Text("分析人: ${item['ANALYZE_USER_NAME'] ?? ''}"), + if (FormUtils.hasValue(item, 'ANALYZE_USER_NAME')) + Text("分析人: ${item['ANALYZE_USER_NAME'] ?? ''}"), ], ), const SizedBox(height: 8), @@ -343,36 +417,31 @@ class _ElectricityListPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"), - Text("批准人: ${item['APPROVE_USER_NAME'] ?? ''}"), + Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"), ], ), 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: [ + Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"), + Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), + ], + ), const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"), - Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}"), - ], - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("用电单位负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), + Text("配送电单位负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), + ], + ), + 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['ACCEPT_USER_NAME'] ?? ''}")], + ), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -386,17 +455,19 @@ class _ElectricityListPageState 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['ELECTRICITY_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['ELECTRICITY_ID']), + ), + SizedBox(width: 1), + ], + ), ], ), ), 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 b97037d..5f55ead 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 @@ -4,7 +4,7 @@ import 'package:intl/intl.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; @@ -327,7 +327,7 @@ class _ElectricityJhrDetailState extends State { child: Column( children: [ // _card(_defaultDetail()), - HotWorkDetailFormWidget( + ElectricityDetailFormWidget( pd: pd, isEditable: false, onChooseLevel: (){}, 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 eda4ded..b1017ab 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';/// 接受交底人签字 +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';/// 接受交底人签字 class ElectricityJsjdDetail extends StatefulWidget { const ElectricityJsjdDetail({ super.key, 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 66117ec..7e81d2a 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; /// 作业结束时间选择 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 072aba9..6396e68 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; /// 作业开始时间选择 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 526e3e1..9c86494 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 @@ -7,7 +7,8 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart'; import 'package:qhd_prevention/customWidget/department_picker.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart'; import 'package:qhd_prevention/tools/h_colors.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/http/ApiService.dart'; @@ -16,17 +17,17 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/bottom_picker.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListWidget.dart'; - enum EditUserType { + // 12个 ANALYZE('分析单位', '分析单位负责人', true), GUARDIAN('监护人单位', '监护人', true), + ELECTRICITY('用电单位', '用电人', true),// CONFESS('安全交底人单位', '安全交底人', true), ACCEPT_CONFESS('接受交底人单位', '接受交底人', true), + WORK('作业人单位', '作业人', true), // CONFIRM('作业负责人单位', '作业负责人', true), - LEADER('所在单位', '所在单位负责人', true), - AUDIT('安全管理部门', '安全管理部门负责人', true), - APPROVE('动火审批单位', '动火审批负责人', true), - MONITOR('动火前在岗部门', '动火前在岗班长', true), + AUDIT('用电单位', '用电单位负责人', true), + APPROVE('配送电单位', '配送电单负责人', true), WORK_START('作业开始负责人单位', '作业开始负责人', true), WORK_END('作业结束负责人单位', '作业结束负责人', true), ACCEPT('验收部门', '验收部门负责人', true); @@ -39,7 +40,6 @@ enum EditUserType { const EditUserType(this.displayName, this.personName, this.isRequired); } - class ElectricityApplyDetail extends StatefulWidget { const ElectricityApplyDetail({ super.key, @@ -56,11 +56,13 @@ class ElectricityApplyDetail extends StatefulWidget { class _ElectricityApplyDetailState extends State { late bool isEditable = false; - final levelList = ["特级", "一级", "二级"]; /// 编辑还是新增 late String msg = 'add'; + // 是否进行气体分析 + bool _isGasAnalyze = false; + /// 详情 late Map pd = {}; late Map signs = {}; @@ -68,14 +70,14 @@ class _ElectricityApplyDetailState extends State { final TextEditingController _contentController = TextEditingController(); final TextEditingController _locationController = TextEditingController(); - final TextEditingController _methodController = TextEditingController(); - final TextEditingController _hotworkPersonController = - TextEditingController(); + final TextEditingController _cardController = TextEditingController(); + final TextEditingController _powerController = TextEditingController(); + final TextEditingController _ratedPowerController = TextEditingController(); + final TextEditingController _VController = TextEditingController(); final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); - - /// 动火人及证书编号 - late List workUserList = []; + // 负责人电工号 + final TextEditingController _fzCardController = TextEditingController(); // 存储各单位的人员列表 final Map>> _personCache = {}; @@ -88,28 +90,34 @@ class _ElectricityApplyDetailState extends State { _getData(); } else { isEditable = true; - pd['ANALYZE_TIME'] = 1; pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId; pd['APPLY_DEPARTMENT_NAME'] = SessionService.instance.loginUser!['DEPARTMENT_NAME'] ?? ''; pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; pd['APPLY_USER_NAME'] = SessionService.instance.username; } - _getHotWorkNameList(); _contentController.addListener(() { - setState(() { - pd['WORK_CONTENT'] = _contentController.text.trim(); - }); + pd['WORK_CONTENT'] = _contentController.text.trim(); + }); _locationController.addListener(() { pd['WORK_PLACE'] = _locationController.text.trim(); }); - _methodController.addListener(() { - pd['WORK_FUNCTION'] = _methodController.text.trim(); + _cardController.addListener(() { + pd['CARD_NO'] = _cardController.text.trim(); }); - _hotworkPersonController.addListener(() { - pd['WORK_USER'] = _hotworkPersonController.text.trim(); + _powerController.addListener(() { + pd['ALLOW_POWER'] = _powerController.text.trim(); + }); + _ratedPowerController.addListener(() { + pd['RATED_POWER'] = _ratedPowerController.text.trim(); + }); + _VController.addListener(() { + pd['WORK_VOLTAGE'] = _VController.text.trim(); + }); + _fzCardController.addListener(() { + pd['LEADER_CARD_NO'] = _VController.text.trim(); }); _relatedController.addListener(() { pd['SPECIAL_WORK'] = _relatedController.text.trim(); @@ -148,47 +156,13 @@ class _ElectricityApplyDetailState extends State { } String get_pd_USER_Name(EditUserType type) { + if (type == EditUserType.WORK) { + return pd['${type.name}_USER_USER_NAME'] ?? ''; + } return pd['${type.name}_USER_NAME'] ?? ''; } - Future _chooseLevel() async { - final choice = await BottomPicker.show( - context, - items: levelList, - itemBuilder: (item) => Text(item, textAlign: TextAlign.center), - initialIndex: 0, - ); - if (choice != null) { - // 用户点击确定并选择了 choice - setState(() { - pd['WORK_LEVEL'] = choice; - FocusHelper.clearFocus(context); - }); - } - } - Future _chooseHorkUser() async { - final choice = await BottomPicker.show( - context, - items: workUserList.map((item) => item['NAME'] as String).toList(), - itemBuilder: (item) => Text(item, textAlign: TextAlign.center), - initialIndex: 0, - ); - if (choice != null) { - setState(() { - pd['WORK_USER'] = choice; - _hotworkPersonController.text = choice; - Map result = workUserList.firstWhere( - (item) => item['NAME'] == choice, - orElse: () => {}, // 避免找不到时报错 - ); - if (FormUtils.hasValue(result, 'USER_ID')) { - pd['WORK_USER_ID'] = result['USER_ID']; - } - FocusHelper.clearFocus(context); - }); - } - } Widget _card(Widget child) { return Container( @@ -205,26 +179,6 @@ class _ElectricityApplyDetailState extends State { bool isClean = false; bool isRequired = true; - if (isEditable) { - if (type == EditUserType.AUDIT && (pd['WORK_LEVEL'] ?? '') == '二级') { - isClean = true; - isRequired = false; - } - - // 如果既不是二级也不是一级,就加上 APPROVE - if (type == EditUserType.APPROVE && pd['WORK_LEVEL'] != '特级') { - isRequired = false; - isClean = true; - - } - // EditUserType.APPROVE, - if (type == EditUserType.APPROVE && - ((pd['WORK_LEVEL'] ?? '') == '二级' || - (pd['WORK_LEVEL'] ?? '') == '一级')) { - isClean = true; - } - } - return Column( children: [ ItemListWidget.selectableLineTitleTextRightButton( @@ -250,6 +204,19 @@ class _ElectricityApplyDetailState extends State { text: pd['${type.name}_USER_NAME'] ?? '请选择', onTap: () => choosePersonHandle(type), ), + if (type == EditUserType.CONFIRM) + Column( + children: [ + Divider(), + ItemListWidget.singleLineTitleText( + label: '负责人电工号:', + isEditable: isEditable, + controller: _fzCardController, + hintText: '请输入负责人电工号', + text: pd['LEADER_CARD_NO'] ?? '', + ), + ], + ) ], ); } @@ -301,13 +268,15 @@ class _ElectricityApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -337,40 +306,46 @@ class _ElectricityApplyDetailState extends State { // 通用文本字段校验规则 final textRules = >[ {'value': _contentController.text.trim(), 'message': '请填写作业内容'}, - {'value': _locationController.text.trim(), 'message': '请填写动火地点及部位'}, - {'value': _methodController.text.trim(), 'message': '请填写动火方式'}, - {'value': _hotworkPersonController.text.trim(), 'message': '请填写动火人及证书编号'}, + {'value': _locationController.text.trim(), 'message': '请输入作业地点'}, + {'value': _cardController.text.trim(), 'message': '请输入电工证号'}, + {'value': _powerController.text.trim(), 'message': '请输入电源接入点及许可用电功率'}, { - 'value': _relatedController.text.trim(), - 'message': '请输入关联的其他特殊作业及安全作业票编号', + 'value': _ratedPowerController.text.trim(), + 'message': '请输入用电设备名称及额定功率', }, + { + 'value': _fzCardController.text.trim(), + 'message': '请输入负责人电工号', + }, + {'value': _VController.text.trim(), 'message': '请输入工作电压'}, + {'value': _relatedController.text.trim(), 'message': '请输入关联的其他特殊作业及安全作业票编号'}, {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, + + ]; - final level = pd['WORK_LEVEL'] ?? ''; - print('---level-$level'); /// 各项负责人校验 final unitRules = [ - EditUserType.ANALYZE, + if (_isGasAnalyze) + EditUserType.ANALYZE, EditUserType.GUARDIAN, + EditUserType.ELECTRICITY, EditUserType.CONFESS, EditUserType.ACCEPT_CONFESS, + EditUserType.WORK, EditUserType.CONFIRM, - EditUserType.LEADER, - // 如果不是二级,或者SAFETY_USER_ID有值就加上 AUDIT - if (pd['WORK_LEVEL'] != '二级' || FormUtils.hasValue(pd, 'SAFETY_USER_ID')) EditUserType.AUDIT, - EditUserType.AUDIT, - // 如果既不是二级也不是一级,就加上 APPROVE - if (pd['WORK_LEVEL'] == '特级') - EditUserType.APPROVE, - - EditUserType.MONITOR, + EditUserType.AUDIT, + EditUserType.APPROVE, EditUserType.WORK_START, EditUserType.WORK_END, EditUserType.ACCEPT, ]; if (status == '1') { + if (!_isGasAnalyze) { + pd['ANALYZE_DEPARTMENT_ID'] = ''; + pd['ANALYZE_USER_ID'] = ''; + } // 文本校验 for (var rule in textRules) { if ((rule['value'] as String).isEmpty) { @@ -378,11 +353,6 @@ class _ElectricityApplyDetailState extends State { return; } } - // 级别校验 - if (level.length == 0) { - ToastUtil.showNormal(context, '请选择动火级别'); - return; - } for (var type in unitRules) { if (get_pd_DEPARTMENT_ID(type).length == 0) { @@ -397,20 +367,15 @@ class _ElectricityApplyDetailState extends State { } // LoadingDialogHelper.show(); - String taskId = '0'; - if (level == '特级') { - taskId = '1'; - } else if (level == '一级') { - taskId = '2'; - } else if (level == '二级') { - taskId = '3'; - } + String taskId = '8'; + pd['USER_ID'] = SessionService.instance.loginUserId; pd['STEP_ID'] = status; pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; pd['OPERATOR'] = SessionService.instance.loginUserId; pd['CREATOR'] = SessionService.instance.loginUserId; pd['ACTION_USER'] = SessionService.instance.username; + pd['ISANALYZE'] = _isGasAnalyze ? 1 : 0; pd['APPLY_STATUS'] = status; pd['TASK_ID'] = taskId; @@ -428,15 +393,14 @@ class _ElectricityApplyDetailState extends State { String jsonStr = jsonEncode(pd); printLongString(jsonStr); try { - String url = "/app/hotwork/" + msg; + String url = "/app/electricity/" + msg; final result = await ApiService.submitHomework(url, pd); LoadingDialogHelper.hide(); if (result['result'] == 'success') { ToastUtil.showSuccess(context, status == '1' ? '提交成功' : '已暂存'); Navigator.pop(context); - }else{ + } else { ToastUtil.showSuccess(context, '提交失败'); - } } catch (e) { LoadingDialogHelper.hide(); @@ -444,18 +408,13 @@ class _ElectricityApplyDetailState extends State { } } - Future _getHotWorkNameList() async { - final result = await ApiService.getHotWorkNameList(); - setState(() { - workUserList = result['varList'] ?? ''; - List names = - workUserList.map((item) => item['NAME'] as String).toList(); - }); - } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID); + final data = await ApiService.getHomeworkFindById( + 'electricity', + widget.ELECTRICITY_ID, + ); setState(() { pd = data['pd']; if (pd['STEP_ID'] == 0) { @@ -467,8 +426,10 @@ class _ElectricityApplyDetailState extends State { // 给所有输入框赋值 _contentController.text = pd['WORK_CONTENT'] ?? ''; _locationController.text = pd['WORK_PLACE'] ?? ''; - _methodController.text = pd['WORK_FUNCTION'] ?? ''; - _hotworkPersonController.text = pd['WORK_USER'] ?? ''; + _cardController.text = pd['WORK_FUNCTION'] ?? ''; + _powerController.text = pd['WORK_USER'] ?? ''; + _ratedPowerController.text = pd['SPECIAL_WORK'] ?? ''; + _VController.text = pd['WORK_VOLTAGE'] ?? ''; _relatedController.text = pd['SPECIAL_WORK'] ?? ''; _riskController.text = pd['RISK_IDENTIFICATION'] ?? ''; }); @@ -480,7 +441,8 @@ class _ElectricityApplyDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('electricity', + final data = await ApiService.listSignFinished( + 'electricity', homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, ); setState(() { @@ -489,7 +451,8 @@ class _ElectricityApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('electricity', + final data = await ApiService.listSignFinishMeasures( + 'electricity', homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, ); setState(() { @@ -503,24 +466,26 @@ class _ElectricityApplyDetailState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: h_backGroundColor(), - appBar: MyAppbar(title: '动火安全作业申请'), + appBar: MyAppbar(title: '临时用电作业申请'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( children: [ _card( - HotWorkDetailFormWidget( + ElectricityDetailFormWidget( pd: pd, isEditable: isEditable, contentController: _contentController, locationController: _locationController, - methodController: _methodController, - hotworkPersonController: _hotworkPersonController, + cardController: _cardController, + powerController: _powerController, + ratedPowerController: _ratedPowerController, + VController: _VController, relatedController: _relatedController, riskController: _riskController, - onChooseLevel: _chooseLevel, - onChooseHotworkUser: _chooseHorkUser, + onChooseLevel: () {}, + onChooseHotworkUser: (){}, onAnalyzeTap: () { pushPage( ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID), @@ -529,28 +494,46 @@ class _ElectricityApplyDetailState extends State { }, ), ), + SizedBox(height: 10), + ListItemFactory.createYesNoSection( + title: '是否进行气体分析', + horizontalPadding: 0, + groupValue: _isGasAnalyze, + onChanged: (val) { + setState(() { + _isGasAnalyze = val; + }); + }, + ), if (isEditable) Column( children: [ - SizedBox(height: 15), - _card(_chooseItem(EditUserType.ANALYZE)), - SizedBox(height: 15), + if (_isGasAnalyze) + Column( + children: [ + _card(_chooseItem(EditUserType.ANALYZE)), + SizedBox(height: 15), + ], + ), + _card(_chooseItem(EditUserType.GUARDIAN)), SizedBox(height: 15), _card(_chooseItem(EditUserType.CONFESS)), SizedBox(height: 15), + _card(_chooseItem(EditUserType.ELECTRICITY)), + SizedBox(height: 15), + _card(_chooseItem(EditUserType.CONFESS)), + SizedBox(height: 15), _card(_chooseItem(EditUserType.ACCEPT_CONFESS)), SizedBox(height: 15), - _card(_chooseItem(EditUserType.CONFIRM)), + _card(_chooseItem(EditUserType.WORK)), SizedBox(height: 15), - _card(_chooseItem(EditUserType.LEADER)), + _card(_chooseItem(EditUserType.CONFIRM)), SizedBox(height: 15), _card(_chooseItem(EditUserType.AUDIT)), SizedBox(height: 15), _card(_chooseItem(EditUserType.APPROVE)), SizedBox(height: 15), - _card(_chooseItem(EditUserType.MONITOR)), - SizedBox(height: 15), _card( Column( mainAxisAlignment: MainAxisAlignment.start, @@ -604,7 +587,7 @@ class _ElectricityApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -632,45 +615,9 @@ class _ElectricityApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -678,18 +625,54 @@ class _ElectricityApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqgl_work_detail/electricity_aqgl_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart similarity index 95% rename from lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqgl_work_detail/electricity_aqgl_detail.dart rename to lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart index 39a3fba..44458fc 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/aqgl_work_detail/electricity_aqgl_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart @@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; @@ -15,9 +15,9 @@ import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart'; -/// 安全管理部门意见 -class ElectricityAqglDetail extends StatefulWidget { - const ElectricityAqglDetail({ +/// 配送电单位意见 +class ElectricityPsdwDetail extends StatefulWidget { + const ElectricityPsdwDetail({ super.key, required this.ELECTRICITY_ID, required this.flow, @@ -27,10 +27,10 @@ class ElectricityAqglDetail extends StatefulWidget { final String flow; @override - State createState() => _ElectricityAqglDetailState(); + State createState() => _ElectricityPsdwDetailState(); } -class _ElectricityAqglDetailState extends State { +class _ElectricityPsdwDetailState extends State { late bool isEditable = false; /// 详情 @@ -263,7 +263,7 @@ class _ElectricityAqglDetailState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '安全管理部门意见'), + appBar: MyAppbar(title: '配送电单位意见'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -290,7 +290,7 @@ class _ElectricityAqglDetailState extends State { Column( children: [ ListItemFactory.createBuildMultilineInput( - '安全管理部门意见', + '配送电单位意见', '请输入意见', _contentController, isRequired: true @@ -301,7 +301,7 @@ class _ElectricityAqglDetailState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ListItemFactory.headerTitle('安全管理部门负责人'), + ListItemFactory.headerTitle('配送电单位负责人'), CustomButton( text: '新增手写签字', height: 36, diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_edit.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_edit.dart deleted file mode 100644 index f7b47bc..0000000 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_edit.dart +++ /dev/null @@ -1,272 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:qhd_prevention/customWidget/custom_button.dart'; -import 'package:qhd_prevention/customWidget/toast_util.dart'; -import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart'; -import 'package:qhd_prevention/tools/h_colors.dart'; -import 'package:qhd_prevention/tools/tools.dart'; -import 'package:qhd_prevention/http/ApiService.dart'; -import 'package:qhd_prevention/pages/my_appbar.dart'; -import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; -import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; - -/// 气体分析 -class ElectricityGasEdit extends StatefulWidget { - const ElectricityGasEdit({ - super.key, - required this.CONFINEDSPACE_ID, - this.addFlag = false, - }); - - final String CONFINEDSPACE_ID; - final bool addFlag; - - @override - State createState() => _ElectricityGasEditState(); -} - -class _ElectricityGasEditState extends State { - Map pd = {}; - final TextEditingController _gasName1Controller = TextEditingController(); - final TextEditingController _gasName2Controller = TextEditingController(); - final TextEditingController _gasName3Controller = TextEditingController(); - final TextEditingController _gasName4Controller = TextEditingController(); - final TextEditingController _gasStandard1Controller = TextEditingController(); - final TextEditingController _gasStandard2Controller = TextEditingController(); - final TextEditingController _gasStandard3Controller = TextEditingController(); - final TextEditingController _gasStandard4Controller = TextEditingController(); - - @override - void initState() { - super.initState(); - _getData(); - } - - Future _getData() async { - try { - final result = await ApiService.getConfinedspacegaswh(widget.CONFINEDSPACE_ID); - if (FormUtils.hasValue(result, 'pd')) { - setState(() { - pd = result['pd']; - _gasName1Controller.text = pd['GAS_NAME1'] ?? ''; - _gasStandard1Controller.text = pd['GAS_STANDARD1'] ?? ''; - _gasName2Controller.text = pd['GAS_NAME2'] ?? ''; - _gasStandard2Controller.text = pd['GAS_STANDARD2'] ?? ''; - _gasName3Controller.text = pd['GAS_NAME3'] ?? ''; - _gasStandard3Controller.text = pd['GAS_STANDARD3'] ?? ''; - _gasName4Controller.text = pd['GAS_NAME4'] ?? ''; - _gasStandard4Controller.text = pd['GAS_STANDARD4'] ?? ''; - }); - } - } catch (e) { - ToastUtil.showNormal(context, '获取数据失败: \$e'); - } - } - - Future _gasAnalyze() async { - // 清理旧的气体信息,避免遗留空字段 - for (var key in [ - 'GAS_NAME1', 'GAS_STANDARD1', - 'GAS_NAME2', 'GAS_STANDARD2', - 'GAS_NAME3', 'GAS_STANDARD3', - 'GAS_NAME4', 'GAS_STANDARD4' - ]) { - pd.remove(key); - } - - // 收集输入值,仅在非空时写入 pd - void assignIfNotEmpty(String key, String value) { - if (value.trim().isNotEmpty) pd[key] = value.trim(); - } - - assignIfNotEmpty('GAS_NAME1', _gasName1Controller.text); - assignIfNotEmpty('GAS_STANDARD1', _gasStandard1Controller.text); - assignIfNotEmpty('GAS_NAME2', _gasName2Controller.text); - assignIfNotEmpty('GAS_STANDARD2', _gasStandard2Controller.text); - assignIfNotEmpty('GAS_NAME3', _gasName3Controller.text); - assignIfNotEmpty('GAS_STANDARD3', _gasStandard3Controller.text); - assignIfNotEmpty('GAS_NAME4', _gasName4Controller.text); - assignIfNotEmpty('GAS_STANDARD4', _gasStandard4Controller.text); - - // 固定字段 - pd['CONFINEDSPACE_ID'] = widget.CONFINEDSPACE_ID; - pd['ANALYZE_USER'] = SessionService.instance.username; - - // 校验至少填写了一项气体名称 - final hasAnyName = pd.containsKey('GAS_NAME1') || pd.containsKey('GAS_NAME2') || - pd.containsKey('GAS_NAME3') || pd.containsKey('GAS_NAME4'); - if (!hasAnyName) { - ToastUtil.showNormal(context, - widget.addFlag ? '最少填写一项气体名称' : '无气体检测信息'); - return; - } - - // 配对校验:有名称必须有标准,反之亦然 - void checkPair(String nameKey, String stdKey, String label) { - final hasName = pd.containsKey(nameKey); - final hasStd = pd.containsKey(stdKey); - if (hasName && !hasStd) { - ToastUtil.showNormal(context, '请输入$label 的合格标准'); - throw ''; - } - if (!hasName && hasStd) { - ToastUtil.showNormal(context, '请输入$label 的名称'); - throw ''; - } - } - - try { - checkPair('GAS_NAME1', 'GAS_STANDARD1', '有毒有害气体名称1'); - checkPair('GAS_NAME2', 'GAS_STANDARD2', '有毒有害气体名称2'); - checkPair('GAS_NAME3', 'GAS_STANDARD3', '可燃气体名称1'); - checkPair('GAS_NAME4', 'GAS_STANDARD4', '可燃气体名称2'); - } catch (_) { - return; - } - - // 提交 - final isEdit = pd.containsKey('CONFINEDSPACEGASWH_ID') && - pd['CONFINEDSPACEGASWH_ID'] != null; - final url = isEdit ? '/app/confinedspacegaswh/edit' : '/app/confinedspacegaswh/add'; - try { - LoadingDialogHelper.show(); - final res = await ApiService.submitSpaceGas(url, pd); - LoadingDialogHelper.hide(); - if (res != null && res['result'] == 'success') { - - Map arguments = { - 'isShow': widget.addFlag, - 'CONFINEDSPACE_ID': widget.CONFINEDSPACE_ID, - 'addFlag': 1, - 'GAS_NAME1': pd['GAS_NAME1'] ?? '', - 'GAS_NAME2': pd['GAS_NAME2'] ?? '', - 'GAS_NAME3': pd['GAS_NAME3'] ?? '', - 'GAS_NAME4': pd['GAS_NAME4'] ?? '', - }; - pushPage(SpaceworkGasList(CONFINEDSPACE_ID: widget.CONFINEDSPACE_ID, saveParams: arguments,addFlag: true,), context); - } else { - ToastUtil.showNormal(context, res['message'] ?? '提交失败'); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '提交异常: $e'); - } - } - - Widget _card(Widget child) { - return Container( - padding: const EdgeInsets.symmetric(vertical: 5), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(5), - ), - child: child, - ); - } - - Widget _buildListContent() { - return Padding( - padding: const EdgeInsets.all(12), - child: SingleChildScrollView( - child: Column( - children: [ - _card( - Column( - children: [ - ItemListWidget.selectableLineTitleTextField( - label: '有毒有害气体名称1:', - isEditable: true, - controller: _gasName1Controller, - text: '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextField( - label: '合格标准:', - isEditable: true, - controller: _gasStandard1Controller, - text: '', - ), - ], - ), - ), - const SizedBox(height: 12), - _card( - Column( - children: [ - ItemListWidget.selectableLineTitleTextField( - label: '有毒有害气体名称2:', - isEditable: true, - controller: _gasName2Controller, - text: '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextField( - label: '合格标准:', - isEditable: true, - controller: _gasStandard2Controller, - text: '', - ), - ], - ), - ), - const SizedBox(height: 12), - _card( - Column( - children: [ - ItemListWidget.selectableLineTitleTextField( - label: '可燃气体名称1:', - isEditable: true, - controller: _gasName3Controller, - text: '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextField( - label: '合格标准:', - isEditable: true, - controller: _gasStandard3Controller, - text: '', - ), - ], - ), - ), - const SizedBox(height: 12), - _card( - Column( - children: [ - ItemListWidget.selectableLineTitleTextField( - label: '可燃气体名称2:', - isEditable: true, - controller: _gasName4Controller, - text: '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextField( - label: '合格标准:', - isEditable: true, - controller: _gasStandard4Controller, - text: '', - ), - ], - ), - ), - const SizedBox(height: 20), - CustomButton( - text: '气体分析', - backgroundColor: Colors.green, - onPressed: _gasAnalyze, - ), - ], - ), - ), - ); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: h_backGroundColor(), - appBar: MyAppbar(title: '气体名称'), - body: SafeArea(child: _buildListContent()), - ); - } -} 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 2a4fc37..268e9fc 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 @@ -75,23 +75,23 @@ class _ElectricityGasListState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('分析时间: ${item['ANALYZE_TIME'] ?? ''}'), - Text('代表性气体: ${item['ANALYZE_GAS'] ?? ''}'), - ], - ), - const SizedBox(height: 6), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('分析数据: ${item['ANALYZE_RESULT'] ?? ''}'), if ((item['ANALYZE_PLACE'] ?? '').toString().isNotEmpty) Text('分析地点: ${item['ANALYZE_PLACE']}'), ], ), const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('可燃气体检测结果: ${item['ANALYZE_RESULT'] ?? ''}'), + + ], + ), + const SizedBox(height: 6), Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - const Text('分析人:'), + Text('分析人:${item['ANALYZE_USER'] ?? ''}'), const SizedBox(width: 8), Expanded( child: Wrap( @@ -101,7 +101,7 @@ class _ElectricityGasListState extends State { final img = baseImgPath + images[i]; return GestureDetector( onTap: () { - present( + presentOpaque( SingleImageViewer(imageUrl: img), context, ); @@ -119,7 +119,7 @@ class _ElectricityGasListState extends State { if (widget.addFlag) TextButton( onPressed: () => - _deleteItem(item['HOTWORKGAS_ID'].toString()), + _deleteItem(item['ELECTRICITYGAS_ID'].toString()), style: TextButton.styleFrom( backgroundColor: Colors.red, padding: const EdgeInsets.symmetric(horizontal: 12), @@ -171,7 +171,7 @@ class _ElectricityGasListState extends State { return Scaffold( backgroundColor: Colors.white, appBar: MyAppbar( - title: '气体分析详情', + title: '临时用电作业气体分析', actions: [ if (widget.addFlag) TextButton( 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 0511131..42c7ce6 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 @@ -1,5 +1,4 @@ import 'dart:io'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart'; import 'package:dotted_line/dotted_line.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -15,13 +14,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, - this.saveParams = const {}, - }) : super(key: key); + const ElectricityGasTestPage({Key? key, required this.ELECTRICITY_ID}) : super(key: key); - final Map saveParams; final String ELECTRICITY_ID; @override @@ -32,24 +26,13 @@ class _ElectricityGasTestPageState extends State { String _selectData = ''; List imagePaths = []; List signTimes = []; // 签字时间列表 - Map pd = {}; - final TextEditingController _PartController = TextEditingController(); // 部位 - final TextEditingController _O2Controller = TextEditingController(); // 结果 - final TextEditingController _addressController = - TextEditingController(); // 地点 - - final TextEditingController _gas1Controller = TextEditingController(); // 地点 - final TextEditingController _gas2Controller = TextEditingController(); // 地点 - final TextEditingController _gas3Controller = TextEditingController(); // 地点 - final TextEditingController _gas4Controller = TextEditingController(); // 地点 - + final TextEditingController _pointController = TextEditingController(); + final TextEditingController _resultController = TextEditingController(); bool _loading = false; @override void initState() { super.initState(); - pd['ANALYZE_USER'] = SessionService.instance.username; - pd['ELECTRICITY_ID'] = widget.ELECTRICITY_ID; } Future _chooseDatePicker() async { @@ -57,7 +40,6 @@ class _ElectricityGasTestPageState extends State { if (picked != null) { setState(() { _selectData = DateFormat('yyyy-MM-dd HH:mm').format(picked); - pd['ANALYZE_TIME'] = _selectData; }); } } @@ -80,59 +62,58 @@ class _ElectricityGasTestPageState extends State { Widget _signListWidget() { return Column( - children: - imagePaths.map((path) { - return Column( + children: imagePaths.map((path) { + return Column( + children: [ + const SizedBox(height: 10), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const SizedBox(height: 10), - const Divider(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + 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: [ - GestureDetector( - child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain - ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - maxHeight: 150, - ), - child: Image.file( - File(path), - // 改为完整显示 - fit: BoxFit.contain, - ), + 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); + }); + }, ), - 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(), ); } @@ -142,13 +123,7 @@ class _ElectricityGasTestPageState extends State { return; } if (status == 1) { - if (_selectData.isEmpty) { - ToastUtil.showNormal(context, '请选择取样分析时间'); - return; - } - if (_PartController.text.isEmpty || - _O2Controller.text.isEmpty || - _addressController.text.isEmpty) { + if (_selectData.isEmpty || _resultController.text.isEmpty || _pointController.text.isEmpty) { ToastUtil.showNormal(context, '请完善所有字段'); return; } @@ -158,82 +133,53 @@ class _ElectricityGasTestPageState extends State { if (status != 1) { await showDialog( context: context, - builder: - (_) => CustomAlertDialog( - title: '作废原因', - mode: DialogMode.input, - hintText: '请输入作废原因', - cancelText: '取消', - confirmText: '确定', - onInputConfirm: (text) { - reasonText = text; - }, - ), + builder: (_) => CustomAlertDialog( + title: '作废原因', + mode: DialogMode.input, + hintText: '请输入作废原因', + cancelText: '取消', + confirmText: '确定', + onInputConfirm: (text) { + reasonText = text; + }, + ), ); 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; + await showDialog( + context: context, + builder: (_) => CustomAlertDialog( + title: '请确认', + content: status == 1 ? '通过本作业票?' : '作废本作业票?', + onConfirm: () { + isConfirm = true; + }, + ), + ); + if (isConfirm != true) return; setState(() => _loading = true); final formData = { - ...pd, - 'ANALYZE_PART': _PartController.text, - 'OXYGEN_CONTENT': _O2Controller.text, - 'ANALYZE_PLACE': _addressController.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, }; - await showDialog( - context: context, - builder: - (_) => CustomAlertDialog( - title: '请确认', - content: status == 1 ? '通过本作业票?' : '作废本作业票?', - onConfirm: () { - isConfirm = true; - }, - ), - ); - if (isConfirm != true) return; try { - await ApiService.saveGasTest('confinedspace',formData, imagePaths); + await ApiService.saveGasTest('electricity',formData, imagePaths); ToastUtil.showNormal(context, status == 1 ? '保存成功' : '作废成功'); Navigator.of(context).pop(status == 1); } catch (e) { @@ -243,169 +189,96 @@ class _ElectricityGasTestPageState extends State { } } - Future setRequest() async {} + Future setRequest() async { + + } @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: [ - if (FormUtils.hasValue( - widget.saveParams, - 'GAS_NAME1', - )) - Column( - children: [ - ItemListWidget.singleLineTitleText( - label: '${widget.saveParams['GAS_NAME1']}:', - isEditable: true, - isRequired: false, - strongRequired: false, - controller: _gas1Controller, - ), - const Divider(), - ], - ), - if (FormUtils.hasValue( - widget.saveParams, - 'GAS_NAME2', - )) - Column( - children: [ - ItemListWidget.singleLineTitleText( - label: '${widget.saveParams['GAS_NAME2']}:', - isEditable: true, - isRequired: false, - strongRequired: false, - controller: _gas2Controller, - ), - const Divider(), - ], - ), - if (FormUtils.hasValue( - widget.saveParams, - 'GAS_NAME3', - )) - Column( - children: [ - ItemListWidget.singleLineTitleText( - label: '${widget.saveParams['GAS_NAME3']}:', - isEditable: true, - isRequired: false, - strongRequired: false, - controller: _gas3Controller, - ), - const Divider(), - ], - ), - if (FormUtils.hasValue( - widget.saveParams, - 'GAS_NAME4', - )) - Column( - children: [ - ItemListWidget.singleLineTitleText( - label: '${widget.saveParams['GAS_NAME4']}:', - isEditable: true, - isRequired: false, - strongRequired: false, - controller: _gas4Controller, - ), - const Divider(), - ], - ), - - ItemListWidget.selectableLineTitleTextRightButton( - label: '取样分析时间', - isEditable: true, - text: _selectData, - onTap: _chooseDatePicker, - ), - const Divider(), - ItemListWidget.singleLineTitleText( - label: '分析部位:', - hintText: '请输入分析部位', - isEditable: true, - controller: _PartController, - ), - const Divider(), - ItemListWidget.singleLineTitleText( - label: '氧气含量:', - hintText: '请输入氧气含量', - isEditable: true, - controller: _O2Controller, - ), - - const Divider(), - ItemListWidget.singleLineTitleText( - label: '分析地点:', - hintText: '请输入分析地点', - isEditable: true, - controller: _addressController, - ), - const Divider(), - ItemListWidget.singleLineTitleText( - label: '分析人:', - isEditable: false, - strongRequired: true, - 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), - ), - ), - ], - ), - ], - ), + 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, + ), + ], + ), + 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), + ), + ), + ], + ), + ], + ), + ), + ) ); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart index a801349..da0868c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart @@ -43,6 +43,7 @@ class _SafeFunctionDialogState extends State { @override Widget build(BuildContext context) { return AlertDialog( + backgroundColor: Colors.white, insetPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 24), content: SizedBox( width: MediaQuery.of(context).size.width - 24, 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 e23c231..fbab659 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 @@ -9,7 +9,7 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart'; import 'package:qhd_prevention/customWidget/department_picker.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/http/ApiService.dart'; @@ -18,7 +18,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work/szaq_work_detail/SafeFunctionDialog.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart'; /// 设置安全措施确认人 class ElectricitySetSafeDetail extends StatefulWidget { const ElectricitySetSafeDetail({ @@ -568,7 +568,7 @@ class _ElectricitySetSafeDetailState extends State { child: Column( children: [ // _card(_defaultDetail()), - HotWorkDetailFormWidget( + ElectricityDetailFormWidget( pd: pd, isEditable: false, onChooseLevel: (){}, diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szdw_work_detail/electricity_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart similarity index 95% rename from lib/pages/home/tap/tabList/special_wrok/lsyd_work/szdw_work_detail/electricity_szdw_detail.dart rename to lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart index 9d2c5c1..eec0a71 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szdw_work_detail/electricity_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart @@ -12,11 +12,11 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; -/// 所在单位意见 -class ElectricitySzdwDetail extends StatefulWidget { - const ElectricitySzdwDetail({ +/// 用电单位意见 +class ElectricityYddwDetail extends StatefulWidget { + const ElectricityYddwDetail({ super.key, required this.ELECTRICITY_ID, required this.flow, @@ -26,10 +26,10 @@ class ElectricitySzdwDetail extends StatefulWidget { final String flow; @override - State createState() => _ElectricitySzdwDetailState(); + State createState() => _ElectricityYddwDetailState(); } -class _ElectricitySzdwDetailState extends State { +class _ElectricityYddwDetailState extends State { late bool isEditable = false; /// 详情 @@ -133,7 +133,7 @@ class _ElectricitySzdwDetailState extends State { String DESCR = _contentController.text.trim(); if (DESCR.isEmpty) { - ToastUtil.showNormal(context, '请输入所在单位负责人意见'); + ToastUtil.showNormal(context, '请输入用电单位意见'); return; } if (status == '1') { @@ -263,7 +263,7 @@ class _ElectricitySzdwDetailState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '所在单位意见'), + appBar: MyAppbar(title: '用电单位意见'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -290,7 +290,7 @@ class _ElectricitySzdwDetailState extends State { Column( children: [ ListItemFactory.createBuildMultilineInput( - '所在单位负责人意见', + '用电单位意见', '请输入意见', _contentController, isRequired: true @@ -301,7 +301,7 @@ class _ElectricitySzdwDetailState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ListItemFactory.headerTitle('所在单位负责人'), + ListItemFactory.headerTitle('用电单位负责人'), CustomButton( text: '新增手写签字', height: 36, 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 new file mode 100644 index 0000000..ab6935c --- /dev/null +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart @@ -0,0 +1,321 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +/// 用电人签字 +class ElectricityYdrDetail extends StatefulWidget { + const ElectricityYdrDetail({ + super.key, + required this.ELECTRICITY_ID, + required this.flow, + }); + + final String ELECTRICITY_ID; + final String flow; + + @override + State createState() => _ElectricityYdrDetailState(); +} + +class _ElectricityYdrDetailState extends State { + late bool isEditable = false; + /// 详情 + late Map pd = {}; + /// 安全防护措施列表 + late List> measuresList = []; + late Map signs = {}; + + + List imagePaths = []; + List signTimes = []; // 签字时间列表 + @override + void initState() { + super.initState(); + _getData(); + } + + /// 签字 + Future _sign() async { + final path = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => MineSignPage()), + ); + 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: [ + 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), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + /// 作废 -1 通过 1 + Future _submit(String status) async { + if (imagePaths.isEmpty) { + ToastUtil.showNormal(context, '请签字'); + return; + } + String reasonText = ''; + + if (status == '1') { + } else { + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '作废原因', + mode: DialogMode.input, + hintText: '请输入作废原因', + cancelText: '取消', + confirmText: '确定', + onInputConfirm: (text) { + reasonText = text; + }, + ), + ); + if (reasonText.isEmpty) { + ToastUtil.showNormal(context, '请填写作废原因'); + return; + } + } + + final Map formData = {}; + // 提交参数 + formData['ELECTRICITY_ID'] = widget.ELECTRICITY_ID; + formData['SIGNTIME'] = signTimes.join(','); + formData['USER_ID'] = SessionService.instance.loginUserId; + formData['APPLY_STATUS'] = status; + formData['STEP_REASON'] = reasonText; + + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '提示', + content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?', + cancelText: '取消', + confirmText: '确定', + onConfirm: () async { + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( +'electricity', + formData, + imagePaths, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess( + context, + '保存成功', + ); + Navigator.pop(context); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } + }, + ), + ); + } + + /// 初始化拉取数据 + Future _getData() async { + final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID); + setState(() { + pd = data['pd']; + + _getSigns(pd['ELECTRICITY_ID'] ?? ''); + _getMeasures(pd['ELECTRICITY_ID'] ?? ''); + }); + } + + Future _getMeasures(String homework_id) async { + final data = await ApiService.listSignFinishMeasures('electricity', + homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, + ); + setState(() { + measuresList = List>.from( + data['finishMeasuresList'] ?? >[], + ); + }); + } + + Future _getSigns(String homework_id) async { + final data = await ApiService.listSignFinished('electricity', + homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, + ); + setState(() { + signs = data['signs'] ?? {}; + }); + } + + /// 其他安全防护措施 + Widget _setSafeDetailWidget() { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.symmetric(horizontal: 5), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.createBuildSimpleSection('用电人'), + CustomButton( + text: '新增手写签字', + height: 36, + backgroundColor: Colors.green, + onPressed: () { + _sign(); + }, + ), + ], + ), + SizedBox(height: 10), + if (imagePaths.isNotEmpty) _signListWidget(), + ], + ), + ); + } + + /// 底部按钮 + Widget _bottomButtons() { + return Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '作废', + backgroundColor: Colors.red, + onPressed: () { + _submit('-1'); + }, + ), + ), + Expanded( + child: CustomButton( + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '通过', + backgroundColor: Colors.green, + onPressed: () { + _submit('1'); + }, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '用电人签字确认'), + body: SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.all(12), + child: Column( + children: [ + // _card(_defaultDetail()), + SpecialWorkFormBaseWork( + pd: pd, + measuresList: measuresList, + signs: signs, + baseImgPath: ApiService.baseImgPath, + isEditable: false, + onChooseLevel: () {}, + onChooseHotworkUser: () {}, + onAnalyzeTap: () { + pushPage( + ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID), + context, + ); + }, + ), + SizedBox(height: 20), + _setSafeDetailWidget(), + SizedBox(height: 20), + _bottomButtons(), + ], + ), + ), + ), + ); + } +} 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 af29694..0509cc7 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; 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 89db286..af446e8 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart'; /// 作业负责人意见 class ElectricityZyfzDetail extends StatefulWidget { 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 new file mode 100644 index 0000000..2a75afa --- /dev/null +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart @@ -0,0 +1,308 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';/// 作业人签字 +class ElectricityZyrDetail extends StatefulWidget { + const ElectricityZyrDetail({ + super.key, + required this.ELECTRICITY_ID, + required this.flow, + }); + + final String ELECTRICITY_ID; + final String flow; + + @override + State createState() => _ElectricityZyrDetailState(); +} + +class _ElectricityZyrDetailState extends State { + late bool isEditable = false; + + /// 详情 + late Map pd = {}; + + /// 安全防护措施列表 + late List> measuresList = []; + late Map signs = {}; + + List signImages = []; + List signTimes = []; // 签字时间列表 + @override + void initState() { + super.initState(); + _getData(); + } + + /// 签字 + Future _sign() async { + final path = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => MineSignPage()), + ); + if (path != null) { + final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); + + setState(() { + signImages.add(path); + signTimes.add(now); + FocusHelper.clearFocus(context); + }); + } + } + + Widget _signListWidget() { + return Column( + children: + signImages.map((path) { + return Column( + children: [ + const SizedBox(height: 10), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + 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( + 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(() { + signImages.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + /// 作废 -1 通过 1 + Future _submit(String status) async { + if (signImages.isEmpty) { + ToastUtil.showNormal(context, '请签字'); + return; + } + String reasonText = ''; + + if (status == '1') { + } else { + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '作废原因', + mode: DialogMode.input, + hintText: '请输入作废原因', + cancelText: '取消', + confirmText: '确定', + onInputConfirm: (text) { + reasonText = text; + }, + ), + ); + if (reasonText.isEmpty) { + ToastUtil.showNormal(context, '请填写作废原因'); + return; + } + } + + // 存回 measures + final Map formData = {}; + // 提交参数 + formData['ELECTRICITY_ID'] = widget.ELECTRICITY_ID; + formData['SIGNTIME'] = signTimes.join(','); + formData['USER_ID'] = SessionService.instance.loginUserId; + formData['APPLY_STATUS'] = status; + formData['STEP_REASON'] = reasonText; + + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '提示', + content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?', + cancelText: '取消', + confirmText: '确定', + onConfirm: () async { + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( +'electricity', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.pop(context); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } + }, + ), + ); + } + + /// 初始化拉取数据 + Future _getData() async { + final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID); + setState(() { + pd = data['pd']; + + _getSigns(pd['ELECTRICITY_ID'] ?? ''); + _getMeasures(pd['ELECTRICITY_ID'] ?? ''); + }); + } + + Future _getMeasures(String homework_id) async { + final data = await ApiService.listSignFinishMeasures('electricity', + homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, + ); + setState(() { + measuresList = List>.from( + data['finishMeasuresList'] ?? >[], + ); + }); + } + + Future _getSigns(String homework_id) async { + final data = await ApiService.listSignFinished('electricity', + homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, + ); + setState(() { + signs = data['signs'] ?? {}; + }); + } + + /// 底部按钮 + Widget _bottomButtons() { + return Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '作废', + backgroundColor: Colors.red, + onPressed: () { + _submit('-1'); + }, + ), + ), + Expanded( + child: CustomButton( + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '通过', + backgroundColor: Colors.green, + onPressed: () { + _submit('1'); + }, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '作业人签字确认'), + body: SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.all(12), + child: Column( + spacing: 12, + children: [ + // _setSafeDetailWidget(), + SpecialWorkFormBaseWork( + pd: pd, + measuresList: measuresList, + signs: signs, + baseImgPath: ApiService.baseImgPath, + isEditable: false, + onChooseLevel: () {}, + onChooseHotworkUser: () {}, + onAnalyzeTap: () { + pushPage( + ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID), + context, + ); + }, + ), + ItemListWidget.itemContainer( + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.headerTitle('作业人'), + CustomButton( + text: '新增手写签字', + height: 36, + backgroundColor: Colors.green, + onPressed: () { + _sign(); + }, + ), + ], + ), + if (signImages.isNotEmpty) _signListWidget(), + ], + ), + ), + _bottomButtons(), + ], + ), + ), + ), + ); + } +} 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 d589f33..4671e1b 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 @@ -1,19 +1,58 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import '../../../../../../tools/tools.dart'; import '../../../item_list_widget.dart'; import '../../special_Wrok/MeasuresListWidget.dart'; -/// 通用高处作业明细表单组件(支持编辑/只读) +class MBCD_data_model { + String BOARD_MATERIAL; + String BOARD_SPECIFICATION; + String BOARD_NO; + + MBCD_data_model({ + required this.BOARD_MATERIAL, + required this.BOARD_SPECIFICATION, + required this.BOARD_NO, + }); + + factory MBCD_data_model.fromJson(Map json) { + return MBCD_data_model( + BOARD_MATERIAL: json['BOARD_MATERIAL'] as String? ?? '', + BOARD_SPECIFICATION: json['BOARD_SPECIFICATION'] as String? ?? '', + // 修复:这里应该读取 BOARD_NO,而不是 BOARD_SPECIFICATION + BOARD_NO: json['BOARD_NO'] as String? ?? '', + ); + } + + Map toJson() { + return { + 'BOARD_MATERIAL': BOARD_MATERIAL, + 'BOARD_SPECIFICATION': BOARD_SPECIFICATION, + 'BOARD_NO': BOARD_NO, + }; + } +} + +/// 通用盲板作业明细表单组件(支持编辑/只读) class BlindboardDetailFormWidget extends StatefulWidget { final Map pd; + final List boardList; + final bool isEditable; final VoidCallback onChooseLevel; /// 编辑模式下需提供以下控制器,非编辑模式可不传 - final TextEditingController? locationController; // 地点 - final TextEditingController? hightController; // 高度 - final TextEditingController? contentController; // 内容 + final TextEditingController? nameController; // 名称 + /// 管道参数 + final TextEditingController? mediumController; // 介质 + final TextEditingController? temperatureController; // 温度 + final TextEditingController? pressureController; // 压力 + final TextEditingController? relatedController; final TextEditingController? riskController; @@ -22,40 +61,51 @@ class BlindboardDetailFormWidget extends StatefulWidget { required this.pd, required this.isEditable, required this.onChooseLevel, - this.locationController, - this.hightController, - this.contentController, + required this.boardList, + this.nameController, + this.mediumController, + this.temperatureController, + this.pressureController, this.relatedController, this.riskController, }) : assert( - !isEditable || - (locationController != null && - hightController != null && - contentController != null && - relatedController != null && - riskController != null), - 'Editable mode requires all TextEditingController parameters', - ), - super(key: key); + !isEditable || + (nameController != null && + mediumController != null && + temperatureController != null && + pressureController != null && + relatedController != null && + riskController != null), + 'Editable mode requires all TextEditingController parameters', + ), + super(key: key); @override - State createState() => _BlindboardDetailFormWidgetState(); + State createState() => + _BlindboardDetailFormWidgetState(); } -class _BlindboardDetailFormWidgetState extends State { +class _BlindboardDetailFormWidgetState + extends State { + /// 盲板抽堵参数 + late final List> boardList; + String _getWorkLevelText(dynamic level) { switch (level?.toString()) { - case '1': return 'I级高处作业'; - case '2': return 'II级高处作业'; - case '3': return 'III级高处作业'; - case '4': return 'IV级高处作业'; - default: return ''; + case '1': + return '堵盲板'; + case '2': + return '抽盲板'; + default: + return ''; } } @override Widget build(BuildContext context) { + final boardList = widget.boardList; final pd = widget.pd; + return Container( padding: const EdgeInsets.symmetric(vertical: 10), decoration: const BoxDecoration( @@ -74,53 +124,183 @@ class _BlindboardDetailFormWidgetState extends State const Divider(), ], ItemListWidget.singleLineTitleText( - label: '作业地点:', - isEditable: widget.isEditable, - controller: widget.locationController, - text: pd['WORK_PLACE'] ?? '', + label: '申请部门:', + isEditable: false, + text: pd['APPLY_DEPARTMENT_NAME'] ?? '', ), const Divider(), ItemListWidget.singleLineTitleText( - label: '作业高度(米):', - keyboardType: TextInputType.numberWithOptions( - decimal: true, // 允许小数点 - signed: false, // 允许负号(如需) - ), - isEditable: widget.isEditable, - controller: widget.hightController, - text: pd['WORK_HIGH'] ?? '', + label: '申请人:', + isEditable: false, + text: pd['APPLY_USER_NAME'] ?? '', ), const Divider(), ItemListWidget.selectableLineTitleTextRightButton( - label: '高处作业级别:', + label: '作业方式:', isEditable: widget.isEditable, onTap: widget.onChooseLevel, - text: _getWorkLevelText(pd['WORK_LEVEL']), + text: _getWorkLevelText(pd['WORK_TYPE']), ), const Divider(), - ItemListWidget.multiLineTitleTextField( - label: '作业内容:', + ItemListWidget.singleLineTitleText( + label: '设备管道名称:', isEditable: widget.isEditable, - controller: widget.contentController, - text: pd['WORK_CONTENT'] ?? '', + controller: widget.nameController, + text: pd['NAME'] ?? '', ), const Divider(), + ListItemFactory.createBuildSimpleSection('管道参数'), + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Column( + children: [ + ItemListWidget.singleLineTitleText( + label: '介质:', + isEditable: widget.isEditable, + controller: widget.mediumController, + text: pd['MEDIUM'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '温度:', + isEditable: widget.isEditable, + controller: widget.temperatureController, + text: pd['TEMPERATURE'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '压力:', + isEditable: widget.isEditable, + controller: widget.pressureController, + text: pd['PRESSURE'] ?? '', + ), + ], + ), + ), + + const Divider(), + ...boardList.map((board) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.createBuildSimpleSection('盲板抽堵参数', horPadding: 0), + if (widget.isEditable) + CustomButton( + onPressed: () { + setState(() { + if (boardList.indexOf(board) == 0) { + boardList.add({ + 'BOARD_MATERIAL': '', + 'BOARD_SPECIFICATION': '', + 'BOARD_NO': '', + }); + } else { + boardList.remove(board); + } + }); + }, + text: boardList.indexOf(board) == 0 ? '添加' : '删除', + backgroundColor: + boardList.indexOf(board) == 0 + ? Colors.blue + : Colors.red, + padding: EdgeInsets.symmetric( + horizontal: 15, + vertical: 2, + ), + height: 30, + borderRadius: 15, + ), + ], + ), + ItemListWidget.singleLineTitleText( + label: '材质:', + isEditable: widget.isEditable, + text: board['BOARD_MATERIAL'], + hintText: '请输入材质', + onChanged: (val) { + setState(() { + board['BOARD_MATERIAL'] = val; + }); + }, + isRequired: false, + ), + const Divider(), + + ItemListWidget.singleLineTitleText( + label: '规格:', + isEditable: widget.isEditable, + text: board['BOARD_SPECIFICATION'], + onChanged: (val) { + setState(() { + board['BOARD_SPECIFICATION'] = val; + }); + }, + hintText: '请输入规格', + isRequired: false, + ), + const Divider(), + + ItemListWidget.singleLineTitleText( + label: '编号:', + isEditable: widget.isEditable, + text: board['BOARD_NO'], + onChanged: (val) { + setState(() { + board['BOARD_NO'] = val; + }); + }, + hintText: '请输入编号', + isRequired: false, + ), + if (boardList.indexOf(board) != boardList.length-1) + const Divider(), + + ], + ), + ); + }), + const Divider(), + if (!widget.isEditable && FormUtils.hasValue(pd, 'BOARD_PATH')) ...[ + ItemListWidget.singleLineTitleText( + label: '盲板抽堵位置及安全措施:', + isEditable: false, + text:'', + ), + const Divider(), + + ], + if (!widget.isEditable && FormUtils.hasValue(pd, 'BOARD_PATH')) ...[ + ItemListWidget.twoRowTitleAndImages( + onTapCallBack: (val) { + presentOpaque(SingleImageViewer(imageUrl: val), context); + }, + title: '断路地段示意图:', + imageUrls: pd['BOARD_PATH'], + ), + const Divider(), + ], ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号:', isEditable: widget.isEditable, onTap: () async { final val = await showDialog( context: context, - builder: (_) => SelectionPopup( - type: 'assignments', - initialValue: pd['SPECIAL_WORK'] ?? '', - onConfirm: (v) { - setState(() { - pd['SPECIAL_WORK'] = v; - widget.relatedController?.text = v; - }); - }, - ), + builder: + (_) => SelectionPopup( + type: 'assignments', + initialValue: pd['SPECIAL_WORK'] ?? '', + onConfirm: (v) { + setState(() { + pd['SPECIAL_WORK'] = v; + widget.relatedController?.text = v; + }); + }, + ), ); FocusHelper.clearFocus(context); }, @@ -135,16 +315,17 @@ class _BlindboardDetailFormWidgetState extends State onTap: () async { await showDialog( context: context, - builder: (_) => SelectionPopup( - type: 'identification', - initialValue: pd['RISK_IDENTIFICATION'] ?? '', - onConfirm: (v) { - setState(() { - pd['RISK_IDENTIFICATION'] = v; - widget.riskController?.text = v; - }); - }, - ), + builder: + (_) => SelectionPopup( + type: 'identification', + initialValue: pd['RISK_IDENTIFICATION'] ?? '', + onConfirm: (v) { + setState(() { + pd['RISK_IDENTIFICATION'] = v; + widget.riskController?.text = v; + }); + }, + ), ); FocusHelper.clearFocus(context); }, diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardFormBaseWork.dart index b0ce7d1..7efab0d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardFormBaseWork.dart @@ -10,6 +10,7 @@ import '../../special_Wrok/MeasuresListWidget.dart'; class BlindboardFormBaseWork extends StatelessWidget { /// 基础数据 final Map pd; + final List boardList; /// 安全防护措施列表 final List> measuresList; @@ -35,6 +36,8 @@ class BlindboardFormBaseWork extends StatelessWidget { required this.measuresList, required this.signs, required this.baseImgPath, + required this.boardList, + this.isEditable = false, required this.onChooseLevel, required this.onAnalyzeTap, @@ -224,6 +227,7 @@ class BlindboardFormBaseWork extends StatelessWidget { children: [ // 1. 作业详情表单 BlindboardDetailFormWidget( + boardList: boardList, pd: pd, isEditable: isEditable, onChooseLevel: onChooseLevel, 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 adae5aa..530a8ad 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 @@ -38,6 +38,8 @@ class _BlindboardSafeFuncSureState extends State { /// 详情 late Map pd = {}; + late List boardList = []; + late List> measuresList = []; /// 其他安全措施 final TextEditingController _otherController = TextEditingController(); @@ -289,6 +291,7 @@ class _BlindboardSafeFuncSureState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; + boardList = data['boardList']; _getMeasures(); }); } @@ -450,6 +453,7 @@ class _BlindboardSafeFuncSureState extends State { child: Column( children: [ BlindboardDetailFormWidget( + boardList: boardList, pd: pd, isEditable: false, onChooseLevel: () {}, 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 50491e4..7934d94 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 @@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; @@ -42,6 +42,7 @@ class _BlindboardAqjdDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; late List imgList = []; /// 安全防护措施列表 @@ -233,6 +234,7 @@ class _BlindboardAqjdDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -301,7 +303,8 @@ class _BlindboardAqjdDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 a410276..443fe9c 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 @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart'; @@ -167,14 +168,14 @@ class _BlindboardListPageState extends State { } void _goToDetail(Map item) async { - final Map data = { - 'BLINDBOARD_ID': item['BLINDBOARD_ID'], - 'flow': widget.flow, - }; + switch (widget.flow) { case '提交申请': await pushPage(BlindboardApplyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); break; + case '车间人员签字': + await pushPage(BlindboardCjryDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); + break; case '设置安全措施确认人': await pushPage(BlindboardSetSafeDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); break; @@ -207,11 +208,6 @@ class _BlindboardListPageState extends State { break; case '开始作业': await pushPage(BlindboardKszyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context); - - break; - case '结束作业': - 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); @@ -301,13 +297,13 @@ class _BlindboardListPageState extends State { String _getWorkLevelText(dynamic level) { switch (level?.toString()) { case '1': - return 'I级高处作业'; + return 'I级盲板作业'; case '2': - return 'II级高处作业'; + return 'II级盲板作业'; case '3': - return 'III级高处作业'; + return 'III级盲板作业'; default: - return 'IV级高处作业'; + return 'IV级盲板作业'; } } @@ -330,10 +326,6 @@ class _BlindboardListPageState extends State { "编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), - Text( - "作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), ], ), Row( @@ -357,17 +349,8 @@ class _BlindboardListPageState extends State { Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"), ], ), + Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), - if (item['AUDIT_USER_NAME'] != null) - Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - if (item['APPROVE_USER_NAME'] != null) - Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"), - Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"), - ], - ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ 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 new file mode 100644 index 0000000..ec1cc15 --- /dev/null +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart @@ -0,0 +1,371 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart'; +/// 本地路径 + 线上路径模型 +class ImageData { + String localPath; + String serverPath; + + ImageData({required this.localPath, required this.serverPath}); +} +///车间人员签字 +class BlindboardCjryDetail extends StatefulWidget { + const BlindboardCjryDetail({ + super.key, + required this.BLINDBOARD_ID, + required this.flow, + }); + + final String BLINDBOARD_ID; + final String flow; + + @override + State createState() => _BlindboardCjryDetailState(); +} + +class _BlindboardCjryDetailState extends State { + late bool isEditable = false; + + /// 详情 + late Map pd = {}; + late List boardList = []; + + // final TextEditingController _contentController = TextEditingController(); + + late List imgList = []; + /// 安全防护措施列表 + late List> measuresList = []; + late Map signs = {}; + + List signImages = []; + List signTimes = []; // 签字时间列表 + @override + void initState() { + super.initState(); + _getData(); + } + + /// 签字 + Future _sign() async { + final path = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => MineSignPage()), + ); + if (path != null) { + final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); + + setState(() { + signImages.add(path); + signTimes.add(now); + FocusHelper.clearFocus(context); + }); + } + } + + Widget _signListWidget() { + return Column( + children: + signImages.map((path) { + return Column( + children: [ + const SizedBox(height: 10), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + 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( + 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(() { + signImages.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + /// 作废 -1 通过 1 + Future _submit(String status) async { + if (signImages.isEmpty) { + ToastUtil.showNormal(context, '请签字'); + return; + } + String reasonText = ''; + + if (status == '1') { + // if (_contentController.text.trim().isEmpty) { + // ToastUtil.showNormal(context, '盲板抽堵位置及安全措施'); + // return; + // } + if (imgList.isEmpty) { + ToastUtil.showNormal(context, '请上传盲板抽堵位置图'); + return; + } + } else { + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '作废原因', + mode: DialogMode.input, + hintText: '请输入作废原因', + cancelText: '取消', + confirmText: '确定', + onInputConfirm: (text) { + reasonText = text; + }, + ), + ); + if (reasonText.isEmpty) { + ToastUtil.showNormal(context, '请填写作废原因'); + return; + } + } + final serverPathString = imgList + .map((e) => e.serverPath) + .where((s) => s.isNotEmpty) + .map((s) => s) // 将 String? 转回 String + .join(','); + // 存回 measures + final Map formData = {}; + // 提交参数 + // formData['WORK_CONTENT'] = _contentController.text.trim(); + formData['CONIMG_PATH'] = serverPathString; + + formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ?pd['DESCR']: '无'; + formData['BLINDBOARD_ID'] = pd['BLINDBOARD_ID'] ?? widget.BLINDBOARD_ID; + formData['SIGNTIME'] = signTimes.join(','); + formData['USER_ID'] = SessionService.instance.loginUserId; + formData['APPLY_STATUS'] = status; + formData['STEP_REASON'] = reasonText; + + await showDialog( + context: context, + builder: + (_) => CustomAlertDialog( + title: '提示', + content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?', + cancelText: '取消', + confirmText: '确定', + onConfirm: () async { + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( +'blindboard', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.pop(context); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } + }, + ), + ); + } + + /// 初始化拉取数据 + Future _getData() async { + LoadingDialogHelper.show(); + final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); + setState(() { + pd = data['pd']; + boardList = data['boardList']; + + _getSigns(pd['BLINDBOARD_ID'] ?? ''); + _getMeasures(pd['BLINDBOARD_ID'] ?? ''); + }); + LoadingDialogHelper.hide(); + + } + Future _getMeasures(String homework_id) async { + final data = await ApiService.listSignFinishMeasures('blindboard', + homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, + ); + setState(() { + measuresList = List>.from( + data['finishMeasuresList'] ?? >[], + ); + }); + } + + Future _getSigns(String homework_id) async { + final data = await ApiService.listSignFinished('blindboard', + homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, + ); + setState(() { + signs = data['signs'] ?? {}; + }); + } + /// 拍照或选图后的回调 + Future _onImageAdded(String localPath) async { + // 上传到服务器 + final res = await ApiService.uploadSaveFile(localPath); + final url = res['FILE_PATH'] as String; + setState(() { + imgList.add(ImageData(localPath: localPath, serverPath: url)); + }); + } + + /// 删除图片处理:调用删除接口并更新列表 + Future _onImageRemoved(ImageData item) async { + if (item.serverPath != null) { + await ApiService.deleteSaveFile(item.serverPath!); + } + setState(() { + imgList.remove(item); + }); + } + /// 底部按钮 + Widget _bottomButtons() { + return Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '作废', + backgroundColor: Colors.red, + onPressed: () { + _submit('-1'); + }, + ), + ), + Expanded( + child: CustomButton( + textStyle: TextStyle(fontSize: 16, color: Colors.white), + text: '通过', + backgroundColor: Colors.green, + onPressed: () { + _submit('1'); + }, + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '车间人员签字'), + body: SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.all(12), + child: Column( + spacing: 12, + children: [ + BlindboardDetailFormWidget( + pd: pd, + boardList: boardList, + isEditable: false, + onChooseLevel: (){}, + ), + ItemListWidget.itemContainer( + Column( + children: [ + ListItemFactory.headerTitle('盲板抽堵位置及安全措施'), + Divider(), + RepairedPhotoSection( + title: '断路地段示意图:', + maxCount: 100, + mediaType: MediaType.image, + onChanged: (paths) {}, + isShowNum: false, + horizontalPadding: 0, + isRequired: true, + onMediaAdded: _onImageAdded, + onMediaRemoved: (path) { + final item = imgList.firstWhere((e) => e.localPath == path); + _onImageRemoved(item); + }, + onAiIdentify: () {}, + ), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.headerTitle('车间人员'), + CustomButton( + text: '新增手写签字', + height: 36, + backgroundColor: Colors.green, + onPressed: () { + _sign(); + }, + ), + ], + ), + if (signImages.isNotEmpty) _signListWidget(), + ], + ) + ], + ), + ), + _bottomButtons(), + ], + ), + ), + ), + ); + } +} 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 387cc83..6ab94bf 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 @@ -34,6 +34,7 @@ class _BlindboardJhrDetailState extends State { late bool isEditable = false; /// 详情 late Map pd = {}; + late List boardList = []; /// 安全防护措施列表 late List> measuresList = []; late Map signs = {}; @@ -198,7 +199,7 @@ class _BlindboardJhrDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; - + boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); }); @@ -331,6 +332,7 @@ class _BlindboardJhrDetailState extends State { // _card(_defaultDetail()), BlindboardDetailFormWidget( pd: pd, + boardList: boardList, isEditable: false, onChooseLevel: (){}, ), 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 a14d016..cca3bd4 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; /// 接受交底人签字 @@ -35,6 +35,7 @@ class _BlindboardJsjdDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; /// 安全防护措施列表 late List> measuresList = []; @@ -200,6 +201,7 @@ class _BlindboardJsjdDetailState extends State { ); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -270,7 +272,8 @@ class _BlindboardJsjdDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 8e7e2cd..2c53694 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; /// 作业结束时间选择 @@ -35,6 +35,7 @@ class _BlindboardJszyDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; /// 选择的时间 String endTime = ''; @@ -239,6 +240,7 @@ class _BlindboardJszyDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -307,7 +309,8 @@ class _BlindboardJszyDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 ad0642a..59b2b49 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; @@ -36,6 +36,7 @@ class _BlindboardKszyDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; /// 选择的时间 String startTime = ''; @@ -209,6 +210,7 @@ class _BlindboardKszyDetailState extends State { ); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -279,7 +281,8 @@ class _BlindboardKszyDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, @@ -294,7 +297,6 @@ class _BlindboardKszyDetailState extends State { GestureDetector( child: Row( children: [ - Text('* ', style: TextStyle(color: Colors.red)), Expanded( child: ListItemFactory.createRowSpaceBetweenItem( leftText: '作业开始时间', 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 2e860f1..e292006 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 @@ -15,18 +15,15 @@ import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/customWidget/bottom_picker.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListWidget.dart'; - enum EditUserType { + WORKSHOP('车间人员单位', '车间人员', true), GUARDIAN('监护人单位', '监护人', true), CONFESS('安全交底人单位', '安全交底人', true), ACCEPT_CONFESS('接受交底人单位', '接受交底人', true), WORK_USER('作业人单位', '作业人', true), CONFIRM('作业负责人单位', '作业负责人', true), LEADER('所在单位', '所在单位负责人', true), - AUDIT('审核部门', '审核部门负责人', true), - APPROVE('审批部门', '审批部门负责人', true), - WORK_START('作业开始负责人单位', '作业开始负责人', true), - WORK_END('作业结束负责人单位', '作业结束负责人', true), + WORK_START('实际作业开始负责人单位', '实际作业开始负责人', true), ACCEPT('验收部门', '验收部门负责人', true); /// 对应的单位显示名 @@ -53,19 +50,27 @@ class BlindboardApplyDetail extends StatefulWidget { class _BlindboardApplyDetailState extends State { late bool isEditable = false; - final levelList = ["I级高处作业", "II级高处作业", "III级高处作业","IV级高处作业"]; + final levelList = ["堵盲板", "抽盲板"]; /// 编辑还是新增 late String msg = 'add'; /// 详情 late Map pd = {}; + late List boardList = [ + {'BOARD_MATERIAL': '', 'BOARD_SPECIFICATION': '', 'BOARD_NO': ''}, + ]; + late Map signs = {}; late List> measuresList = []; - final TextEditingController _locationController = TextEditingController(); - final TextEditingController _hightController = TextEditingController(); - final TextEditingController _contentController = TextEditingController(); + final TextEditingController _nameController = TextEditingController(); // 名称 + /// 管道参数 + final TextEditingController _mediumController = TextEditingController(); // 介质 + final TextEditingController _temperatureController = + TextEditingController(); // 温度 + final TextEditingController _pressureController = + TextEditingController(); // 压力 final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); @@ -91,16 +96,19 @@ class _BlindboardApplyDetailState extends State { } _getHotWorkNameList(); - _contentController.addListener(() { + _nameController.addListener(() { setState(() { - pd['WORK_CONTENT'] = _contentController.text.trim(); + pd['NAME'] = _nameController.text.trim(); }); }); - _locationController.addListener(() { - pd['WORK_PLACE'] = _locationController.text.trim(); + _mediumController.addListener(() { + pd['MEDIUM'] = _mediumController.text.trim(); }); - _hightController.addListener(() { - pd['WORK_HIGH'] = _hightController.text.trim(); + _temperatureController.addListener(() { + pd['TEMPERATURE'] = _temperatureController.text.trim(); + }); + _pressureController.addListener(() { + pd['PRESSURE'] = _pressureController.text.trim(); }); _relatedController.addListener(() { pd['SPECIAL_WORK'] = _relatedController.text.trim(); @@ -121,7 +129,7 @@ class _BlindboardApplyDetailState extends State { void set_pd_USER_ID(EditUserType type, String id) { if (type == EditUserType.WORK_USER) { pd['${type.name}_ID'] = id; - }else{ + } else { pd['${type.name}_USER_ID'] = id; } } @@ -141,7 +149,7 @@ class _BlindboardApplyDetailState extends State { String get_pd_USER_ID(EditUserType type) { if (type == EditUserType.WORK_USER) { return pd['${type.name}_ID'] ?? ''; - }else{ + } else { return pd['${type.name}_USER_ID'] ?? ''; } } @@ -160,8 +168,8 @@ class _BlindboardApplyDetailState extends State { if (choice != null) { // 用户点击确定并选择了 choice setState(() { - pd['WORK_LEVEL_NAME'] = choice; - pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); + pd['WORK_TYPE_NAME'] = choice; + pd['WORK_TYPE'] = (levelList.indexOf(choice) + 1).toString(); FocusHelper.clearFocus(context); }); } @@ -181,16 +189,6 @@ class _BlindboardApplyDetailState extends State { Widget _chooseItem(EditUserType type) { bool isClean = false; bool isRequird = true; - if (pd['WORK_LEVEL'] == '1' && type == EditUserType.AUDIT) { - isRequird = false; - isClean = true; - - } - if (pd['WORK_LEVEL'] != '4' && type == EditUserType.APPROVE) { - isRequird = false; - isClean = true; - - } return Column( children: [ @@ -268,13 +266,15 @@ class _BlindboardApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -302,17 +302,19 @@ class _BlindboardApplyDetailState extends State { Future _submit(String status) async { // 通用文本字段校验规则 final textRules = >[ - {'value': _locationController.text.trim(), 'message': '请填写地点及部位'}, - {'value': _hightController.text.trim(), 'message': '请填写高度'}, + {'value': _nameController.text.trim(), 'message': '请输入设备管线名'}, + {'value': pd['WORK_TYPE'], 'message': '请选择作业方式'}, + {'value': _mediumController.text.trim(), 'message': '请输入介质'}, + {'value': _temperatureController.text.trim(), 'message': '请输入温度'}, + {'value': _pressureController.text.trim(), 'message': '请输入压力'}, - {'value': _contentController.text.trim(), 'message': '请填写作业内容'}, { 'value': _relatedController.text.trim(), 'message': '请输入关联的其他特殊作业及安全作业票编号', }, {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, ]; - final level = pd['WORK_LEVEL'] ?? ''; + final level = pd['WORK_TYPE'] ?? ''; print('---level-$level'); /// 各项负责人校验 @@ -322,13 +324,9 @@ class _BlindboardApplyDetailState extends State { EditUserType.ACCEPT_CONFESS, EditUserType.CONFIRM, EditUserType.LEADER, - if (pd['WORK_LEVEL'] != '1') - EditUserType.AUDIT, - if (pd['WORK_LEVEL'] == '4') - EditUserType.APPROVE, + EditUserType.WORKSHOP, EditUserType.WORK_USER, EditUserType.WORK_START, - EditUserType.WORK_END, EditUserType.ACCEPT, ]; if (status == '1') { @@ -341,7 +339,7 @@ class _BlindboardApplyDetailState extends State { } // 级别校验 if (level.length == 0) { - ToastUtil.showNormal(context, '请输入高处作业级别'); + ToastUtil.showNormal(context, '请选择盲板作业方式'); return; } @@ -358,15 +356,9 @@ class _BlindboardApplyDetailState extends State { } // LoadingDialogHelper.show(); - String taskId = '0'; - if (pd['WORK_LEVEL'] == '1') { - taskId = '5'; - } else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') { - taskId = '6'; - } else if (pd['WORK_LEVEL'] == '4') { - taskId = '7'; - } - pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])]; + 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; @@ -374,12 +366,13 @@ class _BlindboardApplyDetailState extends State { pd['CREATOR'] = SessionService.instance.loginUserId; pd['ACTION_USER'] = SessionService.instance.username; pd['APPLY_STATUS'] = status; + pd['boardList'] = jsonEncode(boardList).toString(); // 提交参数 if (msg == 'add') { pd['STEP_ID'] = status; pd['TASK_ID'] = taskId; - pd['BLINDBOARD_ID'] = widget.BLINDBOARD_ID; + pd['BLINDBOARD_ID'] = pd['BLINDBOARD_ID'] ?? widget.BLINDBOARD_ID; pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId; pd['APPLY_DEPARTMENT_NAME'] = SessionService.instance.loginUser?['DEPARTMENT_NAME'] ?? ''; @@ -423,23 +416,26 @@ class _BlindboardApplyDetailState extends State { /// 初始化拉取数据 Future _getData() async { - - final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); + final data = await ApiService.getHomeworkFindById( + 'blindboard', + widget.BLINDBOARD_ID, + ); setState(() { pd = data['pd']; + boardList = data['boardList']; if (pd['STEP_ID'] == 0) { isEditable = true; } else { _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); } - pd['WORK_LEVEL'] = pd['WORK_LEVEL']?.toString() ?? ''; + pd['WORK_TYPE'] = pd['WORK_TYPE']?.toString() ?? ''; // 给所有输入框赋值 - _contentController.text = pd['WORK_CONTENT'] ?? ''; - _locationController.text = pd['WORK_PLACE'] ?? ''; - _hightController.text = pd['WORK_HIGH'] ?? ''; - _relatedController.text = pd['SPECIAL_WORK'] ?? ''; + _nameController.text = pd['NAME'] ?? ''; + _mediumController.text = pd['MEDIUM'] ?? ''; + _temperatureController.text = pd['TEMPERATURE'] ?? ''; + _pressureController.text = pd['PRESSURE'] ?? ''; _riskController.text = pd['RISK_IDENTIFICATION'] ?? ''; }); // final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); @@ -450,7 +446,8 @@ class _BlindboardApplyDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('blindboard', + final data = await ApiService.listSignFinished( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -459,7 +456,8 @@ class _BlindboardApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('blindboard', + final data = await ApiService.listSignFinishMeasures( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -473,7 +471,7 @@ class _BlindboardApplyDetailState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: h_backGroundColor(), - appBar: MyAppbar(title: '高处作业申请'), + appBar: MyAppbar(title: '盲板作业申请'), body: SafeArea( child: SingleChildScrollView( padding: EdgeInsets.all(12), @@ -481,11 +479,13 @@ class _BlindboardApplyDetailState extends State { children: [ _card( BlindboardDetailFormWidget( + boardList: boardList, pd: pd, isEditable: isEditable, - contentController: _contentController, - locationController: _locationController, - hightController: _hightController, + nameController: _nameController, + mediumController: _mediumController, + temperatureController: _temperatureController, + pressureController: _pressureController, relatedController: _relatedController, riskController: _riskController, onChooseLevel: _chooseLevel, @@ -494,7 +494,8 @@ class _BlindboardApplyDetailState extends State { if (isEditable) Column( children: [ - + SizedBox(height: 15), + _card(_chooseItem(EditUserType.WORKSHOP)), SizedBox(height: 15), _card(_chooseItem(EditUserType.GUARDIAN)), SizedBox(height: 15), @@ -507,10 +508,7 @@ class _BlindboardApplyDetailState extends State { _card(_chooseItem(EditUserType.CONFIRM)), SizedBox(height: 15), _card(_chooseItem(EditUserType.LEADER)), - SizedBox(height: 15), - _card(_chooseItem(EditUserType.AUDIT)), - SizedBox(height: 15), - _card(_chooseItem(EditUserType.APPROVE)), + SizedBox(height: 15), _card( Column( @@ -531,26 +529,7 @@ class _BlindboardApplyDetailState extends State { ], ), ), - SizedBox(height: 15), - _card( - Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - _chooseItem(EditUserType.WORK_END), - Divider(), - Row( - children: [ - SizedBox(width: 12), - Text( - '友情提示:负责填写作业实际结束时间', - style: TextStyle(color: Colors.red), - ), - ], - ), - SizedBox(height: 5), - ], - ), - ), + SizedBox(height: 15), _card(_chooseItem(EditUserType.ACCEPT)), SizedBox(height: 15), @@ -565,7 +544,7 @@ class _BlindboardApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -593,45 +572,9 @@ class _BlindboardApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -639,18 +582,54 @@ class _BlindboardApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), 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 05c1c12..a852240 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 @@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; @@ -34,6 +34,7 @@ class _BlindboardShbmDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; final TextEditingController _contentController = TextEditingController(); /// 安全防护措施列表 @@ -203,6 +204,7 @@ class _BlindboardShbmDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -271,7 +273,8 @@ class _BlindboardShbmDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 d8066c4..7f8a91c 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 @@ -11,7 +11,7 @@ import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; /// 审批部门意见 class BlindboardSpbmDetail extends StatefulWidget { @@ -33,6 +33,7 @@ class _BlindboardSpbmDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; final TextEditingController _contentController = TextEditingController(); /// 安全防护措施列表 @@ -179,7 +180,7 @@ class _BlindboardSpbmDetailState extends State { LoadingDialogHelper.show(); try { final result = await ApiService.saveSafeFunctionSure( -'blindboard', + 'blindboard', formData, signImages, ); @@ -199,9 +200,13 @@ class _BlindboardSpbmDetailState extends State { /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); + final data = await ApiService.getHomeworkFindById( + 'blindboard', + widget.BLINDBOARD_ID, + ); setState(() { pd = data['pd']; + boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -209,7 +214,8 @@ class _BlindboardSpbmDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('blindboard', + final data = await ApiService.listSignFinishMeasures( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -220,7 +226,8 @@ class _BlindboardSpbmDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('blindboard', + final data = await ApiService.listSignFinished( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -270,7 +277,8 @@ class _BlindboardSpbmDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, @@ -286,8 +294,7 @@ class _BlindboardSpbmDetailState extends State { '审批部门负责人意见', '请输入意见', _contentController, - isRequired: true - + isRequired: true, ), Divider(), Column( @@ -313,7 +320,7 @@ class _BlindboardSpbmDetailState extends State { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), 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 d2a8b75..6556a14 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 @@ -37,6 +37,8 @@ class _BlindboardSetSafeDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; + late List> measuresList = []; /// 安全防护措施列表 @@ -355,6 +357,7 @@ class _BlindboardSetSafeDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; + boardList = data['boardList']; _getMeasures(); }); } @@ -567,6 +570,7 @@ class _BlindboardSetSafeDetailState extends State { children: [ // _card(_defaultDetail()), BlindboardDetailFormWidget( + boardList: boardList, pd: pd, isEditable: false, onChooseLevel: (){}, 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 7667c20..1dbdfca 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; /// 所在单位意见 class BlindboardSzdwDetail extends StatefulWidget { @@ -34,6 +34,7 @@ class _BlindboardSzdwDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; final TextEditingController _contentController = TextEditingController(); /// 安全防护措施列表 @@ -203,6 +204,7 @@ class _BlindboardSzdwDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -271,7 +273,8 @@ class _BlindboardSzdwDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 7833b36..9711e5f 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; @@ -43,8 +43,11 @@ class _BlindboardYsgdDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; + /// 选择的时间 String startTime = ''; + /// 验收意见 final TextEditingController _contentController = TextEditingController(); late List imgList = []; @@ -60,6 +63,7 @@ class _BlindboardYsgdDetailState extends State { super.initState(); _getData(); } + /// 拍照或选图后的回调 Future _onImageAdded(String localPath) async { // 上传到服务器 @@ -79,6 +83,7 @@ class _BlindboardYsgdDetailState extends State { imgList.remove(item); }); } + /// 签字 Future _sign() async { final path = await Navigator.push( @@ -172,17 +177,7 @@ class _BlindboardYsgdDetailState extends State { ToastUtil.showNormal(context, '请选择验收时间'); return; } - // final workStart = DateTime.parse(pd['WORK_START_DATE'] as String); - final endTime = DateTime.parse(pd['WORK_END_DATE'] as String); - final acceptTime = DateTime.parse(startTime); - final intervalMs = endTime.difference(acceptTime).inMilliseconds; - const thresholdMs = 30 * 60 * 1000; - - if (intervalMs >= thresholdMs) { - ToastUtil.showNormal(context, '请在作业结束30分钟内完成验收'); - return; - } if (imgList.isEmpty) { ToastUtil.showNormal(context, '请上传验收视频'); @@ -211,7 +206,7 @@ class _BlindboardYsgdDetailState extends State { final serverPathString = imgList .map((e) => e.serverPath) .where((s) => s.isNotEmpty) - .map((s) => s) // 将 String? 转回 String + .map((s) => s) // 将 String? 转回 String .join(','); // 存回 measures final Map formData = {}; @@ -237,7 +232,7 @@ class _BlindboardYsgdDetailState extends State { LoadingDialogHelper.show(); try { final result = await ApiService.saveSafeFunctionSure( -'blindboard', + 'blindboard', formData, signImages, ); @@ -257,9 +252,13 @@ class _BlindboardYsgdDetailState extends State { /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); + final data = await ApiService.getHomeworkFindById( + 'blindboard', + widget.BLINDBOARD_ID, + ); setState(() { pd = data['pd']; + boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -267,7 +266,8 @@ class _BlindboardYsgdDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('blindboard', + final data = await ApiService.listSignFinishMeasures( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -278,7 +278,8 @@ class _BlindboardYsgdDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('blindboard', + final data = await ApiService.listSignFinished( + 'blindboard', homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID, ); setState(() { @@ -328,7 +329,8 @@ class _BlindboardYsgdDetailState extends State { spacing: 12, children: [ // _setSafeDetailWidget(), - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, @@ -345,16 +347,25 @@ class _BlindboardYsgdDetailState extends State { '完工验收', '请输入意见', _contentController, - isRequired: true + isRequired: true, ), Divider(), GestureDetector( - child: ListItemFactory.createRowSpaceBetweenItem(leftText: '验收时间', rightText: startTime.isEmpty?'请选择':startTime, isRight: true, isRequired: true), + child: ListItemFactory.createRowSpaceBetweenItem( + leftText: '验收时间', + rightText: startTime.isEmpty ? '请选择' : startTime, + isRight: true, + isRequired: true, + ), onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate(context); + DateTime? picked = await BottomDateTimePicker.showDate( + context, + ); if (picked != null) { setState(() { - startTime = DateFormat('yyyy-MM-dd HH:mm').format(picked); + startTime = DateFormat( + 'yyyy-MM-dd HH:mm', + ).format(picked); }); FocusHelper.clearFocus(context); } @@ -366,11 +377,13 @@ class _BlindboardYsgdDetailState extends State { title: '验收视频', maxCount: 1, mediaType: MediaType.video, - horizontalPadding: 0, + horizontalPadding: 0, onChanged: (paths) {}, onMediaAdded: _onImageAdded, onMediaRemoved: (path) { - final item = imgList.firstWhere((e) => e.localPath == path); + final item = imgList.firstWhere( + (e) => e.localPath == path, + ); _onImageRemoved(item); }, onAiIdentify: () {}, 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 3d7c543..01cb1d4 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; /// 作业负责人意见 class BlindboardZyfzDetail extends StatefulWidget { @@ -34,6 +34,7 @@ class _BlindboardZyfzDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; final TextEditingController _contentController = TextEditingController(); /// 安全防护措施列表 @@ -203,6 +204,7 @@ class _BlindboardZyfzDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -270,7 +272,8 @@ class _BlindboardZyfzDetailState extends State { child: Column( spacing: 12, children: [ - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 71ddc83..a2732c1 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 @@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart'; /// 作业人意见 class BlindboardZyrDetail extends StatefulWidget { @@ -34,6 +34,7 @@ class _BlindboardZyrDetailState extends State { /// 详情 late Map pd = {}; + late List boardList = []; /// 安全防护措施列表 late List> measuresList = []; @@ -196,6 +197,7 @@ class _BlindboardZyrDetailState extends State { final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID); setState(() { pd = data['pd']; +boardList = data['boardList']; _getSigns(pd['BLINDBOARD_ID'] ?? ''); _getMeasures(pd['BLINDBOARD_ID'] ?? ''); @@ -263,7 +265,8 @@ class _BlindboardZyrDetailState extends State { child: Column( spacing: 12, children: [ - HighWorkFormBaseWork( + BlindboardFormBaseWork( + boardList: boardList, pd: pd, measuresList: measuresList, signs: signs, 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 18cc60c..0d7f000 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 @@ -102,7 +102,7 @@ class _SpaceworkGasListState extends State { final img = baseImgPath + images[i]; return GestureDetector( onTap: () { - present( + presentOpaque( SingleImageViewer(imageUrl: img), context, ); diff --git a/lib/pages/home/tap/tabList/work_tab_dl_list.dart b/lib/pages/home/tap/tabList/work_tab_dl_list.dart index 1e9f436..e5497c1 100644 --- a/lib/pages/home/tap/tabList/work_tab_dl_list.dart +++ b/lib/pages/home/tap/tabList/work_tab_dl_list.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/tools/tools.dart'; @@ -23,15 +24,20 @@ class _WorkTabDlListState extends State { _getData(); } Future _getData() async { - final data = await ApiService.specialcheckWorkCount('highwork'); + final data = await ApiService.specialcheckWorkCount('cutroad'); setState(() { final eight_work_count = data['count'] ?? {}; buttonInfos = [ { "icon": "assets/icon-apps/icon-yxkj-1.png", - "title": "高处作业\n申请", + "title": "断路作业\n申请", "unreadCount": eight_work_count['CREATE'] ?? '0', }, + { + "icon": "assets/icon-apps/icon-yxkj-2.png", + "title": "作业项目负责人\n意见", + "unreadCount": eight_work_count['PROJECT_MANAGER'] ?? '0', + }, { "icon": "assets/icon-apps/icon-yh-1.png", "title": "设置安全\n措施确认人", @@ -58,11 +64,6 @@ class _WorkTabDlListState extends State { "title": "接受交底人\n意见", "unreadCount": eight_work_count['ACCEPT_CONFESS'] ?? '0', }, - { - "icon": "assets/icon-apps/icon-yxkj-2.png", - "title": "作业人\n意见", - "unreadCount": eight_work_count['WORK_USER'] ?? '0', - }, { "icon": "assets/icon-apps/icon-yxkj-2.png", "title": "作业负责人\n意见", @@ -75,9 +76,10 @@ class _WorkTabDlListState extends State { }, { "icon": "assets/icon-apps/icon-901.png", - "title": "审核部门\n意见", - "unreadCount": eight_work_count['REVIEWER'] ?? '0', + "title": "消防、安全管理\n部门意见", + "unreadCount": eight_work_count['AUDIT'] ?? '0', }, + { "icon": "assets/icon-apps/icon-901.png", "title": "审批部门\n意见", @@ -107,15 +109,15 @@ class _WorkTabDlListState extends State { String title = ''; switch (index) { case 0: title = '提交申请'; break; - case 1: title = '设置安全措施确认人'; break; - case 2: title = '安全措施确认'; break; - case 3: title = '监护人签字'; break; - case 4: title = '安全交底人签字'; break; - case 5: title = '接受交底人签字'; break; - case 6: title = '作业人签字'; break; + case 1: title = '作业项目负责人'; break; + case 2: title = '设置安全措施确认人'; break; + case 3: title = '安全措施确认'; break; + case 4: title = '监护人签字'; break; + case 5: title = '安全交底人签字'; break; + case 6: title = '接受交底人签字'; break; case 7: title = '作业负责人签字'; break; case 8: title = '所在单位签字'; break; - case 9: title = '审核人签字'; break; + case 9: title = '消防、安全管理部门签字'; break; case 10: title = '审批人签字'; break; case 11: title = '开始作业'; break; case 12: title = '结束作业'; break; @@ -123,18 +125,18 @@ class _WorkTabDlListState extends State { default: print("按钮 $index 被点击"); } - await pushPage(HotWorkListPage(flow: title, workTypeTitle: '高处作业'), context); + await pushPage(CutroadListPage(flow: title, workTypeTitle: '断路作业'), context); _getData(); } @override Widget build(BuildContext context) { return Scaffold( - appBar: MyAppbar(title: '高处作业'), + appBar: MyAppbar(title: '断路作业'), body: SafeArea( child: Column( children: [ - ListItemFactory.createBuildSimpleSection('高处作业审批管理'), + ListItemFactory.createBuildSimpleSection('断路作业审批管理'), WorkTabIconGrid( buttonInfos: buttonInfos, onItemPressed: _handleItemPressed, diff --git a/lib/pages/home/tap/tabList/work_tab_lsyd_list.dart b/lib/pages/home/tap/tabList/work_tab_lsyd_list.dart index db57906..9eba006 100644 --- a/lib/pages/home/tap/tabList/work_tab_lsyd_list.dart +++ b/lib/pages/home/tap/tabList/work_tab_lsyd_list.dart @@ -49,10 +49,15 @@ class _WorkTabLsydListState extends State { "unreadCount": eight_work_count['MEASURES_CONFIRM'] ?? '0', }, { - "icon": "assets/icon-apps/icon-yxkj-4.png", - "title": "用电人意见", + "icon": "assets/icon-apps/icon-zl-9.png", + "title": "监护人\n意见", "unreadCount": eight_work_count['GUARDIAN'] ?? '0', }, + { + "icon": "assets/icon-apps/icon-yxkj-4.png", + "title": "用电人\n意见", + "unreadCount": eight_work_count['ELECTRICITY'] ?? '0', + }, { "icon": "assets/icon-apps/icon-807.png", "title": "安全交底人\n意见", @@ -76,12 +81,12 @@ class _WorkTabLsydListState extends State { { "icon": "assets/icon-apps/icon-907.png", "title": "用电单位\n意见", - "unreadCount": eight_work_count['LEADER'] ?? '0', + "unreadCount": eight_work_count['AUDIT'] ?? '0', }, { "icon": "assets/icon-apps/icon-907.png", "title": "配送电单位\n意见", - "unreadCount": eight_work_count['REVIEWER'] ?? '0', + "unreadCount": eight_work_count['APPROVE'] ?? '0', }, { "icon": "assets/icon-apps/icon-aq-1.png", 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 1a4c1b4..ce32f33 100644 --- a/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart +++ b/lib/pages/home/tap/tabList/work_tab_mbcd_list.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/tools/tools.dart'; @@ -112,7 +113,7 @@ class _WorkTabMbcdListState extends State { default: print("按钮 $index 被点击"); } - await pushPage(HotWorkListPage(flow: title, workTypeTitle: '盲板作业',), context); + await pushPage(BlindboardListPage(flow: title, workTypeTitle: '盲板作业',), context); _getData(); } diff --git a/lib/pages/notif/notif_page.dart b/lib/pages/notif/notif_page.dart index 2fe63da..b413b60 100644 --- a/lib/pages/notif/notif_page.dart +++ b/lib/pages/notif/notif_page.dart @@ -65,7 +65,7 @@ class _NotifPageState extends State } Future _getNotifList(String keyWord) async { - // LoadingDialogHelper.show(); + LoadingDialogHelper.show(); try { final result = await ApiService.getNotifList("-1", pageNum.toString(),keyWord); if (result['result'] == 'success') { @@ -74,7 +74,10 @@ class _NotifPageState extends State _list.addAll(newList); }); } + LoadingDialogHelper.hide(); } catch (e) { + LoadingDialogHelper.hide(); + print('加载出错: $e'); } finally { LoadingDialogHelper.hide();