246 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Dart
		
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Dart
		
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter/services.dart';
 | |
| import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
 | |
| import 'package:qhd_prevention/customWidget/toast_util.dart';
 | |
| import 'package:qhd_prevention/http/ApiService.dart';
 | |
| import 'package:qhd_prevention/pages/home/NFC/home_nfc_check_danger_page.dart';
 | |
| import 'package:qhd_prevention/pages/my_appbar.dart';
 | |
| import 'package:qhd_prevention/tools/tools.dart';
 | |
| 
 | |
| // feedback_type.dart
 | |
| enum NfcFeedbackType {
 | |
|   readError('读取失败', 0),
 | |
|   nfcBld('标签损坏', 1),
 | |
|   nfcLose('标签丢失', 2);
 | |
| 
 | |
|   final String typeName;
 | |
|   final int type;
 | |
| 
 | |
|   const NfcFeedbackType(this.typeName, this.type);
 | |
| }
 | |
| 
 | |
| class NfcQuestionFecebook extends StatefulWidget {
 | |
|   const NfcQuestionFecebook({super.key, required this.info,required this.taskInfo});
 | |
| 
 | |
|   final Map taskInfo;
 | |
|   final Map info;
 | |
| 
 | |
|   @override
 | |
|   State<NfcQuestionFecebook> createState() => _NfcQuestionFecebookState();
 | |
| }
 | |
| 
 | |
| class _NfcQuestionFecebookState extends State<NfcQuestionFecebook> {
 | |
|   final _formKey = GlobalKey<FormState>();
 | |
|   final TextEditingController _descriptionController = TextEditingController();
 | |
|   final FocusNode _descriptionFocus = FocusNode(); // <- 新增
 | |
| 
 | |
|   // 反馈类型
 | |
|   NfcFeedbackType? _selectedType = NfcFeedbackType.readError;
 | |
| 
 | |
|   // 上传的图片
 | |
|   List<String> _images = [];
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     // TODO: implement initState
 | |
|     super.initState();
 | |
|     _getFacebookDetail();
 | |
|   }
 | |
| 
 | |
|   Future<void> _getFacebookDetail() async {
 | |
|     final result = await ApiService.getNfcFeedBackDetail({});
 | |
|     try{
 | |
|       if (result['result'] == 'success') {
 | |
| 
 | |
|       }
 | |
|     }catch(e) {}
 | |
|   }
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Scaffold(
 | |
|       appBar: MyAppbar(title: "NFC异常上报"),
 | |
|       body: Container(
 | |
|         color: Colors.white,
 | |
|         child: Form(
 | |
|           key: _formKey,
 | |
|           child: SingleChildScrollView(
 | |
|             padding: const EdgeInsets.all(16),
 | |
|             child: Column(
 | |
|               crossAxisAlignment: CrossAxisAlignment.start,
 | |
|               children: [
 | |
|                 // 问题描述
 | |
|                 const Text(
 | |
|                   '详细问题',
 | |
|                   style: TextStyle(fontWeight: FontWeight.bold),
 | |
|                 ),
 | |
|                 const SizedBox(height: 8),
 | |
|                 TextFormField(
 | |
|                   controller: _descriptionController,
 | |
|                   focusNode: _descriptionFocus,
 | |
|                   autofocus: false,
 | |
|                   maxLines: 5,
 | |
|                   decoration: const InputDecoration(
 | |
|                     hintText: '请补充详细问题...',
 | |
|                     border: OutlineInputBorder(),
 | |
|                     contentPadding: EdgeInsets.all(10),
 | |
|                   ),
 | |
|                   validator: (value) {
 | |
|                     if (value == null || value.isEmpty) {
 | |
|                       return '请补充详细问题';
 | |
|                     }
 | |
|                     return null;
 | |
|                   },
 | |
|                 ),
 | |
|                 const SizedBox(height: 24),
 | |
| 
 | |
|                 // 反馈类型
 | |
|                 const Text(
 | |
|                   '反馈类型',
 | |
|                   style: TextStyle(fontWeight: FontWeight.bold),
 | |
|                 ),
 | |
|                 const SizedBox(height: 8),
 | |
|                 Wrap(
 | |
|                   spacing: 16,
 | |
|                   children:
 | |
|                       NfcFeedbackType.values.map((type) {
 | |
|                         return ChoiceChip(
 | |
|                           label: Text(type.typeName),
 | |
|                           selected: _selectedType == type,
 | |
|                           onSelected: (selected) {
 | |
|                             setState(() {
 | |
|                               if (selected) {
 | |
|                                 _selectedType = type;
 | |
|                               }
 | |
|                             });
 | |
|                           },
 | |
|                         );
 | |
|                       }).toList(),
 | |
|                 ),
 | |
| 
 | |
|                 // 图片上传
 | |
|                 const SizedBox(height: 16),
 | |
| 
 | |
|                 RepairedPhotoSection(
 | |
|                   horizontalPadding: 0,
 | |
|                   title: "请提供相关问题照片",
 | |
|                   maxCount: 4,
 | |
|                   mediaType: MediaType.image,
 | |
|                   isCamera: true,
 | |
|                   onChanged: (files) {
 | |
|                     // 上传 files 到服务器
 | |
|                     _images.clear();
 | |
|                     for (int i = 0; i < files.length; i++) {
 | |
|                       _images.add(files[i].path);
 | |
|                     }
 | |
|                   },
 | |
|                   onAiIdentify: () {},
 | |
|                 ),
 | |
|                 const SizedBox(height: 40),
 | |
| 
 | |
|                 // 提交按钮
 | |
|                 SizedBox(
 | |
|                   width: double.infinity,
 | |
|                   child: ElevatedButton(
 | |
|                     onPressed: _submitFeedback,
 | |
|                     style: ElevatedButton.styleFrom(
 | |
|                       backgroundColor: Colors.blue,
 | |
|                       padding: const EdgeInsets.symmetric(vertical: 16),
 | |
|                       shape: RoundedRectangleBorder(
 | |
|                         borderRadius: BorderRadius.circular(8),
 | |
|                       ),
 | |
|                     ),
 | |
|                     child: const Text(
 | |
|                       '下一步',
 | |
|                       style: TextStyle(fontSize: 18, color: Colors.white),
 | |
|                     ),
 | |
|                   ),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ),
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   // 提交反馈
 | |
|   Future<void> _submitFeedback() async {
 | |
|     final text = _descriptionController.text.trim();
 | |
| 
 | |
|     if (text.isEmpty) {
 | |
|       ToastUtil.showNormal(context, '请填写问题');
 | |
|       // _showMessage('请填写问题');
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (_images.isEmpty) {
 | |
|       ToastUtil.showNormal(context, '请上传图片');
 | |
|       // _showMessage('请上传图片');
 | |
|       return;
 | |
|     }
 | |
|     Map data = {
 | |
|       ...widget.info,
 | |
|       ...widget.taskInfo,
 | |
|       'EXCEPTION_TYPE': _selectedType?.type,
 | |
|       'MANUAL_CONFIRMATION': '1',
 | |
|       // 'PHOTO_URL': imagePaths,
 | |
|       'DESCRIPTION': text,
 | |
|     };
 | |
| 
 | |
|     pushPage(HomeNfcCheckDangerPage(info: data, facebookImages: _images, isNfcError: true,isEdit: true,), context);
 | |
| 
 | |
|     // String imagePaths = "";
 | |
|     // for (int i = 0; i < _images.length; i++) {
 | |
|     //   String imagePath = await _reloadFeedBack(_images[i]);
 | |
|     //
 | |
|     //   if (0 == i) {
 | |
|     //     imagePaths = imagePath;
 | |
|     //   } else {
 | |
|     //     imagePaths = "$imagePaths,$imagePath";
 | |
|     //   }
 | |
|     // }
 | |
|     //
 | |
|     // _setFeedBack(text, imagePaths);
 | |
|   }
 | |
|   @override
 | |
|   void dispose() {
 | |
|     _descriptionController.dispose();
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
| 
 | |
|   Future<void> _setFeedBack(String text, String imagePaths) async {
 | |
|     try {
 | |
|       Map data = {
 | |
|         "PATROL_TASK_ID":widget.taskInfo['PATROL_TASK_ID']?? '',
 | |
|         "PIPELINE_AREA_ID" :widget.taskInfo['PIPELINE_AREA_ID']?? '',
 | |
|         "EQUIPMENT_PIPELINE_ID" :widget.info['EQUIPMENT_PIPELINE_ID']?? '',
 | |
|         "PATROL_RECORD_ID" :widget.info['EQUIPMENT_PIPELINE_ID'] ?? '',
 | |
|         "PATROL_RECORD_DETAIL_ID" :widget.info['PATROL_RECORD_DETAIL_ID']?? '',
 | |
| 
 | |
|         "NFC_CODE" :widget.info['PIPELINE_AREA_ID'],
 | |
|         'EXCEPTION_TYPE': _selectedType?.type,
 | |
|         'PHOTO_URL': imagePaths,
 | |
|         'DESCRIPTION': text,
 | |
|       };
 | |
| 
 | |
|       final raw = await ApiService.nfcFeedBack(data);
 | |
| 
 | |
|       if (raw['result'] == 'success') {
 | |
|         ToastUtil.showNormal(context, '提交成功');
 | |
|         // _showMessage('提交成功');
 | |
|       } else {
 | |
|         ToastUtil.showNormal(context, '提交失败');
 | |
|         // _showMessage('提交失败');
 | |
|       }
 | |
|     } catch (e) {
 | |
|       // 出错时可以 Toast 或者在页面上显示错误状态
 | |
|       print('加载首页数据失败:$e');
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void _showMessage(String msg) {
 | |
|     ToastUtil.showNormal(context, msg);
 | |
|   }
 | |
| }
 |