From 192d24cea5447a6f25b29f50a5a28cc271f53842 Mon Sep 17 00:00:00 2001 From: xufei <727302827@qq.com> Date: Fri, 6 Mar 2026 17:59:44 +0800 Subject: [PATCH] =?UTF-8?q?2026.3.6=20=E6=99=BA=E8=83=BD=E9=97=A8=E7=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/door_banner.png | Bin 0 -> 74057 bytes assets/images/door_ico10.png | Bin 0 -> 1116 bytes assets/images/door_ico9.png | Bin 0 -> 1065 bytes lib/customWidget/item_list_widget.dart | 24 +- .../doorAndCar/car/doorArea_car_add_page.dart | 559 ++++++++++++++++++ .../car/onlyLook_car_application.dart | 320 ++++++++++ .../doorAndCar/car/onlyLook_doorarea_car.dart | 383 ++++++++++++ .../home/doorAndCar/doorArea_type_page.dart | 102 ++++ .../home/doorAndCar/doorCar_tab_page.dart | 317 ++++++++++ .../person/doorArea_person_add_page.dart | 458 ++++++++++++++ .../person/doorArea_person_record_page.dart | 356 +++++++++++ .../person/onlyLook_doorarea_person.dart | 351 +++++++++++ .../person/onlyLook_person_application.dart | 329 +++++++++++ .../doorAndCar/sign_instructions_webView.dart | 206 +++++++ lib/pages/home/home_page.dart | 4 + 15 files changed, 3400 insertions(+), 9 deletions(-) create mode 100644 assets/images/door_banner.png create mode 100644 assets/images/door_ico10.png create mode 100644 assets/images/door_ico9.png create mode 100644 lib/pages/home/doorAndCar/car/doorArea_car_add_page.dart create mode 100644 lib/pages/home/doorAndCar/car/onlyLook_car_application.dart create mode 100644 lib/pages/home/doorAndCar/car/onlyLook_doorarea_car.dart create mode 100644 lib/pages/home/doorAndCar/doorArea_type_page.dart create mode 100644 lib/pages/home/doorAndCar/doorCar_tab_page.dart create mode 100644 lib/pages/home/doorAndCar/person/doorArea_person_add_page.dart create mode 100644 lib/pages/home/doorAndCar/person/doorArea_person_record_page.dart create mode 100644 lib/pages/home/doorAndCar/person/onlyLook_doorarea_person.dart create mode 100644 lib/pages/home/doorAndCar/person/onlyLook_person_application.dart create mode 100644 lib/pages/home/doorAndCar/sign_instructions_webView.dart diff --git a/assets/images/door_banner.png b/assets/images/door_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5e4b3cabe7e60cdb04779a414d0a2b0fc4229f GIT binary patch literal 74057 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

kTsKoDrir@Pc(1{js5BwW89^D* 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/customWidget/item_list_widget.dart b/lib/customWidget/item_list_widget.dart index d9a725a..7f9154d 100644 --- a/lib/customWidget/item_list_widget.dart +++ b/lib/customWidget/item_list_widget.dart @@ -910,11 +910,13 @@ class ItemListWidget { bool isRequired = false, String text = '', void Function(String)? onTapCallBack, + double verticalInset = vertical_inset, + double horizontalInset = horizontal_inset, }) { return Container( - padding: const EdgeInsets.symmetric( - vertical: vertical_inset, - horizontal: horizontal_inset, + padding: EdgeInsets.symmetric( + vertical: verticalInset, + horizontal: horizontalInset, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -994,6 +996,8 @@ class ItemListWidget { double fontSize = 14, // 字体大小 void Function(String)? onTapCallBack, bool isRequired = true, + double verticalInset = vertical_inset, + double horizontalInset = horizontal_inset, }) { return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -1002,9 +1006,9 @@ class ItemListWidget { // 标题部分 if (title.isNotEmpty) Padding( - padding: const EdgeInsets.symmetric( - vertical: vertical_inset, - horizontal: horizontal_inset, + padding: EdgeInsets.symmetric( + vertical: verticalInset, + horizontal: horizontalInset, ), child: Text( title, @@ -1263,11 +1267,13 @@ class ItemListWidget { required String text, // 显示内容或提示 double fontSize = 14, // 字体大小 bool isRequired = true, + double verticalInset = vertical_inset, + double horizontalInset = horizontal_inset, }) { return Container( - padding: const EdgeInsets.symmetric( - vertical: vertical_inset, - horizontal: horizontal_inset, + padding: EdgeInsets.symmetric( + vertical: verticalInset, + horizontal: horizontalInset, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/home/doorAndCar/car/doorArea_car_add_page.dart b/lib/pages/home/doorAndCar/car/doorArea_car_add_page.dart new file mode 100644 index 0000000..3f38319 --- /dev/null +++ b/lib/pages/home/doorAndCar/car/doorArea_car_add_page.dart @@ -0,0 +1,559 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/http/modules/basic_info_api.dart'; + +import 'package:qhd_prevention/pages/home/doorAndCar/sign_instructions_webView.dart'; +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +import 'package:qhd_prevention/pages/mine/webViewPage.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/services/SessionService.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:flutter/gestures.dart'; + +class DoorareaCarAddPage extends StatefulWidget { + const DoorareaCarAddPage({super.key}); + + @override + State createState() => _DoorareaCarAddPageState(); +} + +class _DoorareaCarAddPageState extends State { + Map pd = {}; + bool _agreed = false; + + // 部门列表 + List _deptList = []; + List _personList = []; + List signImages = []; + + late bool _isMyCompanyArea = false; + late bool _isSelectCar = false; + + + List _vehicleImages = []; + List _vehicleLicenseImages = []; + + @override + void initState() { + super.initState(); + _getDept(); + } + + // 获取部门 + Future _getDept() async { + // try { + // final data = { + // 'eqCorpinfoId': widget.scanData['id'], + // // 'eqParentId': widget.scanData['corpinfoId'], + // }; + // final result = await BasicInfoApi.getDeptTree(data); + // if (result['success'] == true) { + // final list = result['data'] ?? []; + // if (list.length > 0) { + // setState(() { + // _deptList = list[0]['childrenList'] ?? []; + // }); + // } + // } + // } catch (e) {} + } + + // 提交 + Future _saveSuccess() async { + if (!FormUtils.hasValue(pd, 'corpinfoId')) { + ToastUtil.showNormal(context, '请选择部门'); + return; + } + if (!FormUtils.hasValue(pd, 'postName')) { + ToastUtil.showNormal(context, '请输入岗位'); + return; + } + // try { + // final result = await BasicInfoApi.userFirmEntry(pd); + // LoadingDialogHelper.hide(); + // if (result['success'] == true) { + // ToastUtil.showNormal(context, '申请成功'); + // _relogin(); + // } else { + // ToastUtil.showNormal(context, result['errMessage']); + // } + // } catch (e) { + // LoadingDialogHelper.hide(); + // ToastUtil.showNormal(context, '操作失败,请重试'); + // } + } + + Widget _addPersonWight(Map personData) { + return Stack( + children: [ + Padding(padding: const EdgeInsets.only(top: 5),child: Container( + margin: const EdgeInsets.symmetric(horizontal: 12), + // padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: Colors.white, + // 边框 + border: Border.all( + color: Colors.grey.shade300, + width: 1.0, + style: BorderStyle.solid, + ), + borderRadius: BorderRadius.circular(5), + ), + child: Column( + children: [ + const SizedBox(height: 10), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择部门:', + isEditable: true, + text: personData['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择人员:', + isEditable: true, + text: personData['postName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.itemContainer(RepairedPhotoSection( + isRequired: true, + title: "人员照片", + maxCount: 1, + horizontalPadding: 0, + mediaType: MediaType.image, + isShowAI: false, + onChanged: (List files) {}, + onAiIdentify: () {}, + ),), + const SizedBox(height: 10) + ], + ) + ),), + Positioned( + top: 0, + right: 2, + child: Container( + padding: const EdgeInsets.all(2), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + + child: GestureDetector( + child: const Icon(Icons.close, size: 14, color: Colors.white,), + onTap: () { + setState(() { + _personList.remove(personData); + }); + }, + ), + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '车辆申请'), + body: SafeArea( + child: ItemListWidget.itemContainer( + horizontal: 5, + vertical: 12, + ListView( + children: [ + + + ListItemFactory.createBuildSimpleSection('申请信息'), + + + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择管辖单位:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async { + if (_deptList.isEmpty) { + ToastUtil.showNormal(context, '暂无部门信息'); + return; + } + final found = await BottomPicker.show( + context, + items: _deptList, + itemBuilder: + (i) => Text(i['name']!, textAlign: TextAlign.center), + initialIndex: 0, + ); + //FocusHelper.clearFocus(context); + + if (found != null) { + setState(() { + pd['departmentId'] = found['id']; + pd['departmentName'] = found['name']; + pd['corpinfoId'] = found['corpinfoId']; + pd['corpinfoName'] = found['corpinfoName']; + }); + } + }, + ), + + + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择管辖区域:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择项目:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择时间:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.multiLineTitleTextField( + label: '申请原因', + isEditable: true, + ), + + + + + ///车辆信息 + ListItemFactory.createBuildSimpleSection('车辆信息'), + + const Divider(), + + Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: ItemListWidget.selectableLineTitleTextRightButton( + label: '驾驶人部门', + isEditable: !_isSelectCar, + onTap: () { + + }, + text: '', + ), + ), + const Divider(height: 1,), + + Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: ItemListWidget.selectableLineTitleTextRightButton( + label: '驾驶人', + isEditable: !_isSelectCar, + onTap: () { + + }, + text: '', + ), + ), + const Divider(height: 1,), + + + Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌类型', + isEditable: !_isSelectCar, + onTap: () { + + }, + text: '', + ), + ), + + const Divider(height: 1,), + Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: ItemListWidget.selectableLineTitleTextRightButton( + label: '车辆类型', + isEditable: !_isSelectCar, + onTap: () { + + }, + text: '', + ), + ), + + const Divider(height: 1,), + Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌号', + isEditable: !_isSelectCar, + onTap: () { + + }, + text: '', + ), + ), + // ItemListWidget.singleLineTitleText( + // label: '车牌号', + // isEditable: !_isSelectCar, + // text: '', + // onChanged: (value) { + // + // }, + // ), + + + const Divider(), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8), + child: RepairedPhotoSection( + isRequired:true, + title: "车辆照片", + maxCount: 4, + mediaType: MediaType.image, + isShowAI: false, + onChanged: (List files) { + // 上传图片 files + _vehicleImages.clear(); + for(int i=0;i files) { + // 上传图片 files + _vehicleLicenseImages.clear(); + for(int i=0;i SignInstructionsWebview( + name: "安全进港须知", + url: + 'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', + )), + ); + await NativeOrientation.setPortrait(); + if (path != null) { + setState(() { + setState(() { + _agreed = true; + signImages = []; + signImages.add(path); + }); + }); + } + + // pushPage( + // const SignInstructionsWebview( + // name: "安全进港须知", + // url: + // 'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', + // ), + // context, + // ); + }, + ), + ], + ), + ), + ), + ], + ), + + + // Container( + // padding: EdgeInsets.symmetric(horizontal: 12), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // ListItemFactory.headerTitle('签字:', isRequired: true), + // CustomButton( + // text: signImages.isNotEmpty ? '重新签字' : '手写签字', + // height: 36, + // backgroundColor: Colors.blue, + // onPressed: _sign, + // ), + // ], + // ), + // ), + if (signImages.isNotEmpty) _signListWidget(), + + SizedBox(height: 10,), + + CustomButton( + text: '提交申请', + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), + height: 40, + backgroundColor: Colors.blue, + onPressed: () { + _saveSuccess(); + }, + ), + ], + ), + ), + ), + ); + } + + + + Widget _signListWidget() { + return Column( + children: + signImages.map((path) { + return Column( + children: [ + const SizedBox(height: 15), + // const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 200, + maxHeight: 150, + ), + child: Image.file( + File(path), + // 改为完整显示 + fit: BoxFit.contain, + ), + ), + onTap: () { + presentOpaque( + SingleImageViewer(imageUrl: path), + context, + ); + }, + ), + Column( + children: [ + Container( + padding: const EdgeInsets.only(right: 5), + child: CustomButton( + text: 'X', + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 10), + backgroundColor: Colors.red, + onPressed: () { + setState(() { + signImages.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + + + + +} diff --git a/lib/pages/home/doorAndCar/car/onlyLook_car_application.dart b/lib/pages/home/doorAndCar/car/onlyLook_car_application.dart new file mode 100644 index 0000000..5d0efb8 --- /dev/null +++ b/lib/pages/home/doorAndCar/car/onlyLook_car_application.dart @@ -0,0 +1,320 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/h_colors.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + +class CarApplicationRecord extends StatefulWidget { + const CarApplicationRecord(this.type, {super.key}); + + final int type;//1 一级口门人员审核 2 一级口门车辆审核 3 审批记录(人员) 4 审批记录(车辆) + + @override + State createState() => _CarApplicationRecordState(); +} + +class _CarApplicationRecordState extends State { + // 申请信息数据 + final Map applicationInfo = { + 'mingcheng': '项目名称', + 'bumen': '审核人员部门', + 'renyuan': '审核人员', + 'shijian': '2024-01-01 至 2024-12-31', + 'gangqu': '访问港区', + 'diqu': '访问地区', + }; + + // 车辆信息数据 + final Map vehicleInfo = { + 'name': '驾驶人姓名', + 'type': '车辆类型', + 'licenseType': '车牌号类型', + 'license': '车牌号',}; + + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '车辆审核记录'), + body: + Container( + color: Colors.white, + child: SingleChildScrollView( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 申请信息标题 + _buildSectionTitle('申请信息'), + SizedBox(height: 12), + + // 申请信息卡片 + _buildInfoCard(applicationInfo), + SizedBox(height: 24), + + // 车辆信息标题 + _buildSectionTitle('车辆信息'), + SizedBox(height: 12), + + // 车辆信息卡片 + _buildCarCard(vehicleInfo), + SizedBox(height: 16), + + + // SizedBox(height: 10), + + // 底部按钮 + if(widget.type==2) + _buildActionButtons(), + + if(widget.type==4) + CustomButton( + height: 35, + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle: ButtonStyleType.primary, + text: '关闭') + + ], + ), + ), + ), + + ); + } + + Widget _buildSectionTitle(String title) { + return Text( + title, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ); + } + + Widget _buildInfoCard(info) { + return Padding( + padding: EdgeInsets.only(top: 0), + child: Column( + children: [ + + ItemListWidget.selectableLineTitleTextRightButton( + label: '项目名称:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['mingcheng'] ?? '', + onTap: () {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '访问港区:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['gangqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '区域范围:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['diqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['bumen'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['renyuan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '所属项目:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['mingcheng'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择时间:', + isEditable: false, + horizontalnum: 0, + text: applicationInfo['shijian'] ?? '', + onTap: () {}, + ), + const Divider(), + + ], + ), + + ); + } + + Widget _buildCarCard(info) { + return Padding( + padding: EdgeInsets.only(top: 0), + child: Column( + children: [ + + ItemListWidget.selectableLineTitleTextRightButton( + label: '驾驶人姓名:', + isEditable: false, + horizontalnum: 0, + text: info['name'] ?? '', + onTap: () {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '车辆类型:', + isEditable: false, + horizontalnum: 0, + text: info['type'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌号类型:', + isEditable: false, + horizontalnum: 0, + text: info['licenseType'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌号:', + isEditable: false, + horizontalnum: 0, + text: info['license'] ?? '', + onTap: () {}, + ), + const Divider(), + + // 照片信息 + _buildPhotoItem(1), + const Divider(), + _buildPhotoItem(2), + const Divider(), + // _buildPhotoItem(3), + Container( + height: 150, + padding: EdgeInsets.all(8), + alignment: Alignment.center, + child: Image.network('${ApiService.baseImgPath}1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'), + ), + // const Divider(), + + ], + ), + + ); + } + + Widget _buildPhotoItem(int witch) { + String labelName=''; + switch(witch){ + case 1: + labelName='车辆照片'; + break; + case 2: + labelName='行驶证照片'; + break; + case 3: + labelName='机动车登记证书'; + break; + } + return Padding( + padding: EdgeInsets.only(bottom: 12), + child: + ItemListWidget.twoRowTitleAndImages( + title: labelName, + horizontalInset:0, + onTapCallBack: (path) { + presentOpaque(SingleImageViewer(imageUrl: path), context); + }, + imageUrls: ['1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg','1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'], + ), + // ItemListWidget.OneRowImageTitle( + // label: labelName, + // text: '', + // onTapCallBack: (path) { + // presentOpaque(SingleImageViewer(imageUrl: path), context); + // }, + // imgPath: '1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg', + // ), + ); + } + + Widget _buildActionButtons() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 验收按钮 + + Expanded( + child: CustomButton( + height: 35, + onPressed: () async { + final confirmed = await CustomAlertDialog.showInput( + context, + title: "驳回原因", + hintText: '输入内容', + cancelText: '关闭', + confirmText: '确定', + ); + if (confirmed != null) { + ToastUtil.showNormal(context, confirmed); + } + }, + backgroundColor: h_backGroundColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle: ButtonStyleType.secondary, + text: '驳回') + ), + + SizedBox(width: 10), // 使用width而不是height + // 查看详情按钮 + Expanded( + child: CustomButton( + height: 35, + onPressed: () { + + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle: ButtonStyleType.primary, + text: '审核通过') + ), + + ], + ); + } +} diff --git a/lib/pages/home/doorAndCar/car/onlyLook_doorarea_car.dart b/lib/pages/home/doorAndCar/car/onlyLook_doorarea_car.dart new file mode 100644 index 0000000..1b1232d --- /dev/null +++ b/lib/pages/home/doorAndCar/car/onlyLook_doorarea_car.dart @@ -0,0 +1,383 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.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 'package:shared_preferences/shared_preferences.dart'; + + +class OnlylookDoorareaCar extends StatefulWidget { + const OnlylookDoorareaCar(this.type, {super.key}); + + final int type;//1 审核 2 查看 + + @override + State createState() => _OnlylookDoorareaCarState(); +} + +class _OnlylookDoorareaCarState extends State { + + // 模拟申请信息数据 + final Map applicationInfo = { + 'mingcheng': '项目名称', + 'bumen': '审核人员部门', + 'renyuan': '审核人员', + 'shijian': '2024-01-01 至 2024-12-31', + 'gangqu': '访问港区', + 'diqu': '访问地区', + }; + + // 模拟人员列表数据 + final Map personnelList = + { + 'name': '张三', + 'bumen': '技术部', + 'isPei': '是', + 'wan': 'A区、B区', + }; + + /// 是否是监管端 + bool isJGD = false; + + + @override + void initState() { + super.initState(); + + _getTypeTitle(); + + } + + + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '车辆审核'), + body: + Container( + color: Colors.white, + child: SingleChildScrollView( + padding: EdgeInsets.all(16), + child: + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + // 申请信息卡片 + _buildInfoCard(), + SizedBox(height: 10), + + // 人员列表 + _buildPersonCard(), + + SizedBox(height: 10,), + if(widget.type==1) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 验收按钮 + + Expanded( + child:CustomButton( + height: 35, + onPressed: () async { + + final confirmed = await CustomAlertDialog.showInput( + context, + title: "驳回原因", + hintText: '输入内容', + cancelText: '关闭', + confirmText: '确定', + ); + if (confirmed!=null) { + ToastUtil.showNormal(context, confirmed); + } + + }, + backgroundColor: h_backGroundColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle:ButtonStyleType.secondary, + text: '驳回') + ), + + SizedBox(width: 10), // 使用width而不是height + // 查看详情按钮 + Expanded( + child:CustomButton( + height: 35, + onPressed: () { + + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle:ButtonStyleType.primary, + text: '审核通过') + ), + + ], + ), + + if(widget.type==2) + CustomButton( + height: 35, + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle:ButtonStyleType.primary, + text: '关闭'), + + + ], + ), + ), + ), + + ); + } + + Widget _buildInfoCard() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 10), + child: Text( + '申请信息', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 信息列表 + ItemListWidget.selectableLineTitleTextRightButton( + label: '管辖单位:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['mingcheng'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '管辖区域:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['bumen'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['renyuan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['diqu'] ?? '', + onTap: () {}, + ), + + // if((applicationInfo['gangqu'] ?? '').isNotEmpty) + const Divider(), + // if((applicationInfo['gangqu'] ?? '').isNotEmpty) + ItemListWidget.selectableLineTitleTextRightButton( + label: '所属项目:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['gangqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '时间范围:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['shijian'] ?? '', + onTap: () {}, + ), + const Divider(), + + + ItemListWidget.twoRowTitleText( + label: '申请原因:', + text: applicationInfo['shijian']??'', + horizontalInset:0, + ), + const Divider(), + + ], + ), + ); + } + + Widget _buildPersonCard() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 10), + child: Text( + '车辆信息', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 信息列表 + ItemListWidget.selectableLineTitleTextRightButton( + label: '驾驶人部门:', + isEditable: false, + horizontalnum:0, + text: personnelList['name'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '驾驶人:', + isEditable: false, + horizontalnum:0, + text: personnelList['bumen'] ?? '', + onTap: () {}, + ), + const Divider(), + + // ItemListWidget.selectableLineTitleTextRightButton( + // label: '手机号:', + // isEditable: false, + // horizontalnum:0, + // text: personnelList['wan'] ?? '', + // onTap: () {}, + // ), + // const Divider(), + // + // ItemListWidget.selectableLineTitleTextRightButton( + // label: '部门:', + // isEditable: false, + // horizontalnum:0, + // text: personnelList['wan'] ?? '', + // onTap: () {}, + // ), + // const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '车辆类型:', + isEditable: false, + horizontalnum:0, + text: personnelList['wan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌类型:', + isEditable: false, + horizontalnum:0, + text: personnelList['wan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '车牌号:', + isEditable: false, + horizontalnum:0, + text: personnelList['wan'] ?? '', + onTap: () {}, + ), + const Divider(), + + + ItemListWidget.twoRowTitleAndImages( + title: '车辆照片', + horizontalInset:0, + onTapCallBack: (path) { + presentOpaque(SingleImageViewer(imageUrl: path), context); + }, + imageUrls: ['1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg','1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'], + ), + // ItemListWidget.OneRowImageTitle( + // label: '车辆照片:', + // imgPath: '1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg', + // horizontalInset:0, + // onTapCallBack: (imgUrl) { + // presentOpaque(SingleImageViewer(imageUrl: imgUrl), context); + // }, + // ), + const Divider(), + + ItemListWidget.twoRowTitleAndImages( + title: '行驶证照片', + horizontalInset:0, + onTapCallBack: (path) { + presentOpaque(SingleImageViewer(imageUrl: path), context); + }, + imageUrls: ['1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg','1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'], + ), + const Divider(), + + Container( + height: 150, + padding: EdgeInsets.all(8), + alignment: Alignment.center, + child: Image.network('${ApiService.baseImgPath}1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'), + ), + + + ], + ), + ); + } + + + + Future _getTypeTitle() async { + String text= await _getString('selectedRole'); + setState(() { + if(text=='fgszd'||text=='FGSZD'){//分公司 + isJGD=false; + }else{//监管端 + isJGD=true; + } + }); + } + + Future _getString(String key) async { + final prefs = await SharedPreferences.getInstance(); + String text=prefs.getString(key)??''; + return text; + } + + +} diff --git a/lib/pages/home/doorAndCar/doorArea_type_page.dart b/lib/pages/home/doorAndCar/doorArea_type_page.dart new file mode 100644 index 0000000..2dfe43e --- /dev/null +++ b/lib/pages/home/doorAndCar/doorArea_type_page.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/person/doorArea_person_record_page.dart'; + + +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + +class DoorareaTypePage extends StatefulWidget { + const DoorareaTypePage(this.type, {super.key}); + + final int type;//1 进港口门申请 2 进港口门申请记录 3 封闭区域口门申请 4 封闭区域口门申请记录 + + @override + State createState() => _DoorareaTypePageState(); +} + +class _DoorareaTypePageState extends State { + + String labelOne=''; + String labelTwo=''; + + @override + void initState() { + // TODO: implement initState + super.initState(); + switch(widget.type){ + case 1: + labelOne='人员申请'; + labelTwo='车辆申请'; + break; + case 2: + labelOne='人员申请记录'; + labelTwo='车辆申请记录'; + break; + case 3: + labelOne='人员申请'; + labelTwo='车辆申请'; + break; + case 4: + labelOne='人员申请记录'; + labelTwo='车辆申请记录'; + break; + } + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: MyAppbar(title: '查看'), + body: SafeArea( + child: Column( + children: [ + const SizedBox(height: 10), + ItemListWidget.selectableLineTitleTextRightButton( + label: labelOne, + isEditable: true, + isRequired: false, + onTap: () async { + if(widget.type==1){ + await pushPage(DoorareaPersonRecordPage(1), context); + }else if(widget.type==2){ + await pushPage(DoorareaPersonRecordPage(2), context); + }else if(widget.type==3){ + await pushPage(DoorareaPersonRecordPage(3), context); + }else if(widget.type==4){ + await pushPage(DoorareaPersonRecordPage(4), context); + } + + }, + text: '', + + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: labelTwo, + isEditable: true, + isRequired: false, + onTap: () async { + if(widget.type==1){ + await pushPage(DoorareaPersonRecordPage(5), context); + }else if(widget.type==2){ + await pushPage(DoorareaPersonRecordPage(6), context); + }else if(widget.type==3){ + await pushPage(DoorareaPersonRecordPage(7), context); + }else if(widget.type==4){ + await pushPage(DoorareaPersonRecordPage(8), context); + } + + }, + text: '', + + ), + const Divider(), + ], + ), + ), + ); + } +} diff --git a/lib/pages/home/doorAndCar/doorCar_tab_page.dart b/lib/pages/home/doorAndCar/doorCar_tab_page.dart new file mode 100644 index 0000000..1e28098 --- /dev/null +++ b/lib/pages/home/doorAndCar/doorCar_tab_page.dart @@ -0,0 +1,317 @@ +// lib/pages/application_template.dart +import 'dart:ffi'; + +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/doorArea_type_page.dart'; + +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + +typedef ItemTapCallback = void Function(); + +class AppSectionItem { + final String title; + final String icon; // asset path + final int badge; + final bool visible; + final ItemTapCallback? onTap; + + AppSectionItem({ + required this.title, + required this.icon, + this.badge = 0, + this.visible = true, + this.onTap, + }); +} + +class AppSection { + final String title; + final List items; + + AppSection({ + required this.title, + required this.items, + }); +} +class DoorcarTabPage extends StatefulWidget { + const DoorcarTabPage({super.key}); + + @override + State createState() => _DoorcarTabPageState(); +} + +class _DoorcarTabPageState extends State { + + final String bannerAsset = 'assets/images/door_banner.png'; + late List defaultSections = [ + + AppSection(title: '口门门禁申请', items: [ + AppSectionItem( + title: '进港口门申请', + icon: 'assets/images/door_ico9.png', + badge: 0, + onTap: () async { + await pushPage(DoorareaTypePage(1), context); + _fetchData(); + }, + ), + AppSectionItem( + title: '进港口门申请记录', + icon: 'assets/images/door_ico10.png', + badge: 0, + onTap: () async { + await pushPage(DoorareaTypePage(2), context); + _fetchData(); + }, + ), + + + + AppSectionItem( + title: '封闭区域口门申请', + icon: 'assets/images/door_ico9.png', + badge: 0, + onTap: () async { + await pushPage(DoorareaTypePage(3), context); + _fetchData(); + }, + ), + AppSectionItem( + title: '封闭区域口门申请记录', + icon: 'assets/images/door_ico10.png', + badge: 0, + onTap: () async { + await pushPage(DoorareaTypePage(4), context); + _fetchData(); + }, + ), + + ]), + + + + ]; + + @override + void initState() { + // TODO: implement initState + super.initState(); + _fetchData(); + } + + Future _fetchData() async { + } + + @override + Widget build(BuildContext context) { + final double bannerHeight = (730.0 / 1125.0) * MediaQuery.of(context).size.width; + final double iconSectionHeight = + MediaQuery.of(context).size.height - bannerHeight - 30.0; + const double iconOverlapBanner = 30.0; + + // 过滤掉没有可见 items 的分组 + final visibleSections = defaultSections + .map((s) => AppSection( + title: s.title, + items: s.items.where((it) => it.visible).toList())) + .where((s) => s.items.isNotEmpty) + .toList(); + + return Scaffold( + extendBodyBehindAppBar: true, + appBar: MyAppbar(title: '智能门禁', backgroundColor: Colors.transparent,), + body: ListView( + physics: const AlwaysScrollableScrollPhysics(), + padding: EdgeInsets.zero, + children: [ + SizedBox( + height: bannerHeight + iconSectionHeight, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 0, + left: 0, + right: 0, + height: bannerHeight, + child: _buildBannerSection(bannerHeight, context), + ), + Positioned( + left: 10, + right: 10, + top: bannerHeight - iconOverlapBanner, + height: iconSectionHeight, + child: _buildIconSection(context, visibleSections), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildBannerSection(double bannerHeight, BuildContext context) { + return Stack( + children: [ + Image.asset( + bannerAsset, + width: MediaQuery.of(context).size.width, + height: bannerHeight, + fit: BoxFit.fitWidth, + errorBuilder: (c, e, s) { + return Container( + color: Colors.blueGrey, + height: bannerHeight, + alignment: Alignment.center, + child: const Text('Banner', style: TextStyle(color: Colors.white)), + ); + }, + ), + ], + ); + } + + Widget _buildIconSection(BuildContext context, List buttonInfos) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 6, offset: Offset(0, 2)), + ], + ), + child: ListView.builder( + physics: const AlwaysScrollableScrollPhysics(), + padding: const EdgeInsets.all(0), + itemCount: buttonInfos.length, + itemBuilder: (context, index) { + final section = buttonInfos[index]; + final items = section.items; + if (items.isEmpty) return const SizedBox.shrink(); + + return Padding( + padding: const EdgeInsets.only(top: 10, left: 10, right: 10), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 5), + child: Row( + children: [ + Container(width: 2, height: 10, color: Colors.blue), + const SizedBox(width: 5), + Text(section.title, + style: const TextStyle( + fontSize: 14, fontWeight: FontWeight.bold)), + ], + ), + ), + // icons + Padding( + padding: const EdgeInsets.all(10), + child: LayoutBuilder( + builder: (context, constraints) { + const spacing = 20.0; + final totalWidth = constraints.maxWidth; + final itemWidth = (totalWidth - spacing * 2) / 3; + return Wrap( + spacing: spacing, + runSpacing: spacing, + children: items.map((item) { + return SizedBox( + width: itemWidth, + child: _buildItem( + item, + onTap: item.onTap ?? + () => debugPrint('Tapped ${item.title}'), + ), + ); + }).toList(), + ); + }, + ), + ), + ], + ), + ), + ); + }, + ), + ); + } + + Widget _buildItem(AppSectionItem item, {VoidCallback? onTap}) { + const double iconSize = 30; + final int badgeNum = item.badge; + final String title = item.title; + final String iconPath = item.icon; + + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(8), + child: SizedBox( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + width: iconSize, + height: iconSize, + child: Image.asset( + iconPath, + fit: BoxFit.contain, + errorBuilder: (c, e, s) { + return Container( + color: Colors.grey.shade200, + child: const Center(child: Icon(Icons.image, size: 18)), + ); + }, + ), + ), + if (badgeNum > 0) + Positioned( + top: -6, + right: -6, + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 4, vertical: 2), + decoration: + const BoxDecoration(color: Colors.red, shape: BoxShape.circle), + constraints: const BoxConstraints(minWidth: 16, minHeight: 16), + child: Center( + child: Text( + badgeNum > 99 ? '99+' : badgeNum.toString(), + style: const TextStyle(color: Colors.white, fontSize: 10, height: 1), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + const SizedBox(height: 4), + Text( + title, + style: const TextStyle(fontSize: 13), + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/home/doorAndCar/person/doorArea_person_add_page.dart b/lib/pages/home/doorAndCar/person/doorArea_person_add_page.dart new file mode 100644 index 0000000..9ee0ae3 --- /dev/null +++ b/lib/pages/home/doorAndCar/person/doorArea_person_add_page.dart @@ -0,0 +1,458 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/photo_picker_row.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/http/modules/basic_info_api.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/sign_instructions_webView.dart'; + + +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +import 'package:qhd_prevention/pages/mine/webViewPage.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/services/SessionService.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:flutter/gestures.dart'; + +class DoorareaPersonApplyPage extends StatefulWidget { + const DoorareaPersonApplyPage({super.key}); + + @override + State createState() => + _DoorareaPersonApplyPageState(); +} + +class _DoorareaPersonApplyPageState extends State { + Map pd = {}; + bool _agreed = false; + + // 部门列表 + List _deptList = []; + List _personList = []; + List signImages = []; + + @override + void initState() { + super.initState(); + _getDept(); + } + + // 获取部门 + Future _getDept() async { + // try { + // final data = { + // 'eqCorpinfoId': widget.scanData['id'], + // // 'eqParentId': widget.scanData['corpinfoId'], + // }; + // final result = await BasicInfoApi.getDeptTree(data); + // if (result['success'] == true) { + // final list = result['data'] ?? []; + // if (list.length > 0) { + // setState(() { + // _deptList = list[0]['childrenList'] ?? []; + // }); + // } + // } + // } catch (e) {} + } + + // 提交 + Future _saveSuccess() async { + if (!FormUtils.hasValue(pd, 'corpinfoId')) { + ToastUtil.showNormal(context, '请选择部门'); + return; + } + if (!FormUtils.hasValue(pd, 'postName')) { + ToastUtil.showNormal(context, '请输入岗位'); + return; + } + // try { + // final result = await BasicInfoApi.userFirmEntry(pd); + // LoadingDialogHelper.hide(); + // if (result['success'] == true) { + // ToastUtil.showNormal(context, '申请成功'); + // _relogin(); + // } else { + // ToastUtil.showNormal(context, result['errMessage']); + // } + // } catch (e) { + // LoadingDialogHelper.hide(); + // ToastUtil.showNormal(context, '操作失败,请重试'); + // } + } + + Widget _addPersonWight(Map personData) { + return Stack( + children: [ + Padding(padding: const EdgeInsets.only(top: 5),child: Container( + margin: const EdgeInsets.symmetric(horizontal: 12), + // padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: Colors.white, + // 边框 + border: Border.all( + color: Colors.grey.shade300, + width: 1.0, + style: BorderStyle.solid, + ), + borderRadius: BorderRadius.circular(5), + ), + child: Column( + children: [ + const SizedBox(height: 10), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择部门:', + isEditable: true, + text: personData['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择人员:', + isEditable: true, + text: personData['postName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.itemContainer(RepairedPhotoSection( + isRequired: true, + title: "人员照片", + maxCount: 1, + horizontalPadding: 0, + mediaType: MediaType.image, + isShowAI: false, + onChanged: (List files) {}, + onAiIdentify: () {}, + ),), + const SizedBox(height: 10) + ], + ) + ),), + Positioned( + top: 0, + right: 2, + child: Container( + padding: const EdgeInsets.all(2), + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + + child: GestureDetector( + child: const Icon(Icons.close, size: 14, color: Colors.white,), + onTap: () { + setState(() { + _personList.remove(personData); + }); + }, + ), + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '人员申请'), + body: SafeArea( + child: ItemListWidget.itemContainer( + horizontal: 5, + vertical: 12, + ListView( + children: [ + ListItemFactory.createBuildSimpleSection('申请信息'), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择管辖单位:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async { + if (_deptList.isEmpty) { + ToastUtil.showNormal(context, '暂无部门信息'); + return; + } + final found = await BottomPicker.show( + context, + items: _deptList, + itemBuilder: + (i) => Text(i['name']!, textAlign: TextAlign.center), + initialIndex: 0, + ); + //FocusHelper.clearFocus(context); + + if (found != null) { + setState(() { + pd['departmentId'] = found['id']; + pd['departmentName'] = found['name']; + pd['corpinfoId'] = found['corpinfoId']; + pd['corpinfoName'] = found['corpinfoName']; + }); + } + }, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择管辖区域:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择项目:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '选择时间:', + isEditable: true, + text: pd['departmentName'] ?? '请选择', + isRequired: true, + onTap: () async {}, + ), + const Divider(), + ItemListWidget.multiLineTitleTextField( + label: '申请原因', + isEditable: true, + ), + + const Divider(), + if (_personList.isNotEmpty) + ...[ + ListItemFactory.createBuildSimpleSection('人员信息'), + // const Divider(), + for (var i = 0; i < _personList.length; i++) + _addPersonWight(_personList[i]), + ], + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomButton( + text: '添加人员', + padding: const EdgeInsets.symmetric(horizontal: 20), + height: 35, + backgroundColor: Colors.blue, + onPressed: () { + setState(() { + _personList.add({}); + _addPersonWight({}); + }); + }, + ), + const SizedBox(width: 10), + ], + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Checkbox( + value: _agreed, + activeColor: Colors.blue, + checkColor: Colors.white, + side: const BorderSide(color: Colors.grey), + onChanged: (value) { + setState(() { + _agreed = value ?? false; + }); + }, + ), + Flexible( + child: RichText( + text: TextSpan( + children: [ + const TextSpan( + text: '我已阅读并同意', + style: TextStyle(color: Colors.black, fontSize: 12), + ), + TextSpan( + text: '《安全进港须知》', + style: const TextStyle( + color: Colors.blue, + fontSize: 12, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () async { + final path = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => SignInstructionsWebview( + name: "安全进港须知", + url: + 'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', + )), + ); + await NativeOrientation.setPortrait(); + if (path != null) { + setState(() { + setState(() { + _agreed = true; + signImages = []; + signImages.add(path); + }); + }); + } + + }, + ), + ], + ), + ), + ), + ], + ), + + + // Container( + // padding: EdgeInsets.symmetric(horizontal: 12), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // ListItemFactory.headerTitle('签字:', isRequired: true), + // CustomButton( + // text: signImages.isNotEmpty ? '重新签字' : '手写签字', + // height: 36, + // backgroundColor: Colors.blue, + // onPressed: _sign, + // ), + // ], + // ), + // ), + if (signImages.isNotEmpty) _signListWidget(), + + SizedBox(height: 10,), + + CustomButton( + text: '提交申请', + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), + height: 40, + backgroundColor: Colors.blue, + onPressed: () { + _saveSuccess(); + }, + ), + ], + ), + ), + ), + ); + } + + + + Widget _signListWidget() { + return Column( + children: + signImages.map((path) { + return Column( + children: [ + const SizedBox(height: 15), + // const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 200, + maxHeight: 150, + ), + child: Image.file( + File(path), + // 改为完整显示 + fit: BoxFit.contain, + ), + ), + onTap: () { + presentOpaque( + SingleImageViewer(imageUrl: path), + context, + ); + }, + ), + Column( + children: [ + Container( + padding: const EdgeInsets.only(right: 5), + child: CustomButton( + text: 'X', + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 10), + backgroundColor: Colors.red, + onPressed: () { + setState(() { + signImages.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + /// 签字 + // Future _sign() async { + // final name = SessionService.instance.name ?? ''; + // await NativeOrientation.setLandscape(); + // final path = await Navigator.push( + // context, + // MaterialPageRoute(builder: (context) => MineSignPage(personName: name,)), + // ); + // await NativeOrientation.setPortrait(); + // if (path != null) { + // setState(() { + // signImages = []; + // signImages.add(path); + // }); + // } + // } + + + +} diff --git a/lib/pages/home/doorAndCar/person/doorArea_person_record_page.dart b/lib/pages/home/doorAndCar/person/doorArea_person_record_page.dart new file mode 100644 index 0000000..dc84ceb --- /dev/null +++ b/lib/pages/home/doorAndCar/person/doorArea_person_record_page.dart @@ -0,0 +1,356 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/car/doorArea_car_add_page.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/car/onlyLook_car_application.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/car/onlyLook_doorarea_car.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/person/doorArea_person_add_page.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/person/onlyLook_doorarea_person.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/person/onlyLook_person_application.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 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; + + +class DoorareaPersonRecordPage extends StatefulWidget { + const DoorareaPersonRecordPage(this.type, {Key? key}) : super(key: key); + + final int type;//1 进港口门申请(人) 2 进港口门申请记录(人) 3 封闭区域口门申请(人) 4 封闭区域口门申请记录(人) + //5 进港口门申请(车) 6 进港口门申请记录(车) 7 封闭区域口门申请(车) 8 封闭区域口门申请记录(车) + + @override + _DoorareaPersonRecordPageState createState() => _DoorareaPersonRecordPageState(); +} + +class _DoorareaPersonRecordPageState extends State { + // Data and state variables + // List list = []; + final List> list = [ + { + 'applicant': '封闭区域申请', + 'region': '申请人', + 'people': '人数', + 'startTime': '2025-10-29 00:00', + 'endTime': '2025-10-31 00:00', + 'license': '申请区域', + 'status': '待审核', + 'statusColor': Colors.orange, + }, + { + 'applicant': '封闭区域申请', + 'region': '申请人', + 'people': '人数', + 'startTime': '2025-10-29 00:00', + 'endTime': '2025-10-31 00:00', + 'license': '申请区域', + 'status': '待审核', + 'statusColor': Colors.orange, + }, + { + 'applicant': '封闭区域申请', + 'region': '申请人', + 'people': '人数', + 'startTime': '2025-10-29 00:00', + 'endTime': '2025-10-31 00:00', + 'license': '申请区域', + 'status': '待审核', + 'statusColor': Colors.orange, + }, + + ]; + + + Map pd = {}; + + int currentPage = 1; + int rows = 10; + int totalPage = 1; + bool isLoading = false; + final TextEditingController _searchController = TextEditingController(); + + int sindex = 0; + String searchKeywords = ''; + + final GlobalKey _scaffoldKey = GlobalKey(); + + final ScrollController _scrollController = ScrollController(); + + /// 是否是监管端 + + String titleName=''; + String buttonName=''; + + bool isAdd = false; + + @override + void initState() { + super.initState(); + + switch(widget.type){ + case 1: + case 3: + titleName='人员审核'; + buttonName='查看'; + isAdd=true; + break; + case 2: + case 4: + titleName='人员审核记录'; + buttonName='查看'; + isAdd=false; + break; + case 5: + case 7: + titleName='车辆审核'; + buttonName='查看'; + isAdd=true; + break; + case 6: + case 8: + titleName='车辆审核记录'; + buttonName='查看'; + isAdd=false; + break; + } + + _fetchData(); + _scrollController.addListener(_onScroll); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + void _onScroll() { + if (_scrollController.position.pixels >= + _scrollController.position.maxScrollExtent && + !isLoading) { + if (currentPage < totalPage) { + currentPage++; + _fetchData(); + } + } + } + + + + Future _fetchData() async { + + // if (isLoading) return; + // setState(() => isLoading = true); + // + // try { + // final data = { + // "likeCorpName": searchKeywords, + // "pageSize": rows, + // "pageIndex": currentPage, + // }; + // final response = await RiskwarningApi.getCorpRiskStatement(); + // final firmRes = await RiskwarningApi.getCorpRiskList(data); + // setState(() { + // pd = response['data']; + // if (currentPage == 1) { + // list = firmRes['data']; + // } else { + // list.addAll(firmRes['data']); + // } + // totalPage = firmRes['totalPages'] ?? 1; + // isLoading = false; + // }); + // } catch (e) { + // print('Error fetching data: $e'); + // setState(() => isLoading = false); + // } + } + + void _search() { + searchKeywords = _searchController.text.trim(); + currentPage = 1; + list.clear(); + _fetchData(); + } + + void _goToDetail(Map item,int index) async { + switch(widget.type){ + case 1: + case 2: + await pushPage(OnlylookDoorareaPerson(2), context); + break; + case 3: + case 4: + await pushPage(OnlylookPersonApplication(3), context); + break; + case 5: + case 6: + await pushPage(OnlylookDoorareaCar(2), context); + break; + case 7: + case 8: + await pushPage(CarApplicationRecord(4), context); + break; + } + _fetchData(); + } + + Widget _buildListItem(Map item,int index) { + return InkWell( + onTap: () { + + }, + child: Container( + padding: const EdgeInsets.all(20), + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 4, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item['applicant'], + // '${item['name']??''}', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + + + const SizedBox(height: 8), + Text('申请人:${item['region']??""}',), + if(widget.type==5||widget.type==6||widget.type==7||widget.type==8)...[ + const SizedBox(height: 8), + Text('车牌号:${item['region']??""}',), + ], + const SizedBox(height: 8), + Text('申请区域:${item['license']??""}',), + const SizedBox(height: 8), + Text('时间范围:自${item['startTime']??""}至${item['endTime']??""}止'), + const SizedBox(height: 8), + Text('审核状态:${item['status']??""}',), + if(widget.type==2||widget.type==4||widget.type==6||widget.type==8)...[ + const SizedBox(height: 8), + Text('驳回原因:${item['status']??""}',), + ], + + + const SizedBox(height: 12), + CustomButton( + height: 35, + onPressed: () { + _goToDetail(item,index); + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle:ButtonStyleType.primary, + text: buttonName), + + ], + ), + ), + + ); + } + + + Widget _buildListContent() { + if (isLoading && list.isEmpty) { + // 初始加载时显示居中的加载指示器 + return Center(child: CircularProgressIndicator()); + } else if (list.isEmpty) { + // 没有数据 + return NoDataWidget.show(); + } else { + // 有数据或加载更多 + return ListView.builder( + padding: EdgeInsets.zero, + + controller: _scrollController, + itemCount: list.length + (isLoading ? 1 : 0), + itemBuilder: (context, index) { + if (index >= list.length) { + // 加载更多时在列表底部显示加载指示器 + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Center(child: CircularProgressIndicator()), + ); + } + return _buildListItem(list[index],index); + }, + ); + } + } + + @override + Widget build(BuildContext context) { + + return Scaffold( + key: _scaffoldKey, + appBar: MyAppbar(title: titleName, actions: [ + + if(isAdd) + IconButton( + icon: const Icon(Icons.add, color: Colors.white, size: 30), + onPressed: () async { + switch(widget.type){ + case 1: + await pushPage(DoorareaPersonApplyPage(), context); + break; + case 3: + + break; + case 5: + await pushPage(DoorareaCarAddPage(), context); + break; + case 7: + + break; + } + _fetchData(); + + }, + ), + + ],), + body: Column( + children: [ + // Filter bar + Container( + color: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: SearchBarWidget( + showResetButton: true, + hintText: '请输入关键字', + resetButtonText: '重置', + onReset: () { + FocusScope.of(context).unfocus(); + _searchController.text = ''; + _search(); + }, + onSearch: (text) { + FocusScope.of(context).unfocus(); + _search(); + }, + controller: _searchController, + ), + ), + const Divider(height: 1), + // List + Expanded(child: _buildListContent()), + ], + ), + ); + } +} diff --git a/lib/pages/home/doorAndCar/person/onlyLook_doorarea_person.dart b/lib/pages/home/doorAndCar/person/onlyLook_doorarea_person.dart new file mode 100644 index 0000000..8d1a88e --- /dev/null +++ b/lib/pages/home/doorAndCar/person/onlyLook_doorarea_person.dart @@ -0,0 +1,351 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.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 'package:shared_preferences/shared_preferences.dart'; + + +class OnlylookDoorareaPerson extends StatefulWidget { + const OnlylookDoorareaPerson(this.type, {super.key}); + + final int type;//1 审核 2 查看 + + @override + State createState() => _OnlylookDoorareaPersonState(); +} + +class _OnlylookDoorareaPersonState extends State { + + // 模拟申请信息数据 + final Map applicationInfo = { + 'mingcheng': '项目名称', + 'bumen': '审核人员部门', + 'renyuan': '审核人员', + 'shijian': '2024-01-01 至 2024-12-31', + 'gangqu': '访问港区', + 'diqu': '访问地区', + }; + + // 模拟人员列表数据 + final List> personnelList = [ + { + 'name': '张三', + 'bumen': '技术部', + 'isPei': '是', + 'wan': 'A区、B区', + }, + { + 'name': '李四', + 'bumen': '安全部', + 'isPei': '否', + 'wan': 'C区', + }, + { + 'name': '王五', + 'bumen': '运营部', + 'isPei': '是', + 'wan': 'A区、C区、D区', + }, + ]; + + + @override + void initState() { + super.initState(); + + + + } + + + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '人员审核'), + body: + Container( + color: Colors.white, + child: SingleChildScrollView( + padding: EdgeInsets.all(16), + child: + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + // 申请信息卡片 + _buildInfoCard(), + SizedBox(height: 10), + + // 人员列表 + _buildPersonWidget(), + + SizedBox(height: 10,), + if(widget.type==1) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 验收按钮 + + Expanded( + child:CustomButton( + height: 35, + onPressed: () async { + + final confirmed = await CustomAlertDialog.showInput( + context, + title: "驳回原因", + hintText: '输入内容', + cancelText: '关闭', + confirmText: '确定', + ); + if (confirmed!=null) { + ToastUtil.showNormal(context, confirmed); + } + + }, + backgroundColor: h_backGroundColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle:ButtonStyleType.secondary, + text: '驳回') + ), + + SizedBox(width: 10), // 使用width而不是height + // 查看详情按钮 + Expanded( + child:CustomButton( + height: 35, + onPressed: () { + + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle:ButtonStyleType.primary, + text: '审核通过') + ), + + ], + ), + + if(widget.type==2) + CustomButton( + height: 35, + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle:ButtonStyleType.primary, + text: '关闭'), + + + ], + ), + ), + ), + + ); + } + + Widget _buildInfoCard() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 10), + child: Text( + '申请信息', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 信息列表 + ItemListWidget.selectableLineTitleTextRightButton( + label: '管辖单位:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['mingcheng'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '管辖区域:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['bumen'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['renyuan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['diqu'] ?? '', + onTap: () {}, + ), + + // if((applicationInfo['gangqu'] ?? '').isNotEmpty) + const Divider(), + // if((applicationInfo['gangqu'] ?? '').isNotEmpty) + ItemListWidget.selectableLineTitleTextRightButton( + label: '所属项目:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['gangqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '时间范围:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['shijian'] ?? '', + onTap: () {}, + ), + const Divider(), + + + ItemListWidget.twoRowTitleText( + label: '申请原因:', + text: applicationInfo['shijian']??'', + horizontalInset:0, + ), + const Divider(), + + ], + ), + ); + } + + Widget _buildPersonWidget() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 10), + child: Text( + '人员信息', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 人员列表 + ...personnelList.map((person) => _buildPersonCard(person)), + + Container( + height: 150, + padding: EdgeInsets.all(8), + alignment: Alignment.center, + child: Image.network('${ApiService.baseImgPath}1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'), + ), + + + ], + ), + ); + } + + + Widget _buildPersonCard(Map person) { + return Card( + margin: EdgeInsets.only(bottom: 12), + color: Colors.white, + elevation: 2, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: EdgeInsets.all(16), + child: Column( + children: [ + // 第一行:姓名和部门 + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + '姓名: ${person['name']}', + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + ), + ), + ), + // _buildInfoItem('姓名:', person['姓名'] ?? '',), + SizedBox(width: 24), + Expanded( + child: Text( + '部门: ${person['bumen']}', + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + ), + ), + ), + + // _buildInfoItem('部门:', person['部门'] ?? ''), + ], + ), + // SizedBox(height: 8), + + // 第二行:删除 + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // CustomButton( + // height: 35, + // onPressed: () async { + // + // }, + // backgroundColor: Colors.red, + // textStyle: const TextStyle(color: Colors.black), + // buttonStyle:ButtonStyleType.primary, + // text: '删除') + // ], + // ), + ], + ), + ), + ); + } + + + + + +} diff --git a/lib/pages/home/doorAndCar/person/onlyLook_person_application.dart b/lib/pages/home/doorAndCar/person/onlyLook_person_application.dart new file mode 100644 index 0000000..5b4ee0b --- /dev/null +++ b/lib/pages/home/doorAndCar/person/onlyLook_person_application.dart @@ -0,0 +1,329 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/item_list_widget.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/h_colors.dart'; + + +class OnlylookPersonApplication extends StatefulWidget { + const OnlylookPersonApplication(this.type, {super.key}); + + final int type;//1 一级口门人员审核 2 一级口门车辆审核 3 审批记录(人员) 4 审批记录(车辆) + + @override + State createState() => _OnlylookPersonApplicationState(); +} + +class _OnlylookPersonApplicationState extends State { + + // 模拟申请信息数据 + final Map applicationInfo = { + 'mingcheng': '项目名称', + 'bumen': '审核人员部门', + 'renyuan': '审核人员', + 'shijian': '2024-01-01 至 2024-12-31', + 'gangqu': '访问港区', + 'diqu': '访问地区', + }; + + // 模拟人员列表数据 + final List> personnelList = [ + { + 'name': '张三', + 'bumen': '技术部', + 'isPei': '是', + 'wan': 'A区、B区', + }, + { + 'name': '李四', + 'bumen': '安全部', + 'isPei': '否', + 'wan': 'C区', + }, + { + 'name': '王五', + 'bumen': '运营部', + 'isPei': '是', + 'wan': 'A区、C区、D区', + }, + ]; + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '申请记录'), + body: + Container( + color: Colors.white, + child: SingleChildScrollView( + padding: EdgeInsets.all(16), + child: + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 申请信息卡片 + _buildInfoCard(), + SizedBox(height: 10), + + + // 人员列表 + ...personnelList.map((person) => _buildPersonCard(person)), + + Container( + height: 150, + padding: EdgeInsets.all(8), + alignment: Alignment.center, + child: Image.network('${ApiService.baseImgPath}1983773013086048256/202601/ai_recognition_images/a9c8e701f773470d8a8485ccb6fb35b7.jpg'), + ), + + SizedBox(height: 10,), + if(widget.type==1) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 验收按钮 + + Expanded( + child:CustomButton( + height: 35, + onPressed: () async { + + final confirmed = await CustomAlertDialog.showInput( + context, + title: "驳回原因", + hintText: '输入内容', + cancelText: '关闭', + confirmText: '确定', + ); + if (confirmed!=null) { + ToastUtil.showNormal(context, confirmed); + } + + }, + backgroundColor: h_backGroundColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle:ButtonStyleType.secondary, + text: '驳回') + ), + + SizedBox(width: 10), // 使用width而不是height + // 查看详情按钮 + Expanded( + child:CustomButton( + height: 35, + onPressed: () { + + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.white), + buttonStyle:ButtonStyleType.primary, + text: '审核通过') + ), + + ], + ), + + if(widget.type==3) + CustomButton( + height: 35, + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: h_AppBarColor(), + textStyle: const TextStyle(color: Colors.black), + buttonStyle:ButtonStyleType.primary, + text: '关闭'), + + + ], + ), + ), + ), + + ); + } + + Widget _buildInfoCard() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0), + child: Column( + children: [ + // 标题 + Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 10), + child: Text( + '申请信息', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + + // 信息列表 + ItemListWidget.selectableLineTitleTextRightButton( + label: '项目名称:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['mingcheng'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员部门:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['bumen'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '审核人员:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['renyuan'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '时间范围:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['shijian'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '访问港区:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['gangqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '区域范围:', + isEditable: false, + horizontalnum:0, + text: applicationInfo['diqu'] ?? '', + onTap: () {}, + ), + const Divider(), + + ], + ), + ); + } + + Widget _buildPersonCard(Map person) { + return Card( + margin: EdgeInsets.only(bottom: 12), + color: Colors.white, + elevation: 2, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: EdgeInsets.all(16), + child: Column( + children: [ + // 第一行:姓名和部门 + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + '姓名: ${person['name']}', + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + ), + ), + ), + // _buildInfoItem('姓名:', person['姓名'] ?? '',), + SizedBox(width: 24), + Expanded( + child: Text( + '部门: ${person['bumen']}', + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + ), + ), + ), + + // _buildInfoItem('部门:', person['部门'] ?? ''), + ], + ), + SizedBox(height: 12), + + // 第二行:是否培训和权限范围 + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildInfoItem('是否培训:', person['isPei'] ?? ''), // 改为 'isPei' + SizedBox(width: 24), + Expanded( + child: _buildInfoItem( + '现口门权限范围:', + person['wan'] ?? '', // 改为 'wan' + isExpanded: true, + ), + ), + ], + ), + ], + ), + ), + ); + } + + Widget _buildInfoItem(String label, String value, {bool isExpanded = false}) { + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + ), + ), + SizedBox(height: 4), + Container( + padding: EdgeInsets.symmetric(horizontal: 0, vertical: 8), + // decoration: BoxDecoration( + // color: Colors.grey[50], + // borderRadius: BorderRadius.circular(6), + // border: Border.all( + // color: Colors.grey[300]!, + // width: 1, + // ), + // ), + child: Text( + value, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + ), + maxLines: isExpanded ? null : 1, + overflow: isExpanded ? null : TextOverflow.ellipsis, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/home/doorAndCar/sign_instructions_webView.dart b/lib/pages/home/doorAndCar/sign_instructions_webView.dart new file mode 100644 index 0000000..fa4574c --- /dev/null +++ b/lib/pages/home/doorAndCar/sign_instructions_webView.dart @@ -0,0 +1,206 @@ + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/services/SessionService.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + + +class SignInstructionsWebview extends StatefulWidget { + final String url; + final String name; + + const SignInstructionsWebview({Key? key, required this.url, required this.name,}) : super(key: key); + + @override + State createState() => _SignInstructionsWebviewState(name); + + // _SignInstructionsWebviewState(this.name); +} + +class _SignInstructionsWebviewState extends State { + late final WebViewController _controller; + final String name; + ValueNotifier loadingProgress = ValueNotifier(0.0); + ValueNotifier isLoading = ValueNotifier(true); + + _SignInstructionsWebviewState(this.name); + + List signImages = []; + + + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onProgress: (progress) { + loadingProgress.value = progress / 100; + if (progress == 100) isLoading.value = false; + }, + onPageStarted: (url) => isLoading.value = true, + onPageFinished: (url) => isLoading.value = false, + )) + ..loadRequest(Uri.parse(widget.url)); + } + + @override + Widget build(BuildContext context) { + return + Container( + color: Colors.white, + padding: EdgeInsets.only(bottom: 10), + child: Column( + children: [ + MyAppbar(title: name,onBackPressed: () async { + if (await _controller.canGoBack()) { + _controller.goBack(); + } else{ + Navigator.of(context).pop(); + } + },), + Expanded( child: WebViewWidget(controller: _controller),), + // ValueListenableBuilder( + // valueListenable: isLoading, + // builder: (context, loading, _) { + // return loading + // ? const Center(child: CircularProgressIndicator()) + // : const SizedBox(); + // }, + // ), + + SizedBox(height: 5,), + + Container( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.headerTitle('签字:', isRequired: true), + CustomButton( + text: signImages.isNotEmpty ? '重新签字' : '手写签字', + height: 36, + backgroundColor: Colors.blue, + onPressed: _sign, + ), + ], + ), + ), + + if (signImages.isNotEmpty) _signListWidget(), + + SizedBox(height: 10,), + CustomButton( + text: '完成', + margin: EdgeInsets.symmetric(horizontal: 10), + padding: const EdgeInsets.symmetric( + vertical: 10, + horizontal: 10, + ), + height: 40, + backgroundColor: Colors.blue, + onPressed: () { + if( signImages.isEmpty){ + ToastUtil.showNormal(context, '请先签字'); + } + + Navigator.pop(context, signImages[0]); + }, + ), + + ], + + ), + ); + + + } + + + Widget _signListWidget() { + return Column( + children: + signImages.map((path) { + return Column( + children: [ + const SizedBox(height: 15), + // const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 200, + maxHeight: 150, + ), + child: Image.file( + File(path), + // 改为完整显示 + fit: BoxFit.contain, + ), + ), + onTap: () { + presentOpaque( + SingleImageViewer(imageUrl: path), + context, + ); + }, + ), + Column( + children: [ + Container( + padding: const EdgeInsets.only(right: 5), + child: CustomButton( + text: 'X', + height: 30, + padding: const EdgeInsets.symmetric(horizontal: 10), + backgroundColor: Colors.red, + onPressed: () { + setState(() { + signImages.remove(path); + }); + }, + ), + ), + const SizedBox(height: 80), + ], + ), + ], + ), + ], + ); + }).toList(), + ); + } + + + /// 签字 + Future _sign() async { + + await NativeOrientation.setLandscape(); + final path = await Navigator.push( + context, + MaterialPageRoute(builder: (context) => MineSignPage()), + ); + await NativeOrientation.setPortrait(); + if (path != null) { + setState(() { + signImages = []; + signImages.add(path); + }); + } + } + + +} \ No newline at end of file diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 9b3a946..41b4aa0 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -9,6 +9,7 @@ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/home/Study/study_tab_list_page.dart'; +import 'package:qhd_prevention/pages/home/doorAndCar/doorCar_tab_page.dart'; import 'package:qhd_prevention/pages/home/scan_page.dart'; import 'package:qhd_prevention/pages/home/unit/unit_tab_page.dart'; import 'package:qhd_prevention/pages/main_tab.dart'; @@ -36,6 +37,8 @@ class HomePageState extends RouteAwareState int _currentPage = 0; bool _isMobileSelected = true; // 切换按钮状态 + + void startScan() async { final result = await pushPage( @@ -750,6 +753,7 @@ class HomePageState extends RouteAwareState case "安环检查": break; case "口门门禁": + pushPage(DoorcarTabPage(), context); break; case "入港培训": pushPage(StudyTabListPage(), context);