flutter_integrated_whb/lib/pages/home/NFC/nfc_question_fecebook.dart

242 lines
7.3 KiB
Dart
Raw Normal View History

2025-08-27 16:14:50 +08:00
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) {
_showMessage('请填写问题');
return;
}
if (_images.isEmpty) {
_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,), 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') {
_showMessage('提交成功');
} else {
_showMessage('提交失败');
}
} catch (e) {
// 出错时可以 Toast 或者在页面上显示错误状态
print('加载首页数据失败:$e');
}
}
void _showMessage(String msg) {
ToastUtil.showNormal(context, msg);
}
}