Merge remote-tracking branch 'origin/main'
# Conflicts: # lib/http/ApiService.dartmain
commit
b2b2298929
|
|
@ -23,8 +23,10 @@ class ListItemFactory {
|
|||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (isRequired) Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Text(
|
||||
|
|
@ -39,16 +41,18 @@ class ListItemFactory {
|
|||
),
|
||||
if (isRight)
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Expanded(child: Text(
|
||||
rightText,
|
||||
// rightText,
|
||||
style: TextStyle(fontSize: 15, color: Colors.grey),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),),
|
||||
SizedBox(width: 2),
|
||||
Flexible(
|
||||
fit: FlexFit.loose,
|
||||
child: Text(
|
||||
rightText,
|
||||
style: TextStyle(fontSize: 15, color: Colors.grey),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
SizedBox(width: 6),
|
||||
Icon(
|
||||
Icons.arrow_forward_ios_rounded,
|
||||
color: Colors.black45,
|
||||
|
|
@ -57,8 +61,16 @@ class ListItemFactory {
|
|||
],
|
||||
)
|
||||
else
|
||||
Expanded(child: Text(rightText, style: TextStyle(fontSize: 15, color: Colors.grey,),maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis, textAlign: TextAlign.right,)),
|
||||
Flexible(
|
||||
fit: FlexFit.loose,
|
||||
child: Text(
|
||||
rightText,
|
||||
style: TextStyle(fontSize: 15, color: Colors.grey),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
textAlign: TextAlign.right,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
|
@ -196,25 +208,26 @@ class ListItemFactory {
|
|||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
videoUrl.isNotEmpty ?
|
||||
GestureDetector(
|
||||
onTap: onVideoTapped,
|
||||
child: Container(
|
||||
height: videoHeight,
|
||||
width: videoHeight * 3 / 2,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[300],
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(
|
||||
Icons.play_circle_outline,
|
||||
size: 40,
|
||||
color: Colors.white,
|
||||
videoUrl.isNotEmpty
|
||||
? GestureDetector(
|
||||
onTap: onVideoTapped,
|
||||
child: Container(
|
||||
height: videoHeight,
|
||||
width: videoHeight * 3 / 2,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[300],
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(
|
||||
Icons.play_circle_outline,
|
||||
size: 40,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
) : SizedBox(height: 10,)
|
||||
)
|
||||
: SizedBox(height: 10),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
|
@ -258,7 +271,6 @@ class ListItemFactory {
|
|||
bool isEdit = true,
|
||||
String text = '',
|
||||
bool isRequired = false,
|
||||
|
||||
}) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
|
|
@ -278,15 +290,18 @@ class ListItemFactory {
|
|||
Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
if (isRequired && isEdit) Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black,
|
||||
if (isRequired && isEdit)
|
||||
Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Expanded(
|
||||
child: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -318,8 +333,7 @@ class ListItemFactory {
|
|||
),
|
||||
],
|
||||
),
|
||||
if (!isEdit)
|
||||
Text(text, style: TextStyle(),)
|
||||
if (!isEdit) Text(text, style: TextStyle()),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -330,10 +344,11 @@ class ListItemFactory {
|
|||
static Widget createBuildSimpleSection(
|
||||
String title, {
|
||||
double horPadding = 10,
|
||||
Color color = Colors.white,
|
||||
}) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
color: color,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Padding(
|
||||
|
|
@ -352,6 +367,45 @@ class ListItemFactory {
|
|||
);
|
||||
}
|
||||
|
||||
/// 列表标题头(蓝色圆点+文字)
|
||||
static Widget createBlueDotSection(
|
||||
String title,
|
||||
{double horPadding = 10,
|
||||
int color=0xFFf1f1f1}) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Color(color),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: horPadding, vertical: 10),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 7,
|
||||
height: 7,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue,
|
||||
borderRadius: BorderRadius.circular(180),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
// 添加 Expanded
|
||||
child: Text(
|
||||
title,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 单纯标题
|
||||
static Widget headerTitle(String title, {bool isRequired = false}) {
|
||||
return Container(
|
||||
|
|
@ -403,7 +457,9 @@ class ListItemFactory {
|
|||
children: [
|
||||
if (isRequired) Text('* ', style: TextStyle(color: Colors.red)),
|
||||
// 标题
|
||||
HhTextStyleUtils.mainTitle(label, fontSize: 15),
|
||||
Expanded(
|
||||
child:HhTextStyleUtils.mainTitle(label, fontSize: 15),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -9,13 +9,15 @@ import 'package:qhd_prevention/http/ApiService.dart';
|
|||
import 'package:qhd_prevention/pages/app/danger_wait_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/app/detail_images_page.dart';
|
||||
import 'package:qhd_prevention/pages/app/hidden_record_detail_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
|
||||
class CheckRecordDetailPage extends StatefulWidget {
|
||||
const CheckRecordDetailPage(this.id, {super.key});
|
||||
const CheckRecordDetailPage(this.id, this.type, {super.key});
|
||||
|
||||
final int type;
|
||||
final String id;
|
||||
@override
|
||||
_CheckRecordDetailPageState createState() => _CheckRecordDetailPageState();
|
||||
|
|
@ -81,7 +83,13 @@ class _CheckRecordDetailPageState extends State<CheckRecordDetailPage> {
|
|||
Future<void> _getInspectRecordsDetail() async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getInspectRecordsDetail(widget.id);
|
||||
final Map<String, dynamic> result;
|
||||
if(widget.type==1){
|
||||
result = await ApiService.getInspectRecordsDetailYin(widget.id);
|
||||
}else{
|
||||
result = await ApiService.getInspectRecordsDetail(widget.id);
|
||||
}
|
||||
// final result = await ApiService.getInspectRecordsDetail(widget.id);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> qianmingList = result['qianming'] ?? [];
|
||||
setState(() {
|
||||
|
|
@ -106,7 +114,13 @@ class _CheckRecordDetailPageState extends State<CheckRecordDetailPage> {
|
|||
Future<void> _getInspectRecordsDetailTwo() async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getInspectRecordsDetailTwo(widget.id);
|
||||
final Map<String, dynamic> result;
|
||||
if(widget.type==1){
|
||||
result = await ApiService.getInspectRecordsDetailTwoYin(widget.id);
|
||||
}else{
|
||||
result = await ApiService.getInspectRecordsDetailTwo(widget.id);
|
||||
}
|
||||
// final result = await ApiService.getInspectRecordsDetailTwo(widget.id);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['hiddenList'] ?? [];
|
||||
setState(() {
|
||||
|
|
@ -129,7 +143,8 @@ class _CheckRecordDetailPageState extends State<CheckRecordDetailPage> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: _buildAppBar(),
|
||||
appBar: MyAppbar(title: "检查记录详情"),
|
||||
// _buildAppBar(),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
|
@ -148,17 +163,17 @@ class _CheckRecordDetailPageState extends State<CheckRecordDetailPage> {
|
|||
);
|
||||
}
|
||||
|
||||
AppBar _buildAppBar() {
|
||||
return AppBar(
|
||||
leading: IconButton(
|
||||
icon: Icon(Icons.arrow_back, color: Colors.white),
|
||||
onPressed: () => Navigator.pop(context),
|
||||
),
|
||||
title: Text("检查记录详情", style: TextStyle(color: Colors.white)),
|
||||
backgroundColor: Colors.blue,
|
||||
centerTitle: true,
|
||||
);
|
||||
}
|
||||
// AppBar _buildAppBar() {
|
||||
// return AppBar(
|
||||
// leading: IconButton(
|
||||
// icon: Icon(Icons.arrow_back, color: Colors.white),
|
||||
// onPressed: () => Navigator.pop(context),
|
||||
// ),
|
||||
// title: Text("检查记录详情", style: TextStyle(color: Colors.white)),
|
||||
// backgroundColor: Colors.blue,
|
||||
// centerTitle: true,
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget _buildSectionTitle(String title) {
|
||||
return Padding(
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ class _CheckRecordListPageState extends State<CheckRecordListPage>
|
|||
void _handleItemTap( item, int index) {
|
||||
if(_selectedTab==0){
|
||||
print("点击了是: ${index}");
|
||||
pushPage(CheckRecordDetailPage(item['CHECKRECORD_ID']), context);
|
||||
pushPage(CheckRecordDetailPage(item['CHECKRECORD_ID'],widget.type), context);
|
||||
}
|
||||
}
|
||||
// 显示分类选择器
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ class _CheckingInformationOnePageState extends State<CheckingInformationOnePage>
|
|||
// TODO: implement initState
|
||||
super.initState();
|
||||
|
||||
CHECKRECORD_ID= widget.checkrecordId??"";
|
||||
final now =DateTime.now();
|
||||
dataTime=DateFormat('yyyy-MM-dd').format(now);
|
||||
stringTime=DateFormat('HH:mm').format(now);
|
||||
|
|
@ -86,7 +87,7 @@ class _CheckingInformationOnePageState extends State<CheckingInformationOnePage>
|
|||
final List<dynamic> newList = result['hiddenList'] ?? [];
|
||||
setState(() {
|
||||
|
||||
CHECKRECORD_ID= result['CHECKRECORD_ID'];
|
||||
// CHECKRECORD_ID= result['CHECKRECORD_ID'];
|
||||
listDates.addAll(newList);//"HIDDENDESCR" -> "3111111"
|
||||
for(int i=0;i<listDates.length;i++){
|
||||
try{
|
||||
|
|
@ -117,7 +118,7 @@ class _CheckingInformationOnePageState extends State<CheckingInformationOnePage>
|
|||
final List<dynamic> newList = result['hiddenList'] ?? [];
|
||||
setState(() {
|
||||
|
||||
CHECKRECORD_ID= result['CHECKRECORD_ID'];
|
||||
// CHECKRECORD_ID= result['CHECKRECORD_ID'];
|
||||
listDates.addAll(newList);//"HIDDENDESCR" -> "3111111"
|
||||
for(int i=0;i<listDates.length;i++){
|
||||
try{
|
||||
|
|
|
|||
|
|
@ -456,7 +456,7 @@ class _PendingRectificationDetailPageState extends State<PendingRectificationDet
|
|||
|
||||
|
||||
Future<void> _normalRectificationSubmission() async {
|
||||
try {
|
||||
|
||||
|
||||
|
||||
String dataTime= dannerRepairKey.currentState!.dataTime;
|
||||
|
|
@ -616,6 +616,8 @@ class _PendingRectificationDetailPageState extends State<PendingRectificationDet
|
|||
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
final result = await ApiService.normalRectificationSubmission(
|
||||
dataTime, miaoShu, acceptedPrepareType, acceptedPlanType,
|
||||
id, caertTime, listName,
|
||||
|
|
@ -635,6 +637,24 @@ class _PendingRectificationDetailPageState extends State<PendingRectificationDet
|
|||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
|
||||
final result = await ApiService.normalRectificationSubmissionTwo(
|
||||
dataTime, miaoShu, acceptedPrepareType, acceptedPlanType,
|
||||
id, caertTime, listName,
|
||||
standard, method, fund, person,
|
||||
workTime, time, work, other, json);
|
||||
if (result['result'] == 'success') {
|
||||
setState(() {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, "提交成功");
|
||||
Navigator.of(context).pop();
|
||||
widget.onClose('关闭详情'); // 触发回调
|
||||
});
|
||||
|
||||
}else{
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
}
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
|
|
@ -658,6 +678,19 @@ class _PendingRectificationDetailPageState extends State<PendingRectificationDet
|
|||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
final result = await ApiService.rectificationSubmissionTwo(pd["HIDDEN_ID"],buMenId,renYuanId);
|
||||
if (result['result'] == 'success') {
|
||||
setState(() {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, "提交成功");
|
||||
Navigator.of(context).pop();
|
||||
widget.onClose('关闭详情'); // 触发回调
|
||||
});
|
||||
|
||||
}else{
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
}
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,210 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/EquipmentInspection/equiment_detail_listinfo.dart';
|
||||
import 'package:qhd_prevention/pages/home/Safetymeeting/safety_meeting_detail_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/notif/notif_detail_page.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
class EquimentDetailListPage extends StatefulWidget {
|
||||
const EquimentDetailListPage(this.id, {Key? key}) : super(key: key);
|
||||
|
||||
final String id;
|
||||
@override
|
||||
State<EquimentDetailListPage> createState() => _EquimentDetailListPageState();
|
||||
}
|
||||
|
||||
class _EquimentDetailListPageState extends State<EquimentDetailListPage>
|
||||
with SingleTickerProviderStateMixin{
|
||||
|
||||
late TabController _tabController= TabController(length: 2, vsync: this);
|
||||
int _selectedTab = 0;
|
||||
late List<dynamic> _list = [];
|
||||
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// _tabController = TabController(length: 2, vsync: this);
|
||||
_tabController.addListener(() {
|
||||
// if (!_tabController.indexIsChanging) {
|
||||
// setState(() => _selectedTab = _tabController.index);
|
||||
// }
|
||||
|
||||
if (_tabController.indexIsChanging) {
|
||||
setState(() => _selectedTab = _tabController.index);
|
||||
print('切换到标签:${_tabController.index}');
|
||||
reRefreshData();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
_getEquipmentDetailList(false);
|
||||
}
|
||||
|
||||
void reRefreshData(){
|
||||
_list.clear();
|
||||
_getEquipmentDetailList(false);
|
||||
|
||||
}
|
||||
|
||||
Future<void> _getEquipmentDetailList(bool loadMore) async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getEquipmentDetailList(widget.id,_selectedTab );
|
||||
if (result['result'] == 'success') {
|
||||
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
setState(() {
|
||||
_list.addAll(newList);
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "设备巡检记录"),
|
||||
body:
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
FocusScope.of(context).unfocus(); // 收起键盘
|
||||
},
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Scaffold(
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
// Tab bar
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: TabBar(
|
||||
controller: _tabController,
|
||||
labelStyle: TextStyle(fontSize: 16),
|
||||
indicator: UnderlineTabIndicator(
|
||||
borderSide: BorderSide(width: 3.0, color: Colors.blue),
|
||||
insets: EdgeInsets.symmetric(horizontal: 100.0),
|
||||
),
|
||||
labelColor: Colors.blue,
|
||||
unselectedLabelColor: Colors.grey,
|
||||
tabs: const [Tab(text: '已检查记录'), Tab(text: '超期未检查记录')],
|
||||
),
|
||||
),
|
||||
|
||||
// Search bar
|
||||
// List
|
||||
Expanded(
|
||||
child:
|
||||
_list.isEmpty
|
||||
? NoDataWidget.show()
|
||||
: ListView.builder(
|
||||
itemCount: _list.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _itemCell(_list[index]);
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _itemCell(final record) {
|
||||
return Card(
|
||||
color: Colors.white,
|
||||
margin: const EdgeInsets.only(top: 15,left: 15,right: 15),
|
||||
elevation: 2,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: InkWell(
|
||||
onTap:() {
|
||||
_goToDetail(record);
|
||||
} ,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
_buildInfoRow('人员:${record['INSPECTOR']}'),
|
||||
const SizedBox(height: 8),
|
||||
_buildInfoRow(
|
||||
'检查周期:${ DateFormat('yyyy-MM-dd').format(DateTime.parse(record['PERIOD_START_DATE']))} '
|
||||
'- ${DateFormat('yyyy-MM-dd').format(DateTime.parse(record['PERIOD_END_DATE']))}'
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
_buildInfoRow('检查时间:${record['INSPECTIONTIME']}'),
|
||||
_buildInfoRow('是否故障:${record['ISFAULT']}'),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildInfoRow(String text) {
|
||||
return Text(
|
||||
text,
|
||||
style: const TextStyle(color: Colors.grey, fontSize: 14),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void _goToDetail(item){
|
||||
// pushPage(SafetyMeetingDetailPage(
|
||||
// id,_selectedTab,
|
||||
// onClose: (String result) {
|
||||
// setState(() {
|
||||
// reRefreshData();
|
||||
// });
|
||||
//
|
||||
// },
|
||||
// ), context);
|
||||
pushPage(EquimentDetailListinfo(item["SPECIALEQUIPMENTAQXJ_ID"]), context);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,159 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
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/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 EquimentDetailListinfo extends StatefulWidget {
|
||||
const EquimentDetailListinfo(this. id, {super.key});
|
||||
|
||||
final String id;
|
||||
|
||||
@override
|
||||
State<EquimentDetailListinfo> createState() => _EquimentDetailListinfoState();
|
||||
}
|
||||
|
||||
class _EquimentDetailListinfoState extends State<EquimentDetailListinfo> {
|
||||
|
||||
|
||||
final TextEditingController _xunController = TextEditingController();
|
||||
final TextEditingController _neiRongController = TextEditingController();
|
||||
// 是否有故障
|
||||
bool _isFault = false;
|
||||
String dataTime="";
|
||||
|
||||
List<dynamic> faultImgs = [];
|
||||
List<dynamic> handleImgs = [];
|
||||
List<dynamic> inspectionImgs = [];
|
||||
|
||||
dynamic pd={};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
|
||||
_getEquimentDetailListinfo();
|
||||
}
|
||||
|
||||
Future<void> _getEquimentDetailListinfo() async {
|
||||
try {
|
||||
final result = await ApiService.getEquimentDetailListinfo(widget.id);
|
||||
if (result['result'] == 'success') {
|
||||
|
||||
setState(() {
|
||||
|
||||
pd= result['pd'];
|
||||
faultImgs.addAll(result['faultImgs'] ?? []);
|
||||
handleImgs.addAll(result['handleImgs'] ?? []);
|
||||
inspectionImgs.addAll(result['inspectionImgs'] ?? []);
|
||||
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error fetching data: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "开始巡检"),
|
||||
body: ListView(
|
||||
children: [
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: Column(children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '巡检人:',
|
||||
isEditable: false,
|
||||
controller: _xunController,
|
||||
text: pd["INSPECTOR"]??"",
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '巡检时间:',
|
||||
isEditable: false,
|
||||
controller: _xunController,
|
||||
text: pd["INSPECTIONTIME"]??"",
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '巡检内容:',
|
||||
isEditable: false,
|
||||
controller: _xunController,
|
||||
text: pd["INSPECTIONCONTENT"]??"",
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '是否有故障:',
|
||||
isEditable: false,
|
||||
controller: _xunController,
|
||||
text: pd["ISFAULT"]??"",
|
||||
),
|
||||
|
||||
if(faultImgs.isNotEmpty)
|
||||
Divider(),
|
||||
if(faultImgs.isNotEmpty)
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '故障照片:',
|
||||
imageUrls: faultImgs
|
||||
.map((item) => item['FILEPATH'] as String) // 提取并转换为 String
|
||||
.toList(),
|
||||
),
|
||||
|
||||
if(faultImgs.isNotEmpty)
|
||||
Divider(),
|
||||
if(faultImgs.isNotEmpty)
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '故障处理后照片:',
|
||||
imageUrls: handleImgs
|
||||
.map((item) => item['FILEPATH'] as String) // 提取并转换为 String
|
||||
.toList(),
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '巡检照片:',
|
||||
imageUrls: inspectionImgs
|
||||
.map((item) => item['FILEPATH'] as String) // 提取并转换为 String
|
||||
.toList(),
|
||||
),
|
||||
|
||||
SizedBox(height: 20,)
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,362 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/EquipmentInspection/immediately_inspection.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
import 'equiment_detail_list_page.dart';
|
||||
|
||||
class EquipmentInspectionListPage extends StatefulWidget {
|
||||
const EquipmentInspectionListPage({super.key});
|
||||
|
||||
@override
|
||||
State<EquipmentInspectionListPage> createState() =>
|
||||
_EquipmentInspectionListPageState();
|
||||
}
|
||||
|
||||
class _EquipmentInspectionListPageState
|
||||
extends State<EquipmentInspectionListPage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late TabController _tabController;
|
||||
int _currentTabIndex = 0;
|
||||
List<EquipItem> _equipList = [];
|
||||
List<String> _periodList = ['每日', '每周', '每旬', '每月'];
|
||||
int _currentPage = 1;
|
||||
int _totalPage = 0;
|
||||
bool _isLoading = false;
|
||||
bool _noMoreData = false;
|
||||
ScrollController _scrollController = ScrollController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tabController = TabController(length: 2, vsync: this);
|
||||
_tabController.addListener(_handleTabSelection);
|
||||
|
||||
_scrollController.addListener(() {
|
||||
if (_scrollController.position.pixels ==
|
||||
_scrollController.position.maxScrollExtent) {
|
||||
_loadMoreData();
|
||||
}
|
||||
});
|
||||
|
||||
_fetchData();
|
||||
}
|
||||
|
||||
void _handleTabSelection() {
|
||||
if (_tabController.indexIsChanging) {
|
||||
setState(() {
|
||||
_currentTabIndex = _tabController.index;
|
||||
_resetPageData();
|
||||
_fetchData();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _resetPageData() {
|
||||
setState(() {
|
||||
_currentPage = 1;
|
||||
_equipList.clear();
|
||||
_noMoreData = false;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _fetchData() async {
|
||||
if (_isLoading) return;
|
||||
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
});
|
||||
|
||||
try {
|
||||
await Future.delayed(Duration(seconds: 1));
|
||||
|
||||
final result = await ApiService.getEquipmentInspectionList(
|
||||
_currentPage,
|
||||
_currentTabIndex,
|
||||
);
|
||||
if (result['result'] == 'success') {
|
||||
// final List<dynamic> newItems = result['varList'] ?? [];
|
||||
// final data = json.decode(response.body);
|
||||
final newItems =
|
||||
(result['varList'] as List)
|
||||
.map((item) => EquipItem.fromJson(item))
|
||||
.toList();
|
||||
|
||||
setState(() {
|
||||
_equipList.addAll(newItems);
|
||||
_totalPage = result['page']['totalPage'];
|
||||
_noMoreData = _currentPage >= _totalPage;
|
||||
_currentPage++;
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error fetching data: $e');
|
||||
} finally {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _loadMoreData() {
|
||||
if (_isLoading || _noMoreData) return;
|
||||
_fetchData();
|
||||
}
|
||||
|
||||
Future<void> _goToAdd(EquipItem item) async {
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(
|
||||
// builder: (context) => InspectionAddPage(equipmentId: item.id),
|
||||
// ),
|
||||
// );
|
||||
await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => ImmediatelyInspection(item.id)),
|
||||
);
|
||||
_resetPageData();
|
||||
_fetchData();
|
||||
// pushPage(ImmediatelyInspection(item.id), context);
|
||||
}
|
||||
|
||||
void _goToRecordList(EquipItem item) {
|
||||
// Navigator.push(
|
||||
// context,
|
||||
// MaterialPageRoute(
|
||||
// builder: (context) => InspectionRecordPage(equipmentId: item.id),
|
||||
// ),
|
||||
// );
|
||||
pushPage(EquimentDetailListPage(item.id), context);
|
||||
|
||||
}
|
||||
|
||||
String _handleIsChecked(EquipItem item) {
|
||||
final now = DateTime.now();
|
||||
final nextInspection = DateFormat(
|
||||
'yyyy-MM-dd hh:mm',
|
||||
).parse(item.periodStartDate);
|
||||
|
||||
if (nextInspection.isAfter(now)) {
|
||||
return "已检查";
|
||||
} else {
|
||||
return "未检查";
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildFirstTab() {
|
||||
// 按周期分组
|
||||
Map<String, List<EquipItem>> groupedItems = {};
|
||||
for (var period in _periodList) {
|
||||
groupedItems[period] =
|
||||
_equipList.where((item) => item.periodName == period).toList();
|
||||
}
|
||||
|
||||
return ListView.builder(
|
||||
controller: _scrollController,
|
||||
itemCount: _periodList.length,
|
||||
itemBuilder: (context, index) {
|
||||
final period = _periodList[index];
|
||||
final items = groupedItems[period] ?? [];
|
||||
|
||||
return Container(
|
||||
color: Colors.white,
|
||||
child: ExpansionTile(
|
||||
title: Text(
|
||||
period,
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
children: items.map((item) => _buildEquipItem(item)).toList(),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildSecondTab() {
|
||||
return ListView.builder(
|
||||
controller: _scrollController,
|
||||
itemCount: _equipList.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
if (index == _equipList.length) {
|
||||
return _buildLoader();
|
||||
}
|
||||
return _equipList.isNotEmpty
|
||||
? _buildEquipItem(_equipList[index])
|
||||
: null;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildEquipItem(EquipItem item) {
|
||||
return Card(
|
||||
color: Colors.white,
|
||||
margin: EdgeInsets.all(8),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'设备名称:${item.equipmentName}',
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
Text(
|
||||
'设备类型:${item.equipmentTypeName}',
|
||||
style: TextStyle(color: Colors.grey[600]),
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
Text(
|
||||
'巡检周期:${item.periodName}',
|
||||
style: TextStyle(color: Colors.grey[600]),
|
||||
),
|
||||
SizedBox(height: 12),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
if (_currentTabIndex == 0)
|
||||
Text(
|
||||
_handleIsChecked(item),
|
||||
style: TextStyle(color: Colors.orange),
|
||||
)
|
||||
else
|
||||
Text('巡检次数: ${item.inspectionCount}'),
|
||||
ElevatedButton(
|
||||
onPressed:
|
||||
() =>
|
||||
_currentTabIndex == 0
|
||||
? _goToAdd(item)
|
||||
: _goToRecordList(item),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.orange,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
_currentTabIndex == 0 ? '立即巡检' : '巡检记录',
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildLoader() {
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 16),
|
||||
alignment: Alignment.center,
|
||||
child:
|
||||
_isLoading
|
||||
? CircularProgressIndicator()
|
||||
: Text(
|
||||
_noMoreData ? '--已经没有更多了--' : '',
|
||||
style: TextStyle(color: Colors.grey),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildEmptyState() {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset('assets/images/null.png', width: 200, height: 200),
|
||||
SizedBox(height: 16),
|
||||
Text('暂无数据', style: TextStyle(fontSize: 18, color: Colors.grey)),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "我的任务"),
|
||||
|
||||
body: Column(
|
||||
children: [
|
||||
// 将 TabBar 放在 body 顶部
|
||||
Container(
|
||||
color: Colors.white, // 白色背景
|
||||
child: TabBar(
|
||||
controller: _tabController,
|
||||
labelStyle: TextStyle(fontSize: 16),
|
||||
indicator: UnderlineTabIndicator(
|
||||
borderSide: BorderSide(width: 3.0, color: Colors.blue),
|
||||
insets: EdgeInsets.symmetric(horizontal: 100.0),
|
||||
),
|
||||
labelColor: Colors.blue,
|
||||
unselectedLabelColor: Colors.grey,
|
||||
tabs: const [Tab(text: '待反馈'), Tab(text: '已反馈')],
|
||||
),
|
||||
),
|
||||
|
||||
// 内容区域(可滚动)
|
||||
Expanded(
|
||||
child: TabBarView(
|
||||
controller: _tabController,
|
||||
children: [
|
||||
// 第一个选项卡
|
||||
_equipList.isEmpty ? _buildEmptyState() : _buildFirstTab(),
|
||||
|
||||
// 第二个选项卡
|
||||
_equipList.isEmpty ? _buildEmptyState() : _buildSecondTab(),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
class EquipItem {
|
||||
final String id;
|
||||
final String equipmentName;
|
||||
final String equipmentTypeName;
|
||||
final String periodName;
|
||||
final String periodStartDate;
|
||||
final int inspectionCount;
|
||||
|
||||
EquipItem({
|
||||
required this.id,
|
||||
required this.equipmentName,
|
||||
required this.equipmentTypeName,
|
||||
required this.periodName,
|
||||
required this.periodStartDate,
|
||||
required this.inspectionCount,
|
||||
});
|
||||
|
||||
factory EquipItem.fromJson(Map<String, dynamic> json) {
|
||||
return EquipItem(
|
||||
id: json['SPECIALEQUIPMENT_ID'] ?? '',
|
||||
equipmentName: json['EQUIPMENTNAME'] ?? '',
|
||||
equipmentTypeName: json['EQUIPMENTTYPENAME'] ?? '',
|
||||
periodName: json['PERIOD_NAME'] ?? '',
|
||||
periodStartDate: json['PERIOD_START_DATE'] ?? '',
|
||||
inspectionCount: json['XJCOUNT'] ?? 0,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,281 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
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/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/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
|
||||
class ImmediatelyInspection extends StatefulWidget {
|
||||
const ImmediatelyInspection(this. id, {super.key});
|
||||
|
||||
final String id;
|
||||
|
||||
@override
|
||||
State<ImmediatelyInspection> createState() => _ImmediatelyInspectionState();
|
||||
}
|
||||
|
||||
class _ImmediatelyInspectionState extends State<ImmediatelyInspection> {
|
||||
|
||||
|
||||
final TextEditingController _xunController = TextEditingController();
|
||||
final TextEditingController _neiRongController = TextEditingController();
|
||||
// 是否有故障
|
||||
bool _isFault = false;
|
||||
String dataTime="";
|
||||
|
||||
List<String> _guZhangImages = [];
|
||||
List<String> _xiuGaiImages = [];
|
||||
List<String> _xunJianImages = [];
|
||||
|
||||
List<String> allImagePaths = [];
|
||||
List<String> allImageTypes = [];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "开始巡检"),
|
||||
body: ListView(
|
||||
children: [
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: Column(children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '巡检人:',
|
||||
isEditable: true,
|
||||
controller: _xunController,
|
||||
hintText: '请输入巡检人',
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 15,vertical: 10),
|
||||
child: GestureDetector(
|
||||
child: ItemListWidget.selectableLineTitleTextRightButton(label: '巡检日期', text: dataTime.isEmpty?
|
||||
'请选择':dataTime??'', isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => HDatePickerDialog(
|
||||
initialDate: DateTime.now(),
|
||||
onCancel: () => Navigator.of(context).pop(),
|
||||
onConfirm: (selected) {
|
||||
Navigator.of(context).pop();
|
||||
setState(() {
|
||||
|
||||
dataTime= DateFormat('yyyy-MM-dd').format(selected);
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
// ListItemFactory.createRowSpaceBetweenItem(
|
||||
// leftText: "巡检日期",
|
||||
// rightText: dataTime.isEmpty?"请选择":dataTime,
|
||||
// isRight: true,
|
||||
// ),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: ItemListWidget.multiLineTitleTextField(
|
||||
label: '巡检内容:',
|
||||
isEditable: true,
|
||||
controller: _neiRongController,
|
||||
hintText: "(必填)",
|
||||
text:'',
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '是否有故障',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
// if(_isFault)
|
||||
// SizedBox(height: 15,),
|
||||
if(_isFault)
|
||||
RepairedPhotoSection(
|
||||
horizontalPadding: 15,
|
||||
title: "故障照片",
|
||||
maxCount: 4,
|
||||
mediaType: MediaType.image,
|
||||
onMediaAdded: (value) {
|
||||
_guZhangImages.add(value);
|
||||
},
|
||||
onMediaRemoved: (value) {
|
||||
_guZhangImages.remove(value);
|
||||
},
|
||||
onChanged: (files) {
|
||||
},
|
||||
onAiIdentify: () {
|
||||
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height:_isFault? 15:0,),
|
||||
if(_isFault)
|
||||
RepairedPhotoSection(
|
||||
horizontalPadding: 15,
|
||||
title: "故障处理后照片",
|
||||
maxCount: 4,
|
||||
mediaType: MediaType.image,
|
||||
onMediaAdded: (value) {
|
||||
_xiuGaiImages.add(value);
|
||||
},
|
||||
onMediaRemoved: (value) {
|
||||
_xiuGaiImages.remove(value);
|
||||
},
|
||||
onChanged: (files) {
|
||||
},
|
||||
onAiIdentify: () {
|
||||
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height:_isFault? 15:0,),
|
||||
RepairedPhotoSection(
|
||||
horizontalPadding: 15,
|
||||
title: "巡检照片",
|
||||
maxCount: 4,
|
||||
mediaType: MediaType.image,
|
||||
onMediaAdded: (value) {
|
||||
_xunJianImages.add(value);
|
||||
},
|
||||
onMediaRemoved: (value) {
|
||||
_xunJianImages.remove(value);
|
||||
},
|
||||
onChanged: (files) {
|
||||
},
|
||||
onAiIdentify: () {
|
||||
|
||||
},
|
||||
),
|
||||
|
||||
SizedBox(height:25,),
|
||||
CustomButton(
|
||||
text: "提交",
|
||||
backgroundColor: Colors.blue,
|
||||
height: 42,
|
||||
onPressed: () {
|
||||
_startInspection();
|
||||
},
|
||||
),
|
||||
SizedBox(height:25,),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _startInspection() async {
|
||||
try {
|
||||
|
||||
String person=_xunController.text.trim();
|
||||
if(person.isEmpty){
|
||||
ToastUtil.showNormal(context, "请填巡检人");
|
||||
return;
|
||||
}
|
||||
|
||||
if(dataTime.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择巡检时间");
|
||||
return;
|
||||
}
|
||||
|
||||
String content=_neiRongController.text.trim();
|
||||
if(content.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选巡检内容");
|
||||
return;
|
||||
}
|
||||
|
||||
if(_isFault&&_guZhangImages.isEmpty){
|
||||
ToastUtil.showNormal(context, "请上传故障照片");
|
||||
return;
|
||||
}
|
||||
|
||||
if(_isFault&&_xiuGaiImages.isEmpty){
|
||||
ToastUtil.showNormal(context, "请上传故障处理后照片");
|
||||
return;
|
||||
}
|
||||
|
||||
if(_xunJianImages.isEmpty){
|
||||
ToastUtil.showNormal(context, "请上传巡检图片");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
LoadingDialogHelper.show(message: "提交中...");
|
||||
|
||||
for(int i=0;i<_guZhangImages.length;i++){
|
||||
allImagePaths.add(_guZhangImages[i]);
|
||||
allImageTypes.add("24");
|
||||
}
|
||||
|
||||
for(int m=0;m<_xiuGaiImages.length;m++){
|
||||
allImagePaths.add(_xiuGaiImages[m]);
|
||||
allImageTypes.add("25");
|
||||
}
|
||||
|
||||
for(int n=0;n<_xunJianImages.length;n++){
|
||||
allImagePaths.add(_xunJianImages[n]);
|
||||
allImageTypes.add("26");
|
||||
}
|
||||
|
||||
|
||||
|
||||
final formData = {
|
||||
'SPECIALEQUIPMENT_ID': widget.id,
|
||||
'CREATOR': SessionService.instance.username,
|
||||
'ISFAULT': _isFault?"是":"否",
|
||||
'INSPECTOR': person,
|
||||
'INSPECTIONCONTENT': content,
|
||||
'INSPECTIONTIME': dataTime,
|
||||
|
||||
'TYPES':allImageTypes.join(','),
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
'USER_ID': SessionService.instance.loginUserId,
|
||||
};
|
||||
|
||||
final result = await ApiService.startInspection(formData,allImagePaths);
|
||||
LoadingDialogHelper.hide();
|
||||
if (result['result'] == 'success') {
|
||||
setState(() {
|
||||
ToastUtil.showNormal(context, "提交成功");
|
||||
Navigator.pop(context);
|
||||
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
print('Error fetching data: $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,450 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
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 'dart:convert';
|
||||
|
||||
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 CommitmentWorkshopDetailPage extends StatefulWidget {
|
||||
final String commitmentWorkshopId;
|
||||
|
||||
const CommitmentWorkshopDetailPage({
|
||||
Key? key,
|
||||
required this.commitmentWorkshopId,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CommitmentWorkshopDetailPageState createState() => _CommitmentWorkshopDetailPageState();
|
||||
}
|
||||
|
||||
class _CommitmentWorkshopDetailPageState extends State<CommitmentWorkshopDetailPage> {
|
||||
Map<String, dynamic> pd = {};
|
||||
bool isLoading = true;
|
||||
String errorMessage = '';
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
Future<void> _getData() async {
|
||||
setState(() {
|
||||
isLoading = true;
|
||||
});
|
||||
|
||||
try {
|
||||
final response = await ApiService.getWorkshopSafetyCommitmentDetail( widget.commitmentWorkshopId);
|
||||
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
pd = response['pd'];
|
||||
isLoading = false;
|
||||
});
|
||||
} else {
|
||||
ToastUtil.showNormal(context, '数据加载失败');
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
ToastUtil.showNormal(context, '发生错误: ${e.toString()}');
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Widget _buildInfoItem(String label, dynamic value, {bool isMarked = true}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
if (isMarked)
|
||||
TextSpan(
|
||||
text: value.toString(),
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
)
|
||||
else
|
||||
TextSpan(text: value.toString()),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildParagraph(List<Widget> children) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (isLoading) {
|
||||
return const Scaffold(
|
||||
body: Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.isNotEmpty) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: Center(child: Text(errorMessage)),
|
||||
);
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body: Container(
|
||||
color: Colors.white,
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child:Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// 标题部分
|
||||
Center(
|
||||
child: Text(
|
||||
'【${pd['DEPARTMENT_NAME'] ?? '未知车间'}】车间',
|
||||
style: const TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
|
||||
// 企业状态部分
|
||||
ListItemFactory.createBuildSimpleSection('企业状态',horPadding: 0),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom: 15,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBlueDotSection('高危生产活动及作业的安全风险可控状态'),
|
||||
// _buildSubTitle('高危生产活动及作业的安全风险可控状态'),
|
||||
|
||||
|
||||
_buildParagraph([
|
||||
_buildInfoItem('特殊作业 ', pd['INPUT1'] ?? ''),
|
||||
_buildInfoItem('风险辨识、作业许可及管控措施的落实情况: ',
|
||||
(pd['RADIO1'] == 1 ? '是' : '否')),
|
||||
|
||||
_buildWorkInfoParagraph(),
|
||||
|
||||
_buildInfoItem('处于试生产情况: ', (pd['RADIO2'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('处于开停车情况: ', (pd['RADIO3'] == 1 ? '开' : '停')),
|
||||
_buildWorkInfoParagraphThree(),
|
||||
// _buildInfoItem('承包商作业 ${pd['INPUT14'] ?? ''} 处,管控情况: ',
|
||||
// (pd['RADIO4'] == 1 ? '受控' : '非受控')),
|
||||
_buildInfoItem('变更情况: ', (pd['RADIO5'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('落实审批程序情况: ', (pd['RADIO6'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('罐区、仓库等危险源是否处于安全状态: ',
|
||||
(pd['RADIO7'] == 1 ? '是' : '否')),
|
||||
]),
|
||||
|
||||
ListItemFactory.createBlueDotSection('车间安全状态'),
|
||||
// _buildSubTitle('车间安全状态:'),
|
||||
_buildParagraph([
|
||||
_buildWorkInfoParagraphSecond(),
|
||||
// _buildInfoItem(
|
||||
// '车间岗位 ${pd['INPUT15'] ?? ''} 处,其中运行 ${pd['INPUT16'] ?? ''} 处,'
|
||||
// '停产 ${pd['INPUT17'] ?? ''} 处,检修 ${pd['INPUT18'] ?? ''} 处。',
|
||||
// '', isMarked: false),
|
||||
]),
|
||||
|
||||
ListItemFactory.createBlueDotSection('生产装置的安全运行状态'),
|
||||
// _buildSubTitle('生产装置的安全运行状态'),
|
||||
_buildParagraph([
|
||||
_buildInfoItem('生产装置的温度、压力、组分液位、流量等主要工艺参数是否处于指标范围: ',
|
||||
(pd['RADIO8'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('压力容器、压力管道等特种设备处于安全运行状态: ',
|
||||
(pd['RADIO9'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('设备设施的静动密封完好无泄漏: ',
|
||||
(pd['RADIO10'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('超限报警、紧急切断、联锁等各类安全设施配备完好投用,并可靠运行: ',
|
||||
(pd['RADIO11'] == 1 ? '是' : '否')),
|
||||
]),
|
||||
|
||||
ListItemFactory.createBlueDotSection('危险化学品罐区、仓库等重大危险源的安全运行状态'),
|
||||
// _buildSubTitle('危险化学品罐区、仓库等重大危险源的安全运行状态'),
|
||||
_buildParagraph([
|
||||
_buildInfoItem('储罐、管道、机泵、阀门及仪表系统完好无泄漏: ',
|
||||
(pd['RADIO12'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('储罐的液位、温度、压力、气柜钟罩无超限运行: ',
|
||||
(pd['RADIO13'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('手动放脱水、装卸车时确保人员在岗: ',
|
||||
(pd['RADIO14'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('可燃及有毒气体报警和联锁处于可靠运行状态: ',
|
||||
(pd['RADIO15'] == 1 ? '是' : '否')),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(
|
||||
'仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存。',
|
||||
style: TextStyle(fontSize: 14),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.all(12),
|
||||
// decoration: BoxDecoration(
|
||||
// border: Border.all(color: Colors.blue),
|
||||
// borderRadius: BorderRadius.circular(4),
|
||||
// ),
|
||||
// child:
|
||||
Text(
|
||||
pd['INPUT19'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
]),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
// 企业承诺部分
|
||||
ListItemFactory.createBuildSimpleSection('企业承诺',horPadding: 0),
|
||||
// _buildSectionTitle('企业承诺'),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,bottom: 5,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
const TextSpan(text: '今日('),
|
||||
TextSpan(
|
||||
text: pd['START_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(text: ' 至 '),
|
||||
TextSpan(
|
||||
text: pd['END_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(
|
||||
text: ')我车间已进行安全风险研判,各项安全风险防控措施已落实到位。'
|
||||
'我承诺本生产装置/业务活动处于安全运行状态,涉及罐区、仓库等危险源安全风险得到有效管控。',
|
||||
),
|
||||
],
|
||||
),
|
||||
style: const TextStyle(fontSize: 14),
|
||||
),
|
||||
),
|
||||
|
||||
// 签名部分
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
presentOpaque(SingleImageViewer(imageUrl:ApiService.baseImgPath+ pd['SIGN_PATH']), context);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
// if (imagePath.isNotEmpty)
|
||||
Text('签字照片:',
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
if (pd['SIGN_PATH'] != null)
|
||||
Image.network(ApiService.baseImgPath+pd['SIGN_PATH'],width: 230,height: 150,fit: BoxFit.cover,),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
//签字时间
|
||||
_buildParagraph([
|
||||
_buildInfoItem('签字时间: ', pd['SIGN_TIME']??""),
|
||||
]),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('动火作业 ', pd['INPUT2']?.toString()),
|
||||
const TextSpan(text: ' 处,其中特级 '),
|
||||
_buildStyledText('', pd['INPUT3']?.toString()),
|
||||
const TextSpan(text: ' 处,一级 '),
|
||||
_buildStyledText('', pd['INPUT4']?.toString()),
|
||||
const TextSpan(text: ' 处,二级 '),
|
||||
_buildStyledText('', pd['INPUT5']?.toString()),
|
||||
const TextSpan(text: ' 处,高处作业 '),
|
||||
_buildStyledText('', pd['INPUT6']?.toString()),
|
||||
const TextSpan(text: ' 处,受限空间作业 '),
|
||||
_buildStyledText('', pd['INPUT7']?.toString()),
|
||||
const TextSpan(text: ' 处,吊装作业 '),
|
||||
_buildStyledText('', pd['INPUT8']?.toString()),
|
||||
const TextSpan(text: ' 处,临时用电作业 '),
|
||||
_buildStyledText('', pd['INPUT9']?.toString()),
|
||||
const TextSpan(text: ' 处,盲板抽堵作业 '),
|
||||
_buildStyledText('', pd['INPUT10']?.toString()),
|
||||
const TextSpan(text: ' 处,动土作业 '),
|
||||
_buildStyledText('', pd['INPUT11']?.toString()),
|
||||
const TextSpan(text: ' 处,断路作业 '),
|
||||
_buildStyledText('', pd['INPUT12']?.toString()),
|
||||
const TextSpan(text: ' 处,检修作业 '),
|
||||
_buildStyledText('', pd['INPUT13']?.toString()),
|
||||
const TextSpan(text: ' 处。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraphSecond() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('车间岗位 ', pd['INPUT15']?.toString()),
|
||||
const TextSpan(text: ' 处,其中运行 '),
|
||||
_buildStyledText('', pd['INPUT16']?.toString()),
|
||||
const TextSpan(text: ' 处,停产 '),
|
||||
_buildStyledText('', pd['INPUT17']?.toString()),
|
||||
const TextSpan(text: ' 处,检修 '),
|
||||
_buildStyledText('', pd['INPUT18']?.toString()),
|
||||
const TextSpan(text: ' 处。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraphThree() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('承包商作业 ', pd['INPUT14']?.toString()),
|
||||
const TextSpan(text: ' 处,管控情况: '),
|
||||
_buildStyledText('', (pd['RADIO4'] == 1 ? '受控' : '非受控')),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,528 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
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/picker/CupertinoDatePicker.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/http/HttpManager.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 CompanySafetyCommitmentApply extends StatefulWidget {
|
||||
const CompanySafetyCommitmentApply({super.key});
|
||||
|
||||
@override
|
||||
State<CompanySafetyCommitmentApply> createState() => _CompanySafetyCommitmentApplyState();
|
||||
}
|
||||
|
||||
class _CompanySafetyCommitmentApplyState extends State<CompanySafetyCommitmentApply> {
|
||||
|
||||
|
||||
final TextEditingController _controller1 = TextEditingController();
|
||||
final TextEditingController _controller2 = TextEditingController();
|
||||
final TextEditingController _controller3 = TextEditingController();
|
||||
final TextEditingController _controller4 = TextEditingController();
|
||||
final TextEditingController _controller5 = TextEditingController();
|
||||
final TextEditingController _controller6 = TextEditingController();
|
||||
final TextEditingController _controller7 = TextEditingController();
|
||||
final TextEditingController _controller8 = TextEditingController();
|
||||
final TextEditingController _controller9 = TextEditingController();
|
||||
final TextEditingController _controller10 = TextEditingController();
|
||||
|
||||
bool _isFault1 = true;
|
||||
bool _isFault2 = true;
|
||||
bool _isFault3 = true;
|
||||
|
||||
DateTime? dataStart;
|
||||
String dataTimeStart="";
|
||||
DateTime? dataEnd;
|
||||
String dataTimeEnd="";
|
||||
|
||||
List<String> signImgList = [];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body:Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom:15,left: 15,right: 15),
|
||||
child: ListView(
|
||||
children: [
|
||||
ListItemFactory.createBuildSimpleSection('企业状态',horPadding: 0,color: Color(0x00000000)),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '生产装置:',
|
||||
isEditable: true,
|
||||
controller: _controller1,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '运行:',
|
||||
isEditable: true,
|
||||
controller: _controller2,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '停产:',
|
||||
isEditable: true,
|
||||
controller: _controller3,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '检修:',
|
||||
isEditable: true,
|
||||
controller: _controller4,
|
||||
text: '',
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '特级动火作业:',
|
||||
isEditable: true,
|
||||
controller: _controller5,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '一级动火作业:',
|
||||
isEditable: true,
|
||||
controller: _controller6,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '二级动火作业:',
|
||||
isEditable: true,
|
||||
controller: _controller7,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '受限空间作业:',
|
||||
isEditable: true,
|
||||
controller: _controller8,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '登高作业:',
|
||||
isEditable: true,
|
||||
controller: _controller9,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '其他特殊作业:',
|
||||
isEditable: true,
|
||||
controller: _controller10,
|
||||
text: '',
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '是否处于生产',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault1,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault1 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '是否处于开停车状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault2,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault2 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '罐区、库房等危险源是否处于安全状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault3,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault3 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 5,),
|
||||
ListItemFactory.createBuildSimpleSection('企业承诺',horPadding: 0,color: Color(0x00000000)),
|
||||
SizedBox(height: 5,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5,horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
GestureDetector(
|
||||
child: ItemListWidget.selectableLineTitleTextRightButton(label: '今日', text: dataTimeStart.isEmpty?
|
||||
'请选择':dataTimeStart??'', isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataStart=picked;
|
||||
if(dataTimeEnd.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!,dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeStart = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
GestureDetector(
|
||||
child:ItemListWidget.selectableLineTitleTextRightButton(label: '至', text: dataTimeEnd.isEmpty?
|
||||
'请选择':dataTimeEnd, isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataEnd=picked;
|
||||
if(dataTimeStart.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!, dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeEnd = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
Text("今天我公司已进行安全风险研判,各项安全风险防控措施已落实到位,我承诺所有生产设施处于安全运行状态,罐区、库房等危险源安全风险得到有效控制。",
|
||||
style: TextStyle(color: Colors.black,fontSize: 13),),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('承诺人:', style: TextStyle(fontSize: 16)),
|
||||
CustomButton(
|
||||
text: '手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: _sign,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImgList.isNotEmpty) _signListWidget(),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
CustomButton(
|
||||
backgroundColor: Colors.green,
|
||||
text: "提交",
|
||||
onPressed: () {
|
||||
// TODO: 完成回调
|
||||
_upData();
|
||||
}
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
) ,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _upData() async {
|
||||
try {
|
||||
|
||||
String text1=_controller1.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入生产装置数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text2=_controller2.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入生产装置运行数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text3=_controller3.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入生产装置停产数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text4=_controller4.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入生产装置检修数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text5=_controller5.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入特级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text6=_controller6.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入一级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text7=_controller7.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入二级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text8=_controller8.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入受限空间作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text9=_controller9.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入登高作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text10=_controller10.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入其他特殊作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
if(dataTimeStart.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(dataTimeEnd.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(signImgList.isEmpty){
|
||||
ToastUtil.showNormal(context, "请签字");
|
||||
return;
|
||||
}
|
||||
|
||||
LoadingDialogHelper.show(message: "提交中。。。");
|
||||
|
||||
|
||||
String nowTime= DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
|
||||
|
||||
final formData = {
|
||||
'INPUT1': text1,
|
||||
'INPUT2': text2,
|
||||
'INPUT3': text3,
|
||||
'INPUT4': text4,
|
||||
'INPUT5': text5,
|
||||
'INPUT6': text6,
|
||||
'INPUT7': text7,
|
||||
'INPUT8': text8,
|
||||
'INPUT9': text9,
|
||||
'INPUT10': text10,
|
||||
|
||||
'RADIO1': _isFault1?"1":"-1",
|
||||
'RADIO2': _isFault2?"1":"-1",
|
||||
'RADIO3': _isFault3?"1":"-1",
|
||||
|
||||
'START_TIME':dataTimeStart,
|
||||
'END_TIME': dataTimeEnd,
|
||||
|
||||
|
||||
"SIGNER_TIME": nowTime,
|
||||
'DEPARTMENT_ID':SessionService.instance.loginUser?["DEPARTMENT_ID"],
|
||||
'SIGN_USER': SessionService.instance.loginUserId,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
'USER_ID': SessionService.instance.loginUserId,
|
||||
};
|
||||
|
||||
print(formData.toString());
|
||||
final file = File(signImgList[0]);
|
||||
if (!await file.exists()) {
|
||||
throw ApiException('file_not_found', '图片不存在:${signImgList[0]}');
|
||||
}
|
||||
final Map<String, dynamic>response = await ApiService.upCompanySafetyCommitmentApply(formData,signImgList);
|
||||
LoadingDialogHelper.hide();
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
Navigator.pop(context);
|
||||
});
|
||||
}else{
|
||||
ToastUtil.showNormal(context, response['msg']);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
print('Error fetching data: $e');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _sign() async {
|
||||
final String path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (c) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
setState(() {
|
||||
signImgList.add(path);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
signImgList.map((imgData) {
|
||||
final idx = signImgList.indexOf(imgData);
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 230,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child:
|
||||
Image.file(
|
||||
File(signImgList[0] ?? ''),
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap:
|
||||
() => presentOpaque(
|
||||
SingleImageViewer(imageUrl:signImgList[0] ?? ''),
|
||||
context,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '删除',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() => signImgList.removeAt(idx));
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool validateDateRange(DateTime startTime, DateTime endTime) {
|
||||
const int thirtyDaysInMilliseconds = 30 * 24 * 60 * 60 * 1000; // 30 天的毫秒数
|
||||
final int difference = endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch;
|
||||
|
||||
if (difference > thirtyDaysInMilliseconds) {
|
||||
ToastUtil.showNormal(context, "只能选择30天内的日期");
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,392 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'dart:convert';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
class CompanySafetyCommitmentDetail extends StatefulWidget {
|
||||
final String commitmentId;
|
||||
|
||||
const CompanySafetyCommitmentDetail({Key? key, required this.commitmentId}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CompanySafetyCommitmentDetailState createState() => _CompanySafetyCommitmentDetailState();
|
||||
}
|
||||
|
||||
class _CompanySafetyCommitmentDetailState extends State<CompanySafetyCommitmentDetail> {
|
||||
Map<String, dynamic> pd = {};
|
||||
bool isLoading = true;
|
||||
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
Future<void> _getData() async {
|
||||
try {
|
||||
|
||||
final data = await ApiService.getCompanySafetyCommitmentDetail( widget.commitmentId);
|
||||
|
||||
if (data['result'] == 'success') {
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
isLoading = false;
|
||||
});
|
||||
} else {
|
||||
_showError('数据加载失败: ${data['message']}');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
_showError('网络请求失败: $e');
|
||||
}
|
||||
}
|
||||
|
||||
void _showError(String message) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(message)),
|
||||
);
|
||||
setState(() => isLoading = false);
|
||||
}
|
||||
|
||||
void _showImagePreview(String imageUrl) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: PhotoView(
|
||||
imageProvider: NetworkImage(imageUrl),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 构建高亮文本
|
||||
Widget _highlightText(String text) {
|
||||
return Text(
|
||||
text,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 构建问题行
|
||||
Widget _questionRow(String question, String answer) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(question),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
answer,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (isLoading) {
|
||||
return const Scaffold(
|
||||
body: Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body: Container(
|
||||
color: Colors.white,
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child:Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// 标题部分
|
||||
Center(
|
||||
child: Text(
|
||||
pd['CORP_NAME'] ?? '未知企业',
|
||||
style: const TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
|
||||
// 企业状态部分
|
||||
ListItemFactory.createBuildSimpleSection('企业状态',horPadding: 0),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom: 15,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
||||
|
||||
_buildParagraph([
|
||||
|
||||
_buildWorkInfoParagraph1(),
|
||||
_buildWorkInfoParagraph2(),
|
||||
|
||||
const SizedBox(height: 2),
|
||||
const Text('特殊作业:'),
|
||||
const SizedBox(height: 2),
|
||||
_buildWorkInfoParagraph3(),
|
||||
|
||||
|
||||
_buildInfoItem('是否处于生产: ', (pd['RADIO1'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('是否处于开停车状态: ', (pd['RADIO2'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('罐区、库房等危险源是否处于安全状态: ', (pd['RADIO3'] == 1 ? '是' : '否')),]),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
// 企业承诺部分
|
||||
ListItemFactory.createBuildSimpleSection('企业承诺',horPadding: 0),
|
||||
// _buildSectionTitle('企业承诺'),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,bottom: 5,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
const TextSpan(text: '今日('),
|
||||
TextSpan(
|
||||
text: pd['START_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(text: ' 至 '),
|
||||
TextSpan(
|
||||
text: pd['END_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(
|
||||
text: ')我车间已进行安全风险研判,各项安全风险防控措施已落实到位。'
|
||||
'我承诺本生产装置/业务活动处于安全运行状态,涉及罐区、仓库等危险源安全风险得到有效管控。',
|
||||
),
|
||||
],
|
||||
),
|
||||
style: const TextStyle(fontSize: 14),
|
||||
),
|
||||
),
|
||||
|
||||
// 签名部分
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
presentOpaque(SingleImageViewer(imageUrl: ApiService.baseImgPath+pd['SIGN_PATH']), context);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
// if (imagePath.isNotEmpty)
|
||||
Text('签字照片:',
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
if (pd['SIGN_PATH'] != null)
|
||||
Image.network(ApiService.baseImgPath+pd['SIGN_PATH'] ,width: 230,height: 150,fit: BoxFit.cover,),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
//签字时间
|
||||
_buildParagraph([
|
||||
_buildInfoItem('签字时间: ', pd['SIGN_TIME']??""),
|
||||
]),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildParagraph(List<Widget> children) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildInfoItem(String label, dynamic value, {bool isMarked = true}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
if (isMarked)
|
||||
TextSpan(
|
||||
text: value.toString(),
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
)
|
||||
else
|
||||
TextSpan(text: value.toString()),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildWorkInfoParagraph1() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 2),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('生产装置 ', pd['INPUT1']?.toString()??"0"),
|
||||
const TextSpan(text: ' 套,其中 '),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph2() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 2),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('运行 ', pd['INPUT2']?.toString()??"0"),
|
||||
_buildStyledText(' 套, 停产', pd['INPUT3']?.toString()??"0"),
|
||||
_buildStyledText('套, 检修 ', pd['INPUT4']?.toString()??"0"),
|
||||
const TextSpan(text: ' 套。 '),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph3() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 2),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('特级动火作业', pd['INPUT5']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 一级动火作业', pd['INPUT6']?.toString()??"0"),
|
||||
_buildStyledText('处, 二级动火作业 ', pd['INPUT7']?.toString()??"0"),
|
||||
_buildStyledText('处, 受限空间作业 ', pd['INPUT8']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 登高作业', pd['INPUT9']?.toString()??"0"),
|
||||
_buildStyledText('处, 其他特殊作业 ', pd['INPUT10']?.toString()??"0"),
|
||||
const TextSpan(text: ' 处。 '),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,344 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/company_safety_commitment_apply.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/team_safety_commitment_apply.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/team_safety_commitment_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/work_shop_safety_commitment_apply.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/home/tap/tabList/special_wrok/dh_work/aqcs_work_detail/hotwork_safe_func_sure.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/aqgl_work_detail/hotwork_aqgl_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/aqjd_work_detail/hotwork_aqjd_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/dbbz_work_detail/hotwork_dbbz_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/dhsp_work_detail/hotwork_dhsp_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/jhr_work_detail/hotwork_jhr_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/szdw_work_detail/hotwork_szdw_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/ysgd_work_detail/hotwork_ysgd_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/zyfz_work_detail/hotwork_zyfz_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';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work/jsjd_work_detail/hotwork_jsjd_detail.dart';
|
||||
|
||||
import 'commitment_workshop_detail_page.dart';
|
||||
import 'company_safety_commitment_detail.dart';
|
||||
|
||||
class SafetyCommitmentDhList extends StatefulWidget {
|
||||
const SafetyCommitmentDhList({Key? key, required this.type, }) : super(key: key);
|
||||
|
||||
final int type;
|
||||
@override
|
||||
_SafetyCommitmentDhListState createState() => _SafetyCommitmentDhListState();
|
||||
}
|
||||
|
||||
class _SafetyCommitmentDhListState extends State<SafetyCommitmentDhList> {
|
||||
// Data and state variables
|
||||
List<dynamic> list = [];
|
||||
int currentPage = 1;
|
||||
int rows = 10;
|
||||
int totalPage = 1;
|
||||
bool isLoading = false;
|
||||
|
||||
final TextEditingController _searchController = TextEditingController();
|
||||
|
||||
List<Map<String, dynamic>> stepList = [];
|
||||
int sindex = 0;
|
||||
String searchKeywords = '';
|
||||
String id="";
|
||||
String title ="";
|
||||
String itemTitle ="";
|
||||
String itemTitleName="";
|
||||
|
||||
List<Map<String, dynamic>> flowList = [];
|
||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
id=SessionService.instance.loginUser?["DEPARTMENT_ID"]??"";
|
||||
|
||||
switch(widget.type){
|
||||
case 1:
|
||||
title="公司安全承诺";
|
||||
itemTitle="公开安全承诺报告";
|
||||
itemTitleName="CORP_NAME";
|
||||
break;
|
||||
case 2:
|
||||
title="风险研判报告及安全承诺公告";
|
||||
itemTitle="风险研判报告及安全承诺公告";
|
||||
itemTitleName="DEPARTMENT_NAME";
|
||||
break;
|
||||
case 3:
|
||||
title="班组风险研判及安全承诺";
|
||||
itemTitle="风险研判报告及安全承诺公告";
|
||||
itemTitleName="DEPARTMENTNAME";
|
||||
break;
|
||||
}
|
||||
|
||||
_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 Map<String, dynamic> response;
|
||||
if(widget.type==1) {
|
||||
response = await ApiService.getCompanySafetyCommitmentList(currentPage, searchKeywords, id);
|
||||
}else if(widget.type==2){
|
||||
response = await ApiService.getWorkshopSafetyCommitmentList(currentPage, searchKeywords,id);
|
||||
}else {
|
||||
response = await ApiService.getTeamSafetyCommitmentList(currentPage, searchKeywords,id);
|
||||
}
|
||||
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
if (currentPage == 1) {
|
||||
list = response['varList'];
|
||||
} else {
|
||||
list.addAll(response['varList']);
|
||||
}
|
||||
Map<String, dynamic> page = response['page'];
|
||||
totalPage = page['totalPage'] ?? 1;
|
||||
isLoading = false;
|
||||
});
|
||||
}else{
|
||||
ToastUtil.showNormal(context, response['msg']);
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error fetching data: $e');
|
||||
setState(() => isLoading = false);
|
||||
}
|
||||
}
|
||||
|
||||
void _search() {
|
||||
searchKeywords = _searchController.text.trim();
|
||||
currentPage = 1;
|
||||
list.clear();
|
||||
_fetchData();
|
||||
}
|
||||
|
||||
|
||||
/// 申请
|
||||
Future<void> _handleApply() async {
|
||||
// 处理申请按钮点击逻辑
|
||||
|
||||
setState(() async {
|
||||
if(widget.type==1) {
|
||||
await pushPage(CompanySafetyCommitmentApply(), context);
|
||||
}else if(widget.type==2){
|
||||
await pushPage(WorkShopSafetyCommitmentApply(), context);
|
||||
}else {
|
||||
await pushPage(TeamSafetyCommitmentApply(), context);
|
||||
}
|
||||
|
||||
searchKeywords = "";
|
||||
currentPage = 1;
|
||||
list.clear();
|
||||
_fetchData();
|
||||
});
|
||||
|
||||
// try {
|
||||
// final Map<String, dynamic> response;
|
||||
// if(widget.type==1) {
|
||||
// response = await ApiService.getCompanySafetyCommitmentPermission( id);
|
||||
// }else if(widget.type==2){
|
||||
// response = await ApiService.getWorkshopSafetyCommitmentPermission(id);
|
||||
// }else {
|
||||
// response = await ApiService.getTeamSafetyCommitmentPermission(id);
|
||||
// }
|
||||
//
|
||||
// if (response['result'] == 'success') {
|
||||
// setState(() async {
|
||||
// if(widget.type==1) {
|
||||
// await pushPage(CompanySafetyCommitmentApply(), context);
|
||||
// }else if(widget.type==2){
|
||||
//
|
||||
// }else {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// searchKeywords = "";
|
||||
// currentPage = 1;
|
||||
// list.clear();
|
||||
// _fetchData();
|
||||
// });
|
||||
// }else{
|
||||
// ToastUtil.showNormal(context, response['msg']);
|
||||
// }
|
||||
// } catch (e) {
|
||||
// ToastUtil.showNormal(context,'$e');
|
||||
// print('Error fetching data: $e');
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void _goToDetail(Map<String, dynamic> item) {
|
||||
if(widget.type==1) {
|
||||
pushPage(CompanySafetyCommitmentDetail( commitmentId:item['COMMITMENTCOMPANY_ID'],), context);
|
||||
}else if(widget.type==2){
|
||||
pushPage(CommitmentWorkshopDetailPage( commitmentWorkshopId:item['COMMITMENTWORKSHOP_ID'],), context);
|
||||
}else {
|
||||
pushPage(TeamSafetyCommitmentDetail( commitmentWorkshopId:item['COMMITMENTTEAM_ID'],), context);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Widget _buildListItem(Map<String, dynamic> item) {
|
||||
return InkWell(
|
||||
onTap: () => _goToDetail(item),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(20),
|
||||
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black12,
|
||||
blurRadius: 4,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'$itemTitle-${item[itemTitleName]}',
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('承诺时间: ${item['SIGN_TIME']??""}'),
|
||||
Text('承诺人: ${item['SIGN_USER_NAME']??""}'),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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) {
|
||||
return Scaffold(
|
||||
key: _scaffoldKey,
|
||||
appBar: MyAppbar(
|
||||
title: title,
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: _handleApply,
|
||||
child: const Text(
|
||||
'承诺',
|
||||
style: TextStyle(color: Colors.white, fontSize: 17),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
body: Column(
|
||||
children: [
|
||||
// Filter bar
|
||||
Container(
|
||||
color: Colors.white,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
|
||||
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: SearchBarWidget(
|
||||
showResetButton: false,
|
||||
hintText: "请输入关键字",
|
||||
// isClickableOnly: true,
|
||||
onSearch: (text) {
|
||||
_search();
|
||||
},
|
||||
controller: _searchController,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Divider(height: 1),
|
||||
// List
|
||||
Expanded(child: _buildListContent()),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,251 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/Safetymeeting/safety_meeting_detail_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/notif/notif_detail_page.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
class SafetyCommitmentOtherListPage extends StatefulWidget {
|
||||
const SafetyCommitmentOtherListPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SafetyCommitmentOtherListPage> createState() => _SafetyCommitmentOtherListPageState();
|
||||
}
|
||||
|
||||
class _SafetyCommitmentOtherListPageState extends State<SafetyCommitmentOtherListPage>
|
||||
with SingleTickerProviderStateMixin{
|
||||
|
||||
|
||||
|
||||
late TabController _tabController= TabController(length: 2, vsync: this);
|
||||
int _selectedTab = 0;
|
||||
|
||||
int _page = 1;
|
||||
String searchKey="";
|
||||
int _totalPage=1;
|
||||
late List<dynamic> _list = [];
|
||||
bool _isLoading = false;
|
||||
bool _hasMore = true;
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// _tabController = TabController(length: 2, vsync: this);
|
||||
_tabController.addListener(() {
|
||||
// if (!_tabController.indexIsChanging) {
|
||||
// setState(() => _selectedTab = _tabController.index);
|
||||
// }
|
||||
|
||||
if (_tabController.indexIsChanging) {
|
||||
setState(() => _selectedTab = _tabController.index);
|
||||
print('切换到标签:${_tabController.index}');
|
||||
reRefreshData();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
_getSafetyMeetingList(false);
|
||||
}
|
||||
|
||||
void reRefreshData(){
|
||||
_page=1;
|
||||
_list.clear();
|
||||
_getSafetyMeetingList(false);
|
||||
|
||||
}
|
||||
|
||||
Future<void> _getSafetyMeetingList(bool loadMore) async {
|
||||
// LoadingDialogHelper.show();
|
||||
try {
|
||||
if (_isLoading) return;
|
||||
_isLoading = true;
|
||||
|
||||
|
||||
final Map<String, dynamic> result;
|
||||
if(_selectedTab==0){
|
||||
result = await ApiService.getMyOtherCommitmentsList();
|
||||
}else{
|
||||
result = await ApiService.getAcceptCommitmentList( );
|
||||
}
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
_totalPage =result["page"]['totalPage'] ?? 1;
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
// setState(() {
|
||||
// _list.addAll(newList);
|
||||
// });
|
||||
|
||||
setState(() {
|
||||
if (loadMore) {
|
||||
_list.addAll(newList);
|
||||
} else {
|
||||
_list = newList;
|
||||
}
|
||||
_hasMore = _page < _totalPage;
|
||||
// if (_hasMore) _page++;
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
} finally {
|
||||
// if (!loadMore) LoadingDialogHelper.hide();
|
||||
_isLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "其他行业安全承诺"),
|
||||
body:
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
FocusScope.of(context).unfocus(); // 收起键盘
|
||||
},
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Scaffold(
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
// Tab bar
|
||||
TabBar(
|
||||
controller: _tabController,
|
||||
labelStyle: TextStyle(fontSize: 16),
|
||||
indicator: UnderlineTabIndicator(
|
||||
borderSide: BorderSide(width: 3.0, color: Colors.blue),
|
||||
insets: EdgeInsets.symmetric(horizontal: 100.0),
|
||||
),
|
||||
labelColor: Colors.blue,
|
||||
unselectedLabelColor: Colors.grey,
|
||||
tabs: const [Tab(text: '我的承诺'), Tab(text: '接收承诺')],
|
||||
),
|
||||
|
||||
// Search bar
|
||||
// List
|
||||
NotificationListener<ScrollNotification>(
|
||||
onNotification: _onScroll,
|
||||
child: Expanded(
|
||||
child:
|
||||
_list.isEmpty
|
||||
? NoDataWidget.show()
|
||||
: ListView.builder(
|
||||
itemCount: _list.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _itemCell(_list[index]);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _itemCell(final item) {
|
||||
return InkWell(
|
||||
onTap: () => _goToDetail(item),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(20),
|
||||
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black12,
|
||||
blurRadius: 4,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'-${item['DEPARTMENT_NAME']}',//$itemTitle
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('承诺时间: ${item['SIGN_TIME']}'),
|
||||
Text('承诺人: ${item['SIGN_USER_NAME']}'),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool _onScroll(ScrollNotification n) {
|
||||
if (n.metrics.pixels > n.metrics.maxScrollExtent - 100 &&
|
||||
_hasMore && !_isLoading) {
|
||||
|
||||
_page++;
|
||||
_getSafetyMeetingList(true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void _goToDetail(String id){
|
||||
pushPage(SafetyMeetingDetailPage(
|
||||
id,_selectedTab,
|
||||
onClose: (String result) {
|
||||
setState(() {
|
||||
reRefreshData();
|
||||
});
|
||||
|
||||
},
|
||||
), context);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/safety_commitment_other_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/safety_commitment_tab_list.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 SafetyCommitmentPage extends StatefulWidget {
|
||||
const SafetyCommitmentPage({super.key});
|
||||
|
||||
@override
|
||||
State<SafetyCommitmentPage> createState() => _SafetyCommitmentPageState();
|
||||
}
|
||||
|
||||
|
||||
class _SafetyCommitmentPageState extends State<SafetyCommitmentPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body: Column(
|
||||
children: [
|
||||
Padding(padding: EdgeInsets.only(top: 10),
|
||||
child: ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '危化行业安全承诺:',
|
||||
isEditable: true,
|
||||
isRequired:false,
|
||||
onTap: () {
|
||||
pushPage(SafetyCommitmentTabList(), context);
|
||||
},
|
||||
text:' ',
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
// Padding(padding: EdgeInsets.only(top: 10),
|
||||
// child:ItemListWidget.selectableLineTitleTextRightButton(
|
||||
// label: '其他行业安全承诺:',
|
||||
// isEditable: true,
|
||||
// isRequired:false,
|
||||
// onTap: () {
|
||||
// pushPage(SafetyCommitmentOtherListPage(), context);
|
||||
//
|
||||
// },
|
||||
// text: ' ',
|
||||
// ),
|
||||
// ),
|
||||
// const Divider(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/SafetyCommitment/safety_commitment_dh_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_dh_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_dl_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_dt_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_dz_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_gc_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_lsyd_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_mbcd_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_sxkj_list.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
class SafetyCommitmentTabList extends StatefulWidget {
|
||||
const SafetyCommitmentTabList({super.key});
|
||||
|
||||
@override
|
||||
State<SafetyCommitmentTabList> createState() => _SafetyCommitmentTabListState();
|
||||
}
|
||||
|
||||
class _SafetyCommitmentTabListState extends State<SafetyCommitmentTabList> {
|
||||
late List<Map<String, dynamic>> buttonInfos = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
Future<void> _getData() async {
|
||||
|
||||
setState(() {
|
||||
|
||||
buttonInfos = [
|
||||
{
|
||||
"icon": "assets/icon-apps/icon_101.png",
|
||||
"title": "动火作业",
|
||||
"unreadCount": 0,
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon_100.png",
|
||||
"title": "车间风险研判\n及安全承诺",
|
||||
"unreadCount": 0,
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon_102.png",
|
||||
"title": "班组风险研判\n及安全承诺",
|
||||
"unreadCount": 0,
|
||||
},
|
||||
|
||||
];
|
||||
});
|
||||
}
|
||||
void _handleItemPressed(int index) async {
|
||||
switch (index) {
|
||||
case 0:await pushPage(SafetyCommitmentDhList(type:1,), context); break;
|
||||
case 1:await pushPage(SafetyCommitmentDhList(type:2,), context); break;
|
||||
case 2:await pushPage(SafetyCommitmentDhList(type:3,), context); break;
|
||||
|
||||
}
|
||||
_getData();
|
||||
}
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '危化行业安全承诺'),
|
||||
body: SafeArea(
|
||||
child: WorkTabIconGrid(
|
||||
buttonInfos: buttonInfos,
|
||||
onItemPressed: _handleItemPressed,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,898 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
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/picker/CupertinoDatePicker.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/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
|
||||
class TeamSafetyCommitmentApply extends StatefulWidget {
|
||||
const TeamSafetyCommitmentApply({super.key});
|
||||
|
||||
@override
|
||||
State<TeamSafetyCommitmentApply> createState() => _TeamSafetyCommitmentApplyState();
|
||||
}
|
||||
|
||||
class _TeamSafetyCommitmentApplyState extends State<TeamSafetyCommitmentApply> {
|
||||
|
||||
|
||||
final TextEditingController _controller1 = TextEditingController();
|
||||
final TextEditingController _controller2 = TextEditingController();
|
||||
final TextEditingController _controller3 = TextEditingController();
|
||||
final TextEditingController _controller4 = TextEditingController();
|
||||
final TextEditingController _controller5 = TextEditingController();
|
||||
final TextEditingController _controller6 = TextEditingController();
|
||||
final TextEditingController _controller7 = TextEditingController();
|
||||
final TextEditingController _controller8 = TextEditingController();
|
||||
final TextEditingController _controller9 = TextEditingController();
|
||||
final TextEditingController _controller10 = TextEditingController();
|
||||
final TextEditingController _controller11 = TextEditingController();
|
||||
final TextEditingController _controller12 = TextEditingController();
|
||||
final TextEditingController _controller13 = TextEditingController();
|
||||
final TextEditingController _controller14 = TextEditingController();
|
||||
final TextEditingController _controller15 = TextEditingController();
|
||||
final TextEditingController _controller16 = TextEditingController();
|
||||
final TextEditingController _controller17 = TextEditingController();
|
||||
final TextEditingController _controller18 = TextEditingController();
|
||||
final TextEditingController _controller19 = TextEditingController();
|
||||
|
||||
|
||||
bool _isFault1 = true;
|
||||
bool _isFault2 = true;
|
||||
bool _isFault3 = true;
|
||||
bool _isFault4 = true;
|
||||
bool _isFault5 = true;
|
||||
bool _isFault6 = true;
|
||||
bool _isFault7 = true;
|
||||
bool _isFault8 = true;
|
||||
bool _isFault9 = true;
|
||||
bool _isFault10 = true;
|
||||
bool _isFault11 = true;
|
||||
bool _isFault12 = true;
|
||||
bool _isFault13 = true;
|
||||
bool _isFault14 = true;
|
||||
bool _isFault15 = true;
|
||||
bool _isFault16 = true;
|
||||
|
||||
DateTime? dataStart;
|
||||
String dataTimeStart="";
|
||||
DateTime? dataEnd;
|
||||
String dataTimeEnd="";
|
||||
|
||||
List<String> signImgList = [];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body:Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom:15,left: 15,right: 15),
|
||||
child: ListView(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBuildSimpleSection('企业状态',horPadding: 0,color: Color(0x00000000)),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBlueDotSection('高危生产活动及作业的安全风险可控状态',color: 0xffffffff),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '检维修作业:',
|
||||
isEditable: true,
|
||||
controller: _controller1,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '特殊作业:',
|
||||
isEditable: true,
|
||||
controller: _controller2,
|
||||
text: '',
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动火作业:',
|
||||
isEditable: true,
|
||||
controller: _controller3,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '其中特级:',
|
||||
isEditable: true,
|
||||
controller: _controller4,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '一级:',
|
||||
isEditable: true,
|
||||
controller: _controller5,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '二级:',
|
||||
isEditable: true,
|
||||
controller: _controller6,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '高处作业:',
|
||||
isEditable: true,
|
||||
controller: _controller7,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '受限空间作业:',
|
||||
isEditable: true,
|
||||
controller: _controller8,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '吊装作业:',
|
||||
isEditable: true,
|
||||
controller: _controller9,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '临时用电作业:',
|
||||
isEditable: true,
|
||||
controller: _controller10,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '盲板抽堵作业:',
|
||||
isEditable: true,
|
||||
controller: _controller11,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动土作业:',
|
||||
isEditable: true,
|
||||
controller: _controller12,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '断路作业:',
|
||||
isEditable: true,
|
||||
controller: _controller13,
|
||||
text: '',
|
||||
),
|
||||
// const Divider(),
|
||||
// ItemListWidget.singleLineTitleText(
|
||||
// label: '检维修作业:',
|
||||
// isEditable: true,
|
||||
// controller: _controller13,
|
||||
// text: '',
|
||||
// ),
|
||||
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 风险辨识、作业许可及管控措施的落实情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault1,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault1 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 处于试生产情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault2,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault2 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 处于开停车情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"开",
|
||||
noLabel:"停",
|
||||
groupValue: _isFault3,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault3 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '承包商作业:',
|
||||
isEditable: true,
|
||||
controller: _controller14,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 管控情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"受控",
|
||||
noLabel:"非受控",
|
||||
groupValue: _isFault4,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault4 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 变更情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"有",
|
||||
noLabel:"没有",
|
||||
groupValue: _isFault5,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault5 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 落实审批程序情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault6,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault6 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 罐区、仓库等危险源是否处于安全状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault7,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault7 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('车间安全状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
// ItemListWidget.singleLineTitleText(
|
||||
// label: '车间岗位:',
|
||||
// isEditable: true,
|
||||
// controller: _controller15,
|
||||
// text: '',
|
||||
// ),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 15,right: 15),
|
||||
child: ListItemFactory.createBuildMultilineInput(
|
||||
"岗位主要设备(装置)名称、数量",
|
||||
"请输入...",
|
||||
_controller15,
|
||||
isRequired:true,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '其中运行:',
|
||||
isEditable: true,
|
||||
controller: _controller16,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '停产:',
|
||||
isEditable: true,
|
||||
controller: _controller17,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '检修:',
|
||||
isEditable: true,
|
||||
controller: _controller18,
|
||||
text: '',
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('生产装置的安全运行状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '生产装置的温度、压力、组分液位、流量等主要工艺参数是否处于指标范围',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault8,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault8 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '压力容器、压力管道等特种设备处于安全运行状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault9,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault9 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '设备设施的静动密封完好无泄漏',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault10,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault10 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '超限报警、紧急切断、联锁等各类安全设施配备完好投用,并可靠运行',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault11,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault11 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('危险化学品罐区、仓库等重大危险源安全运行状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '储罐、管道、机泵、阀门及仪表系统完好无泄漏',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault12,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault12 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '储罐的液位、温度、压力、气柜钟罩无超限运行',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault13,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault13 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '气柜钟罩超高、低运行',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault14,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault14 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '手动放脱水、装卸车时确保人员在岗',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault15,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault15 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '可燃及有毒气体报警和联锁处于可靠运行状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault16,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault16 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 15,right: 15),
|
||||
child: ListItemFactory.createBuildMultilineInput(
|
||||
"仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存。",
|
||||
"请输入...",
|
||||
_controller19,
|
||||
isRequired:true,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 5,),
|
||||
ListItemFactory.createBuildSimpleSection('企业承诺',horPadding: 0,color: Color(0x00000000)),
|
||||
SizedBox(height: 5,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5,horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
GestureDetector(
|
||||
child: ItemListWidget.selectableLineTitleTextRightButton(label: '今日', text: dataTimeStart.isEmpty?
|
||||
'请选择':dataTimeStart??'', isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataStart=picked;
|
||||
if(dataTimeEnd.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!,dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeStart = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
GestureDetector(
|
||||
child:ItemListWidget.selectableLineTitleTextRightButton(label: '至', text: dataTimeEnd.isEmpty?
|
||||
'请选择':dataTimeEnd, isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataEnd=picked;
|
||||
if(dataTimeStart.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!, dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeEnd = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
Text("今天我公司已进行安全风险研判,各项安全风险防控措施已落实到位,我承诺所有生产设施处于安全运行状态,罐区、库房等危险源安全风险得到有效控制。",
|
||||
style: TextStyle(color: Colors.black,fontSize: 13),),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('承诺人:', style: TextStyle(fontSize: 16)),
|
||||
CustomButton(
|
||||
text: '手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: _sign,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImgList.isNotEmpty) _signListWidget(),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
CustomButton(
|
||||
backgroundColor: Colors.green,
|
||||
text: "提交",
|
||||
onPressed: () {
|
||||
// TODO: 完成回调
|
||||
_upData();
|
||||
}
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
) ,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _upData() async {
|
||||
try {
|
||||
|
||||
|
||||
|
||||
String text1=_controller1.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入检维修作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text2=_controller2.text.trim();
|
||||
if(text2.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入特殊作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text3=_controller3.text.trim();
|
||||
if(text3.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text4=_controller4.text.trim();
|
||||
if(text4.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入特级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text5=_controller5.text.trim();
|
||||
if(text5.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入一级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text6=_controller6.text.trim();
|
||||
if(text6.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入二级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text7=_controller7.text.trim();
|
||||
if(text7.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入高处作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text8=_controller8.text.trim();
|
||||
if(text8.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入受限空间作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text9=_controller9.text.trim();
|
||||
if(text9.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入吊装作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text10=_controller10.text.trim();
|
||||
if(text10.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入临时用电作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text11=_controller11.text.trim();
|
||||
if(text11.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入盲板抽堵作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text12=_controller12.text.trim();
|
||||
if(text12.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入动土作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text13=_controller13.text.trim();
|
||||
if(text13.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入断路作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text14=_controller14.text.trim();
|
||||
if(text14.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入承包商作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text15=_controller15.text.trim();
|
||||
if(text15.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text16=_controller16.text.trim();
|
||||
if(text16.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位运行数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text17=_controller17.text.trim();
|
||||
if(text17.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位停产数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text18=_controller18.text.trim();
|
||||
if(text18.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位检修数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text19=_controller19.text.trim();
|
||||
if(text19.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(dataTimeStart.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(dataTimeEnd.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(signImgList.isEmpty){
|
||||
ToastUtil.showNormal(context, "请签字");
|
||||
return;
|
||||
}
|
||||
|
||||
LoadingDialogHelper.show(message: "提交中。。。");
|
||||
|
||||
final formData = {
|
||||
'INPUT1': text1,
|
||||
'INPUT2': text2,
|
||||
'INPUT3': text3,
|
||||
'INPUT4': text4,
|
||||
'INPUT5': text5,
|
||||
'INPUT6': text6,
|
||||
'INPUT7': text7,
|
||||
'INPUT8': text8,
|
||||
'INPUT9': text9,
|
||||
'INPUT10': text10,
|
||||
'INPUT11': text11,
|
||||
'INPUT12': text12,
|
||||
'INPUT13': text13,
|
||||
'INPUT14': text14,
|
||||
'INPUT15': text15,
|
||||
'INPUT16': text16,
|
||||
'INPUT17': text17,
|
||||
'INPUT18': text18,
|
||||
'INPUT19': text19,
|
||||
|
||||
|
||||
'RADIO1': _isFault1?"1":"-1",
|
||||
'RADIO2': _isFault2?"1":"-1",
|
||||
'RADIO3': _isFault3?"1":"-1",
|
||||
'RADIO4': _isFault4?"1":"-1",
|
||||
'RADIO5': _isFault5?"1":"-1",
|
||||
'RADIO6': _isFault6?"1":"-1",
|
||||
'RADIO7': _isFault7?"1":"-1",
|
||||
'RADIO8': _isFault8?"1":"-1",
|
||||
'RADIO9': _isFault9?"1":"-1",
|
||||
'RADIO10': _isFault10?"1":"-1",
|
||||
'RADIO11': _isFault11?"1":"-1",
|
||||
'RADIO12': _isFault12?"1":"-1",
|
||||
'RADIO13': _isFault13?"1":"-1",
|
||||
'RADIO14': _isFault14?"1":"-1",
|
||||
'RADIO15': _isFault15?"1":"-1",
|
||||
'RADIO16': _isFault16?"1":"-1",
|
||||
|
||||
'START_TIME':dataTimeStart,
|
||||
'END_TIME': dataTimeEnd,
|
||||
|
||||
|
||||
"SIGNER_TIME":DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()) ,
|
||||
'DEPARTMENT_ID':SessionService.instance.loginUser?["DEPARTMENT_ID"],
|
||||
'SIGN_USER': SessionService.instance.loginUserId,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
'USER_ID': SessionService.instance.loginUserId,
|
||||
};
|
||||
|
||||
|
||||
final Map<String, dynamic>response = await ApiService.upTeamSafetyCommitmentApply(formData,signImgList);
|
||||
LoadingDialogHelper.hide();
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
Navigator.pop(context);
|
||||
});
|
||||
}else{
|
||||
ToastUtil.showNormal(context, response['msg']);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
print('Error fetching data: $e');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _sign() async {
|
||||
final String path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (c) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
setState(() {
|
||||
signImgList.add(path);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
signImgList.map((imgData) {
|
||||
final idx = signImgList.indexOf(imgData);
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 230,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child:
|
||||
Image.file(
|
||||
File(signImgList[0] ?? ''),
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap:
|
||||
() => presentOpaque(
|
||||
SingleImageViewer(imageUrl:signImgList[0] ?? ''),
|
||||
context,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '删除',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() => signImgList.removeAt(idx));
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool validateDateRange(DateTime startTime, DateTime endTime) {
|
||||
const int thirtyDaysInMilliseconds = 30 * 24 * 60 * 60 * 1000; // 30 天的毫秒数
|
||||
final int difference = endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch;
|
||||
|
||||
if (difference > thirtyDaysInMilliseconds) {
|
||||
ToastUtil.showNormal(context, "只能选择30天内的日期");
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,440 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
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 'dart:convert';
|
||||
|
||||
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 TeamSafetyCommitmentDetail extends StatefulWidget {
|
||||
final String commitmentWorkshopId;
|
||||
|
||||
const TeamSafetyCommitmentDetail({
|
||||
Key? key,
|
||||
required this.commitmentWorkshopId,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_TeamSafetyCommitmentDetailState createState() => _TeamSafetyCommitmentDetailState();
|
||||
}
|
||||
|
||||
class _TeamSafetyCommitmentDetailState extends State<TeamSafetyCommitmentDetail> {
|
||||
Map<String, dynamic> pd = {};
|
||||
bool isLoading = true;
|
||||
String errorMessage = '';
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
Future<void> _getData() async {
|
||||
setState(() {
|
||||
isLoading = true;
|
||||
});
|
||||
|
||||
try {
|
||||
final response = await ApiService.getTeamSafetyCommitmentDetail( widget.commitmentWorkshopId);
|
||||
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
pd = response['pd'];
|
||||
isLoading = false;
|
||||
});
|
||||
} else {
|
||||
ToastUtil.showNormal(context, '数据加载失败');
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
ToastUtil.showNormal(context, '发生错误: ${e.toString()}');
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Widget _buildInfoItem(String label, dynamic value, {bool isMarked = true}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
if (isMarked)
|
||||
TextSpan(
|
||||
text: value.toString(),
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
)
|
||||
else
|
||||
TextSpan(text: value.toString()),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildParagraph(List<Widget> children) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (isLoading) {
|
||||
return const Scaffold(
|
||||
body: Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.isNotEmpty) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: Center(child: Text(errorMessage)),
|
||||
);
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body: Container(
|
||||
color: Colors.white,
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child:Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// 标题部分
|
||||
Center(
|
||||
child: Text(
|
||||
"【${pd['DEPARTMENTNAME'] ?? '未知车间'}】车间 【${pd['POSTNAME'] ?? '未知岗位'}】岗位",
|
||||
style: const TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
|
||||
// 企业状态部分
|
||||
ListItemFactory.createBuildSimpleSection('班组状态',horPadding: 0),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom: 15,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBlueDotSection('高危生产活动及作业的安全风险可控状态'),
|
||||
// _buildSubTitle('高危生产活动及作业的安全风险可控状态'),
|
||||
|
||||
|
||||
_buildParagraph([
|
||||
|
||||
_buildWorkInfoParagraph1(),
|
||||
|
||||
_buildInfoItem('风险辨识、作业许可及管控措施的落实情况: ', (pd['RADIO1'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('处于试生产情况: ', (pd['RADIO2'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('处于开停车情况: ', (pd['RADIO3'] == 1 ? '开' : '停')),
|
||||
|
||||
_buildWorkInfoParagraph2(),
|
||||
|
||||
_buildInfoItem('变更情况: ', (pd['RADIO5'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('落实审批程序情况: ', (pd['RADIO6'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('罐区、仓库等危险源是否处于安全状态: ',
|
||||
(pd['RADIO7'] == 1 ? '是' : '否')),
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
]),
|
||||
|
||||
|
||||
|
||||
ListItemFactory.createBlueDotSection('班组安全状态'),
|
||||
_buildParagraph([
|
||||
_buildWorkInfoParagraph3(),
|
||||
]),
|
||||
|
||||
ListItemFactory.createBlueDotSection('生产装置的安全运行状态'),
|
||||
// _buildSubTitle('生产装置的安全运行状态'),
|
||||
_buildParagraph([
|
||||
_buildInfoItem('生产装置的温度、压力、组分液位、流量等主要工艺参数是否处于指标范围: ',
|
||||
(pd['RADIO8'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('压力容器、压力管道等特种设备处于安全运行状态: ',
|
||||
(pd['RADIO9'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('设备设施的静动密封完好无泄漏: ',
|
||||
(pd['RADIO10'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('超限报警、紧急切断、联锁等各类安全设施配备完好投用,并可靠运行: ',
|
||||
(pd['RADIO11'] == 1 ? '是' : '否')),
|
||||
]),
|
||||
|
||||
ListItemFactory.createBlueDotSection('危险化学品罐区、仓库等重大危险源的安全运行状态'),
|
||||
// _buildSubTitle('危险化学品罐区、仓库等重大危险源的安全运行状态'),
|
||||
_buildParagraph([
|
||||
_buildInfoItem('储罐、管道、机泵、阀门及仪表系统完好无泄漏: ',
|
||||
(pd['RADIO12'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('储罐的液位、温度、压力、气柜钟罩无超限运行: ',
|
||||
(pd['RADIO13'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('气柜钟罩超高、低运行: ',
|
||||
(pd['RADIO14'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('手动放脱水、装卸车时确保人员在岗: ',
|
||||
(pd['RADIO15'] == 1 ? '是' : '否')),
|
||||
_buildInfoItem('可燃及有毒气体报警和联锁处于可靠运行状态: ',
|
||||
(pd['RADIO16'] == 1 ? '是' : '否')),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(
|
||||
'仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存。',
|
||||
style: TextStyle(fontSize: 14),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.all(12),
|
||||
// decoration: BoxDecoration(
|
||||
// border: Border.all(color: Colors.blue),
|
||||
// borderRadius: BorderRadius.circular(4),
|
||||
// ),
|
||||
// child:
|
||||
Text(
|
||||
pd['INPUT19'] ?? '无内容',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
]),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
|
||||
|
||||
// 企业承诺部分
|
||||
ListItemFactory.createBuildSimpleSection('班组承诺',horPadding: 0),
|
||||
// _buildSectionTitle('企业承诺'),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,bottom: 5,left: 15,right: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey,width: 1)
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
const TextSpan(text: '今日('),
|
||||
TextSpan(
|
||||
text: pd['START_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(text: ' 至 '),
|
||||
TextSpan(
|
||||
text: pd['END_TIME'] ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
const TextSpan(
|
||||
text: ')我车间已进行安全风险研判,各项安全风险防控措施已落实到位。'
|
||||
'我承诺本生产装置/业务活动处于安全运行状态,涉及罐区、仓库等危险源安全风险得到有效管控。',
|
||||
),
|
||||
],
|
||||
),
|
||||
style: const TextStyle(fontSize: 14),
|
||||
),
|
||||
),
|
||||
|
||||
// 签名部分
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
presentOpaque(SingleImageViewer(imageUrl:ApiService.baseImgPath+ pd['SIGN_PATH']), context);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
// if (imagePath.isNotEmpty)
|
||||
Text('签字照片:',
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.grey,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 15),
|
||||
if (pd['SIGN_PATH'] != null)
|
||||
Image.network(ApiService.baseImgPath+pd['SIGN_PATH'],width: 230,height: 150,fit: BoxFit.cover,),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
//签字时间
|
||||
_buildParagraph([
|
||||
_buildInfoItem('签字时间: ', pd['SIGN_TIME']??""),
|
||||
]),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph1() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('检修作业 ', pd['INPUT1']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 特殊作业 ', pd['INPUT2']?.toString()??"0"),
|
||||
_buildStyledText('处, 动火作业', pd['INPUT3']?.toString()??"0"),
|
||||
_buildStyledText('处, 其中特级', pd['INPUT4']?.toString()??"0"),
|
||||
_buildStyledText('处, 一级 ', pd['INPUT5']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 二级', pd['INPUT6']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 高处作业', pd['INPUT7']?.toString()??"0"),
|
||||
_buildStyledText('处, 受限空间作业', pd['INPUT8']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 吊装作业', pd['INPUT9']?.toString()??"0"),
|
||||
_buildStyledText('处, 临时用电作业', pd['INPUT10']?.toString()??"0"),
|
||||
_buildStyledText('处, 盲板抽堵作业', pd['INPUT11']?.toString()??"0"),
|
||||
_buildStyledText('处, 动土作业', pd['INPUT12']?.toString()??"0"),
|
||||
_buildStyledText('处, 断路作业', pd['INPUT13']?.toString()??"0"),
|
||||
const TextSpan(text: ' 处。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph2() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('承包商作业 ', pd['INPUT14']?.toString()??"0"),
|
||||
_buildStyledText('处, 管控情况:', pd['RADIO4'] == 1 ? '受控' : '非受控'),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget _buildWorkInfoParagraph3() {
|
||||
// 定义一个样式映射函数,将数据部分标记为蓝色加粗
|
||||
TextSpan _buildStyledText(String label, String? value) {
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(text: label),
|
||||
TextSpan(
|
||||
text: value ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: const TextStyle(fontSize: 14, color: Colors.black87),
|
||||
children: [
|
||||
_buildStyledText('岗位主要设备(装置)名称、数量 ', pd['INPUT15']?.toString()??"0"),
|
||||
_buildStyledText(', 其中运行', pd['INPUT16']?.toString()??"0"),
|
||||
_buildStyledText('处, 停产', pd['INPUT17']?.toString()??"0"),
|
||||
_buildStyledText(' 处, 检修 ', pd['INPUT18']?.toString()??"0"),
|
||||
const TextSpan(text: ' 处。 '),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,861 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
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/picker/CupertinoDatePicker.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/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
|
||||
class WorkShopSafetyCommitmentApply extends StatefulWidget {
|
||||
const WorkShopSafetyCommitmentApply({super.key});
|
||||
|
||||
@override
|
||||
State<WorkShopSafetyCommitmentApply> createState() => _WorkShopSafetyCommitmentApplyState();
|
||||
}
|
||||
|
||||
class _WorkShopSafetyCommitmentApplyState extends State<WorkShopSafetyCommitmentApply> {
|
||||
|
||||
|
||||
final TextEditingController _controller1 = TextEditingController();
|
||||
final TextEditingController _controller2 = TextEditingController();
|
||||
final TextEditingController _controller3 = TextEditingController();
|
||||
final TextEditingController _controller4 = TextEditingController();
|
||||
final TextEditingController _controller5 = TextEditingController();
|
||||
final TextEditingController _controller6 = TextEditingController();
|
||||
final TextEditingController _controller7 = TextEditingController();
|
||||
final TextEditingController _controller8 = TextEditingController();
|
||||
final TextEditingController _controller9 = TextEditingController();
|
||||
final TextEditingController _controller10 = TextEditingController();
|
||||
final TextEditingController _controller11 = TextEditingController();
|
||||
final TextEditingController _controller12 = TextEditingController();
|
||||
final TextEditingController _controller13 = TextEditingController();
|
||||
final TextEditingController _controller14 = TextEditingController();
|
||||
final TextEditingController _controller15 = TextEditingController();
|
||||
final TextEditingController _controller16 = TextEditingController();
|
||||
final TextEditingController _controller17 = TextEditingController();
|
||||
final TextEditingController _controller18 = TextEditingController();
|
||||
final TextEditingController _controller19 = TextEditingController();
|
||||
|
||||
|
||||
bool _isFault1 = true;
|
||||
bool _isFault2 = true;
|
||||
bool _isFault3 = true;
|
||||
bool _isFault4 = true;
|
||||
bool _isFault5 = true;
|
||||
bool _isFault6 = true;
|
||||
bool _isFault7 = true;
|
||||
bool _isFault8 = true;
|
||||
bool _isFault9 = true;
|
||||
bool _isFault10 = true;
|
||||
bool _isFault11 = true;
|
||||
bool _isFault12 = true;
|
||||
bool _isFault13 = true;
|
||||
bool _isFault14 = true;
|
||||
bool _isFault15 = true;
|
||||
|
||||
DateTime? dataStart;
|
||||
String dataTimeStart="";
|
||||
DateTime? dataEnd;
|
||||
String dataTimeEnd="";
|
||||
|
||||
List<String> signImgList = [];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全承诺"),
|
||||
body:Container(
|
||||
padding: EdgeInsets.only(top: 15,bottom:15,left: 15,right: 15),
|
||||
child: ListView(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBuildSimpleSection('企业状态',horPadding: 0,color: Color(0x00000000)),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBlueDotSection('高危生产活动及作业的安全风险可控状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '特殊作业:',
|
||||
isEditable: true,
|
||||
controller: _controller1,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 风险辨识、作业许可及管控措施的落实情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault1,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault1 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动火作业:',
|
||||
isEditable: true,
|
||||
controller: _controller2,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '其中特级:',
|
||||
isEditable: true,
|
||||
controller: _controller3,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '一级:',
|
||||
isEditable: true,
|
||||
controller: _controller4,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '二级:',
|
||||
isEditable: true,
|
||||
controller: _controller5,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '高处作业:',
|
||||
isEditable: true,
|
||||
controller: _controller6,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '受限空间作业:',
|
||||
isEditable: true,
|
||||
controller: _controller7,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '吊装作业:',
|
||||
isEditable: true,
|
||||
controller: _controller8,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '临时用电作业:',
|
||||
isEditable: true,
|
||||
controller: _controller9,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '盲板抽堵作业:',
|
||||
isEditable: true,
|
||||
controller: _controller10,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动土作业:',
|
||||
isEditable: true,
|
||||
controller: _controller11,
|
||||
text: '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '断路作业:',
|
||||
isEditable: true,
|
||||
controller: _controller12,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '检维修作业:',
|
||||
isEditable: true,
|
||||
controller: _controller13,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 处于试生产情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault2,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault2 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 处于开停车情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"开",
|
||||
noLabel:"停",
|
||||
groupValue: _isFault3,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault3 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '承包商作业:',
|
||||
isEditable: true,
|
||||
controller: _controller14,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 管控情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"受控",
|
||||
noLabel:"非受控",
|
||||
groupValue: _isFault4,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault4 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 变更情况',
|
||||
horizontalPadding: 0,
|
||||
yesLabel:"有",
|
||||
noLabel:"没有",
|
||||
groupValue: _isFault5,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault5 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 落实审批程序情况',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault6,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault6 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: ' 罐区、仓库等危险源是否处于安全状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault7,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault7 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('车间安全状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '车间岗位:',
|
||||
isEditable: true,
|
||||
controller: _controller15,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '其中运行:',
|
||||
isEditable: true,
|
||||
controller: _controller16,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '停产:',
|
||||
isEditable: true,
|
||||
controller: _controller17,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '检修:',
|
||||
isEditable: true,
|
||||
controller: _controller18,
|
||||
text: '',
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('生产装置的安全运行状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '生产装置的温度、压力、组分液位、流量等主要工艺参数是否处于指标范围',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault8,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault8 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '压力容器、压力管道等特种设备处于安全运行状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault9,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault9 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '设备设施的静动密封完好无泄漏',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault10,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault10 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '超限报警、紧急切断、联锁等各类安全设施配备完好投用,并可靠运行',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault11,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault11 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBlueDotSection('危险化学品罐区、仓库等重大危险源安全运行状态',color: 0xffffffff),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '储罐、管道、机泵、阀门及仪表系统完好无泄漏',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault12,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault12 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '储罐的液位、温度、压力、气柜钟罩无超限运行',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault13,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault13 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '手动放脱水、装卸车时确保人员在岗',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault14,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault14 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '可燃及有毒气体报警和联锁处于可靠运行状态',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isFault15,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isFault15 = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 15,right: 15),
|
||||
child: ListItemFactory.createBuildMultilineInput(
|
||||
"仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存。",
|
||||
"请输入...",
|
||||
_controller19,
|
||||
isRequired:true,
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 5,),
|
||||
ListItemFactory.createBuildSimpleSection('企业承诺',horPadding: 0,color: Color(0x00000000)),
|
||||
SizedBox(height: 5,),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5,horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
GestureDetector(
|
||||
child: ItemListWidget.selectableLineTitleTextRightButton(label: '今日', text: dataTimeStart.isEmpty?
|
||||
'请选择':dataTimeStart??'', isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataStart=picked;
|
||||
if(dataTimeEnd.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!,dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeStart = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
GestureDetector(
|
||||
child:ItemListWidget.selectableLineTitleTextRightButton(label: '至', text: dataTimeEnd.isEmpty?
|
||||
'请选择':dataTimeEnd, isEditable: true, isRequired: true,horizontalnum: 0),
|
||||
onTap: () async {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context,allowFuture: true);
|
||||
if (picked != null) {
|
||||
|
||||
setState(() {
|
||||
dataEnd=picked;
|
||||
if(dataTimeStart.isNotEmpty) {
|
||||
bool isChao= validateDateRange(dataStart!, dataEnd!);
|
||||
if(!isChao){
|
||||
return;
|
||||
}
|
||||
}
|
||||
dataTimeEnd = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
});
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
const Divider(),
|
||||
Text("今天我公司已进行安全风险研判,各项安全风险防控措施已落实到位,我承诺所有生产设施处于安全运行状态,罐区、库房等危险源安全风险得到有效控制。",
|
||||
style: TextStyle(color: Colors.black,fontSize: 13),),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('承诺人:', style: TextStyle(fontSize: 16)),
|
||||
CustomButton(
|
||||
text: '手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: _sign,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImgList.isNotEmpty) _signListWidget(),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15,),
|
||||
|
||||
CustomButton(
|
||||
backgroundColor: Colors.green,
|
||||
text: "提交",
|
||||
onPressed: () {
|
||||
// TODO: 完成回调
|
||||
_upData();
|
||||
}
|
||||
),
|
||||
|
||||
|
||||
],
|
||||
),
|
||||
) ,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _upData() async {
|
||||
try {
|
||||
|
||||
String text1=_controller1.text.trim();
|
||||
if(text1.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入特殊作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text2=_controller2.text.trim();
|
||||
if(text2.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text3=_controller3.text.trim();
|
||||
if(text3.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入特级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text4=_controller4.text.trim();
|
||||
if(text4.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入一级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text5=_controller5.text.trim();
|
||||
if(text5.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入二级动火作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text6=_controller6.text.trim();
|
||||
if(text6.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入高处作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text7=_controller7.text.trim();
|
||||
if(text7.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入受限空间作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text8=_controller8.text.trim();
|
||||
if(text8.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入吊装作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text9=_controller9.text.trim();
|
||||
if(text9.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入临时用电作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text10=_controller10.text.trim();
|
||||
if(text10.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入盲板抽堵作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text11=_controller11.text.trim();
|
||||
if(text11.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入动土作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text12=_controller12.text.trim();
|
||||
if(text12.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入断路作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text13=_controller13.text.trim();
|
||||
if(text13.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入检维修作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text14=_controller14.text.trim();
|
||||
if(text14.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入承包商作业数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text15=_controller15.text.trim();
|
||||
if(text15.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text16=_controller16.text.trim();
|
||||
if(text16.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位运行数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text17=_controller17.text.trim();
|
||||
if(text17.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位停产数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text18=_controller18.text.trim();
|
||||
if(text18.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入车间岗位检修数");
|
||||
return;
|
||||
}
|
||||
|
||||
String text19=_controller19.text.trim();
|
||||
if(text19.isEmpty){
|
||||
ToastUtil.showNormal(context, "请输入仓库是否按照国家标准分区分类储存危险化学品,是否超量、超品种储存,相互禁配物质是否混放混存");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(dataTimeStart.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(dataTimeEnd.isEmpty){
|
||||
ToastUtil.showNormal(context, "请选择承诺时间");
|
||||
return;
|
||||
}
|
||||
|
||||
if(signImgList.isEmpty){
|
||||
ToastUtil.showNormal(context, "请签字");
|
||||
return;
|
||||
}
|
||||
|
||||
LoadingDialogHelper.show(message: "提交中。。。");
|
||||
|
||||
final formData = {
|
||||
'INPUT1': text1,
|
||||
'INPUT2': text2,
|
||||
'INPUT3': text3,
|
||||
'INPUT4': text4,
|
||||
'INPUT5': text5,
|
||||
'INPUT6': text6,
|
||||
'INPUT7': text7,
|
||||
'INPUT8': text8,
|
||||
'INPUT9': text9,
|
||||
'INPUT10': text10,
|
||||
'INPUT11': text11,
|
||||
'INPUT12': text12,
|
||||
'INPUT13': text13,
|
||||
'INPUT14': text14,
|
||||
'INPUT15': text15,
|
||||
'INPUT16': text16,
|
||||
'INPUT17': text17,
|
||||
'INPUT18': text18,
|
||||
'INPUT19': text19,
|
||||
|
||||
|
||||
'RADIO1': _isFault1?"1":"-1",
|
||||
'RADIO2': _isFault2?"1":"-1",
|
||||
'RADIO3': _isFault3?"1":"-1",
|
||||
'RADIO4': _isFault4?"1":"-1",
|
||||
'RADIO5': _isFault5?"1":"-1",
|
||||
'RADIO6': _isFault6?"1":"-1",
|
||||
'RADIO7': _isFault7?"1":"-1",
|
||||
'RADIO8': _isFault8?"1":"-1",
|
||||
'RADIO9': _isFault9?"1":"-1",
|
||||
'RADIO10': _isFault10?"1":"-1",
|
||||
'RADIO11': _isFault11?"1":"-1",
|
||||
'RADIO12': _isFault12?"1":"-1",
|
||||
'RADIO13': _isFault13?"1":"-1",
|
||||
'RADIO14': _isFault14?"1":"-1",
|
||||
'RADIO15': _isFault15?"1":"-1",
|
||||
|
||||
'START_TIME':dataTimeStart,
|
||||
'END_TIME': dataTimeEnd,
|
||||
|
||||
|
||||
"SIGNER_TIME":DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()) ,
|
||||
'DEPARTMENT_ID':SessionService.instance.loginUser?["DEPARTMENT_ID"],
|
||||
'SIGN_USER': SessionService.instance.loginUserId,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
'USER_ID': SessionService.instance.loginUserId,
|
||||
};
|
||||
|
||||
|
||||
final Map<String, dynamic>response = await ApiService.upWorkshopSafetyCommitmentApply(formData,signImgList);
|
||||
LoadingDialogHelper.hide();
|
||||
if (response['result'] == 'success') {
|
||||
setState(() {
|
||||
Navigator.pop(context);
|
||||
});
|
||||
}else{
|
||||
ToastUtil.showNormal(context, response['msg']);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
print('Error fetching data: $e');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _sign() async {
|
||||
final String path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (c) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
setState(() {
|
||||
signImgList.add(path);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
signImgList.map((imgData) {
|
||||
final idx = signImgList.indexOf(imgData);
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 230,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child:
|
||||
Image.file(
|
||||
File(signImgList[0] ?? ''),
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap:
|
||||
() => presentOpaque(
|
||||
SingleImageViewer(imageUrl:signImgList[0] ?? ''),
|
||||
context,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '删除',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() => signImgList.removeAt(idx));
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool validateDateRange(DateTime startTime, DateTime endTime) {
|
||||
const int thirtyDaysInMilliseconds = 30 * 24 * 60 * 60 * 1000; // 30 天的毫秒数
|
||||
final int difference = endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch;
|
||||
|
||||
if (difference > thirtyDaysInMilliseconds) {
|
||||
ToastUtil.showNormal(context, "只能选择30天内的日期");
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,378 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
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/http/HttpManager.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 SafetyMeetingDetailPage extends StatefulWidget {
|
||||
const SafetyMeetingDetailPage(this.id, this.selectedTab, {super.key,required this.onClose});
|
||||
|
||||
final int selectedTab;
|
||||
final String id;
|
||||
final Function(String) onClose; // 回调函数
|
||||
|
||||
@override
|
||||
State<SafetyMeetingDetailPage> createState() => _SafetyMeetingDetailPageState();
|
||||
}
|
||||
|
||||
class _SafetyMeetingDetailPageState extends State<SafetyMeetingDetailPage> {
|
||||
|
||||
final TextEditingController contentController = TextEditingController();
|
||||
List<String> signImages = [];
|
||||
late List<dynamic> _listImage = [];
|
||||
late Map<String, dynamic> pd = {};
|
||||
|
||||
late List<dynamic> qianZiImages = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
getSafetyMeetDetail();
|
||||
}
|
||||
|
||||
|
||||
Future<void> getSafetyMeetDetail() async {
|
||||
|
||||
try {
|
||||
|
||||
final result = await ApiService.getSafetyMeetDetail(widget.id );
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['imgs'] ?? [];
|
||||
setState(() {
|
||||
pd= result['pd'];
|
||||
_listImage.addAll(newList);
|
||||
if(widget.selectedTab==1&&result.containsKey('singImgs')){
|
||||
final List<dynamic> singList = result['singImgs'] ?? [];
|
||||
if(singList.isNotEmpty){
|
||||
qianZiImages.add(singList[0]);
|
||||
}
|
||||
|
||||
// qianZiImages=result['singImgs'][0]["FILEPATH"]?? [];
|
||||
}
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: "安全例会-详情"),
|
||||
body: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,left: 5,right: 5,bottom: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
// 例会标题
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '例会标题:',
|
||||
isEditable: false,
|
||||
text: pd['SAFETY_MEETING_TITLE'] ?? '',
|
||||
),
|
||||
Divider(height: 30),
|
||||
|
||||
// 内容
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '内容:',
|
||||
isEditable: false,
|
||||
text: pd['SAFETY_MEETING_CONTENT'] ?? '',
|
||||
),
|
||||
Divider(height: 30),
|
||||
|
||||
// 附件
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '附件:',
|
||||
imageUrls: _listImage
|
||||
.map((item) => item['FILEPATH'] as String) // 提取并转换为 String
|
||||
.toList(),
|
||||
),
|
||||
],
|
||||
|
||||
)
|
||||
),
|
||||
|
||||
SizedBox(height: 15),
|
||||
|
||||
if(widget.selectedTab==1)
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,left: 5,right: 5,bottom: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
// 反馈意见
|
||||
ItemListWidget.multiLineTitleTextField(
|
||||
label: '反馈意见:',
|
||||
isEditable: false,
|
||||
isRequired: false,
|
||||
controller: contentController,
|
||||
text:pd["FEED_BACK"],
|
||||
),
|
||||
Divider(),
|
||||
|
||||
// 签字区域
|
||||
if(qianZiImages.isNotEmpty)
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '签字信息:',
|
||||
imageUrls: qianZiImages
|
||||
.map((item) => item['FILEPATH'] as String) // 提取并转换为 String
|
||||
.toList(),
|
||||
),
|
||||
|
||||
],
|
||||
|
||||
)
|
||||
),
|
||||
|
||||
if(widget.selectedTab==0)
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 5,left: 5,right: 5,bottom: 15),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
// 反馈意见
|
||||
ItemListWidget.multiLineTitleTextField(
|
||||
label: '反馈意见:',
|
||||
isEditable: true,
|
||||
controller: contentController,
|
||||
hintText: "(必填)",
|
||||
text:'',
|
||||
),
|
||||
Divider(),
|
||||
|
||||
// 签字区域
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 10,right: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('签字'),
|
||||
CustomButton(
|
||||
text: '手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_sign();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImages.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
)
|
||||
),
|
||||
SizedBox(height: 15),
|
||||
|
||||
// 提交按钮
|
||||
if (widget.selectedTab==0)
|
||||
CustomButton(
|
||||
text: '提交',
|
||||
backgroundColor: Colors.blue,
|
||||
textStyle: TextStyle(color: Colors.white,fontSize: 12),
|
||||
onPressed: () {
|
||||
setSafetyMeetDetailFeedback();
|
||||
},
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Future<void> setSafetyMeetDetailFeedback() async {
|
||||
try {
|
||||
|
||||
String text=contentController.text.trim();
|
||||
if(text.isEmpty){
|
||||
ToastUtil.showNormal(context, "请填写反馈意见");
|
||||
return;
|
||||
}
|
||||
|
||||
if(signImages.isEmpty){
|
||||
ToastUtil.showNormal(context, "请签字");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
LoadingDialogHelper.show();
|
||||
final result = await ApiService.setSafetyMeetDetailFeedback(widget.id ,text);
|
||||
if (result['result'] == 'success') {
|
||||
String SAFETY_MEETING_PEOPLE_ID= result['pd']['SAFETY_MEETING_PEOPLE_ID'];
|
||||
|
||||
addSafetyMeetDetailFeedBack(SAFETY_MEETING_PEOPLE_ID);
|
||||
setState(() {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, "提交成功");
|
||||
widget.onClose('提交成功');
|
||||
Navigator.pop(context);
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
LoadingDialogHelper.hide();
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
LoadingDialogHelper.hide();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> addSafetyMeetDetailFeedBack(id) async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.addSafetyMeetDetailFeedBack(signImages[0] ,id);
|
||||
if (result['result'] == 'success') {
|
||||
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$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());
|
||||
|
||||
final file = File(path);
|
||||
if (!await file.exists()) {
|
||||
throw ApiException('file_not_found', '图片不存在:$path');
|
||||
}
|
||||
|
||||
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,11 +1,14 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/Safetymeeting/safety_meeting_detail_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/notif/notif_detail_page.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
|
@ -107,22 +110,7 @@ class _SafetyMeetingListPageState extends State<SafetyMeetingListPage>
|
|||
|
||||
|
||||
|
||||
Future<void> _deleteNotif(String id) async {
|
||||
// LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.deleteNotif(id);
|
||||
if (result['result'] == 'success') {
|
||||
setState(() {
|
||||
reRefreshData();
|
||||
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('加载出错: $e');
|
||||
} finally {
|
||||
LoadingDialogHelper.hide();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -185,100 +173,66 @@ class _SafetyMeetingListPageState extends State<SafetyMeetingListPage>
|
|||
}
|
||||
|
||||
Widget _itemCell(final item) {
|
||||
return Column(
|
||||
children: [
|
||||
ListTile(
|
||||
onTap: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => NotifDetailPage(
|
||||
item,_selectedTab,
|
||||
onClose: (result) {
|
||||
print('详情页面已关闭,返回结果: $result');
|
||||
reRefreshData();
|
||||
},
|
||||
return Container(
|
||||
padding: EdgeInsets.all(20),
|
||||
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black12,
|
||||
blurRadius: 4,
|
||||
offset: Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
item["SAFETY_MEETING_TITLE"],
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// pushPage(NotifDetailPage(item,_selectedTab), context);
|
||||
},
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 10,
|
||||
],
|
||||
),
|
||||
title: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 20), // 减小底部间距
|
||||
child: Text(item['SYNOPSIS'], style: const TextStyle(fontSize: 14)),
|
||||
SizedBox(height: 8),
|
||||
Text(
|
||||
'例会正文:${item["SAFETY_MEETING_CONTENT"]}',
|
||||
style: TextStyle(color: Colors.grey[600]),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
||||
subtitle: Text(item['CREATTIME'], style: TextStyle(fontSize: 13)),
|
||||
|
||||
trailing: Container(
|
||||
constraints: const BoxConstraints(minHeight: 100), // 确保最小高度
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min, // 关键修改:使用最小尺寸
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
if (0 != _selectedTab)
|
||||
Text(
|
||||
item['TYPE'] == 1 ? '已读' : '未读',
|
||||
style: TextStyle(
|
||||
fontSize: 12, // 稍微减小字体大小
|
||||
color: item['TYPE'] == 1 ? Colors.grey : Colors.red,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 15),
|
||||
|
||||
if (0 != _selectedTab && item['TYPE'] == 1)
|
||||
SizedBox(
|
||||
height: 24, // 固定按钮高度
|
||||
child: TextButton(
|
||||
onPressed: () async{
|
||||
// 显示确认对话框
|
||||
bool? confirm = await showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text("确认删除"),
|
||||
content: Text("确定要删除这条通知吗?"),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context, false),
|
||||
// onPressed: () => Navigator.pop(context, false),
|
||||
child: Text("取消"),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context, true),
|
||||
// onPressed: () => Navigator.pop(context, true),
|
||||
child: Text("确定", style: TextStyle(color: Colors.red)),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
if (confirm == true) {
|
||||
_deleteNotif(item['NOTICECORPUSERID_ID']);
|
||||
}
|
||||
|
||||
},
|
||||
style: TextButton.styleFrom(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
backgroundColor: Colors.red,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
child: Text( '删除', style: TextStyle(fontSize: 13, color: Colors.white),),
|
||||
|
||||
),
|
||||
),
|
||||
],
|
||||
SizedBox(height: 8),
|
||||
Text('发布人:${item["NAME"]}'),
|
||||
SizedBox(height: 8),
|
||||
Text('发布时间:${item["CREATTIME"]}'),
|
||||
SizedBox(height: 8),
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child:
|
||||
SizedBox(
|
||||
width: 90,
|
||||
height: 40,
|
||||
child: CustomButton(
|
||||
text: _selectedTab == 0 ? '立即反馈' : '查看',
|
||||
backgroundColor: Colors.blue,
|
||||
textStyle: TextStyle(color: Colors.white,fontSize: 12),
|
||||
onPressed: () {
|
||||
_goToDetail(item["SAFETY_MEETING_ID"]);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Divider(height: 1, color: Colors.black12),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -294,6 +248,23 @@ class _SafetyMeetingListPageState extends State<SafetyMeetingListPage>
|
|||
}
|
||||
|
||||
|
||||
void _goToDetail(String id){
|
||||
pushPage(SafetyMeetingDetailPage(
|
||||
id,_selectedTab,
|
||||
onClose: (String result) {
|
||||
setState(() {
|
||||
reRefreshData();
|
||||
});
|
||||
|
||||
},
|
||||
), context);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ import 'package:qhd_prevention/pages/app/danger_wait_list_page.dart';
|
|||
import 'package:qhd_prevention/pages/home/work/laws_regulations_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/workSet_page.dart';
|
||||
|
||||
import 'EquipmentInspection/equipment_inspection_list_page.dart';
|
||||
import 'SafetyCommitment/safety_commitment_page.dart';
|
||||
import 'Safetymeeting/safety_meeting_list_page.dart';
|
||||
import 'hidden_roll_widget.dart';
|
||||
import '../../http/ApiService.dart';
|
||||
|
|
@ -340,9 +342,15 @@ class _HomePageState extends State<HomePage> {
|
|||
case 5: // 重点工程管理
|
||||
await pushPage(KeyprojectsTabList(), context);
|
||||
break;
|
||||
case 6://安全承诺
|
||||
pushPage(SafetyCommitmentPage(), context);
|
||||
break;
|
||||
case 7:
|
||||
pushPage(StudyGardenPage(), context);
|
||||
break;
|
||||
case 9:
|
||||
pushPage(EquipmentInspectionListPage(), context);
|
||||
break;
|
||||
case 8: // 安全检查
|
||||
await pushPage(SafecheckTabList(), context);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -161,11 +161,12 @@ class ItemListWidget {
|
|||
VoidCallback? onTapClean, // 清除回调
|
||||
bool isRequired = true,
|
||||
String cleanText = '清除',
|
||||
double horizontalnum=12,
|
||||
}) {
|
||||
return InkWell(
|
||||
onTap: isEditable ? onTap : null,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 12),
|
||||
padding: EdgeInsets.symmetric(vertical: 5, horizontal: horizontalnum),
|
||||
child: Row(
|
||||
children: [
|
||||
// 1. 标题
|
||||
|
|
@ -820,4 +821,11 @@ class ItemListWidget {
|
|||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,8 +12,9 @@ import 'package:qhd_prevention/tools/tools.dart';
|
|||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
|
||||
class DangerProjectPage extends StatefulWidget {
|
||||
const DangerProjectPage(this.item, this.type, {super.key});
|
||||
const DangerProjectPage(this.item, this.type, this.checkrecordId, {super.key});
|
||||
|
||||
final String checkrecordId;
|
||||
final int type;
|
||||
final item;
|
||||
@override
|
||||
|
|
@ -98,9 +99,8 @@ class _DangerProjectPageState extends State<DangerProjectPage> {
|
|||
|
||||
// listDatesTwo.addAll(newListTwo);option1
|
||||
for(int i=0;i<listDates.length;i++){
|
||||
|
||||
|
||||
for(int m=0;m<listDatesSelect.length;m++){
|
||||
if(newListTwo.isNotEmpty){
|
||||
for(int m=0;m<newListTwo.length;m++){
|
||||
if(newListTwo.isNotEmpty&&newListTwo[m]["LISTCHECKITEM_ID"]!=null){
|
||||
if( newListTwo[m]["LISTCHECKITEM_ID"]==listDates[i]["LISTCHECKITEM_ID"]){
|
||||
|
||||
|
|
@ -127,10 +127,16 @@ class _DangerProjectPageState extends State<DangerProjectPage> {
|
|||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -163,38 +169,47 @@ class _DangerProjectPageState extends State<DangerProjectPage> {
|
|||
|
||||
|
||||
for(int i=0;i<listDates.length;i++){
|
||||
for(int m=0;m<listDatesSelect.length;m++){
|
||||
if(newListTwo.isNotEmpty&&newListTwo[m]["CUSTOM_ITEM_ID"]!=null){
|
||||
if( newListTwo[m]["CUSTOM_ITEM_ID"]==listDates[i]["CUSTOM_ITEM_ID"]){
|
||||
if(newListTwo.isNotEmpty){
|
||||
for(int m=0;m<newListTwo.length;m++){
|
||||
if(newListTwo.isNotEmpty&&newListTwo[m]["CUSTOM_ITEM_ID"]!=null){
|
||||
if( newListTwo[m]["CUSTOM_ITEM_ID"]==listDates[i]["CUSTOM_ITEM_ID"]){
|
||||
|
||||
if(listDatesSelect.isNotEmpty){
|
||||
switch(listDatesSelect[m]["ISNORMAL"] ){
|
||||
case 0:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option1";
|
||||
break;
|
||||
case 1:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option2";
|
||||
break;
|
||||
case 2:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option3";
|
||||
break;
|
||||
if(listDatesSelect.isNotEmpty){
|
||||
switch(listDatesSelect[m]["ISNORMAL"] ){
|
||||
case 0:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option1";
|
||||
break;
|
||||
case 1:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option2";
|
||||
break;
|
||||
case 2:
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "option3";
|
||||
break;
|
||||
}
|
||||
}else {
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "";
|
||||
}
|
||||
|
||||
if(listDatesSelect[m].containsKey("HIDDEN_ID")){
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = listDatesSelect[m]["HIDDEN_ID"];
|
||||
SessionService.instance.setUnqualifiedInspectionItemIDJson(listDatesSelect[m]["HIDDEN_ID"]);
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
}else {
|
||||
(listDates[i] as Map<String, dynamic>)["REFERENCE_BASIS"] = "";
|
||||
}
|
||||
|
||||
if(listDatesSelect[m].containsKey("HIDDEN_ID")){
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = listDatesSelect[m]["HIDDEN_ID"];
|
||||
SessionService.instance.setUnqualifiedInspectionItemIDJson(listDatesSelect[m]["HIDDEN_ID"]);
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
}
|
||||
}else{
|
||||
(listDates[i] as Map<String, dynamic>)["ids"] = "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
|
@ -666,7 +681,7 @@ class _DangerProjectPageState extends State<DangerProjectPage> {
|
|||
return;
|
||||
}
|
||||
String itemsString= jsonEncode(upDataItemList);
|
||||
String CHECKRECORD_ID= widget.item["CHECKRECORD_ID"] ?? "";
|
||||
String CHECKRECORD_ID= widget.checkrecordId?? "";
|
||||
try {
|
||||
|
||||
final Map<String, dynamic> result;
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ class _riskListPageState extends State<RiskListPage> {
|
|||
|
||||
void _getData(){
|
||||
listDates.clear();
|
||||
checkMap.clear();
|
||||
switch(widget.type ){
|
||||
case 1://隐患排查
|
||||
_getRiskPointsList();
|
||||
|
|
@ -273,7 +274,7 @@ class _riskListPageState extends State<RiskListPage> {
|
|||
|
||||
final result = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (_) => DangerProjectPage(item,widget.type )),
|
||||
MaterialPageRoute(builder: (_) => DangerProjectPage(item,widget.type,checkrecordId )),
|
||||
);
|
||||
_getData();
|
||||
}
|
||||
|
|
@ -282,7 +283,7 @@ class _riskListPageState extends State<RiskListPage> {
|
|||
// pushPage(DangerProjectPage(item), context);
|
||||
final result = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (_) => DangerProjectPage(item,widget.type )),
|
||||
MaterialPageRoute(builder: (_) => DangerProjectPage(item,widget.type,checkrecordId )),
|
||||
);
|
||||
_getData();
|
||||
break;
|
||||
|
|
|
|||
300
pubspec.lock
300
pubspec.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue