diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java index 89d0b0e6..d1bedbb3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CertAuditServiceImpl.java @@ -213,6 +213,10 @@ public class CertAuditServiceImpl implements ICertAuditService { driver.setId(record.getBizId()); driver.setCertificationStatus(status); driver.setCertificationRejectReason(reason); + // 必须带上 driving_vehicle 原值:该列是 FieldStrategy.ALWAYS, + // 更新时忽略 null 直接写,patch 里不带它就会把司机的车辆绑定清成 NULL, + // 而车辆列表正是按这一列匹配的(清空即「暂无绑定车辆」)。 + copyDrivingVehicle(record.getBizId(), driver); if (pass) { driver.setEffectiveCertRecordId(newEffectiveId); // 通过即生效:与车辆侧同理,把这次快照的证件内容一并写回司机档案。 @@ -224,6 +228,24 @@ public class CertAuditServiceImpl implements ICertAuditService { driverService.updateById(driver); } + /** + * 把司机当前的车辆绑定原值搬进 patch,避免被 ALWAYS 更新策略清空 + *
+ * {@code driving_vehicle} 上标了 {@code FieldStrategy.ALWAYS},任何一次 + * {@code updateById} 都会把该列写成 patch 里的值(null 也照写)。 + * 而司机端的车辆列表是按这一列的车牌匹配出来的,一旦被清空, + * 页面就变成「暂无绑定车辆」,且无法从界面上恢复。 + * + * @param driverId 司机主键 + * @param patch 待更新的司机 patch(就地写入原值) + */ + private void copyDrivingVehicle(Long driverId, Driver patch) { + Driver current = driverService.getById(driverId); + if (current != null) { + patch.setDrivingVehicle(current.getDrivingVehicle()); + } + } + /** * 把生效快照里的司机证件字段搬进司机档案(就地写入同一个 patch 对象) *
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverCertServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverCertServiceImpl.java
index 524e81d4..7246529d 100644
--- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverCertServiceImpl.java
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverCertServiceImpl.java
@@ -368,6 +368,13 @@ public class DriverCertServiceImpl implements IDriverCertService {
patch.setId(driverId);
patch.setCertificationStatus(status);
patch.setCertificationRejectReason(rejectReason);
+ // 必须带上 driving_vehicle 原值:该列标了 FieldStrategy.ALWAYS,
+ // 更新时忽略 null 直接写,patch 里不带它就会把司机的车辆绑定清成 NULL,
+ // 而司机端的车辆列表正是按这一列的车牌匹配出来的(清空即「暂无绑定车辆」)。
+ Driver current = driverService.getById(driverId);
+ if (current != null) {
+ patch.setDrivingVehicle(current.getDrivingVehicle());
+ }
driverService.updateById(patch);
}
diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java
index 352aef64..ae268991 100644
--- a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java
+++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/CertAuditServiceImplTest.java
@@ -155,6 +155,25 @@ class CertAuditServiceImplTest {
assertEquals(RECORD_ID, captor.getValue().getEffectiveCertRecordId());
}
+ @Test
+ @DisplayName("通过司机认证:patch 必须带上车辆绑定,不得把 driving_vehicle 清空")
+ void approveDriverKeepsDrivingVehicle() {
+ TransportCertRecord record = driverRecord(TransportCertRecord.STATUS_PENDING);
+ when(certRecordService.getById(RECORD_ID)).thenReturn(record);
+ Driver existing = driver(null);
+ existing.setDrivingVehicle("桂A12345,桂B67890");
+ when(driverService.getById(DRIVER_ID)).thenReturn(existing);
+
+ service.audit(RECORD_ID, true, null);
+
+ ArgumentCaptor