475 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Dart
		
	
	
			
		
		
	
	
			475 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Dart
		
	
	
| import 'dart:ui';
 | ||
| 
 | ||
| import 'package:flutter/material.dart';
 | ||
| import 'package:intl/intl.dart';
 | ||
| import 'package:qhd_prevention/customWidget/danner_repain_item.dart';
 | ||
| import 'package:qhd_prevention/customWidget/department_picker.dart';
 | ||
| import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
 | ||
| import 'package:qhd_prevention/customWidget/toast_util.dart';
 | ||
| import 'package:qhd_prevention/http/ApiService.dart';
 | ||
| import 'package:qhd_prevention/pages/home/scan_page.dart';
 | ||
| import 'package:qhd_prevention/pages/home/work/risk_list_page.dart';
 | ||
| import 'package:qhd_prevention/pages/my_appbar.dart';
 | ||
| import 'package:qhd_prevention/tools/SmallWidget.dart';
 | ||
| import 'package:qhd_prevention/tools/tools.dart';
 | ||
| 
 | ||
| class DangerPage extends StatefulWidget {
 | ||
|   const DangerPage(this.type, {super.key});
 | ||
| 
 | ||
|   final int type;
 | ||
|   @override
 | ||
|   _DangerPageState createState() => _DangerPageState();
 | ||
| }
 | ||
| 
 | ||
| class _DangerPageState extends State<DangerPage>
 | ||
|     with SingleTickerProviderStateMixin {
 | ||
|   late TabController _tabController;
 | ||
|   int _selectedTab = 0;
 | ||
| 
 | ||
|   // // 模拟数据
 | ||
|   // final List<NotificationItem> _notifications = List.generate(10, (i) {
 | ||
|   //   bool read = i % 3 == 0;
 | ||
|   //   String title = '测试数据标题标题 ${i + 1}';
 | ||
|   //   String time = '2025-06-${10 + i} 12:3${i}';
 | ||
|   //   return NotificationItem(title, time);
 | ||
|   // });
 | ||
| 
 | ||
|   final TextEditingController _searchController = TextEditingController();
 | ||
| 
 | ||
|   String appBarTitle="";
 | ||
|   String id="";
 | ||
|   String searchKey="";
 | ||
|   String searchName="";
 | ||
|   bool showBottomTags=false;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|   List<dynamic> allList = [];
 | ||
|   List<dynamic> listOne = [];
 | ||
|   List<dynamic> listTwo = [];
 | ||
| 
 | ||
|   List<dynamic> listDates = [];
 | ||
| 
 | ||
|   @override
 | ||
|   void initState() {
 | ||
|     super.initState();
 | ||
|     _tabController = TabController(length: 2, vsync: this);
 | ||
|     _tabController.addListener(() {
 | ||
| 
 | ||
|     if (_tabController.indexIsChanging) {
 | ||
|       setState(() => _selectedTab = _tabController.index);
 | ||
|       print('切换到标签:${_tabController.index}');
 | ||
|       listDates.clear();
 | ||
|       setState(() {
 | ||
|         if(_selectedTab==0){
 | ||
|           listDates.addAll(listOne);
 | ||
| 
 | ||
|           if(widget.type==1){
 | ||
|             showBottomTags=true;
 | ||
|           }else{
 | ||
|             showBottomTags=false;
 | ||
|           }
 | ||
|         }else{
 | ||
|           listDates.addAll(listTwo);
 | ||
|           showBottomTags=false;
 | ||
|         }
 | ||
|       });
 | ||
|     }
 | ||
|   });
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|       if(widget.type==1){
 | ||
|         showBottomTags=true;
 | ||
|       }else{
 | ||
|         showBottomTags=false;
 | ||
|       }
 | ||
| 
 | ||
|     id=SessionService.instance.loginUser?["DEPARTMENT_ID"]??"";
 | ||
|     getListData();
 | ||
| 
 | ||
|   }
 | ||
| 
 | ||
| 
 | ||
|   void getListData(){
 | ||
|     listDates.clear();
 | ||
|     listOne.clear();
 | ||
|     listTwo.clear();
 | ||
|     switch(widget.type  ){
 | ||
|       case 1://隐患排查
 | ||
|         appBarTitle="隐患排查";
 | ||
|         _getHazardInvestigationList();
 | ||
|         break;
 | ||
|       case 2://标准排查
 | ||
|         appBarTitle="标准排查";
 | ||
|         _getStandardInvestigationList();
 | ||
|         break;
 | ||
|       // case 3://首页-待排查
 | ||
|       //   appBarTitle="待排查";
 | ||
|       //   // _getStandardInvestigationRecordList(_page,keyWord,"","","","","","",addList);
 | ||
|       //   break;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   Future<void> _getHazardInvestigationList() async {
 | ||
|     try {
 | ||
|       LoadingDialogHelper.show();
 | ||
|       final result = await ApiService.getHazardInvestigationList(id,searchKey);
 | ||
|       LoadingDialogHelper.hide();
 | ||
|       if (result['result'] == 'success') {
 | ||
|         final List<dynamic> newList = result['varList'] ?? [];
 | ||
|         allList.addAll(newList);
 | ||
|         setState(() {
 | ||
| 
 | ||
|           for(int i=0;i<newList.length;i++){
 | ||
|             if(newList[i]["checkCount"]==0){
 | ||
|               listOne.add(newList[i]);
 | ||
|             }else{
 | ||
|               listTwo.add(newList[i]);
 | ||
|             }
 | ||
|           }
 | ||
|           if(_selectedTab==0) {
 | ||
|             listDates.addAll(listOne);
 | ||
|           }else{
 | ||
|             listDates.addAll(listTwo);
 | ||
|           }
 | ||
|         });
 | ||
| 
 | ||
|       }else{
 | ||
|         ToastUtil.showNormal(context, result['msg']??"加载数据失败");
 | ||
|         // _showMessage('加载数据失败');
 | ||
|       }
 | ||
|     } catch (e) {
 | ||
|       LoadingDialogHelper.hide();
 | ||
|       // 出错时可以 Toast 或者在页面上显示错误状态
 | ||
|       print('加载数据失败:$e');
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   Future<void> _getStandardInvestigationList() async {
 | ||
|     try {
 | ||
|       LoadingDialogHelper.show();
 | ||
|       final result = await ApiService.getStandardInvestigationList(id,searchKey);
 | ||
|       LoadingDialogHelper.hide();
 | ||
|       if (result['result'] == 'success') {
 | ||
|         final List<dynamic> newList = result['varList'] ?? [];
 | ||
|         allList.addAll(newList);
 | ||
|         setState(() {
 | ||
| 
 | ||
|           for(int i=0;i<newList.length;i++){
 | ||
|             if(newList[i]["checkCount"]==0){
 | ||
|               listOne.add(newList[i]);
 | ||
|             }else{
 | ||
|               listTwo.add(newList[i]);
 | ||
|             }
 | ||
|           }
 | ||
|           if(_selectedTab==0) {
 | ||
|             listDates.addAll(listOne);
 | ||
|           }else{
 | ||
|             listDates.addAll(listTwo);
 | ||
|           }
 | ||
|         });
 | ||
| 
 | ||
|       }else{
 | ||
|         ToastUtil.showNormal(context, "加载数据失败");
 | ||
|         // _showMessage('加载数据失败');
 | ||
|       }
 | ||
|     } catch (e) {
 | ||
|       LoadingDialogHelper.hide();
 | ||
|       // 出错时可以 Toast 或者在页面上显示错误状态
 | ||
|       print('加载数据失败:$e');
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|   @override
 | ||
|   void dispose() {
 | ||
|     _tabController.dispose();
 | ||
|     super.dispose();
 | ||
|   }
 | ||
| 
 | ||
|   Future<void> _handleItemTap( item, int index) async {
 | ||
|     print("点击了是: ${index}");
 | ||
|     SessionService.instance.setListItemNameJson(item['NAME']);
 | ||
|     switch(widget.type  ){
 | ||
|       case 1://隐患排查
 | ||
|         // pushPage(RiskListPage(widget.type,item["LISTMANAGER_ID"]), context);
 | ||
|         final result = await Navigator.push(
 | ||
|           context,
 | ||
|           MaterialPageRoute(builder: (_) => RiskListPage(widget.type,item["LISTMANAGER_ID"],FormUtils.hasValue(item, "IDENTIFICATIONPARTS_ID")?item["IDENTIFICATIONPARTS_ID"]:"")),
 | ||
|         );
 | ||
|         break;
 | ||
|       case 2://标准排查
 | ||
|         // pushPage(RiskListPage(widget.type,item["CUSTOM_ID"]), context);
 | ||
|         final result = await Navigator.push(
 | ||
|           context,
 | ||
|           MaterialPageRoute(builder: (_) => RiskListPage(widget.type,item["CUSTOM_ID"],FormUtils.hasValue(item, "IDENTIFICATIONPARTS_ID")?item["IDENTIFICATIONPARTS_ID"]:"")),
 | ||
|         );
 | ||
|         break;
 | ||
|     }
 | ||
|     getListData();
 | ||
|   }
 | ||
| 
 | ||
|   // 显示分类选择器
 | ||
|   void showCategoryPicker() {
 | ||
|     showModalBottomSheet(
 | ||
|       context: context,
 | ||
|       isScrollControlled: true,
 | ||
|       barrierColor: Colors.black54,
 | ||
|       backgroundColor: Colors.transparent,
 | ||
|       builder:
 | ||
|           (ctx) => DepartmentPicker(onSelected: (id, name) {
 | ||
|             setState(() {
 | ||
|               searchKey=id;
 | ||
|               searchName=name;
 | ||
|               _searchController.text=name;
 | ||
|             });
 | ||
|             getListData();
 | ||
| 
 | ||
|           }),
 | ||
|     );
 | ||
|   }
 | ||
| 
 | ||
|   @override
 | ||
|   Widget build(BuildContext context) {
 | ||
|     return Scaffold(
 | ||
|       appBar: MyAppbar(
 | ||
|         title: appBarTitle,
 | ||
|         actions: [
 | ||
|           TextButton(
 | ||
|             onPressed: () {
 | ||
|               // pushPage(ScanPage(), context);
 | ||
|               _goScan();
 | ||
| 
 | ||
|             },
 | ||
|             child: Text(
 | ||
|               "清单扫描",
 | ||
|               style: TextStyle(color: Colors.white, fontSize: 16),
 | ||
|             ),
 | ||
|           ),
 | ||
|         ],
 | ||
|       ),
 | ||
|       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: '已排查')],
 | ||
|             ),
 | ||
| 
 | ||
|             Container(
 | ||
|               color: Colors.white,
 | ||
|               child: Padding(
 | ||
|               padding: const EdgeInsets.all(10),
 | ||
|               child: SearchBarWidget(
 | ||
|                 showResetButton: true,
 | ||
|                 onInputTap: () {
 | ||
|                   showCategoryPicker();
 | ||
| 
 | ||
|                 },
 | ||
|                 hintText: "",
 | ||
|                 isClickableOnly: true,
 | ||
|                 onSearch: (text) {
 | ||
|                   print('----------');
 | ||
|                   // searchKey=text;
 | ||
|                   // getListData();
 | ||
|                 },
 | ||
|                 onReset:  () {
 | ||
|                   setState(() {
 | ||
|                     searchKey="";
 | ||
|                     searchName="";
 | ||
|                   });
 | ||
|                   getListData();
 | ||
|                 },
 | ||
|                 controller: _searchController,
 | ||
|               ),
 | ||
|             ),
 | ||
|             ),
 | ||
| 
 | ||
|             // List
 | ||
|             Expanded(
 | ||
|               child:  listDates.isEmpty
 | ||
|                   ? NoDataWidget.show()
 | ||
|                   : ListView.separated(
 | ||
|                 padding: EdgeInsets.only(top: 15),
 | ||
|                 itemCount: listDates.length,
 | ||
|                 separatorBuilder: (_, __) => const SizedBox(),
 | ||
|                 itemBuilder: (context, index) {
 | ||
|                   final item = listDates[index];
 | ||
|                   return GestureDetector(
 | ||
|                     onTap: () => _handleItemTap(item, index),
 | ||
|                     child: DannerRepainItem(
 | ||
|                       showTitleIcon: (SessionService.instance.username==item['USER_NAME']),
 | ||
|                       title: item['NAME'],
 | ||
|                       details: [
 | ||
|                         '清单类型:${item['TYPENAME']}',
 | ||
|                         '排查周期:${item['PERIODNAME']}',
 | ||
|                         '包含检查项:${item['count']}',
 | ||
|                         '负责人:${item['USER_NAME']}',
 | ||
|                         // '起始时间:${item['START_DATE']}-${item['END_DATE']}',
 | ||
|                         '起始时间:${changeTimeString(item['START_DATE'])}-${changeTimeString(item['END_DATE'])}',
 | ||
| 
 | ||
|                       ],
 | ||
|                       showBottomTags: showBottomTags,
 | ||
|                       bottomTags: [
 | ||
|                         riskTagText(1, "重大风险:${item['ACOUNT']}"),
 | ||
|                         riskTagText(2, "较大:${item['BCOUNT']}"),
 | ||
|                         riskTagText(3, "一般:${item['CCOUNT']}"),
 | ||
|                         riskTagText(4, "低:${item['DCOUNT']}"),
 | ||
|                       ],
 | ||
|                     ),
 | ||
|                   );
 | ||
|                 },
 | ||
|               ),
 | ||
|             ),
 | ||
|           ],
 | ||
|         ),
 | ||
|       ),
 | ||
|     );
 | ||
|   }
 | ||
| 
 | ||
|   String changeTimeString(String dataTime) {
 | ||
|     final dateFormat = DateFormat('yyyy-MM-dd');
 | ||
|     // 先将字符串转换为 DateTime 对象
 | ||
|     DateTime dateTime = DateTime.parse(dataTime);
 | ||
|     // 然后格式化 DateTime 对象
 | ||
|     String newData = dateFormat.format(dateTime);
 | ||
|     return newData;
 | ||
|   }
 | ||
| 
 | ||
|   Widget _itemCell(final item) {
 | ||
|     return Padding(
 | ||
|       padding: EdgeInsets.only(left: 15, right: 15, bottom: 15),
 | ||
|       child: Container(
 | ||
|         decoration: const BoxDecoration(
 | ||
|           color: Colors.white,
 | ||
|           borderRadius: BorderRadius.all(Radius.circular(5)),
 | ||
|         ),
 | ||
|         child: Column(
 | ||
|           children: [
 | ||
|             Padding(
 | ||
|               padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15),
 | ||
|               child: Row(
 | ||
|                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | ||
|                 children: [
 | ||
|                   Row(
 | ||
|                     children: [
 | ||
|                       Icon(
 | ||
|                         Icons.star_rate_sharp,
 | ||
|                         color: Colors.green,
 | ||
|                         size: 18,
 | ||
|                       ),
 | ||
|                       SizedBox(width: 5),
 | ||
|                       Text("测试--------", style: TextStyle(fontSize: 14)),
 | ||
|                     ],
 | ||
|                   ),
 | ||
|                   Icon(
 | ||
|                     Icons.arrow_forward_ios_rounded,
 | ||
|                     color: Colors.grey,
 | ||
|                     size: 15,
 | ||
|                   ),
 | ||
|                 ],
 | ||
|               ),
 | ||
|             ),
 | ||
|             Divider(height: 1),
 | ||
|             Padding(
 | ||
|               padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15),
 | ||
|               child: Column(
 | ||
|                 spacing: 5,
 | ||
|                 children: [
 | ||
|                   Row(
 | ||
|                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | ||
|                     children: [
 | ||
|                       HhTextStyleUtils.secondaryTitle("清单类型:测试"),
 | ||
|                       HhTextStyleUtils.secondaryTitle("排查周期:测试"),
 | ||
|                     ],
 | ||
|                   ),
 | ||
|                   Row(
 | ||
|                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | ||
|                     children: [
 | ||
|                       HhTextStyleUtils.secondaryTitle("包含检查项:3"),
 | ||
|                       HhTextStyleUtils.secondaryTitle("负责人:是测试"),
 | ||
|                     ],
 | ||
|                   ),
 | ||
|                   Row(
 | ||
|                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | ||
|                     children: [
 | ||
|                       HhTextStyleUtils.secondaryTitle(
 | ||
|                         "起始时间:2025-6-20 - 2026-3-31",
 | ||
|                       ),
 | ||
|                       SizedBox(),
 | ||
|                     ],
 | ||
|                   ),
 | ||
|                 ],
 | ||
|               ),
 | ||
|             ),
 | ||
|             Padding(
 | ||
|               padding: EdgeInsets.only(top: 0, bottom: 15, left: 15, right: 15),
 | ||
|               child: Row(
 | ||
|                 spacing: 5,
 | ||
|                 children: [
 | ||
|                   riskTagText(1, "重大风险:0"),
 | ||
|                   riskTagText(2, "较大:3"),
 | ||
|                   riskTagText(3, "一般:1"),
 | ||
|                   riskTagText(4, "低:0"),
 | ||
|                 ],
 | ||
|               ),
 | ||
|             ),
 | ||
|           ],
 | ||
|         ),
 | ||
|       ),
 | ||
|     );
 | ||
|   }
 | ||
| 
 | ||
|   Future<void> _goScan() async {
 | ||
|     final result = await Navigator.push(
 | ||
|       context,
 | ||
|       MaterialPageRoute(builder: (_) => ScanPage(totalList: allList)),
 | ||
|     );
 | ||
| 
 | ||
|     dynamic item;
 | ||
|     for(int i=0;i<allList.length;i++){
 | ||
|       final listItem= allList[i];
 | ||
|       String code="";
 | ||
|       switch(widget.type  ){
 | ||
|         case 1://隐患排查
 | ||
|            code= listItem["LISTMANAGER_ID"];
 | ||
|           break;
 | ||
|         case 2://标准排查
 | ||
|            code= listItem["CUSTOM_ID"];
 | ||
|           break;
 | ||
|       }
 | ||
|       if(code==result){
 | ||
|         item=listItem;
 | ||
|       }
 | ||
|     }
 | ||
|     if(item!=null) {
 | ||
|       _handleItemTap(item, 0);
 | ||
|     }else{
 | ||
|       ToastUtil.showNormal(context, "无法检查该清单");
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| // 模拟数据模版
 | ||
| class NotificationItem {
 | ||
|   final String title;
 | ||
|   final String time;
 | ||
| 
 | ||
|   NotificationItem(this.title, this.time);
 | ||
| }
 |