From 8d85311bb327effef2ea4fb3351cb31ecd180a75 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 30 Oct 2026 11:47:21 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=8F=B8=E6=9C=BA=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E8=AF=81OCR=E6=94=AF=E6=8C=81=E6=AD=A3=E5=8F=8D?= =?UTF-8?q?=E9=9D=A2=E8=AF=86=E5=88=AB=E5=B9=B6=E5=9B=9E=E5=A1=AB=E6=9C=89?= =?UTF-8?q?=E6=95=88=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/views/transportCapacity/driver.vue | 130 +++++++++++++++++++++---- 1 file changed, 112 insertions(+), 18 deletions(-) diff --git a/src/views/transportCapacity/driver.vue b/src/views/transportCapacity/driver.vue index dbf7be1..c694ff3 100644 --- a/src/views/transportCapacity/driver.vue +++ b/src/views/transportCapacity/driver.vue @@ -303,6 +303,42 @@ /> + + + +
+ + +
+
+
+ + + + 是 + + + +
@@ -701,6 +737,9 @@ const emptyForm = () => ({ posts: '', idCardFront: '', idCardBack: '', + idCardValidStart: '', + idCardValidEnd: '', + idCardLongTerm: 0, headPhoto: '', drivingType: '', drivingLicenseNo: '', @@ -1260,12 +1299,13 @@ export default { }, handleIdCardUploadSuccess(prop, url) { this.setImage(prop, url); - if (prop !== 'idCardFront') { - return; + this.recognizeIdCard(url, prop); + }, + handleIdCardLongTermChange() { + if (this.driverForm.idCardLongTerm === 1) { + this.driverForm.idCardValidEnd = ''; } - this.recognizeBaiduOcr(url, 'id_card', 'front', '身份证', data => { - this.applyIdCardRecognition(data); - }); + this.validateFormField('idCardValidEnd'); }, handleDrivingLicenseUploadSuccess(prop, url) { this.setImage(prop, url); @@ -1308,7 +1348,7 @@ export default { loading.close(); }); }, - recognizeIdCard(url = '') { + recognizeIdCard(url = '', prop = 'idCardFront') { if (!url) { this.$message.warning('身份证图片上传成功,未获取到图片地址,无法自动识别'); return; @@ -1321,7 +1361,7 @@ export default { recognitionIDCard(url) .then(res => { const data = res.data.data || {}; - this.applyIdCardRecognition(data); + this.applyIdCardRecognition(data, prop); this.$message.success('身份证识别完成'); }) .catch(() => { @@ -1444,45 +1484,62 @@ export default { this.driverForm.drivingLicenseLongTerm = 0; } }, - applyIdCardRecognition(data = {}) { + applyIdCardRecognition(data = {}, prop = 'idCardFront') { + // 正反面都走同一 ShenFenZheng 接口;反面结果可能也带姓名/民族等字段, + // 反面只补空、不覆盖正面已填值,避免国徽页误识别冲掉正面信息。 + const fromBack = prop === 'idCardBack'; + const canWrite = (current, next) => !!next && (!fromBack || !current); const driverName = data.name || data.driverName || this.getOcrValue(data, ['name', '姓名']); const idCardNo = String( data.idNo || data.idCardNo || data.idCard || - this.getOcrValue(data, ['idNo', 'idCardNo', 'number', '公民身份号码', '身份证号']) - ).toUpperCase(); + this.getOcrValue(data, ['idNo', 'idCardNo', 'number', '公民身份号码', '身份证号']) || + '' + ) + .trim() + .toUpperCase(); const ocrGender = data.gender || this.getOcrValue(data, ['gender', '性别']); const ocrNation = data.nation || data.ethnicGroup || this.getOcrValue(data, ['ethnic_group', 'nation', '民族']); const ocrAddress = data.address || this.getOcrValue(data, ['address', '住址', '地址']); - if (driverName) { + const ocrBirthday = + data.birthday || this.getOcrValue(data, ['birthday', '出生', '出生年月', '出生日期']); + if (canWrite(this.driverForm.driverName, driverName)) { this.driverForm.driverName = driverName; } - if (ocrGender) { + if (canWrite(this.driverForm.gender, ocrGender)) { this.driverForm.gender = ocrGender; } - if (ocrNation) { + if (canWrite(this.driverForm.nation, ocrNation)) { this.driverForm.nation = this.normalizeNation(ocrNation); } - if (ocrAddress) { + if (canWrite(this.driverForm.address, ocrAddress)) { this.driverForm.address = String(ocrAddress).trim(); } - if (idCardNo) { + if (ocrBirthday) { + const birthday = this.normalizeBirthday(ocrBirthday); + if (canWrite(this.driverForm.birthday, birthday)) { + this.driverForm.birthday = birthday; + } + } + if (idCardNo && canWrite(this.driverForm.idCardNo, idCardNo)) { this.driverForm.idCardNo = idCardNo; if (!this.driverForm.qualificationNo) { this.driverForm.qualificationNo = idCardNo; } const idCardInfo = this.parseIdCardInfo(idCardNo); - if (idCardInfo.birthday) { + if (!this.driverForm.birthday && idCardInfo.birthday) { this.driverForm.birthday = idCardInfo.birthday; } if (!this.driverForm.gender && idCardInfo.gender) { this.driverForm.gender = idCardInfo.gender; } } + // 有效期:正反面都可回填;反面通常才有,识别到就覆盖 + this.applyIdCardValidity(data); this.$nextTick(() => { [ 'driverName', @@ -1492,11 +1549,46 @@ export default { 'nation', 'qualificationNo', 'address', - ].forEach(prop => { - this.$refs.driverForm?.validateField(prop); + 'idCardValidEnd', + ].forEach(field => { + this.$refs.driverForm?.validateField(field); }); }); }, + applyIdCardValidity(data = {}) { + const validStart = + data.validDateStart || + data.idCardValidStart || + this.getOcrValue(data, ['签发日期', '有效起始日期', '有效期限起', '身份证_签发日期']); + const validEndRaw = + data.validDateEnd || + data.idCardValidEnd || + this.getOcrValue(data, [ + '失效日期', + '有效期限', + '有效期限止', + '身份证_有效期限', + '身份证_失效日期', + ]); + const longTerm = data.longTerm ?? data.idCardLongTerm; + const validEndText = String(validEndRaw || '').trim(); + if (longTerm === 1 || longTerm === '1' || /长期|永久/.test(validEndText)) { + this.driverForm.idCardLongTerm = 1; + this.driverForm.idCardValidEnd = ''; + } else if (validEndText) { + const endDate = this.normalizeBirthday(validEndText); + if (endDate) { + this.driverForm.idCardValidEnd = endDate; + this.driverForm.idCardLongTerm = 0; + } + } + if (validStart) { + const startDate = this.normalizeBirthday(validStart); + if (startDate) { + this.driverForm.idCardValidStart = startDate; + } + } + }, getOcrValue(data = {}, keys = []) { const keyInfos = data.keyInfos || data.keyInfo || data.ocrKeyInfos || []; const list = Array.isArray(keyInfos) ? keyInfos : []; @@ -1675,6 +1767,8 @@ export default { const row = { ...this.driverForm, birthday: this.normalizeBirthday(this.driverForm.birthday), + idCardValidStart: this.normalizeBirthday(this.driverForm.idCardValidStart), + idCardValidEnd: this.normalizeBirthday(this.driverForm.idCardValidEnd), drivingLicenseStartDate: this.normalizeBirthday(this.driverForm.drivingLicenseStartDate), drivingLicenseEndDate: this.normalizeBirthday(this.driverForm.drivingLicenseEndDate), qualificationStartDate: this.normalizeBirthday(this.driverForm.qualificationStartDate),