qhd-prevention-flutter/lib/pages/home/work/custom_driver_drawer.dart

402 lines
11 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:convert';
import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/department_picker.dart';
import 'package:qhd_prevention/customWidget/toast_util.dart';
import 'package:qhd_prevention/pages/home/work/risk_list_picker.dart';
import 'package:qhd_prevention/pages/home/work/wait_list_picker.dart';
import 'package:qhd_prevention/pages/http/ApiService.dart';
import '../../../tools/h_colors.dart';
import '../../../customWidget/custom_button.dart';
import '../../../tools/tools.dart';
/// 自定义抽屉
class CustomDriverDrawer extends StatefulWidget {
const CustomDriverDrawer(this.treeData, {super.key,required this.onClose});
final Function(String,String,String) onClose; // 回调函数
final List<WaitListBean> treeData;
@override
_CustomDriverDrawerState createState() => _CustomDriverDrawerState();
}
class _CustomDriverDrawerState extends State<CustomDriverDrawer> {
// 管控部门 id
String? riskId;
// 风险点单元id
String? dept;
//风险等级
int _levelOption = -1;
List<String> dangerStatusId = ["levelA", "levelB", "levelC", "levelD"];
List<WaitListBean> jsonList =[];
String itemNameOne="请选择";
String itemNameTwo="请选择";
late List<RiskListBean> _list = [];
@override
void initState() {
// TODO: implement initState
super.initState();
setState(() {
try {
String? dangerJson = SessionService.instance.riskJson;
if(null!=dangerJson&&dangerJson.isNotEmpty) {
Map<String, dynamic> dangerWaitBean = json.decode(dangerJson);
riskId= dangerWaitBean["riskId"];
dept= dangerWaitBean["dept"];
_levelOption= dangerWaitBean["levelOption"];
itemNameOne= dangerWaitBean["itemNameOne"];
itemNameTwo= dangerWaitBean["itemNameTwo"];
}
// jsonList = parseDepartments(widget.treeJson);
jsonList.addAll(widget.treeData);
} catch (e) {
print("解析失败: $e");
}
// // 解析JSON字符串
// jsonList = json.decode(widget.treeJson);
// departmentList = List<Map<String, dynamic>>.from(jsonList);
});
}
List<WaitListBean> parseDepartments(String jsonString) {
// 1. 解码 JSON 字符串
final List<dynamic> jsonList = json.decode(jsonString);
// 2. 转换为部门对象列表
return jsonList
.map((jsonItem) => WaitListBean.fromJson(jsonItem))
.toList();
}
List<RiskListBean> parseRiskListBean(List<dynamic> jsonList) {
// 2. 转换为部门对象列表
return jsonList
.map((jsonItem) => RiskListBean.fromJson(jsonItem))
.toList();
}
@override
Widget build(BuildContext context) {
final List<String> dangerStatus = ["重大风险", "较大风险", "一般风险", "低风险"];
// 显示分类选择器
void showCategoryPicker(String type) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
barrierColor: Colors.black54,
backgroundColor: Colors.transparent,
builder: (ctx) => WaitListPicker(
data: jsonList,
onSelected: (item) {
setState(() {
// if("1"==type){
riskId = item?.id;
itemNameOne= item!.name;
// }else{
dept= null;
itemNameTwo="";
// }
setResult();
});
_getTreeListUnit();
},
),
);
}
// 显示分类选择器
void showCategoryPickerTwo(String type) {
if("2"==type&&riskId==null){
ToastUtil.showNormal(context, "请先选择部门");
return;
}
showModalBottomSheet(
context: context,
isScrollControlled: true,
barrierColor: Colors.black54,
backgroundColor: Colors.transparent,
builder: (ctx) => RiskListPicker(
data: _list,
onSelected: (item) {
setState(() {
// if("1"==type){
// dept= item?.id;
// itemNameOne= item!.name;
// }else{
riskId = item?.id;
itemNameTwo=item!.name;
// }
setResult();
});
},
),
);
}
return SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: const [
Text(
"高级查询",
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
],
),
const Divider(height: 24, color: Colors.grey),
// 管控部门
_buildDropdownBox(
"管控部门",
display: itemNameOne ?? '请选择',
onTap: () {
showCategoryPicker("1");
}
),
const SizedBox(height: 12),
// 风险点(单元)
_buildDropdownBox(
"风险点(单元)",
display: itemNameTwo ?? '请选择',
onTap: () {
showCategoryPickerTwo("2");
}
),
const SizedBox(height: 24),
const Text(
"风险等级",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
),
const SizedBox(height: 12),
// 风险等级:一行一个
Column(
children: List.generate(dangerStatus.length, (idx) {
final bool selected = _levelOption == idx;
return GestureDetector(
onTap: (){
setState(() {
_levelOption = idx;
setResult();
});
} ,
// onTap: () => setState(() => _dangerStatusOption = idx),
child: Container(
width: double.infinity,
margin: const EdgeInsets.only(bottom: 8),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),
decoration: BoxDecoration(
color: selected ? Colors.blue : Colors.transparent,
borderRadius: BorderRadius.circular(4),
border: Border.all(color: Colors.blue, width: 1),
),
child: Text(
dangerStatus[idx],
style: TextStyle(
fontSize: 14,
color: selected ? Colors.white : Colors.blue,
),
),
),
);
}),
),
const Spacer(),
Row(
children: [
Expanded(
flex: 1,
child: CustomButton(
text: "重置",
backgroundColor: h_backGroundColor(),
textStyle: const TextStyle(color: Colors.black45),
onPressed: () {
setState(() {
riskId = null;
dept=null;
_levelOption = -1;
itemNameOne="请选择";
itemNameTwo="请选择";
// widget.onClose("","","",);
setResult();
});
},
),
),
const SizedBox(width: 12),
Expanded(
flex: 2,
child: CustomButton(
text: "完成",
backgroundColor: Colors.blue,
onPressed: () {
// TODO: 提交筛选条件
Navigator.pop(context); // 关闭加载对话框
},
),
),
],
),
],
),
),
);
}
Widget _buildDropdownBox(String title,
{required String display, required VoidCallback onTap}) {
return GestureDetector(
onTap: onTap,
child: Container(
height: 48,
padding: const EdgeInsets.symmetric(horizontal: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
border: Border.all(color: Colors.grey.shade400),
color: Colors.white,
),
child: Row(
children: [
Text(title, style: const TextStyle(fontSize: 14)),
const Spacer(),
Row(
children: [
Text(_truncateText(display,9)),
const Icon(Icons.arrow_drop_down, color: Colors.grey),
],
),
],
),
),
);
}
// 文本截取函数
String _truncateText(String text, int maxLength) {
if (text.runes.length <= maxLength) {
return text;
}
return String.fromCharCodes(text.runes.take(maxLength)) + '...';
}
void setResult(){
DangerRiskBean waitBean= DangerRiskBean.fromJson(
riskId ?? "", dept?? "",
_levelOption,itemNameOne, itemNameTwo);
String jsonString = jsonEncode(waitBean.toJson());
SessionService.instance.setRiskWaitInfo(jsonString);
widget.onClose(
riskId ?? "",
dept ?? "",
_levelOption!=-1?dangerStatusId[_levelOption]:"",
); // 触发回调
}
Future<void> _getTreeListUnit( ) async {
try {
_list.clear();
final result = await ApiService.getTreeListUnit( riskId!);
if (result['result'] == 'success') {
final List<dynamic> newList = result['list'] ?? [];
setState(() {
_list.addAll(parseRiskListBean(newList));
// _list.addAll(newList);
});
}else{
_showMessage('加载数据失败');
}
} catch (e) {
// 出错时可以 Toast 或者在页面上显示错误状态
print('加载数据失败:$e');
}
}
void _showMessage(String msg) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));
}
}
class DangerRiskBean {
final String? riskId;
final String? dept;
//风险等级
final int levelOption;
final String itemNameOne;
final String itemNameTwo;
DangerRiskBean({
required this.riskId,
required this.dept,
required this.levelOption,
required this.itemNameOne,
required this.itemNameTwo,
});
factory DangerRiskBean.fromJson(String riskId, String dept,
int levelOption,
String itemNameOne, String itemNameTwo,) {
return DangerRiskBean(
riskId: riskId,
dept: dept,
levelOption: levelOption,
itemNameOne: itemNameOne,
itemNameTwo: itemNameTwo,
);
}
Map<String, dynamic> toJson() {
return {"riskId": riskId, "dept": dept,
"levelOption": levelOption,
"itemNameOne": itemNameOne, "itemNameTwo": itemNameTwo,};
}
}