From 1724852a393b418afb76b01cc231c39362bbca09 Mon Sep 17 00:00:00 2001 From: userGyl Date: Wed, 25 Feb 2026 15:35:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B8=E6=9C=BA-=E5=8F=AF=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E8=AF=81=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ln_jq_app/assets/images/ic_attention@2x.png | Bin 0 -> 18246 bytes ln_jq_app/assets/images/ic_upload@2x.png | Bin 0 -> 1026 bytes .../lib/pages/c_page/car_info/controller.dart | 121 +++++++++++++- ln_jq_app/lib/pages/c_page/car_info/view.dart | 157 +++++++++++++++++- 4 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 ln_jq_app/assets/images/ic_attention@2x.png create mode 100644 ln_jq_app/assets/images/ic_upload@2x.png diff --git a/ln_jq_app/assets/images/ic_attention@2x.png b/ln_jq_app/assets/images/ic_attention@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..81c56dc036efd8e7766e2654c2bf24ebc88b4e29 GIT binary patch literal 18246 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 JPDHLkV1lX*-_ig8 literal 0 HcmV?d00001 diff --git a/ln_jq_app/assets/images/ic_upload@2x.png b/ln_jq_app/assets/images/ic_upload@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0583c76f93c0cbaee9a10520240e83ca279990 GIT binary patch literal 1026 zcmV+d1pWJoP)RbZ}ya23E+kX!}kDo8po9Y6J`!|_Pws6UiC<)n; zY>%h2CVPTQf*xp2mZ4vAvS%1G^Z-+`Rm}tLjW@iI-ILu}%Ff6h$==958-z+=Y@qg< z-10z~5(G{Fbr)UN+;<6M0rfcJO&H7ll~5@jk7b|Hdy_?++?Ozxx|C4wIF>GF5hv@T zvBsO?7Re&c8hV84TUff=6k-7NfIOHutQ}R6-e73VIFR!<2LnR&zg9#Vc2SAtbxs~b z-$%V};%yqHs~PX%M6t3(y~xa2yHXee)Qh%)cZi6}c(m``i!9!gKxANf|JSb_rvV3pR^c#K~*EhZZSg z^}JNC-&o2V*!Kj&G-^X1d|+IXZP?!%lUA?@DAEV}K6mEE@+Q!Gqb#12n)K9>7OFjb zYqf7vVAiQXx5ik-G1t-->7hj8XK>T51?J#^CUMO5wBBRV*A6(7~pQ0d-_? z!IF*wXpI7q7wtd?!wb~W?<-sm{Dp6A0e+VUDUnw6v0_QR#fU8F`h6SChha!l9azYf``_%_5$U$YqMtyIqH%CX^;!`a0y3Dd3Ap=e@~)CBZk##$>^ zB@mQDEIV+BqqsJK)HJ>Wy}o;Bb1dCzkiHa15EUHz=u+m|Jg74wkOL9Ofe7S41acq( wIS_#yh(KcjzyIx_aq}n$f*=TjAP7 uploadFile(String filePath) async { + showLoading("正在上传..."); + try { + dio.FormData formData = dio.FormData.fromMap({ + 'file': await dio.MultipartFile.fromFile(filePath, filename: 'ocr_identity.jpg'), + }); + + var response = await HttpService.to.post("appointment/ocr/upload", data: formData); + if (response != null) { + final result = BaseModel.fromJson(response.data); + if (result.code == 0) return result.data.toString(); + showErrorToast(result.error); + } + } catch (e) { + showErrorToast("图片上传失败"); + } finally { + dismissLoading(); + } + return null; + } + void getUserBindCarInfo() async { if (StorageService.to.hasVehicleInfo) { VehicleInfo? bean = StorageService.to.vehicleInfo; @@ -102,7 +213,7 @@ class CarInfoController extends GetxController with BaseControllerMixin { // 获取证件信息 final response = await HttpService.to.get( - 'appointment/vehicle/getPicInfoByVin?vin=$vin', + 'appointment/vehicle/getPicInfoByVin?vin=$vin&plateNumber=$plateNumber', ); if (response != null && response.data != null) { @@ -134,10 +245,10 @@ class CarInfoController extends GetxController with BaseControllerMixin { ...registerAttachments, ]; - color = data['color'].toString(); - hydrogenCapacity = data['hydrogenCapacity'].toString(); - rentFromCompany = data['rentFromCompany'].toString(); - address = data['address'].toString(); + color = data['color'].toString(); + hydrogenCapacity = data['hydrogenCapacity'].toString(); + rentFromCompany = data['rentFromCompany'].toString(); + address = data['address'].toString(); loadAllPdfs(); } diff --git a/ln_jq_app/lib/pages/c_page/car_info/view.dart b/ln_jq_app/lib/pages/c_page/car_info/view.dart index e5a7ab3..ee0d8b3 100644 --- a/ln_jq_app/lib/pages/c_page/car_info/view.dart +++ b/ln_jq_app/lib/pages/c_page/car_info/view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_pdfview/flutter_pdfview.dart'; import 'package:get/get.dart'; import 'package:getx_scaffold/getx_scaffold.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:ln_jq_app/common/login_util.dart'; import 'package:ln_jq_app/pages/c_page/message/view.dart'; import 'package:ln_jq_app/storage_service.dart'; @@ -368,7 +369,7 @@ class CarInfoPage extends GetView { children: [ _buildCertificateContent('行驶证', controller.drivingAttachments), _buildCertificateContent('营运证', controller.operationAttachments), - _buildCertificateContent('加氢资格证', controller.hydrogenationAttachments), + _buildCertificateContent('加氢证', controller.hydrogenationAttachments), _buildCertificateContent('登记证', controller.registerAttachments), ], ), @@ -388,7 +389,7 @@ class CarInfoPage extends GetView { child: Padding( padding: EdgeInsets.all(16.0), child: attachments.isEmpty - ? const Center(child: Text('暂无相关证件信息')) + ? _buildEmptyCertificateState(title) : Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, @@ -440,6 +441,158 @@ class CarInfoPage extends GetView { }); } + Widget _buildEmptyCertificateState(String title) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/ic_attention@2x.png', // 请替换为您的实际图片路径 + width: 120, + height: 120, + ), + const SizedBox(height: 16), + Text( + '您未上传“$title”', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w600, + color: Color.fromRGBO(51, 51, 51, 1), + ), + ), + const SizedBox(height: 8), + Text( + '上传后可提前通知加氢站报备\n大幅减少加氢站等待时间', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12.sp, + color: Color.fromRGBO(156, 163, 175, 1), + height: 1.5, + ), + ), + const SizedBox(height: 24), + SizedBox( + width: 200, + height: 44, + child: ElevatedButton.icon( + onPressed: () { + _showUploadDialog(title); + }, + icon: const Text( + '立即上传', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + label: Image.asset( + 'assets/images/ic_upload@2x.png', + height: 20.h, + width: 20.w, + ), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF017137), + foregroundColor: Colors.white, + shape: StadiumBorder(), + elevation: 0, + ), + ), + ), + ], + ); + } + + void _showUploadDialog(String title) { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + child: Container( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '上传$title', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + const SizedBox(height: 12), + Text( + '请确保拍摄证件清晰可见,关键文字无反光遮挡,这将有助于快速通过审核', + style: TextStyle(fontSize: 13, color: Colors.grey[400], height: 1.5), + ), + const SizedBox(height: 24), + Row( + children: [ + Expanded( + child: _buildUploadOption( + icon: Icons.camera_alt_outlined, + label: '拍照上传', + onTap: () { + controller.pickImage(title, ImageSource.camera); + Get.back(); + }, + ), + ), + const SizedBox(width: 16), + Expanded( + child: _buildUploadOption( + icon: Icons.image_outlined, + label: '相册上传', + onTap: () { + controller.pickImage(title, ImageSource.gallery); + Get.back(); + }, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + // 构建弹窗内的选择按钮 + Widget _buildUploadOption({ + required IconData icon, + required String label, + required VoidCallback onTap, + }) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 24), + decoration: BoxDecoration( + color: const Color(0xFFF2F9F7), // 浅绿色背景 + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: const BoxDecoration( + color: Color(0xFF017137), // 深绿色圆圈 + shape: BoxShape.circle, + ), + child: Icon(icon, color: Colors.white, size: 28), + ), + const SizedBox(height: 12), + Text( + label, + style: const TextStyle( + fontSize: 14, + color: Color(0xFF333333), + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ); + } + Widget _buildCertDetailItem( String label, String value, {