结构修改

main
hs 2025-07-31 21:09:52 +08:00
parent 7ef5d4ccdc
commit 4accf55b81
11 changed files with 1242 additions and 10 deletions

View File

@ -270,7 +270,6 @@ class RepairedPhotoSection extends StatefulWidget {
this.onMediaAdded, this.onMediaAdded,
this.onMediaRemoved, this.onMediaRemoved,
}) : super(key: key); }) : super(key: key);
@override @override
_RepairedPhotoSectionState createState() => _RepairedPhotoSectionState(); _RepairedPhotoSectionState createState() => _RepairedPhotoSectionState();
} }

View File

@ -0,0 +1,611 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/toast_util.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';
class HotWorkListPage extends StatefulWidget {
final String flow;
final String workTypeTitle;
const HotWorkListPage({Key? key, required this.flow, required this.workTypeTitle}) : super(key: key);
@override
_HotWorkListPageState createState() => _HotWorkListPageState();
}
class _HotWorkListPageState extends State<HotWorkListPage> {
// 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 = '';
List<Map<String, dynamic>> flowList = [];
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_fetchSteps();
_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> _fetchSteps() async {
try {
final response = await ApiService.dhHotGetTaskSetps(1);
setState(() {
stepList = [
{'STEP_NAME': '全部', 'STEP_ID': ''},
...response['list'] ?? [],
];
});
} catch (e) {
print('Error fetching steps: $e');
}
}
Future<void> _fetchData() async {
if (isLoading) return;
setState(() => isLoading = true);
try {
final data = {
'CREATOR':
widget.flow == '提交申请' ? SessionService.instance.loginUserId : '',
'GASCHECK':
widget.flow == '气体检测' ? SessionService.instance.loginUserId : '',
'STEP_NAME':
(widget.flow == '提交申请' || widget.flow == '气体检测') ? '' : widget.flow,
'STEP_ID': sindex > 0 ? stepList[sindex]['STEP_ID'] : '',
'KEYWORDS': searchKeywords,
'WORK_STATE': '0',
};
final url = '/app/hotwork/list?showCount=-1&currentPage=$currentPage';
final response = await ApiService.hotCheckWorkCount(data, url);
setState(() {
if (currentPage == 1) {
list = response['varList'];
} else {
list.addAll(response['varList']);
}
Map<String, dynamic> page = response['page'];
totalPage = page['totalPage'] ?? 1;
isLoading = false;
});
} catch (e) {
print('Error fetching data: $e');
setState(() => isLoading = false);
}
}
void _search() {
currentPage = 1;
list.clear();
_fetchData();
}
///
void _handleApply() {
//
pushPage(HotworkApplyDetail(HOTWORK_ID: '', flow: widget.flow), context);
}
///
Future<void> _openFlowDrawer(String hotworkId) async {
try {
final response = await ApiService.dhGetFlowList(hotworkId);
final List<dynamic>? newFlow = response['flowList'];
if (newFlow == null || newFlow.isEmpty) {
ToastUtil.showNormal(context, '暂无流程图数据');
return;
}
setState(() {
flowList = List<Map<String, dynamic>>.from(newFlow);
});
Future.microtask(() {
_scaffoldKey.currentState?.openEndDrawer();
});
} catch (e) {
print('Error fetching flow data: $e');
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('获取流程图失败: $e')));
}
}
void _goToDetail(Map<String, dynamic> item) async {
final Map<String, dynamic> data = {'HOTWORK_ID': item['HOTWORK_ID'], 'flow': widget.flow};
String routeName = '';
switch (widget.flow) {
case '提交申请':
await pushPage(HotworkApplyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
_fetchData();
break;
case '气体检测':
await pushPage(HotworkGasList(HOTWORK_ID: item['HOTWORK_ID'], addFlag:true), context);
break;
case '设置安全措施确认人':
await pushPage(HotworkSetSafeDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全措施确认':
await pushPage(HotworkSafeFuncSure(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '监护人签字':
routeName = '/hotwork-guardian-detail';
await pushPage(HotworkJhrDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全交底人签字':
routeName = '/hotwork-confess-detail';
await pushPage(HotworkAqjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '接受交底人签字':
routeName = '/hotwork-acceptconfess-detail';
await pushPage(HotworkJsjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '作业负责人签字':
routeName = '/hotwork-confirm-detail';
await pushPage(HotworkZyfzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '所在单位签字':
routeName = '/hotwork-leader-detail';
await pushPage(HotworkSzdwDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全管理部门签字':
routeName = '/hotwork-audit-detail';
await pushPage(HotworkAqglDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '审批人签字':
routeName = '/hotwork-approve-detail';
await pushPage(HotworkDhspDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '当班班长验票':
routeName = '/hotwork-monitor-detail';
await pushPage(HotworkDbbzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '开始作业':
routeName = '/hotwork-startwork-detail';
await pushPage(HotworkKszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '结束作业':
routeName = '/hotwork-endwork-detail';
await pushPage(HotworkJszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '验收签字':
routeName = '/hotwork-accept-detail';
await pushPage(HotworkYsgdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
default:
routeName = '/hotwork-detail';
}
setState(() {
_fetchSteps();
_fetchData();
});
// Navigator.pushNamed(
// context,
// routeName,
// arguments: {'HOTWORK_ID': item['HOTWORK_ID'], 'flow': widget.flow},
// );
}
Widget _buildFlowStepItem({
required Map<String, dynamic> item,
required bool isFirst,
required bool isLast,
required int status, // 1 = , 0 = , -1 =
}) {
//
final Color dotColor =
status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.grey);
final Color textColor =
status == 1
? Colors.green
: (status == 0 ? Colors.blue : Colors.black);
return ListTile(
visualDensity: VisualDensity(vertical: -4),
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
leading: Container(
width: 24,
alignment: Alignment.center,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
// 线
isFirst
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
//
CircleAvatar(radius: 6, backgroundColor: dotColor),
// 线
isLast
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
],
),
),
title: Text(
item['STEP_NAME'] ?? '',
style: TextStyle(color: textColor, fontSize: 15),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (item['SIGN_USER'] != null)
Text(
item['SIGN_USER'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['FINISHED_SIGN_USER'] != null)
Text(
item['FINISHED_SIGN_USER'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['ACT_USER_NAME'] != null)
Text(
item['ACT_USER_NAME'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['ACT_TIME'] != null)
Text(
item['ACT_TIME'],
style: TextStyle(color: textColor, fontSize: 13),
),
],
),
);
}
Widget _buildListItem(Map<String, dynamic> item) {
return Card(
color: Colors.white,
margin: const EdgeInsets.all(8.0),
child: InkWell(
onTap: () => _goToDetail(item),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),),
Text("作业级别: ${item['WORK_LEVEL'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"),
Text("分析人: ${item['ANALYZE_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"),
Text("批准人: ${item['APPROVE_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"),
Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
if (item['AUDIT_USER_NAME'] != null)
Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("动火前在岗班长: ${item['MONITOR_USER_NAME'] ?? ''}"),
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
"审核状态: ${_getStatusText(item)}",
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(height: 8),
Row(children: [
CustomButton(
text: '查看流程图',
height: 35,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(left: 0),
backgroundColor: Colors.blue,
onPressed: () => _openFlowDrawer(item['HOTWORK_ID']),
),
SizedBox(width: 1,)
],)
],
),
),
),
);
}
String _getStatusText(Map<String, dynamic> item) {
// STEP_ID STATUS
final int stepId = (item['STEP_ID'] is int) ? item['STEP_ID'] as int : 0;
final int status = (item['STATUS'] is int) ? item['STATUS'] as int : 0;
if (stepId == 0) {
return '暂存';
} else if (status == -2) {
return '气体检测打回';
} else if (stepId != -1) {
return item['NEXT_STEP_NAME'] ?? '';
} else {
return '${item['STEP_NAME'] ?? ''}打回';
}
}
//
Future<void> _showStepPicker() async {
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...')));
await _fetchSteps();
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('无法加载步骤数据')));
return;
}
}
//
final options = stepList.map((e) => e['STEP_NAME'] as String).toList();
//
final choice = await BottomPicker.show<String>(
context,
items: options,
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
initialIndex: sindex,
);
if (choice != null) {
//
final newIndex = options.indexOf(choice);
if (newIndex != -1) {
setState(() {
sindex = newIndex;
});
_search();
}
}
}
Widget _buildListContent() {
if (isLoading && list.isEmpty) {
//
return Center(child: CircularProgressIndicator());
} else if (list.isEmpty) {
//
return NoDataWidget.show();
} else {
//
return ListView.builder(
padding: EdgeInsets.zero,
controller: _scrollController,
itemCount: list.length + (isLoading ? 1 : 0),
itemBuilder: (context, index) {
if (index >= list.length) {
//
return Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Center(child: CircularProgressIndicator()),
);
}
return _buildListItem(list[index]);
},
);
}
}
@override
Widget build(BuildContext context) {
final int lastDoneIndex = flowList.lastIndexWhere((e) => e['STATUS'] == 1);
return Scaffold(
key: _scaffoldKey,
appBar: MyAppbar(
title: '${widget.workTypeTitle}${widget.flow}',
actions: [
if (widget.flow == '提交申请')
TextButton(
onPressed: _handleApply,
child: const Text(
'申请',
style: TextStyle(color: Colors.white, fontSize: 17),
),
),
],
),
endDrawer: Drawer(
child: SafeArea(
child:
flowList.isEmpty
? Center(child: Text('暂无流程图数据'))
: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemCount: flowList.length + 1, // +1
itemBuilder: (context, i) {
if (i == 0) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Text(
'查看流程图',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
);
}
final idx = i - 1;
final item = flowList[idx];
final bool isFirst = idx == 0;
final bool isLast = idx == flowList.length - 1;
// lastDoneIndex
final int status;
if (idx <= lastDoneIndex) {
status = 1; //
} else if (idx == lastDoneIndex + 1) {
status = 0; //
} else {
status = -1; //
}
return _buildFlowStepItem(
item: item,
isFirst: isFirst,
isLast: isLast,
status: status,
);
},
),
),
),
body: Column(
children: [
// Filter bar
Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
child: Row(
children: [
//
SizedBox(
width: 65,
child: TextButton(
onPressed: _showStepPicker,
style: TextButton.styleFrom(
padding: EdgeInsets.symmetric(
vertical: 12,
horizontal: 5,
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'筛选',
style: TextStyle(color: Colors.black87, fontSize: 16),
),
Icon(Icons.arrow_drop_down, color: Colors.grey),
],
),
),
),
Expanded(
flex: 2,
child: SearchBarWidget(
showResetButton: false,
hintText: "请输入关键字",
// isClickableOnly: true,
onSearch: (text) {
_search();
},
controller: _searchController,
),
),
],
),
),
const Divider(height: 1),
// List
Expanded(child: _buildListContent()),
],
),
);
}
}

View File

@ -0,0 +1,621 @@
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/toast_util.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';
class HighworkListPage extends StatefulWidget {
final String flow;
final String workTypeTitle;
const HighworkListPage({Key? key, required this.flow, required this.workTypeTitle}) : super(key: key);
@override
_HighworkListPageState createState() => _HighworkListPageState();
}
class _HighworkListPageState extends State<HighworkListPage> {
// 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 = '';
List<Map<String, dynamic>> flowList = [];
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_fetchSteps();
_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> _fetchSteps() async {
try {
final response = await ApiService.dhHotGetTaskSetps(1);
setState(() {
stepList = [
{'STEP_NAME': '全部', 'STEP_ID': ''},
...response['list'] ?? [],
];
});
} catch (e) {
print('Error fetching steps: $e');
}
}
Future<void> _fetchData() async {
if (isLoading) return;
setState(() => isLoading = true);
try {
final data = {
'CREATOR':
widget.flow == '提交申请' ? SessionService.instance.loginUserId : '',
'GASCHECK':
widget.flow == '气体检测' ? SessionService.instance.loginUserId : '',
'STEP_NAME':
(widget.flow == '提交申请' || widget.flow == '气体检测') ? '' : widget.flow,
'STEP_ID': sindex > 0 ? stepList[sindex]['STEP_ID'] : '',
'KEYWORDS': searchKeywords,
'WORK_STATE': '0',
};
final url = '/app/highwork/list?showCount=-1&currentPage=$currentPage';
final response = await ApiService.hotCheckWorkCount(data, url);
setState(() {
if (currentPage == 1) {
list = response['varList'];
} else {
list.addAll(response['varList']);
}
Map<String, dynamic> page = response['page'];
totalPage = page['totalPage'] ?? 1;
isLoading = false;
});
} catch (e) {
print('Error fetching data: $e');
setState(() => isLoading = false);
}
}
void _search() {
currentPage = 1;
list.clear();
_fetchData();
}
///
void _handleApply() {
//
pushPage(HotworkApplyDetail(HOTWORK_ID: '', flow: widget.flow), context);
}
///
Future<void> _openFlowDrawer(String hotworkId) async {
try {
final response = await ApiService.dhGetFlowList(hotworkId);
final List<dynamic>? newFlow = response['flowList'];
if (newFlow == null || newFlow.isEmpty) {
ToastUtil.showNormal(context, '暂无流程图数据');
return;
}
setState(() {
flowList = List<Map<String, dynamic>>.from(newFlow);
});
Future.microtask(() {
_scaffoldKey.currentState?.openEndDrawer();
});
} catch (e) {
print('Error fetching flow data: $e');
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('获取流程图失败: $e')));
}
}
void _goToDetail(Map<String, dynamic> item) async {
final Map<String, dynamic> data = {'HOTWORK_ID': item['HOTWORK_ID'], 'flow': widget.flow};
String routeName = '';
switch (widget.flow) {
case '提交申请':
//await pushPage(HotworkApplyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '设置安全措施确认人':
//await pushPage(HotworkSetSafeDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全措施确认':
//await pushPage(HotworkSafeFuncSure(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '监护人签字':
routeName = '/hotwork-guardian-detail';
//await pushPage(HotworkJhrDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全交底人签字':
routeName = '/hotwork-confess-detail';
//await pushPage(HotworkAqjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '接受交底人签字':
routeName = '/hotwork-acceptconfess-detail';
//await pushPage(HotworkJsjdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '作业负责人签字':
routeName = '/hotwork-confirm-detail';
//await pushPage(HotworkZyfzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '所在单位签字':
routeName = '/hotwork-leader-detail';
//await pushPage(HotworkSzdwDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '安全管理部门签字':
routeName = '/hotwork-audit-detail';
//await pushPage(HotworkAqglDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '审批人签字':
routeName = '/hotwork-approve-detail';
//await pushPage(HotworkDhspDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '当班班长验票':
routeName = '/hotwork-monitor-detail';
//await pushPage(HotworkDbbzDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '开始作业':
routeName = '/hotwork-startwork-detail';
//await pushPage(HotworkKszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '结束作业':
routeName = '/hotwork-endwork-detail';
//await pushPage(HotworkJszyDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
case '验收签字':
routeName = '/hotwork-accept-detail';
//await pushPage(HotworkYsgdDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context);
break;
default:
routeName = '/hotwork-detail';
}
setState(() {
_fetchSteps();
_fetchData();
});
// Navigator.pushNamed(
// context,
// routeName,
// arguments: {'HOTWORK_ID': item['HOTWORK_ID'], 'flow': widget.flow},
// );
}
Widget _buildFlowStepItem({
required Map<String, dynamic> item,
required bool isFirst,
required bool isLast,
required int status, // 1 = , 0 = , -1 =
}) {
//
final Color dotColor =
status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.grey);
final Color textColor =
status == 1
? Colors.green
: (status == 0 ? Colors.blue : Colors.black);
return ListTile(
visualDensity: VisualDensity(vertical: -4),
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
leading: Container(
width: 24,
alignment: Alignment.center,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
// 线
isFirst
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
//
CircleAvatar(radius: 6, backgroundColor: dotColor),
// 线
isLast
? SizedBox(height: 6 + 5)
: Expanded(child: Container(width: 1, color: Colors.grey[300])),
],
),
),
title: Text(
item['STEP_NAME'] ?? '',
style: TextStyle(color: textColor, fontSize: 15),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (item['SIGN_USER'] != null)
Text(
item['SIGN_USER'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['FINISHED_SIGN_USER'] != null)
Text(
item['FINISHED_SIGN_USER'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['ACT_USER_NAME'] != null)
Text(
item['ACT_USER_NAME'],
style: TextStyle(color: textColor, fontSize: 13),
),
if (item['ACT_TIME'] != null)
Text(
item['ACT_TIME'],
style: TextStyle(color: textColor, fontSize: 13),
),
],
),
);
}
String _getWorkLevelText(dynamic level) {
switch (level?.toString()) {
case '1':
return 'I级高处作业';
case '2':
return 'II级高处作业';
case '3':
return 'III级高处作业';
default:
return 'IV级高处作业';
}
}
Widget _buildListItem(Map<String, dynamic> item) {
return Card(
color: Colors.white,
margin: const EdgeInsets.all(8.0),
child: InkWell(
onTap: () => _goToDetail(item),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),),
Text(
"作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"),
Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"),
Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
if (item['AUDIT_USER_NAME'] != null)
Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("动火前在岗班长: ${item['MONITOR_USER_NAME'] ?? ''}"),
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
],
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
"审核状态: ${_getStatusText(item)}",
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(height: 8),
Row(children: [
CustomButton(
text: '查看流程图',
height: 35,
padding: EdgeInsets.symmetric(horizontal: 12),
margin: EdgeInsets.only(left: 0),
backgroundColor: Colors.blue,
onPressed: () => _openFlowDrawer(item['HOTWORK_ID']),
),
SizedBox(width: 1,)
],)
],
),
),
),
);
}
String _getStatusText(Map<String, dynamic> item) {
// STEP_ID STATUS
final int stepId = (item['STEP_ID'] is int) ? item['STEP_ID'] as int : 0;
final int status = (item['STATUS'] is int) ? item['STATUS'] as int : 0;
if (stepId == 0) {
return '暂存';
} else if (status == -2) {
return '气体检测打回';
} else if (stepId != -1) {
return item['NEXT_STEP_NAME'] ?? '';
} else {
return '${item['STEP_NAME'] ?? ''}打回';
}
}
//
Future<void> _showStepPicker() async {
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...')));
await _fetchSteps();
if (stepList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('无法加载步骤数据')));
return;
}
}
//
final options = stepList.map((e) => e['STEP_NAME'] as String).toList();
//
final choice = await BottomPicker.show<String>(
context,
items: options,
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
initialIndex: sindex,
);
if (choice != null) {
//
final newIndex = options.indexOf(choice);
if (newIndex != -1) {
setState(() {
sindex = newIndex;
});
_search();
}
}
}
Widget _buildListContent() {
if (isLoading && list.isEmpty) {
//
return Center(child: CircularProgressIndicator());
} else if (list.isEmpty) {
//
return NoDataWidget.show();
} else {
//
return ListView.builder(
padding: EdgeInsets.zero,
controller: _scrollController,
itemCount: list.length + (isLoading ? 1 : 0),
itemBuilder: (context, index) {
if (index >= list.length) {
//
return Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Center(child: CircularProgressIndicator()),
);
}
return _buildListItem(list[index]);
},
);
}
}
@override
Widget build(BuildContext context) {
final int lastDoneIndex = flowList.lastIndexWhere((e) => e['STATUS'] == 1);
return Scaffold(
key: _scaffoldKey,
appBar: MyAppbar(
title: '${widget.workTypeTitle}${widget.flow}',
actions: [
if (widget.flow == '提交申请')
TextButton(
onPressed: _handleApply,
child: const Text(
'申请',
style: TextStyle(color: Colors.white, fontSize: 17),
),
),
],
),
endDrawer: Drawer(
child: SafeArea(
child:
flowList.isEmpty
? Center(child: Text('暂无流程图数据'))
: ListView.builder(
padding: const EdgeInsets.symmetric(vertical: 16),
itemCount: flowList.length + 1, // +1
itemBuilder: (context, i) {
if (i == 0) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
child: Text(
'查看流程图',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
);
}
final idx = i - 1;
final item = flowList[idx];
final bool isFirst = idx == 0;
final bool isLast = idx == flowList.length - 1;
// lastDoneIndex
final int status;
if (idx <= lastDoneIndex) {
status = 1; //
} else if (idx == lastDoneIndex + 1) {
status = 0; //
} else {
status = -1; //
}
return _buildFlowStepItem(
item: item,
isFirst: isFirst,
isLast: isLast,
status: status,
);
},
),
),
),
body: Column(
children: [
// Filter bar
Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
child: Row(
children: [
//
SizedBox(
width: 65,
child: TextButton(
onPressed: _showStepPicker,
style: TextButton.styleFrom(
padding: EdgeInsets.symmetric(
vertical: 12,
horizontal: 5,
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'筛选',
style: TextStyle(color: Colors.black87, fontSize: 16),
),
Icon(Icons.arrow_drop_down, color: Colors.grey),
],
),
),
),
Expanded(
flex: 2,
child: SearchBarWidget(
showResetButton: false,
hintText: "请输入关键字",
// isClickableOnly: true,
onSearch: (text) {
_search();
},
controller: _searchController,
),
),
],
),
),
const Divider(height: 1),
// List
Expanded(child: _buildListContent()),
],
),
);
}
}

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';

View File

@ -1,7 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';
@ -124,7 +125,7 @@ class _WorkTabGcListState extends State<WorkTabGcList> {
default: default:
print("按钮 $index 被点击"); print("按钮 $index 被点击");
} }
pushPage(HotWorkListPage(flow: title, workTypeTitle: '高处作业',), context); pushPage(HighworkListPage(flow: title, workTypeTitle: '高处作业',), context);
} }
@override @override

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hot_work_list_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/tools.dart'; import 'package:qhd_prevention/tools/tools.dart';