336 lines
9.0 KiB
Dart
336 lines
9.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
|
import 'package:qhd_prevention/pages/home/work/custom_driver_drawer.dart';
|
|
import 'package:qhd_prevention/pages/home/risk/risk_detail_page.dart';
|
|
import 'package:qhd_prevention/pages/my_appbar.dart';
|
|
import 'package:qhd_prevention/tools/tools.dart';
|
|
import '../../../http/ApiService.dart';
|
|
import '../../../tools/h_colors.dart';
|
|
import '/customWidget/search_bar_widget.dart';
|
|
|
|
class RiskControlPage extends StatefulWidget {
|
|
const RiskControlPage({super.key});
|
|
|
|
@override
|
|
State<RiskControlPage> createState() => _RiskControlPageState();
|
|
}
|
|
|
|
class _RiskControlPageState extends State<RiskControlPage> {
|
|
|
|
int _page = 1;
|
|
String searchKey="";
|
|
int _totalPage=1;
|
|
late List<dynamic> _list = [];
|
|
bool _isLoading = false;
|
|
bool _hasMore = true;
|
|
|
|
String treeJson="";
|
|
|
|
|
|
|
|
// 风险等级颜色
|
|
final List<Color> _fxColors = [
|
|
const Color(0xFFFADBD9),
|
|
const Color(0xFFFCE6D2),
|
|
const Color(0xFFFDF2CE),
|
|
const Color(0xFFCCE6FF),
|
|
];
|
|
final TextEditingController _searchController = TextEditingController();
|
|
|
|
// 风险等级文本
|
|
final List<String> _levelTexts = ["重大风险/A级", "较大风险/B级", "一般风险/C级", "低风险/D级"];
|
|
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
getListData(false,"");
|
|
_getListTree();
|
|
SessionService.instance.setRiskWaitInfo("");
|
|
|
|
}
|
|
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// 取屏幕宽度
|
|
final double screenWidth = MediaQuery.of(context).size.width;
|
|
|
|
return Scaffold(
|
|
appBar: MyAppbar(
|
|
title: "风险分布",
|
|
actions: [
|
|
// 用 Builder 拿到 Scaffold 之下的 context
|
|
Builder(
|
|
builder: (innerContext) {
|
|
return TextButton(
|
|
onPressed: () {
|
|
// 通过 innerContext 调用 openEndDrawer
|
|
Scaffold.of(innerContext).openEndDrawer();
|
|
},
|
|
child: Text(
|
|
"查询",
|
|
style: TextStyle(color: Colors.white, fontSize: 16),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
|
|
//弹窗
|
|
endDrawer: Drawer(
|
|
// 用 Container 限制宽度为屏幕的 3/5
|
|
child: Container(
|
|
width: screenWidth * 3 / 5,
|
|
color: Colors.white,
|
|
child: CustomDriverDrawer(
|
|
treeJson,
|
|
onClose: (String riskId,String dept,String level) {
|
|
|
|
// _getDangerRecord(-1,_page,startDate,endDate,hazardLevelOption,investigationMethodOption,
|
|
// dangerStatusOption,selectedCategoryId,selectedDepartmentId,"",searchKey,false);
|
|
_page=1;
|
|
_getRiskRecord(_page,riskId,dept,level,searchKey,false);
|
|
|
|
},
|
|
),
|
|
),
|
|
),
|
|
|
|
|
|
body: SafeArea(
|
|
child: NotificationListener<ScrollNotification>(
|
|
onNotification: _onScroll,
|
|
child:_vcDetailWidget()
|
|
)
|
|
),
|
|
backgroundColor: Colors.white,
|
|
);
|
|
}
|
|
|
|
Widget _vcDetailWidget() {
|
|
return Column(
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.all(10),
|
|
child: SearchBarWidget(
|
|
controller: _searchController,
|
|
onSearch: (keyboard) {
|
|
// 输入请求接口
|
|
_page=1;
|
|
searchKey=keyboard;
|
|
getListData(false,keyboard);
|
|
},
|
|
),
|
|
),
|
|
Container(
|
|
height: 5,
|
|
color: h_backGroundColor(),
|
|
),
|
|
Expanded(
|
|
child: _list.isEmpty
|
|
? NoDataWidget.show()
|
|
: ListView.separated(
|
|
separatorBuilder: (_, __) => const Divider(height: 1),
|
|
itemCount: _list.length,
|
|
itemBuilder: (context, index) {
|
|
final item = _list[index];
|
|
return _fxitemCell(item);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Widget _fxitemCell(final item) {
|
|
int level;
|
|
// 确保level在有效范围内 (1-4)
|
|
// level = level.clamp(1, 4) - 1;
|
|
if(item['LEVELID']=="levelA"){
|
|
level=0;
|
|
}else if(item['LEVELID']=="levelB"){
|
|
level=1;
|
|
}else if(item['LEVELID']=="levelC"){
|
|
level=2;
|
|
}else {
|
|
level=3;
|
|
}
|
|
|
|
// 使用GestureDetector包裹整个列表项以添加点击事件
|
|
return GestureDetector(
|
|
onTap: () {
|
|
// 点击后跳转到详情页面
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => RiskDetailPage(itemData: item),
|
|
),
|
|
);
|
|
},
|
|
child: Container(
|
|
height: 100,
|
|
color: Colors.white,
|
|
padding: EdgeInsets.symmetric(horizontal: 16), // 添加水平内边距
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
// 左侧信息列
|
|
Expanded(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'部位名称:${item['PARTSNAME'] ?? ''}',
|
|
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
),
|
|
SizedBox(height: 8),
|
|
Text(
|
|
'风险点(单元):${item['RISKUNITNAME'] ?? ''}',
|
|
style: TextStyle(fontSize: 14, color: Colors.grey),
|
|
),
|
|
SizedBox(height: 4),
|
|
Text(
|
|
'管控部门:${item['DEPT_NAME'] ?? ''}',
|
|
style: TextStyle(fontSize: 14, color: Colors.grey),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
|
|
// 右侧风险等级和箭头
|
|
Padding(
|
|
padding: EdgeInsets.only(top: 15),
|
|
child: Column(
|
|
children: [
|
|
// 风险等级标签
|
|
Row(
|
|
children: [
|
|
Container(
|
|
padding: EdgeInsets.symmetric(
|
|
horizontal: 8,
|
|
vertical: 4,
|
|
),
|
|
decoration: BoxDecoration(
|
|
color: _fxColors[level],
|
|
borderRadius: BorderRadius.circular(2),
|
|
),
|
|
child: Text(
|
|
_levelTexts[level],
|
|
style: TextStyle(fontSize: 12),
|
|
),
|
|
),
|
|
SizedBox(width: 30),
|
|
],
|
|
),
|
|
SizedBox(height: 12), // 添加间距
|
|
Row(
|
|
children: [
|
|
SizedBox(width: 110),
|
|
Icon(Icons.arrow_forward_ios_rounded, size: 16),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
|
|
void getListData(bool addList,String keyWord){
|
|
_getRiskRecord(_page,"","","",keyWord,addList);
|
|
|
|
}
|
|
|
|
Future<void> _getRiskRecord(int currentPage,
|
|
String riskId,String dept,String level,String keyWord,bool loadMore) async {
|
|
try {
|
|
if (_isLoading) return;
|
|
_isLoading = true;
|
|
|
|
|
|
final result = await ApiService.getRiskRecordList( currentPage,
|
|
riskId, dept, level, keyWord);
|
|
|
|
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{
|
|
_showMessage('加载数据失败');
|
|
}
|
|
|
|
} catch (e) {
|
|
// 出错时可以 Toast 或者在页面上显示错误状态
|
|
print('加载数据失败:$e');
|
|
} finally {
|
|
// if (!loadMore) LoadingDialogHelper.hide();
|
|
_isLoading = false;
|
|
}
|
|
}
|
|
|
|
bool _onScroll(ScrollNotification n) {
|
|
if (n.metrics.pixels > n.metrics.maxScrollExtent - 100 &&
|
|
_hasMore && !_isLoading) {
|
|
|
|
_page++;
|
|
getListData(true,"");
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
Future<void> _getListTree() async {
|
|
try {
|
|
|
|
final result = await ApiService.getHiddenTreatmentListTree();
|
|
if (result['result'] == 'success') {
|
|
setState(() {
|
|
treeJson= result['zTreeNodes'];
|
|
});
|
|
|
|
}else{
|
|
_showMessage('加载数据失败');
|
|
}
|
|
} catch (e) {
|
|
// 出错时可以 Toast 或者在页面上显示错误状态
|
|
print('加载数据失败:$e');
|
|
}
|
|
}
|
|
|
|
void _showMessage(String msg) {
|
|
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|