🐛 个人认证通过后姓名与身份证号也写回司机档案
审核通过时只写回证件内容,姓名与身份证号被当作「身份标识」跳过:司机申报「黄大富」,档案里却还是建档时的「黄宇富」,司机端卡片显示档案名、「重新认证」表单回填快照名,同一个页面上两个名字。现在审核通过即认可整份申报内容,姓名与身份证号一并写回,档案与生效值一致。身份证号写回前先确认它没有落在另一名司机名下——该列没有唯一索引,直接写会静默产生两条同证件号的档案,管理端的证件号查重从此失效。
This commit is contained in:
+43
-7
@@ -27,6 +27,7 @@ package org.springblade.transport.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springblade.core.log.exception.ServiceException;
|
||||
import org.springblade.core.secure.utils.AuthUtil;
|
||||
@@ -51,6 +52,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 认证审核服务实现
|
||||
@@ -268,19 +270,21 @@ public class CertAuditServiceImpl implements ICertAuditService {
|
||||
/**
|
||||
* 把生效快照里的司机证件字段搬进司机档案(就地写入同一个 patch 对象)
|
||||
* <p>
|
||||
* 只搬**司机自己申报的证件内容**,不碰两类字段:
|
||||
* <ul>
|
||||
* <li>{@code realName} / {@code idCardNo}:身份标识,
|
||||
* 由管理端建档时确定,司机端提交不覆盖(重复认证时会按证件号校验为同一人);</li>
|
||||
* <li>{@code driverType} / {@code posts} / {@code drivingVehicle} / {@code organizationName}:
|
||||
* 内部管理归属与派工关系,由管理端维护,不该被司机的提交内容覆盖。</li>
|
||||
* </ul>
|
||||
* 搬**司机自己申报的全部实名内容**,姓名与身份证号也在其中:审核通过即认可这次申报,
|
||||
* 档案必须与生效值一致;否则司机端卡片显示档案里的名字、「重新认证」表单回填快照里的名字,
|
||||
* 同一个页面上出现两个名字。
|
||||
* <p>
|
||||
* 仍不碰 {@code driverType} / {@code posts} / {@code drivingVehicle} / {@code organizationName}:
|
||||
* 内部管理归属与派工关系由管理端维护,不该被司机的提交内容覆盖。
|
||||
* <p>
|
||||
* 快照里为 null 的字段不会写(框架的 not_null 更新策略会跳过),
|
||||
* 因此不会把管理端填过、司机端没填的字段清空。
|
||||
* <p>
|
||||
* 快照缺失、无法解析或不是当前字段定义时**只跳过写回,不阻断审核**:
|
||||
* 审核本身是独立于写回的业务动作(切指针、置状态),不该因为一份读不懂的快照而失败;
|
||||
* 何况历史快照本来就存在,阻断会让这些对象再也审不过去。
|
||||
* 申报的身份证号已落在另一名司机名下时是例外——那会把两条档案写成同一个证件号,
|
||||
* 必须阻断。
|
||||
*
|
||||
* @param driver 待更新的司机 patch
|
||||
* @param snapshotJson 该条记录的全量提交内容
|
||||
@@ -304,6 +308,11 @@ public class CertAuditServiceImpl implements ICertAuditService {
|
||||
if (Func.isEmpty(snapshot.getIdCardNo()) && Func.isEmpty(snapshot.getDriverFileNo())) {
|
||||
return;
|
||||
}
|
||||
// 身份证号要落到档案上,先确认它没有落在别人名下:该列没有唯一索引,
|
||||
// 直接写会静默产生两条同证件号的档案,管理端的证件号查重从此失效
|
||||
requireIdCardNotTaken(snapshot.getIdCardNo(), driver.getId());
|
||||
driver.setDriverName(snapshot.getRealName());
|
||||
driver.setIdCardNo(snapshot.getIdCardNo());
|
||||
driver.setIdCardFront(snapshot.getIdCardFrontUrl());
|
||||
driver.setIdCardBack(snapshot.getIdCardBackUrl());
|
||||
driver.setIdCardValidStart(snapshot.getIdCardValidStart());
|
||||
@@ -325,6 +334,33 @@ public class CertAuditServiceImpl implements ICertAuditService {
|
||||
driver.setQualificationLongTerm(snapshot.getQualificationLongTerm());
|
||||
}
|
||||
|
||||
/**
|
||||
* 身份证号不得落在另一名司机名下
|
||||
* <p>
|
||||
* 司机申报的实名内容会写回档案,其中身份证号是管理端建档时的查重判据,
|
||||
* 而 {@code blade_transport_driver.id_card_no} 上没有唯一索引:若申报的证件号
|
||||
* 已属于另一条档案,直接写会静默产生两条同证件号的档案,后续建档查重、
|
||||
* 按证件号识别同一人都将失效。此处阻断审核并整体回滚,交由管理端先处理档案归属。
|
||||
* <p>
|
||||
* 证件号与当前档案相同(绝大多数情况)、或库里尚无该号时不阻断;
|
||||
* 快照没带证件号时无从判断,同样不阻断(历史快照就是这种)。
|
||||
*
|
||||
* @param idCardNo 快照里的身份证号
|
||||
* @param driverId 本次要写入的司机主键
|
||||
*/
|
||||
private void requireIdCardNotTaken(String idCardNo, Long driverId) {
|
||||
if (Func.isEmpty(idCardNo)) {
|
||||
return;
|
||||
}
|
||||
Driver owner = driverService.getOne(Wrappers.<Driver>lambdaQuery()
|
||||
.eq(Driver::getIdCardNo, idCardNo)
|
||||
.last("LIMIT 1"));
|
||||
if (owner != null && !Objects.equals(owner.getId(), driverId)) {
|
||||
throw new ServiceException("身份证号 " + idCardNo + " 已属于另一名司机档案(ID:" + owner.getId()
|
||||
+ "),本次审核已回滚、未生效;请先处理档案归属");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取从业资格证封面页地址,兼容改名前的旧键
|
||||
* <p>
|
||||
|
||||
Reference in New Issue
Block a user