确实文件
							parent
							
								
									980bbe19c9
								
							
						
					
					
						commit
						698ccad423
					
				|  | @ -0,0 +1,309 @@ | ||||||
|  | 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/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.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 CutroadZyrDetail extends StatefulWidget { | ||||||
|  |   const CutroadZyrDetail({ | ||||||
|  |     super.key, | ||||||
|  |     required this.CUTROAD_ID, | ||||||
|  |     required this.flow, | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   final String CUTROAD_ID; | ||||||
|  |   final String flow; | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   State<CutroadZyrDetail> createState() => _CutroadZyrDetailState(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class _CutroadZyrDetailState extends State<CutroadZyrDetail> { | ||||||
|  |   late bool isEditable = false; | ||||||
|  | 
 | ||||||
|  |   /// 详情 | ||||||
|  |   late Map<String, dynamic> pd = {}; | ||||||
|  | 
 | ||||||
|  |   /// 安全防护措施列表 | ||||||
|  |   late List<Map<String, dynamic>> measuresList = []; | ||||||
|  |   late Map<String, dynamic> signs = {}; | ||||||
|  | 
 | ||||||
|  |   List<String> signImages = []; | ||||||
|  |   List<String> signTimes = []; // 签字时间列表 | ||||||
|  |   @override | ||||||
|  |   void initState() { | ||||||
|  |     super.initState(); | ||||||
|  |     _getData(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// 签字 | ||||||
|  |   Future<void> _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<void> _submit(String status) async { | ||||||
|  |     if (signImages.isEmpty) { | ||||||
|  |       ToastUtil.showNormal(context, '请签字'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     String reasonText = ''; | ||||||
|  | 
 | ||||||
|  |     if (status == '1') { | ||||||
|  |     } else { | ||||||
|  |       await showDialog<String>( | ||||||
|  |         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<String, dynamic> formData = {}; | ||||||
|  |     // 提交参数 | ||||||
|  |     formData['CUTROAD_ID'] = widget.CUTROAD_ID; | ||||||
|  |     formData['SIGNTIME'] = signTimes.join(','); | ||||||
|  |     formData['USER_ID'] = SessionService.instance.loginUserId; | ||||||
|  |     formData['APPLY_STATUS'] = status; | ||||||
|  |     formData['STEP_REASON'] = reasonText; | ||||||
|  | 
 | ||||||
|  |     await showDialog<String>( | ||||||
|  |       context: context, | ||||||
|  |       builder: | ||||||
|  |           (_) => CustomAlertDialog( | ||||||
|  |             title: '提示', | ||||||
|  |             content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?', | ||||||
|  |             cancelText: '取消', | ||||||
|  |             confirmText: '确定', | ||||||
|  |             onConfirm: () async { | ||||||
|  |               LoadingDialogHelper.show(); | ||||||
|  |               try { | ||||||
|  |                 final result = await ApiService.saveSafeFunctionSure( | ||||||
|  | 'cutroad', | ||||||
|  |                   formData, | ||||||
|  |                   signImages, | ||||||
|  |                 ); | ||||||
|  |                 LoadingDialogHelper.hide(); | ||||||
|  |                 if (result['result'] == 'success') { | ||||||
|  |                   ToastUtil.showSuccess(context, '保存成功'); | ||||||
|  |                   Navigator.pop(context); | ||||||
|  |                 } | ||||||
|  |               } catch (e) { | ||||||
|  |                 LoadingDialogHelper.hide(); | ||||||
|  |                 ToastUtil.showNormal(context, '操作失败:$e'); | ||||||
|  |               } | ||||||
|  |             }, | ||||||
|  |           ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// 初始化拉取数据 | ||||||
|  |   Future<void> _getData() async { | ||||||
|  |     final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); | ||||||
|  |     setState(() { | ||||||
|  |       pd = data['pd']; | ||||||
|  | 
 | ||||||
|  |       _getSigns(pd['CUTROAD_ID'] ?? ''); | ||||||
|  |       _getMeasures(pd['CUTROAD_ID'] ?? ''); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Future<void> _getMeasures(String homework_id) async { | ||||||
|  |     final data = await ApiService.listSignFinishMeasures('cutroad', | ||||||
|  |       homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, | ||||||
|  |     ); | ||||||
|  |     setState(() { | ||||||
|  |       measuresList = List<Map<String, dynamic>>.from( | ||||||
|  |         data['finishMeasuresList'] ?? <Map<String, dynamic>>[], | ||||||
|  |       ); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Future<void> _getSigns(String homework_id) async { | ||||||
|  |     final data = await ApiService.listSignFinished('cutroad', | ||||||
|  |       homework_id.length > 0 ? homework_id : widget.CUTROAD_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: [ | ||||||
|  |               CutroadFormBaseWork( | ||||||
|  |                 pd: pd, | ||||||
|  |                 measuresList: measuresList, | ||||||
|  |                 signs: signs, | ||||||
|  |                 baseImgPath: ApiService.baseImgPath, | ||||||
|  |                 isEditable: false, | ||||||
|  |                 onChooseLevel: () {}, | ||||||
|  |                 onAnalyzeTap: () {}, | ||||||
|  |               ), | ||||||
|  |               ItemListWidget.itemContainer( | ||||||
|  |                 Column( | ||||||
|  |                   children: [ | ||||||
|  | 
 | ||||||
|  |                     Column( | ||||||
|  |                       children: [ | ||||||
|  |                         Row( | ||||||
|  |                           mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                           children: [ | ||||||
|  |                             ListItemFactory.headerTitle('作业人'), | ||||||
|  |                             CustomButton( | ||||||
|  |                               text: '新增手写签字', | ||||||
|  |                               height: 36, | ||||||
|  |                               backgroundColor: Colors.green, | ||||||
|  |                               onPressed: () { | ||||||
|  |                                 _sign(); | ||||||
|  |                               }, | ||||||
|  |                             ), | ||||||
|  |                           ], | ||||||
|  |                         ), | ||||||
|  |                         if (signImages.isNotEmpty) _signListWidget(), | ||||||
|  |                       ], | ||||||
|  |                     ) | ||||||
|  |                   ], | ||||||
|  |                 ), | ||||||
|  |               ), | ||||||
|  |               _bottomButtons(), | ||||||
|  |             ], | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue