flutter_integrated_whb/lib/pages/home/work/danger_page.dart

399 lines
12 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:ui';
import 'package:flutter/material.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> 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 {
final result = await ApiService.getHazardInvestigationList(id,searchKey);
if (result['result'] == 'success') {
final List<dynamic> newList = result['varList'] ?? [];
setState(() {
for(int i=0;i<newList.length;i++){
if(newList[i]["checkCount"]==0){
listOne.add(newList[i]);
}else{
listTwo.add(newList[i]);
}
}
listDates.addAll(listOne);
});
}else{
ToastUtil.showNormal(context, "加载数据失败");
// _showMessage('加载数据失败');
}
} catch (e) {
// 出错时可以 Toast 或者在页面上显示错误状态
print('加载数据失败:$e');
}
}
Future<void> _getStandardInvestigationList() async {
try {
final result = await ApiService.getStandardInvestigationList(id,searchKey);
if (result['result'] == 'success') {
final List<dynamic> newList = result['varList'] ?? [];
setState(() {
for(int i=0;i<newList.length;i++){
if(newList[i]["checkCount"]==0){
listOne.add(newList[i]);
}else{
listTwo.add(newList[i]);
}
}
listDates.addAll(listOne);
});
}else{
ToastUtil.showNormal(context, "加载数据失败");
// _showMessage('加载数据失败');
}
} catch (e) {
// 出错时可以 Toast 或者在页面上显示错误状态
print('加载数据失败:$e');
}
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
void _handleItemTap( item, int index) {
print("点击了是: ${index}");
switch(widget.type ){
case 1://隐患排查
pushPage(RiskListPage(widget.type,item["LISTMANAGER_ID"]), context);
break;
case 2://标准排查
appBarTitle="标准排查";
pushPage(RiskListPage(widget.type,item["CUSTOM_ID"]), context);
break;
}
}
// 显示分类选择器
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: "隐患排查",
actions: [
TextButton(
onPressed: () {
pushPage(ScanPage(), context);
},
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();
},
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(
title: item['NAME'],
details: [
'清单类型:${item['TYPENAME']}',
'排查周期:${item['PERIODNAME']}',
'包含检查项:${item['count']}',
'负责人:${item['USER_NAME']}',
'起始时间:${item['START_DATE']}-${item['END_DATE']}',
],
showBottomTags: showBottomTags,
bottomTags: [
riskTagText(1, "重大风险:${item['ACOUNT']}"),
riskTagText(2, "较大:${item['BCOUNT']}"),
riskTagText(3, "一般:${item['CCOUNT']}"),
riskTagText(4, "低:${item['DCOUNT']}"),
],
),
);
},
),
),
],
),
),
);
}
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"),
],
),
),
],
),
),
);
}
}
// 模拟数据模版
class NotificationItem {
final String title;
final String time;
NotificationItem(this.title, this.time);
}