安全检查-隐患指派验收、申辩记录

main
hs 2025-08-18 17:08:38 +08:00
parent 3fd86e7ca2
commit c925d146fd
18 changed files with 1288 additions and 627 deletions

View File

@ -1,4 +1,5 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
@ -48,12 +49,31 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
? widget.initialMediaPaths!.take(widget.maxCount).toList()
: [];
WidgetsBinding.instance.addPostFrameCallback((_) {
// File('') File(path)path http
widget.onChanged(
_mediaPaths.map((p) => p.startsWith('http') ? File('') : File(p)).toList(),
_mediaPaths.map((p) => File(p)).toList(),
);
});
}
@override
void didUpdateWidget(covariant MediaPickerRow oldWidget) {
super.didUpdateWidget(oldWidget);
// initialMediaPaths _mediaPaths onChanged
if (!listEquals(oldWidget.initialMediaPaths, widget.initialMediaPaths)) {
_mediaPaths = widget.initialMediaPaths != null
? widget.initialMediaPaths!.take(widget.maxCount).toList()
: [];
setState(() {}); // rebuild
WidgetsBinding.instance.addPostFrameCallback((_) {
// File(path)
widget.onChanged(
_mediaPaths.map((p) => File(p)).toList(),
);
});
}
}
Future<void> _showPickerOptions() async {
if (!widget.isEdit) return; //
@ -120,6 +140,7 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
if (picked != null) {
final path = picked.path;
setState(() => _mediaPaths.add(path));
// File(p)
widget.onChanged(_mediaPaths.map((p) => File(p)).toList());
widget.onMediaAdded?.call(path);
}
@ -308,6 +329,19 @@ class _RepairedPhotoSectionState extends State<RepairedPhotoSection> {
});
}
@override
void didUpdateWidget(covariant RepairedPhotoSection oldWidget) {
super.didUpdateWidget(oldWidget);
// initialMediaPaths _mediaPaths onChanged
if (!listEquals(oldWidget.initialMediaPaths, widget.initialMediaPaths)) {
_mediaPaths = widget.initialMediaPaths?.take(widget.maxCount).toList() ?? [];
setState(() {});
WidgetsBinding.instance.addPostFrameCallback((_) {
widget.onChanged(_mediaPaths.map((p) => File(p)).toList());
});
}
}
@override
Widget build(BuildContext context) {
return Container(

View File

@ -418,9 +418,6 @@ U6Hzm1ninpWeE+awIDAQAB
);
}
///
///
/// [imagePath]
/// JSON
static Future<Map<String, dynamic>> getUserFace(String imagePath, String studentId) async {
final file = File(imagePath);
if (!await file.exists()) {
@ -1200,7 +1197,7 @@ U6Hzm1ninpWeE+awIDAQAB
},
);
}
///
///
static Future<Map<String, dynamic>> getSafeCheckSearchList(Map data, String url) {
return HttpManager().request(
basePath,
@ -1239,9 +1236,6 @@ U6Hzm1ninpWeE+awIDAQAB
},
);
}
//
static Future<Map<String, dynamic>> SafeCheckStartGoEditMsg(
String imagePath,
@ -1332,6 +1326,59 @@ U6Hzm1ninpWeE+awIDAQAB
},
);
}
//
static Future<Map<String, dynamic>> safeCheckDefendSubmit(Map formData, String imagePath) async {
final file = File(imagePath);
if (!await file.exists()) {
throw ApiException('file_not_found', '图片不存在:$imagePath');
}
final fileName = file.path
.split(Platform.pathSeparator)
.last;
return HttpManager().uploadFaceImage(
baseUrl: basePath,
path: '/app/safetyenvironmental/explain',
fromData: {
...formData,
'FFILE': await MultipartFile.fromFile(
file.path,
filename: fileName
),
}
);
}
//
static Future<Map<String, dynamic>> safeCheckDangerConfirm(Map data) {
return HttpManager().request(
basePath,
'/app/hidden/confirm',
method: Method.post,
data: {
...data,
"CORPINFO_ID":SessionService.instance.corpinfoId,
"USER_ID":SessionService.instance.loginUserId,
"OPERATOR" :SessionService.instance.loginUserId,
"NAME":SessionService.instance.loginUser?["USERNAME"]??"",
"USERNAME": SessionService.instance.loginUser?["USERNAME"]??"",
},
);
}
//
static Future<Map<String, dynamic>> safeCheckDefendRecordList(String INSPECTION_ID) {
return HttpManager().request(
basePath,
'/app/safetyenvironmental/getExplain',
method: Method.post,
data: {
"CORPINFO_ID":SessionService.instance.corpinfoId,
"INSPECTION_ORIGINATOR_ID":SessionService.instance.loginUserId,
"INSPECTION_ID" :INSPECTION_ID,
'tm': DateTime.now().millisecondsSinceEpoch.toString(),
},
);
}

View File

@ -9,7 +9,6 @@ import '../../tools/tools.dart';
import '../home/userInfo_page.dart';
import 'ai_alarm_page.dart';
import '../home/work/danger_page.dart';
import '../home/work/danger_repair_page.dart';
enum AppItem {
riskInspection, //

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:qhd_prevention/pages/app/pending_rectification_detail_page.dart';
import 'package:qhd_prevention/pages/home/work/custom_driver_drawer.dart';
import 'package:qhd_prevention/pages/home/risk/risk_detail_page.dart';
import 'package:qhd_prevention/pages/home/work/danger_repair_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/h_colors.dart';
import 'package:qhd_prevention/tools/tools.dart';

View File

@ -246,7 +246,8 @@ class _CheckPersonListPageState extends State<CheckPersonListPage> {
],
),
const SizedBox(height: 8),
if (item['INSPECTION_STATUS'] == '0' || item['INSPECTION_STATUS'] == '1')
if ((item['INSPECTION_STATUS'] == '0' || item['INSPECTION_STATUS'] == '1') &&
!FormUtils.hasValue(item, 'INSPECTION_USER_SIGN_TIME'))
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [

View File

@ -1,19 +1,348 @@
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/date_picker_dialog.dart';
import 'package:qhd_prevention/customWidget/department_person_picker.dart';
import 'package:qhd_prevention/customWidget/department_picker.dart';
import 'package:qhd_prevention/customWidget/full_screen_video_page.dart';
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart';
class SafecheckAssignmentDetailPage extends StatefulWidget {
const SafecheckAssignmentDetailPage({super.key});
const SafecheckAssignmentDetailPage({
super.key,
required this.HIDDEN_STATUS,
required this.INSPECTION_ID,
required this.HIDDEN_ID,
});
final String HIDDEN_STATUS;
final String INSPECTION_ID;
final String HIDDEN_ID;
@override
State<SafecheckAssignmentDetailPage> createState() => _SafecheckAssignmentDetailPageState();
State<SafecheckAssignmentDetailPage> createState() =>
_SafecheckAssignmentDetailPageState();
}
class _SafecheckAssignmentDetailPageState extends State<SafecheckAssignmentDetailPage> {
class _SafecheckAssignmentDetailPageState
extends State<SafecheckAssignmentDetailPage> {
late bool _isEdit = false;
late Map<String, dynamic> form = {};
late List files = [];
late List<String> hiddenVideo = [];
late List hiddenExamineList = [];
final Map<String, dynamic> _danger_des = {
'1': '隐患快报',
'2': '清单排查',
'3': '清单排查',
'4': '安全检查',
'5': '安全检查',
'6': '消防检查',
};
late List<dynamic> inspectorList = [];
//
final Map<String, List<Map<String, dynamic>>> _personCache = {};
final Map<String, dynamic> _rect_des = {'1': '立即整改', '2': '限期整改'};
@override
void initState() {
// TODO: implement initState
super.initState();
if (widget.HIDDEN_ID == '-2') {
_isEdit = true;
}
WidgetsBinding.instance.addPostFrameCallback((_) {
_getData();
});
}
@override
Future<void> _getData() async {
LoadingDialogHelper.show();
final data = await ApiService.getDangerDetail(widget.HIDDEN_ID);
LoadingDialogHelper.hide();
if (data['result'] == 'success') {
setState(() {
form = data['pd'];
final List videos = data['hiddenVideo'] ?? [];
hiddenVideo =
videos
.map((item) => '${ApiService.baseImgPath}${item['FILEPATH']}')
.toList();
files = data['hImgs'];
});
}
}
///
void chooseUnitHandle(String typeStr) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
barrierColor: Colors.black54,
backgroundColor: Colors.transparent,
builder:
(_) => DepartmentPicker(
onSelected: (id, name) async {
setState(() {
form['RECTIFICATIONDEPT'] = id;
form['RECTIFICATIONDEPTNAME'] = name;
});
FocusHelper.clearFocus(context);
_getPersonListForUnitId(typeStr);
},
),
).then((_) {});
}
Future<void> _getPersonListForUnitId(String typeStr) async {
String unitId = form['RECTIFICATIONDEPT'] ?? '';
//
final result = await ApiService.getListTreePersonList(unitId);
setState(() {
_personCache[typeStr] = List<Map<String, dynamic>>.from(
result['userList'] as List,
);
});
FocusHelper.clearFocus(context);
}
///
void choosePersonHandle(String typeStr) async {
final personList = _personCache[typeStr];
if (!FormUtils.hasValue(_personCache, typeStr)) {
ToastUtil.showNormal(context, '请先选择单位');
return;
}
DepartmentPersonPicker.show(
context,
personsData: personList!,
onSelectedWithIndex: (userId, name, index) {
setState(() {
form['RECTIFICATIONOR'] = userId;
form['RECTIFICATIONORNAME'] = name;
});
FocusHelper.clearFocus(context);
},
).then((_) {});
}
Future<void> _submit() async {
if (!_isEdit) {
Navigator.of(context).pop();
return;
}
final textRules = <Map<String, dynamic>>[
{'value': form['RECTIFICATIONDEPT'], 'message': '整改负责人部门不能为空'},
{'value': form['RECTIFICATIONOR'], 'message': '整改负责人不能为空'},
{'value': form['RECTIFICATIONDEADLINE'], 'message': '整改期限不能为空'},
];
for (var rule in textRules) {
if ((rule['value'] as String).isEmpty) {
ToastUtil.showNormal(context, rule['message']);
return;
}
}
Map data = {
'HIDDEN_ID': form['HIDDEN_ID'],
'HIDDENLEVEL': form['HIDDENLEVEL'],
'RECTIFICATIONDEPT': form['RECTIFICATIONDEPT'],
'RECTIFICATIONDEADLINE': form['RECTIFICATIONDEADLINE'],
'RECTIFICATIONOR': form['RECTIFICATIONOR'],
'HIDDEN_STATUS': widget.HIDDEN_STATUS,
'INSPECTION_ID': widget.INSPECTION_ID,
'HIDDENDESCR': form['HIDDENDESCR'],
};
try {
LoadingDialogHelper.show();
final result = await ApiService.safeCheckDangerConfirm(data);
if (result['result'] == 'success') {
ToastUtil.showNormal(context, '保存成功');
Navigator.of(context).pop();
}else{
ToastUtil.showNormal(context, '保存失败');
}
LoadingDialogHelper.hide();
} catch (e) {
LoadingDialogHelper.hide();
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: '安全检查指派'),
body: SafeArea(child: SizedBox()),
body: SafeArea(
child: ListView(
children: [
Padding(
padding: EdgeInsetsGeometry.all(12),
child: ItemListWidget.itemContainer(
horizontal: 0,
Column(
children: [
ItemListWidget.singleLineTitleText(
label: '隐患描述',
isEditable: false,
text: form['HIDDENDESCR'] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '隐患来源',
isEditable: false,
text: _danger_des[form['SOURCE'] ?? ''] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '隐患部位',
isEditable: false,
text: form['hregionName'] ?? form['HIDDENPART'],
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '隐患级别',
isEditable: false,
text: form['HIDDENLEVELNAME'] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '隐患类型',
isEditable: false,
text:
_rect_des[form['RECTIFICATIONTYPE'].toString()] ?? '',
),
const Divider(),
ItemListWidget.twoRowTitleAndImages(
title: '隐患图片',
imageUrls: files.map((item) => item['FILEPATH']).toList(),
onTapCallBack: (url) {
presentOpaque(
SingleImageViewer(imageUrl: url),
context,
);
},
),
if (hiddenVideo.isNotEmpty)
Column(
children: [
const Divider(),
ItemListWidget.itemContainer(
horizontal: 5,
RepairedPhotoSection(
title: '隐患视频',
maxCount: 1,
onMediaTapped: (p) {
showDialog(
context: context,
barrierColor: Colors.black54,
builder: (_) => VideoPlayerPopup(videoUrl: p),
);
},
isEdit: false,
mediaType: MediaType.video,
initialMediaPaths: hiddenVideo,
onChanged: (files) {},
onAiIdentify: () {},
),
),
],
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '隐患发现人',
isEditable: false,
text: form['CREATORNAME'] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '发现时间',
isEditable: false,
text: form['CREATTIME'] ?? '',
),
],
),
),
),
// SizedBox(height: 12,),
Padding(
padding: EdgeInsetsGeometry.only(left: 12, right: 12),
child: ItemListWidget.itemContainer(
horizontal: 0,
Column(
children: [
ListItemFactory.createBuildSimpleSection('安全检查隐患指派整改人'),
const SizedBox(height: 10),
ItemListWidget.selectableLineTitleTextRightButton(
label: '整改负责人部门',
isEditable: _isEdit,
isRequired: false,
isClean: false,
onTapClean: () {
setState(() {});
},
text: form['RECTIFICATIONDEPTNAME'] ?? '请选择',
onTap: () => chooseUnitHandle('key'),
),
const Divider(),
ItemListWidget.selectableLineTitleTextRightButton(
label: '整改负责人',
isRequired: false,
isEditable: _isEdit,
text: form['RECTIFICATIONORNAME'] ?? '请选择',
onTap: () => choosePersonHandle('key'),
),
const Divider(),
ItemListWidget.selectableLineTitleTextRightButton(
label: '整改期限',
isRequired: false,
isEditable: _isEdit,
text: form['RECTIFICATIONDEADLINE'] ?? '请选择',
onTap: () {
showDialog(
context: context,
builder:
(_) => HDatePickerDialog(
initialDate: DateTime.now(),
onCancel: () => Navigator.of(context).pop(),
onConfirm: (selected) {
Navigator.of(context).pop();
setState(() {
form['RECTIFICATIONDEADLINE'] = DateFormat(
'yyyy-MM-dd',
).format(selected);
});
},
),
);
},
),
],
),
),
),
SizedBox(height: 15),
Padding(padding: EdgeInsets.symmetric(horizontal: 50, vertical: 10), child: CustomButton(
text: _isEdit ? '保存' : '返回',
backgroundColor: Colors.blue,
onPressed: () {
_submit();
},
),)
],
),
),
);
}
}

View File

@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_detail_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Start/safeCheck_start_detail.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
@ -112,25 +113,21 @@ class _SafecheckAssignmentListState extends State<SafecheckAssignmentList> {
}
//
//
void _goToDetail(Map<String, dynamic> item) async {
// await pushPage(CheckPersonDetail(INSPECTION_ID: item['INSPECTION_ID'] ?? '', INSPECTION_INSPECTOR_ID: item['INSPECTION_INSPECTOR_ID'],isEdit: false), context);
//
// setState(() {
// _fetchData();
// });
await pushPage(SafecheckAssignmentDetailPage(HIDDEN_STATUS: '0', INSPECTION_ID: item['INSPECTION_ID'], HIDDEN_ID:item['HIDDEN_ID']), context);
_fetchData();
}
///
//
void _goToAssign(Map<String, dynamic> item) async {
// await pushPage(SafecheckSignDetail(INSPECTION_ID: item['INSPECTION_ID'] ?? '', INSPECTION_INSPECTOR_ID: item['INSPECTION_INSPECTOR_ID'] ?? '',isEdit: false), context);
await pushPage(SafecheckAssignmentDetailPage(HIDDEN_STATUS: '-2', INSPECTION_ID: item['INSPECTION_ID'], HIDDEN_ID:item['HIDDEN_ID']), context);
_fetchData();
}
///
//
void _goAccept(Map<String, dynamic> item) async {
// await pushPage(SafecheckSignDetail(INSPECTION_ID: item['INSPECTION_ID'] ?? '', INSPECTION_INSPECTOR_ID: item['INSPECTION_INSPECTOR_ID'] ?? '',isEdit: false), context);

View File

@ -0,0 +1,140 @@
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/customWidget/toast_util.dart';
import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart';
import 'package:url_launcher/url_launcher.dart';
class DefendRecordDetailPage extends StatefulWidget {
const DefendRecordDetailPage({super.key, required this.INSPECTION_ID});
final String INSPECTION_ID;
@override
State<DefendRecordDetailPage> createState() => _DefendRecordDetailPageState();
}
class _DefendRecordDetailPageState extends State<DefendRecordDetailPage> {
late List _list = [];
@override
void initState() {
// TODO: implement initState
super.initState();
_getData();
}
Future<void> _getData() async {
LoadingDialogHelper.show();
try {
final result = await ApiService.safeCheckDefendRecordList(
widget.INSPECTION_ID,
);
if (result['result'] == 'success') {
_list = result['list'];
}
LoadingDialogHelper.hide();
} catch (e) {
LoadingDialogHelper.hide();
ToastUtil.showNormal(context, '接口请求失败');
}
}
Widget _itemWidget(Map<String, dynamic> item) {
return Container(
color: Colors.white,
child: Column(
children: [
ItemListWidget.itemContainer(
ListItemFactory.headerTitle(
'申辩意见:${item['INSPECTED_EXPLAIN'] ?? ''}',
),
),
ItemListWidget.singleLineTitleText(
label: '申辩时间',
isEditable: false,
text: item['CREATTIME'] ?? '',
),
ItemListWidget.singleLineTitleText(
label: '申辩状态',
isEditable: false,
text:
item['ISPASS'] == '0'
? '待审核'
: (item['ISPASS'] == '1'
? '申辩成功'
: (item['ISPASS'] == '2' ? '申辩驳回' : '历史数据')),
),
ItemListWidget.OneRowImageTitle(
label: '签字图片:',
imgPath: item['INSPECTED_SITEUSER_SIGN_IMG'] ?? '',
onTapCallBack: (imgUrl) {
presentOpaque(SingleImageViewer(imageUrl: imgUrl), context);
},
),
if (FormUtils.hasValue(item, 'INSPECTED_EXPLAIN_FILENAME'))
ItemListWidget.OneRowButtonTitleText(
label: '申辩附件名称',
buttonText: '申辩附件下载',
text: item['INSPECTED_EXPLAIN_FILENAME'] ?? '',
onTap: () {
launchUrl(Uri.parse(item['INSPECTED_EXPLAIN_FILENAME'] ?? ''));
},
),
if (item['ISPASS'] == '2')
Column(
children: [
ItemListWidget.OneRowImageTitle(
label: '检查人签字:',
imgPath: item['INSPECTION_ORIGINATOR_SIGN_IMG'] ?? '',
onTapCallBack: (imgUrl) {
presentOpaque(SingleImageViewer(imageUrl: imgUrl), context);
},
),
ItemListWidget.singleLineTitleText(
label: '检查人意见',
isEditable: false,
text: item['INSPECTED_EXPLAIN_REFUSE'] ?? '',
),
ItemListWidget.singleLineTitleText(
label: '审批时间',
isEditable: false,
text: item['INSPECTION_ORIGINATOR_SIGN_TIME'] ?? '',
),
],
),
if (item['ISPASS'] == '1')
ItemListWidget.singleLineTitleText(
label: '申辩时间',
isEditable: false,
text: item['OPERATTIME'] ?? '',
),
SizedBox(height: 10),
const Divider(),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: '申辩记录'),
body: SafeArea(
child: Expanded(
child: ListView.builder(
itemCount: _list.length,
itemBuilder: (context, index) {
final item = _list[index];
return _itemWidget(item);
},
),
),
),
);
}
}

View File

@ -0,0 +1,448 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSign/safecheck_sign_detail.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/DangeCheck/safeCheck_assignment_list.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/DangeCheck/safecheck_danger_detail.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Record/defend_record_detail_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Start/safeCheck_start_detail.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_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';
import 'package:qhd_prevention/customWidget/custom_button.dart';
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
import 'package:qhd_prevention/http/ApiService.dart';
class DefendRecordListPage extends StatefulWidget {
final String flow;
const DefendRecordListPage({Key? key, required this.flow}) : super(key: key);
@override
_DefendRecordListPageState createState() => _DefendRecordListPageState();
}
class _DefendRecordListPageState extends State<DefendRecordListPage> {
// Data and state variables
List<dynamic> list = [];
int currentPage = 1;
int rows = 10;
int totalPage = 1;
bool isLoading = false;
List stepList = [
{'id': '', 'name': '请选择'},
{'id': '0', 'name': '待检查人核实'},
{'id': '1', 'name': '检查人核实中'},
{'id': '2', 'name': '待被检查人确认'},
{'id': '3', 'name': '待指派'},
{'id': '4', 'name': '指派中'},
{'id': '5', 'name': '指派完成'},
{'id': '6', 'name': '检查待验收'},
{'id': '7', 'name': '检查已验收'},
{'id': '8', 'name': '已归档'},
{'id': '-1', 'name': '检查人核实打回'},
{'id': '-2', 'name': '被检查人申辩'},
];
final TextEditingController _searchController = TextEditingController();
int sindex = 0;
String searchKeywords = '';
List<Map<String, dynamic>> flowList = [];
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_fetchData();
_scrollController.addListener(_onScroll);
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
void _onScroll() {
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent &&
!isLoading) {
if (currentPage < totalPage) {
currentPage++;
_fetchData();
}
}
}
Future<void> _fetchData() async {
if (isLoading) return;
setState(() => isLoading = true);
try {
final data = {
'INSPECTION_STATUS': sindex > 0 ? stepList[sindex]['id'] : '',
'roleLevel': SessionService.instance.loginUser?['roleLevel'] ?? '',
'supDeparIds': SessionService.instance.loginUser?['supDeparIds'] ?? '',
'KEYWORDS': searchKeywords,
};
final url =
'/app/safetyenvironmental/pleadList?showCount=-1&currentPage=$currentPage';
final response = await ApiService.getSafeCheckSearchList(data, url);
setState(() {
if (currentPage == 1) {
list = response['varList'];
} else {
list.addAll(response['varList']);
}
Map<String, dynamic> page = response['page'];
totalPage = page['totalPage'] ?? 1;
isLoading = false;
});
} catch (e) {
print('Error fetching data: $e');
setState(() => isLoading = false);
}
}
void _search() {
searchKeywords = _searchController.text.trim();
currentPage = 1;
list.clear();
_fetchData();
}
///
void _goToDetail(Map<String, dynamic> item) async {
await pushPage(
DefendRecordDetailPage(
INSPECTION_ID: item['INSPECTION_ID'] ?? '',
),
context,
);
_fetchData();
}
Widget _buildFlowStepItem({
required Map<String, dynamic> item,
required bool isFirst,
required bool isLast,
}) {
bool status = item['active'] == item['order'];
//
final Color dotColor = status ? Colors.blue : Colors.grey;
final Color textColor = status ? Colors.blue : Colors.black54;
return ListTile(
visualDensity: VisualDensity(vertical: -4),
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
leading: Container(
width: 24,
alignment: Alignment.center,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
// 线
isFirst
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
//
CircleAvatar(radius: 6, backgroundColor: dotColor),
// 线
isLast
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
],
),
),
title: Text(
item['title'] ?? '',
style: TextStyle(color: textColor, fontSize: 15),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (item['desc'] != null)
Text(
item['desc'],
style: TextStyle(color: textColor, fontSize: 13),
),
],
),
);
}
String _checkStatusWithId(String id) {
for (Map item in stepList) {
if (item['id'] == id) {
return item['name'];
}
}
return '';
}
Widget _buildListItem(Map<String, dynamic> item) {
return Card(
color: Colors.white,
margin: const EdgeInsets.all(8.0),
child: InkWell(
onTap: () => _goToDetail(item),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"安全检查记录",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"检查状态: ${_checkStatusWithId(item['INSPECTION_STATUS'].toString())}",
),
Text("检查类型: ${item['INSPECTION_TYPE_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"检查人: ${item['INSPECTION_USER_NAME'] ?? ''}",
maxLines: 5,
overflow: TextOverflow.ellipsis,
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"检查发起人: ${item['INSPECTION_ORIGINATOR_NAME'] ?? ''}",
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("被检查人: ${item['INSPECTED_SITEUSER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"检查时间: ${item['INSPECTION_TIME_START'] ?? ''}${item['INSPECTION_TIME_END'] ?? ''}",
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(),
CustomButton(
text: '申辩记录',
height: 32,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(left: 0),
backgroundColor: Colors.blue,
onPressed: () => _goToDetail(item),
),
],
),
],
),
),
),
);
}
//
Future<void> _showStepPicker() async {
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...')));
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('无法加载步骤数据')));
return;
}
}
//
final options = stepList.map((e) => e['name'] as String).toList();
//
final choice = await BottomPicker.show<String>(
context,
items: options,
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
initialIndex: sindex,
);
if (choice != null) {
//
final newIndex = options.indexOf(choice);
if (newIndex != -1) {
setState(() {
sindex = newIndex;
});
_search();
}
}
}
Widget _buildListContent() {
if (isLoading && list.isEmpty) {
//
return Center(child: CircularProgressIndicator());
} else if (list.isEmpty) {
//
return NoDataWidget.show();
} else {
//
return ListView.builder(
padding: EdgeInsets.zero,
controller: _scrollController,
itemCount: list.length + (isLoading ? 1 : 0),
itemBuilder: (context, index) {
if (index >= list.length) {
//
return Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Center(child: CircularProgressIndicator()),
);
}
return _buildListItem(list[index]);
},
);
}
}
@override
Widget build(BuildContext context) {
final int lastDoneIndex = flowList.lastIndexWhere((e) => e['STATUS'] == 1);
return Scaffold(
key: _scaffoldKey,
appBar: MyAppbar(title: '${widget.flow}', actions: []),
endDrawer: Drawer(
child: SafeArea(
child:
flowList.isEmpty
? Center(child: Text('暂无流程图数据'))
: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemCount: flowList.length + 1, // +1
itemBuilder: (context, i) {
if (i == 0) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Text(
'查看流程图',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
);
}
final idx = i - 1;
final item = flowList[idx];
final bool isFirst = idx == 0;
final bool isLast = idx == flowList.length - 1;
return _buildFlowStepItem(
item: item,
isFirst: isFirst,
isLast: isLast,
);
},
),
),
),
body: SafeArea(
child: Column(
children: [
// Filter bar
Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
child: Row(
children: [
//
SizedBox(
width: 65,
child: TextButton(
onPressed: _showStepPicker,
style: TextButton.styleFrom(
padding: EdgeInsets.symmetric(
vertical: 12,
horizontal: 5,
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'筛选',
style: TextStyle(
color: Colors.black87,
fontSize: 16,
),
),
Icon(Icons.arrow_drop_down, color: Colors.grey),
],
),
),
),
Expanded(
flex: 2,
child: SearchBarWidget(
showResetButton: false,
hintText: "请输入关键字",
// isClickableOnly: true,
onSearch: (text) {
_search();
},
controller: _searchController,
),
),
],
),
),
const Divider(height: 1),
// List
Expanded(child: _buildListContent()),
],
),
),
);
}
}

View File

@ -1,11 +1,22 @@
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/single_image_viewer.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSure/check_person_detail.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Start/safeCheck_start_detail.dart';
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart';
class SafecheckDefendSetPage extends StatefulWidget {
const SafecheckDefendSetPage({super.key, required this.INSPECTION_ID});
final String INSPECTION_ID;
@override
@ -13,10 +24,20 @@ class SafecheckDefendSetPage extends StatefulWidget {
}
class _SafecheckDefendSetPageState extends State<SafecheckDefendSetPage> {
late Map<String, dynamic> form = {};
late bool chooseType = true;
late String INSPECTION_STATUS = '-2';
List<String> signImages = [];
List<String> signTimes = []; //
@override
void initState() {
// TODO: implement initState
super.initState();
_getData();
}
Future<void> _getData() async {
LoadingDialogHelper.show();
try {
final result = await ApiService.getSafeCheckStartGoEdit(
widget.INSPECTION_ID,
@ -25,24 +46,231 @@ class _SafecheckDefendSetPageState extends State<SafecheckDefendSetPage> {
if (!mounted) return;
setState(() {
form = result['pd'] ?? {};
});
LoadingDialogHelper.hide();
} catch (e, st) {
LoadingDialogHelper.hide();
print('加载单条数据失败: $e\n$st');
if (mounted) {
ToastUtil.showNormal(context, '加载数据失败:$e');
}
}
}
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 = [];
signTimes = [];
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(),
);
}
Future<void> _submit() async{
if (INSPECTION_STATUS == '-2') {
await pushPage(SafecheckStartDetail(INSPECTION_ID: form['INSPECTION_ID'] ?? '', type: 'edit'), context);
return;
}
if (INSPECTION_STATUS == '3' && form['INSPECTED_EXPLAIN_REFUSE'] == '') {
ToastUtil.showNormal(context, '请填写理由');
return;
}
if (signImages.isEmpty) {
ToastUtil.showNormal(context, '请签字');
return;
}
LoadingDialogHelper.show();
form['OPERATOR'] = SessionService.instance.loginUserId;
form['ACTION_USER'] = SessionService.instance.username;
form['INSPECTION_STATUS'] = INSPECTION_STATUS;
final result = await ApiService.safeCheckDefendSubmit(form, signImages.first);
LoadingDialogHelper.hide();
try{
if (result['result'] == 'success') {
ToastUtil.showSuccess(context, '保存成功');
}else{
ToastUtil.showError(context, '保存失败');
}
Navigator.of(context).pop();
}catch(e){}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: '申辩处理'),
body: SafeArea(child: Padding(
padding: EdgeInsets.all(12),
child: ItemListWidget.itemContainer(Column(children: [
],)))),
appBar: MyAppbar(title: '申辩处理'),
body: SafeArea(
child:
form.isNotEmpty
? ListView(
children: [
Padding(
padding: EdgeInsets.all(12),
child: ItemListWidget.itemContainer(
horizontal: 0,
Column(
children: [
ItemListWidget.OneRowImageTitle(
label: '申辩人签字',
text: form['INSPECTED_SITEUSER_SIGN_TIME'],
onTapCallBack: (path) {
presentOpaque(
SingleImageViewer(
imageUrl:
ApiService.baseImgPath +
form['INSPECTED_SITEUSER_SIGN_IMG'],
),
context,
);
},
imgPath:
form['INSPECTED_SITEUSER_SIGN_IMG'] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '申辩时间',
isEditable: false,
text: form['INSPECTED_SITEUSER_SIGN_TIME'] ?? '',
),
const Divider(),
ItemListWidget.singleLineTitleText(
label: '申辩说明',
isEditable: false,
text: form['INSPECTED_EXPLAIN'] ?? '',
),
const Divider(),
ListItemFactory.createYesNoSection(
title: '申辩是否成立:',
groupValue: chooseType,
isEdit: true,
isRequired: true,
horizontalPadding: 5,
verticalPadding: 0,
text: '${form['INSPECTION_SUBJECT'] ?? ''}现场检查记录',
onChanged: (val) {
setState(() {
chooseType = val;
INSPECTION_STATUS = val == true ? '-2' : '3';
});
},
),
if (INSPECTION_STATUS == '3')
Column(
children: [
const Divider(),
ItemListWidget.multiLineTitleTextField(
label: '不成立理由',
isEditable: true,
hintText: '请输入理由',
onChanged: (val) {
setState(() {
form['INSPECTED_EXPLAIN_REFUSE'] = val;
});
},
),
const Divider(),
ItemListWidget.itemContainer(
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
ListItemFactory.headerTitle('确认人'),
CustomButton(
text: '手写签字',
height: 36,
backgroundColor: Colors.green,
onPressed: () {
_sign();
},
),
],
),
),
if (signImages.isNotEmpty) _signListWidget(),
],
),
],
),
),
),
CustomButton(
text: INSPECTION_STATUS == '3' ? '提交' : '确认',
backgroundColor: Colors.blue,
onPressed: () {
_submit();
},
),
],
)
: SizedBox(),
),
);
}
}

View File

@ -1148,19 +1148,24 @@ class _SafecheckStartDetailState extends State<SafecheckStartDetail> {
context: context,
),
if (widget.type == 'look' && inspectorVerifyList.isNotEmpty)
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
/// TODO
Column(children: [
const Divider(),
ItemListWidget.singleLineTitleText(label: '打回信息', isEditable: false,),
const Divider(),
ItemListWidget.singleLineTitleText(label: '打回人', isEditable: false, text: inspectorVerifyList.first['INSPECTION_USER_NAME']),
const Divider(),
ItemListWidget.singleLineTitleText(label: '打回信息', isEditable: false, text: inspectorVerifyList.first['INSPECTION_USER_OPINION']),
const Divider(),
ItemListWidget.OneRowImageTitle(
label: '检查人签字',
text: inspectorVerifyList.first['INSPECTION_USER_SIGN_TIME']?? '',
onTapCallBack: (path) {
presentOpaque(SingleImageViewer(imageUrl: path), context);
},
imgPath: inspectorVerifyList.first['INSPECTION_USER_SIGN_IMG']?? '',
),
],),
if (_isEdit && widget.type != 'detail')
Column(
children: [
@ -1239,7 +1244,7 @@ class _SafecheckStartDetailState extends State<SafecheckStartDetail> {
fontSize: 17,
),
backgroundColor: Colors.blue,
onPressed: () => Navigator.pop(context),
onPressed: _submit,
),
),]else...[
SizedBox(
@ -1251,7 +1256,7 @@ class _SafecheckStartDetailState extends State<SafecheckStartDetail> {
fontSize: 17,
),
backgroundColor: Colors.blue,
onPressed: _submit,
onPressed:() => Navigator.pop(context),
),
),
]

View File

@ -114,7 +114,7 @@ class _SafecheckStartListPageState extends State<SafecheckStartListPage> {
///
void _handleApply() {
//
pushPage(SafecheckStartDetail(INSPECTION_ID: '', type: 'add',), context);
pushPage(SafecheckStartDetail(INSPECTION_ID: '', type: 'add',), context);
}
///
@ -143,7 +143,7 @@ class _SafecheckStartListPageState extends State<SafecheckStartListPage> {
void _goToDetail(Map<String, dynamic> item, String type) async {
pushPage(SafecheckStartDetail(INSPECTION_ID: item['INSPECTION_ID'] ?? '', type: type), context);
await pushPage(SafecheckStartDetail(INSPECTION_ID: item['INSPECTION_ID'] ?? '', type: type), context);
setState(() {
_fetchData();

View File

@ -7,6 +7,7 @@ import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/safeCheck_list_page.d
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSign/safeCheck_sign_list_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/CheckPersonSure/check_person_list_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/DangeCheck/safeCheck_danger_list_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Record/defend_record_list_page.dart';
import 'package:qhd_prevention/pages/home/SafeCheck/Start/safeCheck_start_list_page.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
@ -116,7 +117,12 @@ class _SafecheckTabListState extends State<SafecheckTabList> {
await pushPage(SafecheckDangerListPage(flow: title), context);
} break;
case 4: title = '申辩记录'; break;
case 4: {
title = '申辩记录';
await pushPage(DefendRecordListPage(flow: title), context);
} break;
default:
print("按钮 $index 被点击");

View File

@ -510,6 +510,7 @@ class ItemListWidget {
required String text, //
required VoidCallback? onTap, //
double fontSize = 15, //
String buttonText = '分析详情'
}) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 12),
@ -542,7 +543,7 @@ class ItemListWidget {
),
),
CustomButton(
text: "分析详情",
text: buttonText,
height: 30,
padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 5),
backgroundColor: Colors.green,
@ -648,7 +649,7 @@ class ItemListWidget {
///
static Widget twoRowTitleAndImages({
required String title, //
required List<dynamic>? imageUrls, // pd['CONTENT_IMG_PATH']
required List<dynamic>? imageUrls,
double row2Height = 80, //
double fontSize = 15, //
void Function(String)? onTapCallBack,

View File

@ -1,96 +0,0 @@
import 'package:flutter/material.dart';
import '../../../../../customWidget/ItemWidgetFactory.dart';
import '../../../../../customWidget/full_screen_video_page.dart';
import '../../../../../customWidget/single_image_viewer.dart';
import '../../../../../tools/tools.dart';
class DangerAcceptanceFinish extends StatefulWidget {
const DangerAcceptanceFinish({super.key});
@override
State<DangerAcceptanceFinish> createState() => _DangerAcceptanceFinishState();
}
class _DangerAcceptanceFinishState extends State<DangerAcceptanceFinish> {
final List<String> imgUrls = [
"https://pic.rmb.bdstatic.com/bjh/news/100b8b78cbd136ede03249d9f3b3f5c42221.jpeg",
"https://pic.rmb.bdstatic.com/bjh/news/100b8b78cbd136ede03249d9f3b3f5c42221.jpeg",
];
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 0),
child: DecoratedBox(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
//
ListItemFactory.createBuildSimpleSection("验收信息"),
const Divider(height: 1),
// summary
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListItemFactory.createColumnTextItem(
topText: "验收描述",
bottomText: "这是一段整改描述",
),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "是否合格",
rightText: "--",
),
const Divider(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "验收部门",
rightText: "部门",
),
const Divider(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "验收部门负责人",
rightText: "韩双",
),
const Divider(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "验收时间",
rightText: "2020-01-01",
),
ListItemFactory.createTextImageItem(
text: "验收图片",
imageUrls: imgUrls,
onImageTapped: (index) {
presentOpaque(
SingleImageViewer(imageUrl: imgUrls[index]),
context,
);
},
),
ListItemFactory.createTextVideoItem(
text: "验收视频",
videoUrl: "https://www.w3school.com.cn/i/movie.mp4",
onVideoTapped: () {
showDialog(
context: context,
barrierColor: Colors.black54,
builder: (_) => VideoPlayerPopup(videoUrl: "https://www.w3school.com.cn/i/movie.mp4"),
);
}
),
SizedBox(height: 20),
],
),
),
],
),
),
);
}
}

View File

@ -1,88 +0,0 @@
import 'package:flutter/material.dart';
import '../../../../../customWidget/ItemWidgetFactory.dart';
import '../../../../../customWidget/single_image_viewer.dart';
import '../../../../../tools/tools.dart';
class DannerRepairFinish extends StatefulWidget {
const DannerRepairFinish({super.key});
@override
State<DannerRepairFinish> createState() => _DannerRepairFinishState();
}
class _DannerRepairFinishState extends State<DannerRepairFinish> {
final List<String> imgUrls = [
"https://pic.rmb.bdstatic.com/bjh/news/100b8b78cbd136ede03249d9f3b3f5c42221.jpeg",
"https://pic.rmb.bdstatic.com/bjh/news/100b8b78cbd136ede03249d9f3b3f5c42221.jpeg",
];
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 0),
child: DecoratedBox(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
//
ListItemFactory.createBuildSimpleSection("整改信息"),
const Divider(height: 1),
// summary
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12,),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListItemFactory.createColumnTextItem(
topText: "整改描述",
bottomText: "这是一段整改描述",
),
// const SizedBox(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改部门",
rightText: "部门",
),
const Divider(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改人",
rightText: "韩双",
),
const Divider(height: 10),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改时间",
rightText: "2020-01-01",
),
ListItemFactory.createTextImageItem(
text: "整改后图片",
imageUrls: imgUrls,
onImageTapped: (index) {
presentOpaque(
SingleImageViewer(imageUrl: imgUrls[index]),
context,
);
},
),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改方案",
rightText: "",
),
Divider(height: 10,),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改计划",
rightText: "",
),
],
),
),
],
),
),
);
}
}

View File

@ -1,390 +0,0 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/custom_button.dart';
import 'package:qhd_prevention/pages/home/work/dangerTypeItems/danger_detail.dart';
import 'package:qhd_prevention/pages/home/work/dangerTypeItems/finish/danger_acceptance_finish.dart';
import 'package:qhd_prevention/pages/home/work/dangerTypeItems/wait/danger_acceptance.dart';
import 'package:qhd_prevention/pages/app/danner_repair.dart';
import 'package:qhd_prevention/pages/app/danger_wait_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/h_colors.dart';
import '../../../customWidget/ItemWidgetFactory.dart';
import '../../../customWidget/single_image_viewer.dart';
import '../../../http/ApiService.dart';
import '../../../tools/tools.dart';
import 'dangerTypeItems/finish/danner_repair_finish.dart';
class DangerRepairPage extends StatefulWidget {
const DangerRepairPage(this.dangerType, this.item, {Key? key}) : super(key: key);
final DangerType dangerType;
final item;
@override
State<DangerRepairPage> createState() => _DangerRepairPageState();
}
class _DangerRepairPageState extends State<DangerRepairPage> {
//
bool _accepted = false;
List<dynamic> hImgs = [];
List<dynamic> rImgs = [];
dynamic pd;
@override
void initState() {
// TODO: implement initState
super.initState();
if (widget.dangerType == DangerType.ristRecord){//
_getDangerDetail();
}else if (widget.dangerType == DangerType.wait){//
}else if (widget.dangerType == DangerType.expired){//
}else if (widget.dangerType == DangerType.waitAcceptance){//
}else{//
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppbar(title: widget.dangerType.detailTitle),
body: SafeArea(
child: Column(
children: [
//
Expanded(
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
//
// DangerDetail(),
DangerPageDetail(),
SizedBox(height: 15),
if (widget.dangerType == DangerType.wait) //
_danner_type_wait()
else if (widget.dangerType ==
DangerType.waitAcceptance) ...[ //
DannerRepairFinish(),
SizedBox(height: 15),
DangerAcceptance(),
const SizedBox(height: 20),
CustomButton(
text: "提交",
backgroundColor: Colors.blue,
onPressed: () {
_submitToServer();
},
),
] else if (widget.dangerType == DangerType.acceptanced) ...[
DannerRepairFinish(),
SizedBox(height: 15),
DangerAcceptanceFinish()
]
else
SizedBox(),
],
),
),
),
//
if (widget.dangerType == DangerType.wait ||
widget.dangerType == DangerType.waitAcceptance)
Container(
padding: const EdgeInsets.all(15),
color: Colors.white,
child: Text(
' 严禁在本互联网非涉密平台处理、传输国家秘密和工作秘密,请确认扫描、传输的文件资料不涉及国家秘密和工作秘密',
style: TextStyle(fontSize: 14, color: Colors.red),
),
),
],
),
),
);
}
///
Widget _danner_type_wait() {
return SizedBox(
child: Column(
children: [
ListItemFactory.createYesNoSection(
horizontalPadding: 0,
title: '是否正常整改',
yesLabel: '',
noLabel: '',
groupValue: _accepted,
onChanged: (val) {
setState(() {
_accepted = val;
});
},
),
//
// _accepted ? DannerRepair() : _noAccepet_repair(_accepted),
const SizedBox(height: 20),
CustomButton(
text: "提交",
backgroundColor: Colors.blue,
onPressed: () {
_submitToServer();
},
),
],
),
);
}
void _submitToServer() {
// Todo ...
}
// #region
Widget _noAccepet_repair(bool _accept) {
return Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改部门",
rightText: "测试啊",
isRight: true,
),
),
Divider(
height: 10,
color: _accept ? h_backGroundColor() : Colors.transparent,
),
Container(
padding: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改负责人",
rightText: "测试啊",
isRight: true,
),
),
],
);
}
Future<void> _getDangerDetail() async {
try {
final result = await ApiService.getDangerDetail(widget.item['HIDDEN_ID']);
if (result['result'] == 'success') {
setState(() {
hImgs= result['hImgs'];
rImgs= result['rImgs'];
pd= result['pd'];
});
}else{
_showMessage('加载数据失败');
}
} catch (e) {
// Toast
print('加载数据失败:$e');
}
}
void _showMessage(String msg) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));
}
final List<String> imgUrls = [
"https://picsum.photos/id/237/200/300",
"https://pic.rmb.bdstatic.com/bjh/news/100b8b78cbd136ede03249d9f3b3f5c42221.jpeg",
];
Widget DangerPageDetail() {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListView(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: [
ListItemFactory.createRowSpaceBetweenItem(
leftText: "隐患描述",
rightText: "",
// rightText: pd["HIDDENDESCR"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "隐患来源",
rightText: "",
// rightText: _getSourceDangers(pd),
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "风险点(单元)",
rightText: "",
// rightText: pd["RISK_UNIT"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "辨识部位",
rightText: "",
// rightText: pd["IDENTIFICATION"]??"",
),
Divider(height: 1),
ListItemFactory.createColumnTextItem(
topText: "存在风险",
bottomText: "",
// bottomText: pd["RISK_DESCR"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "风险分级",
rightText: "",
// rightText: pd["LEVEL"]??"",
),
Divider(height: 1),
ListItemFactory.createColumnTextItem(
topText: "检测内容",
bottomText: "",
// bottomText: pd["CHECK_CONTENT"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "隐患部位",
rightText: "",
// rightText: pd["HIDDENPART"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "发现人",
rightText: "",
// rightText: pd["CREATORNAME"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "发现时间",
rightText: "",
// rightText: pd["CREATTIME"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "隐患类型",
rightText: "",
// rightText: pd["HIDDENTYPE_NAME"]??"",
),
Divider(height: 1),
ListItemFactory.createRowSpaceBetweenItem(
leftText: "整改类型",
rightText: "",
// rightText: _getZhengGaiType(pd),
),
Divider(height: 1),
],
// itemCount: 16,
// separatorBuilder: (_, __) => const Divider(height: 1),
// itemBuilder: (context, index) {
// Widget item;
// // if (index == 0) {
// // item = ListItemFactory.createAloneTextItem(
// // text: "地坪漆漆未分配全皮肤期漆未分配全皮肤期漆未分配全皮肤期未分配全皮肤期间哦飞机哦脾气金佛怕",
// // );
// // } else
// if ((index == 0 && index < 4) ||
// index == 5 ||
// (index > 6 && index < 15)) {
// item = ListItemFactory.createRowSpaceBetweenItem(
// leftText: "隐患来源",
// rightText: "隐患排查",
// );
// } else if (index == 4 || index == 6) {
// item = ListItemFactory.createColumnTextItem(
// topText: "存在风险",
// bottomText: "哦IQ好然后前后hi前后哦i",
// );
// } else {
// item = ListItemFactory.createTextImageItem(
// text: "隐患照片",
// imageUrls: imgUrls,
// onImageTapped: (index) {
// present(
// SingleImageViewer(imageUrl: imgUrls[index]),
// context,
// );
// },
// );
// }
//
// // item
// return Padding(
// padding: const EdgeInsets.symmetric(
// horizontal: 12,
// vertical: 8,
// ),
// child: item,
// );
// },
),
],
),
);
}
String _getSourceDangers(final item) {
String type = item["SOURCE"];
if("1"==type){
return "隐患来源:隐患快报";
}else if("2"==type){
return "隐患来源:隐患排查清单检查";
}else if("3"==type){
return "隐患来源:标准排查清单检查";
}else if("4"==type){
return "隐患来源:专项检查";
}else{
return "隐患来源:安全检查";
}
}
String _getZhengGaiType(final item) {
String type = item["RECTIFICATIONTYPE"];
if("1"==type){
return "立即整改";
}else {
return "限期整改";
}
}
}

View File

@ -79,6 +79,7 @@ dependencies:
flutter_new_badger: ^1.1.1
#loading
flutter_easyloading: ^3.0.5
dev_dependencies:
flutter_test:
sdk: flutter