QinGang_interested/lib/pages/home/hiddenDanger/hidden_danger_acceptance.dart

757 lines
26 KiB
Dart
Raw Normal View History

2026-05-19 17:39:46 +08:00
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/custom_button.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/hiddenDanger/hidden_record_detail_page.dart';
import 'package:qhd_prevention/pages/my_appbar.dart';
import 'package:qhd_prevention/tools/h_colors.dart';
import 'package:qhd_prevention/tools/tools.dart';
import 'dart:async';
enum DangerType {
detailsHiddenInvestigationRecord("排查隐患记录", "排查隐患记录-详情"),
ristRecord("隐患记录", "隐患记录详情"),
waitAcceptance("隐患验收", "隐患验收详情"),
acceptance("已验收隐患", "已验收隐患"),
acceptanced("已验收隐患", "已验收隐患-详情"),
hiddenIdentification("隐患确认", "隐患确认详情"),
wait("隐患整改", "隐患整改详情"),
expired("特殊处置审核", "特殊处置审核详情"),
delayReview("延期审核", "延期审核详情"),
ignoreHiddenDangers("忽略隐患", "忽略隐患详情"),
// 安全环保检查
safeCheckHiddenAssign("隐患指派", "指派"),
safeCheckHiddenAccept("隐患验收", "验收");
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
final String displayName;
final String detailTitle;
const DangerType(this.displayName, this.detailTitle);
}
class HiddenDangerAcceptance extends StatefulWidget {
const HiddenDangerAcceptance(this.dangerType, this.appItem, {super.key});
final DangerType dangerType;
final int appItem;
@override
State<HiddenDangerAcceptance> createState() => _HiddenDangerAcceptanceState();
}
class _HiddenDangerAcceptanceState extends State<HiddenDangerAcceptance> {
int _page = 1;
String searchKey = "";
int _totalPage = 1;
late List<dynamic> _list = [];
bool _isLoading = false;
bool _hasMore = true;
Timer? _debounceTimer;
String buttonTextOne = '查看';
String buttonTextTwo = '确认';
final TextEditingController _searchController = TextEditingController();
@override
void initState() {
super.initState();
// 初始均为空
_searchController.addListener(_onSearchChanged);
switch (widget.appItem) {
case 1:
buttonTextTwo = '确认';
break;
case 2:
buttonTextTwo = '查看';
break;
case 3:
buttonTextOne = '延期申请';
buttonTextTwo = '整改';
break;
case 4:
buttonTextTwo = '特殊处理审核';
break;
case 5:
buttonTextTwo = '延期审核';
break;
case 6:
buttonTextTwo = '验收';
break;
}
_getListData(false);
}
@override
void dispose() {
_debounceTimer?.cancel();
_searchController.removeListener(_onSearchChanged);
_searchController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
// 取屏幕宽度
final double screenWidth = MediaQuery.of(context).size.width;
return Scaffold(
appBar: MyAppbar(title: widget.dangerType.displayName),
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,
isShowSearchButton: false,
hintText: '请输入隐患描述',
onTextChanged: (value) {
if (_debounceTimer?.isActive ?? false) {
_debounceTimer!.cancel();
}
_debounceTimer = Timer(const Duration(milliseconds: 500), () {
print('搜索关键词: ${_searchController.text}');
_performSearch(_searchController.text);
});
},
onSearch: (keyboard) {
// _performSearch(_searchController.text);
},
),
),
Container(height: 5, color: h_backGroundColor()),
Expanded(
child:
_list.isEmpty
? NoDataWidget.show()
: ListView.builder(
itemCount: _list.length,
itemBuilder: (context, index) {
final item = _list[index];
return _fxitemCell(item);
},
),
),
],
);
}
Widget _fxitemCell(pageData) {
// 使用GestureDetector包裹整个列表项以添加点击事件
return GestureDetector(
onTap: () {},
child: Container(
margin: EdgeInsets.all(6),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
spreadRadius: 2,
blurRadius: 5,
offset: Offset(0, 3),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 标题
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start, // 添加这一行
children: [
Expanded(
child: Padding(
padding: EdgeInsets.only(left: 10, top: 15, right: 8),
child: Text(
'隐患描述: ${pageData['hiddenDesc'] ?? ''}',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
maxLines: 1, // 只显示一行
overflow: TextOverflow.ellipsis, // 超出部分显示省略号
),
),
),
// 状态标签
Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: _getLevelColor(pageData),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(12),
topRight: Radius.circular(12), // 改为右上角
),
),
child: Text(
pageData['hiddenLevelName'] ?? '',
style: TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
),
],
),
SizedBox(height: 16),
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 来源
Expanded(
child: Text(
_getSourceDangers(pageData),
style: TextStyle(fontSize: 14, color: Colors.black87),
),
),
// 隐患状态
// Expanded(
// child: Text(
// '隐患状态: ${_getState(pageData)}',
// style: TextStyle(fontSize: 14, color: Colors.black87),
// ),
// ),
],
),
),
SizedBox(height: 8),
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 来源
// Expanded(
// child: Text(
// _getSourceDangers(pageData),
// style: TextStyle(fontSize: 14, color: Colors.black87),
// ),
// ),
// 隐患状态
Expanded(
child: Text(
'隐患状态: ${_getState(pageData)}',
style: TextStyle(fontSize: 14, color: Colors.black87),
),
),
],
),
),
SizedBox(height: 8),
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 隐患发现人 - 使用 Expanded 包裹
Expanded(
child: Text(
'发现人:${truncateString(pageData['createName'] ?? '')}',
style: TextStyle(fontSize: 14, color: Colors.black87),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
// 隐患发现时间 - 使用 Expanded 包裹
Expanded(
child: Text(
'发现时间:${_changeTime(pageData['hiddenFindTime'] ?? '')}',
style: TextStyle(fontSize: 14, color: Colors.black87),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
),
),
],
),
),
if (widget.appItem != 1) SizedBox(height: 8),
if (widget.appItem != 1)
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 隐患确认人
Expanded(
child: Text(
'确认人:${pageData['confirmUserName'] ?? ''}',
style: TextStyle(fontSize: 14, color: Colors.black87),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Expanded(
child: Text(
'确认时间:${_changeTime(pageData['hiddenFindTime'] ?? '')}',
style: TextStyle(fontSize: 14, color: Colors.black87),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
),
),
],
),
),
if (widget.appItem == 6) SizedBox(height: 8),
if (widget.appItem == 6)
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 整改人
Expanded(
child: Text(
'整改人:${pageData['rectifyUserName'] ?? ''}',
style: TextStyle(fontSize: 14, color: Colors.black87),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Expanded(
child: Text(
'整改时间:${_changeTime(pageData['rectificationTime'] ?? '')}',
style: TextStyle(fontSize: 14, color: Colors.black87),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
),
),
],
),
),
if (pageData['hiddenYUserName'] != null &&
pageData['hiddenYUserName'].isNotEmpty)
SizedBox(height: 8),
if (pageData['hiddenYUserName'] != null &&
pageData['hiddenYUserName'].isNotEmpty)
Padding(
padding: EdgeInsets.only(left: 10, right: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// 整改人
Text(
'验收人: ${pageData['hiddenYUserName'] ?? ''}',
style: TextStyle(fontSize: 14, color: Colors.black87),
),
// Text(
// '隐患验收时间: ${_changeTime(pageData['hiddenYTime']??'')}',
// style: TextStyle(
// fontSize: 14,
// color: Colors.black87,
// ),
// ),
],
),
),
SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// 验收按钮
if (widget.appItem != 2 && (widget.appItem != 3 || pageData['noReviewExtensionNum'] == 0))
Expanded(
child: CustomButton(
height: 35,
onPressed: () async {
// print('查看: ${pageData['title']}');
if (widget.appItem == 3) {
await pushPage(
HiddenRecordDetailPage(
widget.dangerType,
8,
pageData['id'],
pageData['hiddenId'],
true,
),
context,
);
_page=1;
_getListData(false);
} else {
pushPage(
HiddenRecordDetailPage(
widget.dangerType,
widget.appItem,
pageData['id'],
pageData['hiddenId'],
false,
),
context,
);
}
},
backgroundColor: h_backGroundColor(),
textStyle: const TextStyle(color: Colors.black),
buttonStyle: ButtonStyleType.secondary,
text: buttonTextOne,
),
),
// Expanded(
// child: Container(
// height: 35,
// margin: EdgeInsets.only(left: 10, right: 5), // 调整间距
// decoration: BoxDecoration(
// border: Border.all(color: Colors.blue, width: 1.0),
// borderRadius: BorderRadius.circular(8),
// ),
// child: ElevatedButton(
// onPressed: () {
// // print('查看: ${pageData['title']}');
// if (widget.appItem == 3) {
// pushPage(
// HiddenRecordDetailPage(
// widget.dangerType,
// 8,
// pageData['id'],
// pageData['hiddenId'],
// true,
// ),
// context,
// );
// } else {
// pushPage(
// HiddenRecordDetailPage(
// widget.dangerType,
// widget.appItem,
// pageData['id'],
// pageData['hiddenId'],
// false,
// ),
// context,
// );
// }
// },
// style: ElevatedButton.styleFrom(
// backgroundColor: Colors.white,
// foregroundColor: Colors.blue,
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(8),
// ),
// elevation: 0,
// ),
// child: Text(buttonTextOne),
// ),
// ),
// ),
SizedBox(width: 10), // 使用width而不是height
// 查看详情按钮
Expanded(
child: CustomButton(
height: 35,
onPressed: () async {
// print('查看详情: ${pageData['title']}');
String text = await pushPage(
HiddenRecordDetailPage(
widget.dangerType,
widget.appItem,
pageData['id'],
pageData['hiddenId'],
widget.appItem != 2,
),
context,
);
if (text == '1') {
_page = 1;
_getListData(false);
}
},
backgroundColor: h_AppBarColor(),
textStyle: const TextStyle(color: Colors.white),
buttonStyle: ButtonStyleType.primary,
text: buttonTextTwo,
),
),
// Expanded(
// child: Container(
// height: 35,
// margin: EdgeInsets.only(left: 5, right: 10),
// child: ElevatedButton(
// onPressed: () async {
// // print('查看详情: ${pageData['title']}');
// String text = await pushPage(
// HiddenRecordDetailPage(
// widget.dangerType,
// widget.appItem,
// pageData['id'],
// pageData['hiddenId'],
// widget.appItem != 2,
// ),
// context,
// );
// if (text == '1') {
// _page = 1;
// _getListData(false);
// }
// },
// style: ElevatedButton.styleFrom(
// backgroundColor: Colors.blue,
// foregroundColor: Colors.white,
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(8),
// ),
// ),
// child: Text(buttonTextTwo),
// ),
// ),
// ),
],
),
SizedBox(height: 10),
],
),
),
);
}
void _performSearch(String keyword) {
// 执行搜索逻辑
// if (keyword.isNotEmpty) {
// print('执行搜索: $keyword');
// 调用API或其他搜索操作
// 输入请求接口
_page = 1;
searchKey = keyword;
_getListData(false);
// }
}
bool _onScroll(ScrollNotification n) {
if (n.metrics.pixels > n.metrics.maxScrollExtent - 100 &&
_hasMore &&
!_isLoading) {
_page++;
_getListData(true);
}
return false;
}
void _onSearchChanged() {
final query = _searchController.text.toLowerCase().trim();
setState(() {
print("=====>" + query);
// filtered = query.isEmpty ? original : _filterCategories(original, query);
});
}
Future<void> _getListData(bool loadMore) async {
try {
if (_isLoading) return;
_isLoading = true;
LoadingDialogHelper.show();
final Map<String, dynamic> result;
if (widget.appItem == 2) {
result = await HiddenDangerApi.getIgnoreList(_page, searchKey);
} else if (widget.appItem == 3) {
2026-05-21 16:23:51 +08:00
result = await HiddenDangerApi.getRectificationList(_page, searchKey,20);
2026-05-19 17:39:46 +08:00
} else if (widget.appItem == 4) {
result = await HiddenDangerApi.getSpecialHandlingList(
_page,
searchKey,
// isJGD ? '1' : '2',
);
} else if (widget.appItem == 5) {
result = await HiddenDangerApi.getDelayReviewList(
_page,
searchKey,
// isJGD ? '1' : '2',
);
} else if (widget.appItem == 6) {
result = await HiddenDangerApi.getHiddenDangerAcceptanceList(
_page,
searchKey,
);
} else {
result = await HiddenDangerApi.getConfirmationList(_page, searchKey);
}
LoadingDialogHelper.hide();
if (result['success']) {
_totalPage = result['totalPages'] ?? 1;
final List<dynamic> newList = result['data'] ?? [];
// setState(() {
// _list.addAll(newList);
// });
setState(() {
if (loadMore) {
_list.addAll(newList);
} else {
_list = newList;
}
_hasMore = _page < _totalPage;
// if (_hasMore) _page++;
});
} else {
ToastUtil.showNormal(context, "加载数据失败");
// _showMessage('加载数据失败');
}
} catch (e) {
LoadingDialogHelper.hide();
// 出错时可以 Toast 或者在页面上显示错误状态
print('加载数据失败:$e');
} finally {
// if (!loadMore) LoadingDialogHelper.hide();
_isLoading = false;
}
}
String _getSourceDangers(final item) {
int type = item["source"] ?? 0;
if (1 == type) {
return "隐患来源:隐患快报";
} else if (2 == type) {
return "隐患来源:清单排查";
} else if (3 == type) {
return "隐患来源:标准排查";
} else if (4 == type) {
return "隐患来源:安全环保检查(监管端)";
} else if (5 == type) {
return "隐患来源:安全环保检查(企业端)";
} else if (6 == type) {
return "隐患来源:消防点检";
} else if (7 == type) {
return "隐患来源:视频巡屏";
} else {
return "隐患来源:";
}
}
// 隐患等级颜色
Color _getLevelColor(final item) {
String type = item["hiddenLevelName"] ?? '';
if ("重大隐患" == type) {
return Colors.red;
} else if ("较大隐患" == type) {
return Color(0xFFFF6A4D);
} else if ("一般隐患" == type) {
return Colors.orange;
} else if ("轻微隐患" == type) {
return h_AppBarColor();
} else {
return Colors.green;
}
}
String _getState(final item) {
int type = item["state"];
2026-05-21 16:23:51 +08:00
if (100 == type) {
2026-05-19 17:39:46 +08:00
return "待确认";
2026-05-21 16:23:51 +08:00
} else if (200 == type) {
return "待整改";
} else if (201 == type) {
2026-05-19 17:39:46 +08:00
return "确认打回";
2026-05-21 16:23:51 +08:00
} else if (202 == type) {
2026-05-19 17:39:46 +08:00
return "待处理特殊隐患";
2026-05-21 16:23:51 +08:00
} else if (300 == type) {
return "已整改";
} else if (301 == type) {
2026-05-19 17:39:46 +08:00
return "已验收";
2026-05-21 16:23:51 +08:00
} else if (302 == type) {
2026-05-19 17:39:46 +08:00
return "验收打回";
2026-05-21 16:23:51 +08:00
} else if (303 == type) {
2026-05-19 17:39:46 +08:00
return "验收打回";
2026-05-21 16:23:51 +08:00
} else if (400 == type) {
return "已归档";
} else if (99 == type) {
2026-05-19 17:39:46 +08:00
return "强制关闭(人员变动)";
2026-05-21 16:23:51 +08:00
} else if (98 == type) {
2026-05-19 17:39:46 +08:00
return "安全环保检查/清单排查暂存";
2026-05-21 16:23:51 +08:00
} else if (102 == type) {
return "安全环保检查,隐患带指派";
} else if (97 == type) {
2026-05-19 17:39:46 +08:00
return "已过期";
2026-05-21 16:23:51 +08:00
} else if (101 == type) {
return "已忽略";
} else if (110 == type) {
return "待核实";
}else if (120 == type) {
return "待核定";
}else {
return "";
2026-05-19 17:39:46 +08:00
}
}
String _changeTime(String time) {
try {
// 解析 ISO 8601 格式的时间字符串
DateTime dateTime = DateTime.parse(time);
// 格式化为年月日
return DateFormat('yyyy-MM-dd').format(dateTime);
} catch (e) {
// 如果解析失败,返回原字符串或默认值
return ' ';
}
}
String truncateString(String input) {
if (input.length > 10) {
return '${input.substring(0, 10)}...';
}
return input;
}
}