2025.7.30 写到检查记录详情
parent
3a00844a57
commit
ac79be123b
|
@ -1656,6 +1656,51 @@ U6Hzm1ninpWeE+awIDAQAB
|
|||
);
|
||||
}
|
||||
|
||||
/// 获取检查记录列表
|
||||
static Future<Map<String, dynamic>> getCheckRecordListOne(String id,String keyword) {
|
||||
return HttpManager().request(
|
||||
basePath,
|
||||
'/app/checkrecord/list',
|
||||
method: Method.post,
|
||||
data: {
|
||||
"LISTMANAGER_ID": id,
|
||||
"KEYWORDS": keyword,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
"USER_ID": SessionService.instance.loginUserId,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// 获取检查记录列表
|
||||
static Future<Map<String, dynamic>> getCheckRecordList(String id,String keyword) {
|
||||
return HttpManager().request(
|
||||
basePath,
|
||||
'/app/customCheckRecord/list',
|
||||
method: Method.post,
|
||||
data: {
|
||||
"CUSTOM_ID": id,
|
||||
"KEYWORDS": keyword,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
"USER_ID": SessionService.instance.loginUserId,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// 获取检查记录详情
|
||||
static Future<Map<String, dynamic>> getInspectRecordsDetail(String id) {
|
||||
return HttpManager().request(
|
||||
basePath,
|
||||
'/app/checkrecord/goEdit',
|
||||
method: Method.post,
|
||||
data: {
|
||||
"CHECKRECORD_ID": id,
|
||||
"CORPINFO_ID": SessionService.instance.corpinfoId,
|
||||
"USER_ID": SessionService.instance.loginUserId,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,441 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:photo_view/photo_view_gallery.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
|
||||
|
||||
|
||||
class CheckRecordDetailPage extends StatefulWidget {
|
||||
const CheckRecordDetailPage(this.id, {super.key});
|
||||
|
||||
final String id;
|
||||
@override
|
||||
_CheckRecordDetailPageState createState() => _CheckRecordDetailPageState();
|
||||
}
|
||||
|
||||
class _CheckRecordDetailPageState extends State<CheckRecordDetailPage> {
|
||||
// 模拟数据
|
||||
// List<Map<String, dynamic>> varList = [
|
||||
// {"RISKPOINT_ID": "1", "CHECK_CONTENT": "安全设备检查", "ISNORMAL": "0", "IMGCOUNT": 2, "RECORDITEM_ID": "1001"},
|
||||
// {"RISKPOINT_ID": "2", "CHECK_CONTENT": "消防设施检查", "ISNORMAL": "1", "HIDDEN_ID": "2001"},
|
||||
// {"RISKPOINT_ID": "3", "CHECK_CONTENT": "电气线路检查", "ISNORMAL": "2"},
|
||||
// ];
|
||||
|
||||
List<Map<String, dynamic>> otherHiddenList = [
|
||||
{"HIDDEN_ID": "3001", "HIDDENDESCR": "应急通道堵塞"},
|
||||
{"HIDDEN_ID": "3002", "HIDDENDESCR": "安全标识缺失"},
|
||||
];
|
||||
|
||||
// Map<String, dynamic> pd = {
|
||||
// "LIST_NAME": "月度安全检查清单",
|
||||
// "SCREENTYPENAME": "常规排查",
|
||||
// "USERS": "张三",
|
||||
// "CHECK_TIME": "2023-06-15 10:30",
|
||||
// "DEPARTMENT_NAME": "安全部",
|
||||
// "POST_NAME": "安全主管",
|
||||
// "PERIODNAME": "每月一次",
|
||||
// "TYPENAME": "临时",
|
||||
// "START_DATE": "2023-06-01",
|
||||
// "END_DATE": "2023-06-30",
|
||||
// };
|
||||
|
||||
List<String> files = [
|
||||
"https://example.com/sign1.jpg",
|
||||
"https://example.com/sign2.jpg",
|
||||
];
|
||||
|
||||
// 地图相关
|
||||
// final LatLng _center = const LatLng(39.8883, 119.519);
|
||||
// final Set<Marker> _markers = {};
|
||||
double _scale = 13.0;
|
||||
|
||||
int _currentImageIndex = 0;
|
||||
bool _showImageViewer = false;
|
||||
|
||||
|
||||
dynamic pd;
|
||||
List<dynamic> imageList =[];
|
||||
List<dynamic> varList =[];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// 添加地图标记
|
||||
// _markers.add(Marker(
|
||||
// markerId: MarkerId("checkpoint"),
|
||||
// position: _center,
|
||||
// icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueBlue),
|
||||
// ));
|
||||
|
||||
|
||||
_getInspectRecordsDetail();
|
||||
}
|
||||
|
||||
Future<void> _getInspectRecordsDetail() async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getInspectRecordsDetail(widget.id);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> qianmingList = result['qianming'] ?? [];
|
||||
setState(() {
|
||||
pd= result['pd'];
|
||||
varList = result['varList'] ?? [];
|
||||
for(int i=0;i<qianmingList.length;i++){
|
||||
imageList.add(qianmingList[i]);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: _buildAppBar(),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
_buildSectionTitle("检查内容"),
|
||||
_buildCheckContentTable(),
|
||||
_buildSectionTitle("其他隐患信息"),
|
||||
_buildOtherHiddenTable(),
|
||||
// _buildMapSection(),
|
||||
_buildSectionTitle("清单信息"),
|
||||
_buildInfoList(),
|
||||
_buildSignPhotos(),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
AppBar _buildAppBar() {
|
||||
return AppBar(
|
||||
leading: IconButton(
|
||||
icon: Icon(Icons.arrow_back, color: Colors.white),
|
||||
onPressed: () => Navigator.pop(context),
|
||||
),
|
||||
title: Text("检查记录详情", style: TextStyle(color: Colors.white)),
|
||||
backgroundColor: Colors.blue,
|
||||
centerTitle: true,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildSectionTitle(String title) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 4,
|
||||
height: 16,
|
||||
color: Colors.blue,
|
||||
margin: EdgeInsets.only(right: 10),
|
||||
),
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCheckContentTable() {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey[300]!),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Table(
|
||||
border: TableBorder.all(color: Colors.grey[300]!),
|
||||
columnWidths: const {
|
||||
0: FlexColumnWidth(3),
|
||||
1: FlexColumnWidth(1),
|
||||
},
|
||||
children: [
|
||||
TableRow(
|
||||
decoration: BoxDecoration(color: Colors.grey[100]),
|
||||
children: [
|
||||
_buildTableHeaderCell("检查内容"),
|
||||
_buildTableHeaderCell("状态"),
|
||||
],
|
||||
),
|
||||
...varList.map((item) => TableRow(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Text(item["CHECK_CONTENT"]),
|
||||
),
|
||||
_buildStatusCell(item)
|
||||
],
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildStatusCell(Map<String, dynamic> item) {
|
||||
String status;
|
||||
Color color = Colors.black;
|
||||
VoidCallback? onTap;
|
||||
|
||||
switch (item["ISNORMAL"]) {
|
||||
case "0":
|
||||
status = "合格";
|
||||
color = Colors.blue;
|
||||
if (item["IMGCOUNT"] > 0) {
|
||||
onTap = () => _goToImgs(item["RECORDITEM_ID"]);
|
||||
}
|
||||
break;
|
||||
case "1":
|
||||
status = "不合格";
|
||||
color = Colors.blue;
|
||||
onTap = () => _goToDetail(item["HIDDEN_ID"]);
|
||||
break;
|
||||
case "2":
|
||||
status = "不涉及";
|
||||
color = Colors.blue;
|
||||
break;
|
||||
default:
|
||||
status = "存在未整改隐患";
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Center(
|
||||
child: Text(
|
||||
status,
|
||||
style: TextStyle(color: color),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildOtherHiddenTable() {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey[300]!),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Table(
|
||||
border: TableBorder.all(color: Colors.grey[300]!),
|
||||
columnWidths: const {
|
||||
0: FlexColumnWidth(3),
|
||||
1: FlexColumnWidth(1),
|
||||
},
|
||||
children: [
|
||||
TableRow(
|
||||
decoration: BoxDecoration(color: Colors.grey[100]),
|
||||
children: [
|
||||
_buildTableHeaderCell("隐患描述"),
|
||||
_buildTableHeaderCell("操作"),
|
||||
],
|
||||
),
|
||||
...otherHiddenList.map((item) => TableRow(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Text(item["HIDDENDESCR"]),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () => _goToDetail(item["HIDDEN_ID"]),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"查看",
|
||||
style: TextStyle(color: Colors.blue),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildTableHeaderCell(String text) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Center(
|
||||
child: Text(
|
||||
text,
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Widget _buildMapSection() {
|
||||
// return Container(
|
||||
// height: 300,
|
||||
// margin: EdgeInsets.symmetric(vertical: 10),
|
||||
// child: GoogleMap(
|
||||
// initialCameraPosition: CameraPosition(
|
||||
// target: _center,
|
||||
// zoom: _scale,
|
||||
// ),
|
||||
// markers: _markers,
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget _buildInfoList() {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.grey[300]!),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
_buildInfoRow("清单名称", pd["LIST_NAME"]),
|
||||
_buildInfoRow("排查清单类型", pd["SCREENTYPENAME"]),
|
||||
_buildInfoRow("检查人", pd["USERS"]),
|
||||
_buildInfoRow("检查时间", pd["CHECK_TIME"]),
|
||||
_buildInfoRow("所属部门", pd["DEPARTMENT_NAME"]),
|
||||
_buildInfoRow("所属岗位", pd["POST_NAME"]),
|
||||
_buildInfoRow("排查周期", pd["PERIODNAME"]),
|
||||
_buildInfoRow("清单类型", pd["TYPENAME"]),
|
||||
if (pd["TYPENAME"] == "临时")
|
||||
_buildInfoRow("排查日期", "${pd["START_DATE"]} - ${pd["END_DATE"]}"),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildInfoRow(String title, String value) {
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 15),
|
||||
decoration: BoxDecoration(
|
||||
border: Border(bottom: BorderSide(color: Colors.grey[300]!)),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(title, style: TextStyle(fontSize: 14)),
|
||||
Text(value, style: TextStyle(fontSize: 14, color: Colors.grey[600])),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildSignPhotos() {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("签字照片", style: TextStyle(fontWeight: FontWeight.bold)),
|
||||
SizedBox(height: 10),
|
||||
Container(
|
||||
height: 120,
|
||||
child: ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: files.length,
|
||||
itemBuilder: (context, index) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_currentImageIndex = index;
|
||||
_showImageViewer = true;
|
||||
});
|
||||
},
|
||||
child: Container(
|
||||
width: 150,
|
||||
margin: EdgeInsets.only(right: 10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
image: DecorationImage(
|
||||
image: NetworkImage(files[index]),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _goToDetail(String hiddenId) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => Scaffold(
|
||||
appBar: AppBar(title: Text("隐患详情")),
|
||||
body: Center(child: Text("隐患ID: $hiddenId")),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _goToImgs(String recordItemId) {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => Scaffold(
|
||||
appBar: AppBar(title: Text("图片详情")),
|
||||
body: Center(child: Text("记录项ID: $recordItemId")),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildImageViewer() {
|
||||
return Stack(
|
||||
children: [
|
||||
PhotoViewGallery.builder(
|
||||
itemCount: files.length,
|
||||
builder: (context, index) {
|
||||
return PhotoViewGalleryPageOptions(
|
||||
imageProvider: NetworkImage(files[index]),
|
||||
minScale: PhotoViewComputedScale.contained,
|
||||
maxScale: PhotoViewComputedScale.covered * 2,
|
||||
);
|
||||
},
|
||||
scrollPhysics: ClampingScrollPhysics(),
|
||||
backgroundDecoration: BoxDecoration(color: Colors.black),
|
||||
pageController: PageController(initialPage: _currentImageIndex),
|
||||
onPageChanged: (index) => setState(() => _currentImageIndex = index),
|
||||
),
|
||||
Positioned(
|
||||
top: 40,
|
||||
right: 20,
|
||||
child: IconButton(
|
||||
icon: Icon(Icons.close, color: Colors.white, size: 30),
|
||||
onPressed: () => setState(() => _showImageViewer = false),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,14 +1,21 @@
|
|||
|
||||
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/app/Danger_paicha/check_record_detail_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
class CheckRecordListPage extends StatefulWidget {
|
||||
const CheckRecordListPage({super.key});
|
||||
const CheckRecordListPage(this.id, this.type, {super.key});
|
||||
|
||||
final String id;
|
||||
final int type;
|
||||
@override
|
||||
_CheckRecordListPageState createState() => _CheckRecordListPageState();
|
||||
}
|
||||
|
@ -17,36 +24,126 @@ class _CheckRecordListPageState extends State<CheckRecordListPage>
|
|||
with SingleTickerProviderStateMixin {
|
||||
late TabController _tabController;
|
||||
int _selectedTab = 0;
|
||||
String keyWord="";
|
||||
|
||||
// 模拟数据
|
||||
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();
|
||||
List<dynamic> alreadyList = [];
|
||||
List<dynamic> overTimeList = [];
|
||||
dynamic ls;
|
||||
|
||||
List<dynamic> listDates = [];
|
||||
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tabController = TabController(length: 2, vsync: this);
|
||||
_tabController.addListener(() {
|
||||
if (!_tabController.indexIsChanging) {
|
||||
// if (!_tabController.indexIsChanging) {
|
||||
// setState(() => _selectedTab = _tabController.index);
|
||||
// }
|
||||
|
||||
if (_tabController.indexIsChanging) {
|
||||
setState(() => _selectedTab = _tabController.index);
|
||||
print('切换到标签:${_tabController.index}');
|
||||
listDates.clear();
|
||||
if(_selectedTab==0){
|
||||
listDates.addAll(alreadyList);
|
||||
}else{
|
||||
listDates.addAll(overTimeList);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
getListData();
|
||||
|
||||
}
|
||||
|
||||
void getListData(){
|
||||
switch(widget.type ){
|
||||
case 1://检查记录
|
||||
_getCheckRecordListOne();
|
||||
break;
|
||||
case 2://标准排查清单
|
||||
_getCheckRecordList();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _getCheckRecordListOne() async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getCheckRecordListOne(widget.id,keyWord);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
setState(() {
|
||||
ls= result['ls'];
|
||||
for(int i=0;i<newList.length;i++){
|
||||
if(newList[i]["TYPE"]=="1"){
|
||||
alreadyList.add(newList[i]);
|
||||
}else{
|
||||
overTimeList.add(newList[i]);
|
||||
}
|
||||
}
|
||||
listDates.addAll(alreadyList);
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _getCheckRecordList() async {
|
||||
try {
|
||||
|
||||
final result = await ApiService.getCheckRecordList(widget.id,keyWord);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
setState(() {
|
||||
ls= result['ls'];
|
||||
for(int i=0;i<newList.length;i++){
|
||||
if(newList[i]["TYPE"]=="1"){
|
||||
alreadyList.add(newList[i]);
|
||||
}else{
|
||||
overTimeList.add(newList[i]);
|
||||
}
|
||||
}
|
||||
listDates.addAll(alreadyList);
|
||||
});
|
||||
|
||||
}else{
|
||||
ToastUtil.showNormal(context, "加载数据失败");
|
||||
// _showMessage('加载数据失败');
|
||||
}
|
||||
} catch (e) {
|
||||
// 出错时可以 Toast 或者在页面上显示错误状态
|
||||
print('加载数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
void _handleItemTap(NotificationItem item, int index) {
|
||||
print("点击了是: ${item.title}");
|
||||
|
||||
void _handleItemTap( item, int index) {
|
||||
if(_selectedTab==0){
|
||||
print("点击了是: ${index}");
|
||||
pushPage(CheckRecordDetailPage(item['CHECKRECORD_ID']), context);
|
||||
}
|
||||
}
|
||||
// 显示分类选择器
|
||||
void showCategoryPicker() {
|
||||
|
@ -86,7 +183,9 @@ class _CheckRecordListPageState extends State<CheckRecordListPage>
|
|||
),
|
||||
|
||||
// Search bar
|
||||
Padding(
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: SearchBarWidget(
|
||||
showResetButton: false,
|
||||
|
@ -97,31 +196,37 @@ class _CheckRecordListPageState extends State<CheckRecordListPage>
|
|||
isClickableOnly: true,
|
||||
onSearch: (text) {
|
||||
print('----------');
|
||||
keyWord=text;
|
||||
getListData();
|
||||
|
||||
},
|
||||
controller: _searchController,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// List
|
||||
Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: _notifications.length,
|
||||
child: listDates.isEmpty
|
||||
? NoDataWidget.show()
|
||||
: ListView.separated(
|
||||
padding: EdgeInsets.only(top: 15),
|
||||
itemCount: listDates.length,
|
||||
separatorBuilder: (_, __) => const SizedBox(),
|
||||
itemBuilder: (context, index) {
|
||||
NotificationItem item = _notifications[index];
|
||||
final item = listDates[index];
|
||||
return GestureDetector(
|
||||
onTap: () => _handleItemTap(item, index),
|
||||
child: DannerRepainItem(
|
||||
title: '清单名称:测试的时候写的假数据',
|
||||
title: widget.type==1?'清单名称:${item['LIST_NAME']??""}':'清单名称:${item['CUSTOM_NAME']??""}',
|
||||
showTitleIcon: false,
|
||||
details: [
|
||||
'清单类型:测试',
|
||||
'排查周期:测试',
|
||||
'包含检查项:3',
|
||||
'负责人:是测试',
|
||||
'起始时间:2025-6-20',
|
||||
widget.type==1? '人员:${item['PRINCIPALNAME']??ls['USER_NAME']}':'人员:${item['USER_NAME']??ls['USER_NAME']}',
|
||||
'',
|
||||
'测试一下是否跳过时间'
|
||||
'检查周期:${returnTime(item['DATESTART'])}-${returnTime(item['DATEEND']).toString()}',
|
||||
'',
|
||||
_selectedTab==0?'检查人:${item['CHECK_USERS']}':'清单类型:${ls['TYPENAME']}',
|
||||
_selectedTab==0?'检查时间:${returnTime(item['CHECK_TIME'])}':'清单周期:${ls['PERIODNAME']}',
|
||||
],
|
||||
showBottomTags: false,
|
||||
|
||||
|
@ -137,12 +242,10 @@ class _CheckRecordListPageState extends State<CheckRecordListPage>
|
|||
}
|
||||
|
||||
|
||||
String returnTime(String time) {
|
||||
return time.substring(0, 16);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 模拟数据模版
|
||||
class NotificationItem {
|
||||
final String title;
|
||||
final String time;
|
||||
|
||||
NotificationItem(this.title, this.time);
|
||||
}
|
||||
|
|
|
@ -37,9 +37,19 @@ class _CheckRecordPageState extends State<CheckRecordPage> {
|
|||
|
||||
|
||||
|
||||
void _handleItemTap(RecordCheckModel model) {
|
||||
//item点击事件
|
||||
pushPage(CheckRecordListPage(), context);
|
||||
void _handleItemTap(item) {
|
||||
//item点击事件
|
||||
String id="";
|
||||
switch(widget.type ){
|
||||
case 1://检查记录
|
||||
id=item["LISTMANAGER_ID"];
|
||||
break;
|
||||
case 2://标准排查清单
|
||||
id=item["CUSTOM_ID"];
|
||||
break;
|
||||
}
|
||||
|
||||
pushPage(CheckRecordListPage(id,widget.type), context);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -176,7 +186,10 @@ class _CheckRecordPageState extends State<CheckRecordPage> {
|
|||
itemBuilder: (context, index) {
|
||||
final item = _list[index];
|
||||
return GestureDetector(
|
||||
onTap: () => _handleItemTap(item),
|
||||
onTap: (){
|
||||
_handleItemTap(item);
|
||||
} ,
|
||||
// => _handleItemTap(item),
|
||||
child: DannerRepainItem(
|
||||
showTitleIcon: true,
|
||||
title: '清单名称:${item['NAME']}',
|
||||
|
|
|
@ -174,7 +174,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
|
||||
responsibleId="";
|
||||
responsibleName="";
|
||||
// setResult();
|
||||
setResult();
|
||||
});
|
||||
|
||||
// 拉取该单位的人员列表并缓存
|
||||
|
@ -201,7 +201,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
|
||||
responsibleId=userId;
|
||||
responsibleName=name;
|
||||
// setResult();
|
||||
setResult();
|
||||
});
|
||||
|
||||
},
|
||||
|
@ -225,7 +225,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
|
||||
setState(() {
|
||||
_selectedQDType = choice;
|
||||
// setResult();
|
||||
setResult();
|
||||
});
|
||||
}
|
||||
}else if (type == 4) {
|
||||
|
@ -244,7 +244,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
|
||||
setState(() {
|
||||
_selectedZQTime = choice;
|
||||
// setResult();
|
||||
setResult();
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
}
|
||||
|
||||
|
||||
// setResult();
|
||||
setResult();
|
||||
|
||||
});
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
final dateFormat = DateFormat('yyyy-MM-dd');
|
||||
endTime=dateFormat.format(picked);
|
||||
|
||||
// setResult();
|
||||
setResult();
|
||||
|
||||
});
|
||||
}
|
||||
|
@ -446,7 +446,7 @@ class _CustomRecordDrawerState extends State<CustomRecordDrawer> {
|
|||
onPressed: () {
|
||||
// TODO: 提交筛选条件,包括 _startDate、_endDate
|
||||
Navigator.pop(context);
|
||||
setResult();// 关闭加载对话框
|
||||
// setResult();// 关闭加载对话框
|
||||
},
|
||||
),
|
||||
),
|
||||
|
|
|
@ -0,0 +1,293 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/search_bar_widget.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/notif/notif_detail_page.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
||||
|
||||
class InspectRecordsListPage extends StatefulWidget {
|
||||
const InspectRecordsListPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_InspectRecordsListPageState createState() => _InspectRecordsListPageState();
|
||||
}
|
||||
|
||||
class _InspectRecordsListPageState extends State<InspectRecordsListPage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
|
||||
final TextEditingController searchController = TextEditingController();
|
||||
late List<dynamic> _list = [];
|
||||
late TabController _tabController;
|
||||
int _selectedTab = 0;
|
||||
int pageNum = 1;
|
||||
|
||||
// 模拟数据
|
||||
final List<Map<String, dynamic>> _notifications = List.generate(10, (i) {
|
||||
bool read = i % 3 == 0;
|
||||
return {
|
||||
'title': '测试数据标题标题 ${i + 1}',
|
||||
'time': '2025-06-${10 + i} 12:3${i}',
|
||||
'read': read,
|
||||
};
|
||||
});
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tabController = TabController(length: 2, vsync: this);
|
||||
_tabController.addListener(() {
|
||||
// if (!_tabController.indexIsChanging) {
|
||||
// setState(() => _selectedTab = _tabController.index);
|
||||
// }
|
||||
|
||||
if (_tabController.indexIsChanging) {
|
||||
setState(() => _selectedTab = _tabController.index);
|
||||
print('切换到标签:${_tabController.index}');
|
||||
reRefreshData();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
_getNotifList("");
|
||||
}
|
||||
|
||||
void reRefreshData(){
|
||||
pageNum=1;
|
||||
_list.clear();
|
||||
searchController.text="";
|
||||
if(0==_selectedTab){
|
||||
_getNotifList("");
|
||||
}else{
|
||||
_getNotifEnterprise("");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _getNotifList(String keyWord) async {
|
||||
// LoadingDialogHelper.show(context);
|
||||
try {
|
||||
final result = await ApiService.getNotifList("-1", pageNum.toString(),keyWord);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
setState(() {
|
||||
_list.addAll(newList);
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('加载出错: $e');
|
||||
} finally {
|
||||
LoadingDialogHelper.hide(context);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _getNotifEnterprise(String keyWord) async {
|
||||
// LoadingDialogHelper.show(context);
|
||||
try {
|
||||
final result = await ApiService.getNotifEnterprise("-1", pageNum.toString(),keyWord);
|
||||
if (result['result'] == 'success') {
|
||||
final List<dynamic> newList = result['varList'] ?? [];
|
||||
setState(() {
|
||||
_list.addAll(newList);
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('加载出错: $e');
|
||||
} finally {
|
||||
LoadingDialogHelper.hide(context);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _deleteNotif(String id) async {
|
||||
// LoadingDialogHelper.show(context);
|
||||
try {
|
||||
final result = await ApiService.deleteNotif(id);
|
||||
if (result['result'] == 'success') {
|
||||
setState(() {
|
||||
reRefreshData();
|
||||
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
print('加载出错: $e');
|
||||
} finally {
|
||||
LoadingDialogHelper.hide(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tabController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
FocusScope.of(context).unfocus(); // 收起键盘
|
||||
},
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Scaffold(
|
||||
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: '企业公告')],
|
||||
),
|
||||
|
||||
// Search bar
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: SearchBarWidget(
|
||||
key: Key("searchBody"),
|
||||
controller: searchController,
|
||||
onSearch: (keyword) {
|
||||
print("用户输入的是: $keyword");
|
||||
// TODO: 执行搜索
|
||||
// String word="整改";
|
||||
pageNum=1;
|
||||
_list.clear();
|
||||
if(0==_selectedTab){
|
||||
_getNotifList(keyword);
|
||||
}else{
|
||||
_getNotifEnterprise(keyword);
|
||||
}
|
||||
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
// List
|
||||
Expanded(
|
||||
child:
|
||||
_list.isEmpty
|
||||
? NoDataWidget.show()
|
||||
: ListView.builder(
|
||||
itemCount: _list.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _itemCell(_list[index]);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _itemCell(final item) {
|
||||
return Column(
|
||||
children: [
|
||||
ListTile(
|
||||
onTap: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => NotifDetailPage(
|
||||
item,_selectedTab,
|
||||
onClose: (result) {
|
||||
print('详情页面已关闭,返回结果: $result');
|
||||
reRefreshData();
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// pushPage(NotifDetailPage(item,_selectedTab), context);
|
||||
},
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: 10,
|
||||
),
|
||||
title: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 20), // 减小底部间距
|
||||
child: Text(item['SYNOPSIS'], style: const TextStyle(fontSize: 14)),
|
||||
),
|
||||
|
||||
subtitle: Text(item['CREATTIME'], style: TextStyle(fontSize: 13)),
|
||||
|
||||
trailing: Container(
|
||||
constraints: const BoxConstraints(minHeight: 100), // 确保最小高度
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min, // 关键修改:使用最小尺寸
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
if (0 != _selectedTab)
|
||||
Text(
|
||||
item['TYPE'] == 1 ? '已读' : '未读',
|
||||
style: TextStyle(
|
||||
fontSize: 12, // 稍微减小字体大小
|
||||
color: item['TYPE'] == 1 ? Colors.grey : Colors.red,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 15),
|
||||
|
||||
if (0 != _selectedTab && item['TYPE'] == 1)
|
||||
SizedBox(
|
||||
height: 24, // 固定按钮高度
|
||||
child: TextButton(
|
||||
onPressed: () async{
|
||||
// 显示确认对话框
|
||||
bool? confirm = await showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text("确认删除"),
|
||||
content: Text("确定要删除这条通知吗?"),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context, false),
|
||||
// onPressed: () => Navigator.pop(context, false),
|
||||
child: Text("取消"),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context, true),
|
||||
// onPressed: () => Navigator.pop(context, true),
|
||||
child: Text("确定", style: TextStyle(color: Colors.red)),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
if (confirm == true) {
|
||||
_deleteNotif(item['NOTICECORPUSERID_ID']);
|
||||
}
|
||||
|
||||
},
|
||||
style: TextButton.styleFrom(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
backgroundColor: Colors.red,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
child: Text( '删除', style: TextStyle(fontSize: 13, color: Colors.white),),
|
||||
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Divider(height: 1, color: Colors.black12),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
278
pubspec.lock
278
pubspec.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue