2025-08-16 14:13:23 +08:00
|
|
|
|
// safe_check_form_view.dart
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
|
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|
|
|
|
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
|
|
|
|
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
|
|
|
|
import 'package:qhd_prevention/customWidget/dotted_border_box.dart';
|
2025-08-16 19:31:17 +08:00
|
|
|
|
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
2025-08-16 14:13:23 +08:00
|
|
|
|
import 'package:qhd_prevention/http/ApiService.dart';
|
|
|
|
|
import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/custom/MultiTextFieldWithTitle.dart';
|
|
|
|
|
import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/custom/safeCheck_table.dart';
|
|
|
|
|
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
2025-08-16 19:31:17 +08:00
|
|
|
|
import 'package:qhd_prevention/tools/tools.dart';
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
|
|
|
|
class SafeCheckFormView extends StatefulWidget {
|
|
|
|
|
const SafeCheckFormView({
|
|
|
|
|
Key? key,
|
|
|
|
|
required this.form,
|
|
|
|
|
required this.isEdit,
|
|
|
|
|
required this.onHiddenShow,
|
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
// === 数据 ===
|
|
|
|
|
final Map<String, dynamic> form;
|
|
|
|
|
final bool isEdit;
|
|
|
|
|
|
|
|
|
|
/// 显示隐患详情(点击)
|
|
|
|
|
final void Function(Map<String, dynamic> item, int idx) onHiddenShow;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
_SafeCheckFormViewState createState() => _SafeCheckFormViewState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _SafeCheckFormViewState extends State<SafeCheckFormView> {
|
|
|
|
|
/// 将 widget.form['situationList'] 转为 MultiTextFieldWithTitle 需要的 List<String>
|
|
|
|
|
List<String> _situationListToStrings() {
|
2025-08-16 19:31:17 +08:00
|
|
|
|
final List<dynamic> cur = List<dynamic>.from(
|
|
|
|
|
widget.form['situationList'] ?? [],
|
|
|
|
|
);
|
2025-08-16 14:13:23 +08:00
|
|
|
|
if (cur.isEmpty) return ['']; // 保持至少一行,和 uni-app 行为一致
|
|
|
|
|
return cur.map((e) {
|
|
|
|
|
if (e is Map && e['SITUATION'] != null) return e['SITUATION'].toString();
|
|
|
|
|
if (e is String) return e;
|
|
|
|
|
return '';
|
|
|
|
|
}).toList();
|
|
|
|
|
}
|
2025-08-16 19:31:17 +08:00
|
|
|
|
|
2025-08-16 14:13:23 +08:00
|
|
|
|
Widget _personUnitItem(Map item, int index) {
|
|
|
|
|
return Stack(
|
|
|
|
|
children: [
|
|
|
|
|
Container(
|
2025-08-16 19:31:17 +08:00
|
|
|
|
padding: EdgeInsets.symmetric(vertical: 5),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
child: DottedBorderBox(
|
|
|
|
|
child: SizedBox(
|
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
isRequired: false,
|
|
|
|
|
label: '${index + 1}.检查人员单位:',
|
|
|
|
|
isEditable: false,
|
|
|
|
|
onTapClean: () {
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
text: item['INSPECTION_DEPARTMENT_NAME'] ?? '请选择',
|
|
|
|
|
),
|
|
|
|
|
Divider(),
|
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
isRequired: false,
|
|
|
|
|
label: '${index + 1}.检查人员:',
|
|
|
|
|
isEditable: false,
|
|
|
|
|
text: item['INSPECTION_USER_NAME'] ?? '请选择',
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
// 删除按钮(叠加在左上角)
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
Widget _checkItem(Map item, int index) {
|
|
|
|
|
return Column(
|
|
|
|
|
children: [
|
|
|
|
|
const SizedBox(height: 10),
|
|
|
|
|
ItemListWidget.singleLineTitleText(
|
|
|
|
|
label: '检查人员核查结果:',
|
|
|
|
|
isEditable: false,
|
|
|
|
|
text: '',
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
|
|
|
|
ItemListWidget.multiLineTitleTextField(
|
|
|
|
|
label: '检查人意见',
|
|
|
|
|
isEditable: false,
|
|
|
|
|
text: item['INSPECTION_USER_OPINION'] ?? '',
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
|
|
|
|
ItemListWidget.OneRowImageTitle(
|
|
|
|
|
label: '检查人签字',
|
|
|
|
|
text: item['INSPECTION_USER_SIGN_TIME'],
|
|
|
|
|
onTapCallBack: (path) {
|
|
|
|
|
presentOpaque(SingleImageViewer(imageUrl: path), context);
|
|
|
|
|
},
|
|
|
|
|
imgPath: item['INSPECTION_USER_SIGN_IMG'],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
final form = widget.form;
|
|
|
|
|
final isEdit = widget.isEdit;
|
2025-08-16 19:31:17 +08:00
|
|
|
|
List<dynamic> inspectorList = widget.form['inspectorList'] ?? [];
|
|
|
|
|
List<dynamic> inspectorVerifyList =
|
|
|
|
|
widget.form['inspectorVerifyList'] ?? widget.form['inspectorList'];
|
|
|
|
|
|
2025-08-16 14:13:23 +08:00
|
|
|
|
return SizedBox(
|
|
|
|
|
// padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
|
2025-08-16 19:31:17 +08:00
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
// 顶部表单区容器
|
|
|
|
|
ItemListWidget.itemContainer(
|
|
|
|
|
horizontal: 0,
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
// 检查题目选择(示例复用你项目的 ListItemFactory)
|
|
|
|
|
ListItemFactory.createYesNoSection(
|
|
|
|
|
title: '检查题目:',
|
|
|
|
|
groupValue:
|
|
|
|
|
(form['INSPECTION_CATEGORY']?.toString() ?? '')
|
|
|
|
|
.toLowerCase() ==
|
|
|
|
|
'安全'
|
|
|
|
|
? true
|
|
|
|
|
: (form['INSPECTION_CATEGORY']?.toString() ?? '')
|
|
|
|
|
.toLowerCase() ==
|
|
|
|
|
'综合'
|
|
|
|
|
? false
|
|
|
|
|
: null,
|
|
|
|
|
yesLabel: '安全',
|
|
|
|
|
noLabel: '综合',
|
|
|
|
|
isEdit: isEdit,
|
|
|
|
|
isRequired: true,
|
|
|
|
|
horizontalPadding: 5,
|
|
|
|
|
verticalPadding: 0,
|
|
|
|
|
text: '${form['INSPECTION_SUBJECT'] ?? ''}现场检查记录',
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
onChanged: (val) {
|
|
|
|
|
// 如果需要把选择写回 form,可以在这里 setState 更新 widget.form
|
|
|
|
|
// setState(() { widget.form['INSPECTION_CATEGORY'] = val ? '安全' : '综合'; });
|
|
|
|
|
},
|
|
|
|
|
),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
const Divider(),
|
|
|
|
|
ItemListWidget.singleLineTitleText(
|
|
|
|
|
label: '被检查单位:',
|
|
|
|
|
isEditable: false,
|
|
|
|
|
text: form['INSPECTED_DEPARTMENT_NAMES'] ?? '',
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
label: '被检查单位现场负责人:',
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
text: form['INSPECTED_SITEUSER_NAME'] ?? '',
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.singleLineTitleText(
|
|
|
|
|
label: '检查场所:',
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
text: form['INSPECTION_PLACE'],
|
|
|
|
|
hintText: '请输入检查场所',
|
|
|
|
|
onChanged: (val) {
|
|
|
|
|
// 可选择写回 form
|
|
|
|
|
// setState(() { widget.form['INSPECTION_PLACE'] = val; });
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
label: '检查类型:',
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
text: form['INSPECTION_TYPE_NAME'] ?? '',
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
label: '检查开始时间:',
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
text: form['INSPECTION_TIME_START'] ?? '',
|
|
|
|
|
onTap: () {},
|
|
|
|
|
),
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.selectableLineTitleTextRightButton(
|
|
|
|
|
label: '检查结束时间:',
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
text: form['INSPECTION_TIME_END'] ?? '',
|
|
|
|
|
onTap: () {},
|
|
|
|
|
),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
const Divider(),
|
|
|
|
|
|
|
|
|
|
// MultiTextFieldWithTitle(检查情况),外部通过 onMultiTextsChanged 更新 form['situationList']
|
|
|
|
|
MultiTextFieldWithTitle(
|
|
|
|
|
label: "检查情况",
|
|
|
|
|
isEditable: isEdit,
|
|
|
|
|
hintText: "请输入检查情况...",
|
|
|
|
|
texts: _situationListToStrings(),
|
|
|
|
|
onTextsChanged: (val) {},
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.itemContainer(
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
ListItemFactory.headerTitle('检查人员'),
|
|
|
|
|
SizedBox(height: 5),
|
|
|
|
|
ListView.builder(
|
|
|
|
|
shrinkWrap: true,
|
|
|
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
|
|
|
itemCount: inspectorList.length,
|
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
|
return _personUnitItem(inspectorList[index], index);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
2025-08-16 14:13:23 +08:00
|
|
|
|
),
|
2025-08-16 19:31:17 +08:00
|
|
|
|
),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
const Divider(),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
ItemListWidget.itemContainer(
|
|
|
|
|
horizontal: 12,
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
children: [ListItemFactory.headerTitle('发现问题')],
|
|
|
|
|
),
|
|
|
|
|
),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
|
2025-08-16 19:31:17 +08:00
|
|
|
|
// HiddenListTable:隐患列表展示(外部通过 onHiddenShow/onHiddenRemove 处理具体交互)
|
|
|
|
|
HiddenListTable(
|
|
|
|
|
hiddenList: (form['hiddenList'] as List<dynamic>?) ?? [],
|
|
|
|
|
forbidEdit: false,
|
|
|
|
|
baseImgPath: ApiService.baseImgPath,
|
|
|
|
|
personSignImg: '',
|
|
|
|
|
personSignTime: '',
|
|
|
|
|
showHidden: widget.onHiddenShow,
|
|
|
|
|
removeHidden: (item, index) {},
|
|
|
|
|
context: context,
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: 10,),
|
|
|
|
|
ItemListWidget.itemContainer(
|
|
|
|
|
horizontal: 0,
|
|
|
|
|
inspectorVerifyList.isNotEmpty
|
|
|
|
|
? ListView.builder(
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 0),
|
|
|
|
|
itemCount: inspectorVerifyList.length,
|
|
|
|
|
shrinkWrap: true,
|
|
|
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
|
|
|
itemBuilder: (context, index) {
|
|
|
|
|
return _checkItem(inspectorVerifyList[index], index);
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
: SizedBox(),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
2025-08-16 14:13:23 +08:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|