refactor(vehicleThreeInspect): 优化批量审核与隐患治理流程,完善日志与异常处理

- 为车辆三检批量审核流程添加多阶段详细日志便于排查问题
- 重构批量审核筛选逻辑,新增各跳过原因统计及无候选数据提前抛出异常
- 修复隐患治理流程重复创建问题,新增重复记录检查逻辑
- 优化隐患治理流程的参数处理与日志输出,新增审核结果翻译工具方法
- 更新流程回调日志,补充实例ID、流程编码等上下文信息
This commit is contained in:
2026-06-23 00:16:13 +08:00
parent b1913abab5
commit efab0eeb18
2 changed files with 130 additions and 65 deletions

View File

@@ -1,5 +1,6 @@
package com.hotwj.platform.config.vehicleThreeInspect.callback; package com.hotwj.platform.config.vehicleThreeInspect.callback;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hotwj.platform.config.vehicleThreeInspect.domain.HotVehicleThreeInspect; import com.hotwj.platform.config.vehicleThreeInspect.domain.HotVehicleThreeInspect;
import com.hotwj.platform.config.vehicleThreeInspect.mapper.HotVehicleThreeInspectMapper; import com.hotwj.platform.config.vehicleThreeInspect.mapper.HotVehicleThreeInspectMapper;
import com.hotwj.platform.flow.callback.IFlowCallback; import com.hotwj.platform.flow.callback.IFlowCallback;
@@ -10,8 +11,8 @@ import com.hotwj.platform.securityManagement.hiddenDanger.domain.HotHiddenDanger
import com.hotwj.platform.securityManagement.hiddenDanger.domain.bo.HotHiddenDangerBo; import com.hotwj.platform.securityManagement.hiddenDanger.domain.bo.HotHiddenDangerBo;
import com.hotwj.platform.securityManagement.hiddenDanger.mapper.HotHiddenDangerMapper; import com.hotwj.platform.securityManagement.hiddenDanger.mapper.HotHiddenDangerMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -48,7 +49,7 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
@Override @Override
public void onProcessEnd(String instanceId, String businessId, String flowCode, boolean success) { public void onProcessEnd(String instanceId, String businessId, String flowCode, boolean success) {
log.info("车辆三检流程结束回调: businessId={}, success={}", businessId, success); log.info("车辆三检流程结束回调: instanceId={}, businessId={}, flowCode={}, success={}", instanceId, businessId, flowCode, success);
Long id = Long.parseLong(businessId); Long id = Long.parseLong(businessId);
// 去掉try catch防止事务无法正常回滚 // 去掉try catch防止事务无法正常回滚
HotVehicleThreeInspect inspect = inspectMapper.selectById(id); HotVehicleThreeInspect inspect = inspectMapper.selectById(id);
@@ -74,45 +75,70 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
* 创建隐患治理流程 * 创建隐患治理流程
*/ */
private void createHiddenDangerFlow(HotVehicleThreeInspect inspect) { private void createHiddenDangerFlow(HotVehicleThreeInspect inspect) {
if (inspect.getHasHiddenDanger() != null && inspect.getHasHiddenDanger() == 1L) { if (!Long.valueOf(1L).equals(inspect.getHasHiddenDanger())) {
log.info("车辆三检存在隐患自动创建隐患治理流程业务ID: {}", inspect.getId()); log.info("车辆三检未标记隐患,跳过隐患治理创建: recordId={}, inspectId={}", inspect.getId(), inspect.getInspectId());
return;
HotHiddenDangerBo hiddenDangerBo = new HotHiddenDangerBo();
hiddenDangerBo.setCompanyId(inspect.getCompanyId());
hiddenDangerBo.setCheckTime(new Date());
hiddenDangerBo.setCheckerId(String.valueOf(inspect.getAuditorId()));
hiddenDangerBo.setCheckerName(inspect.getAuditorName());
hiddenDangerBo.setDescription(inspect.getAuditResult());
hiddenDangerBo.setEvidenceUrls(inspect.getAttachImgUrl());
hiddenDangerBo.setDangerNo("YH-" + System.currentTimeMillis() / 1000);
hiddenDangerBo.setSourceName("车辆");
hiddenDangerBo.setSourceId(String.valueOf(inspect.getId()));
hiddenDangerBo.setSourceType(2L);
hiddenDangerBo.setDataSource(2L);
hiddenDangerBo.setDangerName("车辆三检治理");
hiddenDangerBo.setStatus(0L);
HotHiddenDanger danger = MapstructUtils.convert(hiddenDangerBo, HotHiddenDanger.class);
hiddenDangerMapper.insert(danger);
// 启动隐患治理流程
// 发起人为审核人(发现隐患的人)
String initiator = String.valueOf(inspect.getAuditorId());
// 默认整改人也先设置为审核人,或者留空等待指派
String rectifierId = String.valueOf(inspect.getEvaluatorId());
String instanceId = flowService.startFlow(
"HIDDEN_DANGER_GOVERNANCE",
String.valueOf(danger.getId()),
inspect.getCompanyId(),
initiator,
rectifierId
);
danger.setInstanceId(instanceId);
danger.setEvaluatorId(inspect.getEvaluatorId());
danger.setFlowStatus("SUBMITTED");
hiddenDangerMapper.updateById(danger);
} }
String sourceId = String.valueOf(inspect.getInspectId() != null ? inspect.getInspectId() : inspect.getId());
log.info("车辆三检存在隐患,准备创建隐患治理流程: recordId={}, inspectId={}, sourceId={}, auditorId={}, evaluatorId={}",
inspect.getId(), inspect.getInspectId(), sourceId, inspect.getAuditorId(), inspect.getEvaluatorId());
HotHiddenDanger existingDanger = hiddenDangerMapper.selectOne(
Wrappers.<HotHiddenDanger>lambdaQuery()
.eq(HotHiddenDanger::getSourceType, 2L)
.eq(HotHiddenDanger::getDataSource, 2L)
.eq(HotHiddenDanger::getSourceId, sourceId)
.eq(HotHiddenDanger::getIsDeleted, 0L)
.last("LIMIT 1")
);
if (existingDanger != null) {
log.warn("车辆三检隐患治理已存在,跳过重复创建: recordId={}, inspectId={}, sourceId={}, existingDangerId={}, existingInstanceId={}",
inspect.getId(), inspect.getInspectId(), sourceId, existingDanger.getId(), existingDanger.getInstanceId());
return;
}
HotHiddenDangerBo hiddenDangerBo = new HotHiddenDangerBo();
hiddenDangerBo.setCompanyId(inspect.getCompanyId());
hiddenDangerBo.setCheckTime(new Date());
hiddenDangerBo.setCheckerId(String.valueOf(inspect.getAuditorId()));
hiddenDangerBo.setCheckerName(inspect.getAuditorName());
hiddenDangerBo.setDescription(StringUtils.defaultIfBlank(
StringUtils.trimToNull(inspect.getRejectReason()),
resolveReadableAuditResult(inspect.getAuditResult())
));
hiddenDangerBo.setEvidenceUrls(inspect.getAttachImgUrl());
hiddenDangerBo.setDangerNo("YH-" + System.currentTimeMillis() / 1000);
hiddenDangerBo.setSourceName("车辆");
hiddenDangerBo.setSourceId(sourceId);
hiddenDangerBo.setSourceType(2L);
hiddenDangerBo.setDataSource(2L);
hiddenDangerBo.setDangerName("车辆三检治理");
hiddenDangerBo.setStatus(0L);
HotHiddenDanger danger = MapstructUtils.convert(hiddenDangerBo, HotHiddenDanger.class);
hiddenDangerMapper.insert(danger);
log.info("车辆三检隐患治理数据已创建: recordId={}, inspectId={}, sourceId={}, dangerId={}",
inspect.getId(), inspect.getInspectId(), sourceId, danger.getId());
// 启动隐患治理流程
// 发起人为审核人(发现隐患的人)
String initiator = String.valueOf(inspect.getAuditorId());
// 默认整改人也先设置为审核人,或者留空等待指派
String rectifierId = String.valueOf(inspect.getEvaluatorId());
String instanceId = flowService.startFlow(
"HIDDEN_DANGER_GOVERNANCE",
String.valueOf(danger.getId()),
inspect.getCompanyId(),
initiator,
rectifierId
);
danger.setInstanceId(instanceId);
danger.setEvaluatorId(inspect.getEvaluatorId());
danger.setFlowStatus("SUBMITTED");
hiddenDangerMapper.updateById(danger);
log.info("车辆三检隐患治理流程已启动: recordId={}, inspectId={}, sourceId={}, dangerId={}, hiddenDangerInstanceId={}",
inspect.getId(), inspect.getInspectId(), sourceId, danger.getId(), instanceId);
} }
private void sendDriverAuditNotification(HotVehicleThreeInspect inspect, boolean success) { private void sendDriverAuditNotification(HotVehicleThreeInspect inspect, boolean success) {
@@ -139,13 +165,27 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
if (StringUtils.isNotBlank(rejectReason)) { if (StringUtils.isNotBlank(rejectReason)) {
return "您的车辆三检【" + phaseName + "】未通过,不通过原因:" + rejectReason; return "您的车辆三检【" + phaseName + "】未通过,不通过原因:" + rejectReason;
} }
String auditResult = StringUtils.trimToEmpty(inspect.getAuditResult()); String auditResult = StringUtils.trimToEmpty(resolveReadableAuditResult(inspect.getAuditResult()));
if (StringUtils.isNotBlank(auditResult)) { if (StringUtils.isNotBlank(auditResult)) {
return "您的车辆三检【" + phaseName + "】未通过,审核意见:" + auditResult; return "您的车辆三检【" + phaseName + "】未通过,审核意见:" + auditResult;
} }
return "您的车辆三检【" + phaseName + "】未通过,请及时查看审核意见。"; return "您的车辆三检【" + phaseName + "】未通过,请及时查看审核意见。";
} }
private String resolveReadableAuditResult(String auditResult) {
String value = StringUtils.trimToNull(auditResult);
if (value == null) {
return null;
}
if ("1".equals(value)) {
return "通过";
}
if ("2".equals(value)) {
return "不通过";
}
return value;
}
private String getPhaseName(Long phase) { private String getPhaseName(Long phase) {
if (phase == null) { if (phase == null) {
return "未知阶段"; return "未知阶段";

View File

@@ -4,23 +4,19 @@ import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.hotwj.platform.common.helper.DriverLoginContextHelper; import com.hotwj.platform.common.helper.DriverLoginContextHelper;
import com.hotwj.platform.config.vehicleThreeInspect.domain.HotVehicleThreeInspect; import com.hotwj.platform.config.vehicleThreeInspect.domain.HotVehicleThreeInspect;
import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectBatchAuditBo; import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectBatchAuditBo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectBo; import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectBo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectMultiVehicleBatchAuditBo; import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectMultiVehicleBatchAuditBo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectVehicleQueryBo; import com.hotwj.platform.config.vehicleThreeInspect.domain.bo.HotVehicleThreeInspectVehicleQueryBo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.HotVehicleThreeInspectProcessVo; import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.*;
import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.HotVehicleThreeInspectReceivedVehicleVo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.HotVehicleThreeInspectSummaryVo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.HotVehicleThreeInspectUnreceivedVehicleVo;
import com.hotwj.platform.config.vehicleThreeInspect.domain.vo.HotVehicleThreeInspectVo;
import com.hotwj.platform.config.vehicleThreeInspectConfig.domain.HotVehicleThreeInspectConfig;
import com.hotwj.platform.config.vehicleThreeInspectConfig.mapper.HotVehicleThreeInspectConfigMapper;
import com.hotwj.platform.config.vehicleThreeInspect.mapper.HotVehicleThreeInspectMapper; import com.hotwj.platform.config.vehicleThreeInspect.mapper.HotVehicleThreeInspectMapper;
import com.hotwj.platform.config.vehicleThreeInspect.service.IHotVehicleThreeInspectService; import com.hotwj.platform.config.vehicleThreeInspect.service.IHotVehicleThreeInspectService;
import com.hotwj.platform.config.vehicleThreeInspectConfig.domain.HotVehicleThreeInspectConfig;
import com.hotwj.platform.config.vehicleThreeInspectConfig.mapper.HotVehicleThreeInspectConfigMapper;
import com.hotwj.platform.flow.service.ISysFlowService; import com.hotwj.platform.flow.service.ISysFlowService;
import com.hotwj.platform.integration.ocr.SignatureVerifyService; import com.hotwj.platform.integration.ocr.SignatureVerifyService;
import com.hotwj.platform.noticeManagerment.systemNotification.domain.bo.HotSystemNotificationGroupBo; import com.hotwj.platform.noticeManagerment.systemNotification.domain.bo.HotSystemNotificationGroupBo;
@@ -33,8 +29,8 @@ import com.hotwj.platform.securityManagement.vehicleInoutCheck.domain.HotVehicle
import com.hotwj.platform.securityManagement.vehicleInoutCheck.mapper.HotVehicleInoutCheckMapper; import com.hotwj.platform.securityManagement.vehicleInoutCheck.mapper.HotVehicleInoutCheckMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
@@ -49,16 +45,7 @@ import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.Collections;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
/** /**
@@ -905,12 +892,15 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
if (inspectIdSet.isEmpty()) { if (inspectIdSet.isEmpty()) {
throw new ServiceException("三检流程ID不能为空"); throw new ServiceException("三检流程ID不能为空");
} }
log.info("车辆三检批量审核开始: inspectIds={}, currentAuditorId={}, currentCompanyId={}, hasHiddenDanger={}, evaluatorId={}",
inspectIdSet, currentAuditorId, currentCompanyId, bo.getHasHiddenDanger(), bo.getEvaluatorId());
List<HotVehicleThreeInspectVo> detailList = baseMapper.querySummaryDetailList(new ArrayList<>(inspectIdSet)); List<HotVehicleThreeInspectVo> detailList = baseMapper.querySummaryDetailList(new ArrayList<>(inspectIdSet));
if (detailList == null || detailList.isEmpty()) { if (detailList == null || detailList.isEmpty()) {
throw new ServiceException("未查询到可批量审核的车辆三检数据"); throw new ServiceException("未查询到可批量审核的车辆三检数据");
} }
fillTaskId(detailList); fillTaskId(detailList);
log.info("车辆三检批量审核明细加载完成: detailCount={}, inspectCount={}", detailList.size(), inspectIdSet.size());
Map<Long, List<HotVehicleThreeInspectVo>> detailMap = new LinkedHashMap<>(); Map<Long, List<HotVehicleThreeInspectVo>> detailMap = new LinkedHashMap<>();
for (HotVehicleThreeInspectVo detail : detailList) { for (HotVehicleThreeInspectVo detail : detailList) {
@@ -933,6 +923,10 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
if (auditItems.isEmpty()) { if (auditItems.isEmpty()) {
throw new ServiceException("没有符合批量审核条件的数据"); throw new ServiceException("没有符合批量审核条件的数据");
} }
log.info("车辆三检批量审核审核项构建完成: inspectCount={}, auditItemCount={}, auditItemRecordIds={}",
inspectIdSet.size(),
auditItems.size(),
auditItems.stream().map(HotVehicleThreeInspectBo::getId).filter(Objects::nonNull).toList());
return auditItems; return auditItems;
} }
@@ -945,11 +939,14 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
List<HotVehicleThreeInspectBo> auditItems) { List<HotVehicleThreeInspectBo> auditItems) {
boolean hasBackCheck = false; boolean hasBackCheck = false;
String plateNumber = null; String plateNumber = null;
int pendingCount = 0; Long inspectId = null;
for (HotVehicleThreeInspectVo detail : currentDetails) { for (HotVehicleThreeInspectVo detail : currentDetails) {
if (detail == null) { if (detail == null) {
continue; continue;
} }
if (inspectId == null) {
inspectId = detail.getInspectId();
}
if (Objects.equals(detail.getInspectPhase(), 3L)) { if (Objects.equals(detail.getInspectPhase(), 3L)) {
hasBackCheck = true; hasBackCheck = true;
} }
@@ -961,22 +958,49 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
throw new ServiceException(buildBatchAuditVehicleMessage(plateNumber, "尚未完成收车检查,不可批量审核")); throw new ServiceException(buildBatchAuditVehicleMessage(plateNumber, "尚未完成收车检查,不可批量审核"));
} }
List<HotVehicleThreeInspectVo> candidateDetails = new ArrayList<>();
int skippedByCompany = 0;
int skippedByAuditor = 0;
int skippedByStatus = 0;
int skippedByTask = 0;
for (HotVehicleThreeInspectVo detail : currentDetails) { for (HotVehicleThreeInspectVo detail : currentDetails) {
if (detail == null) { if (detail == null) {
continue; continue;
} }
if (currentCompanyId != null && !Objects.equals(currentCompanyId, detail.getCompanyId())) { if (currentCompanyId != null && !Objects.equals(currentCompanyId, detail.getCompanyId())) {
skippedByCompany++;
continue; continue;
} }
if (!Objects.equals(currentAuditorId, detail.getAuditorId())) { if (!Objects.equals(currentAuditorId, detail.getAuditorId())) {
skippedByAuditor++;
continue; continue;
} }
if (!isPendingAuditRecord(detail)) { if (!isPendingAuditRecord(detail)) {
skippedByStatus++;
continue; continue;
} }
if (StringUtils.isBlank(detail.getTaskId())) { if (StringUtils.isBlank(detail.getTaskId())) {
skippedByTask++;
continue; continue;
} }
candidateDetails.add(detail);
}
log.info("车辆三检批量审核候选明细筛选: inspectId={}, plateNumber={}, totalDetails={}, candidateCount={}, skippedByCompany={}, skippedByAuditor={}, skippedByStatus={}, skippedByTask={}, candidateRecordIds={}",
inspectId,
plateNumber,
currentDetails.size(),
candidateDetails.size(),
skippedByCompany,
skippedByAuditor,
skippedByStatus,
skippedByTask,
candidateDetails.stream().map(HotVehicleThreeInspectVo::getId).filter(Objects::nonNull).toList());
if (candidateDetails.isEmpty()) {
throw new ServiceException(buildBatchAuditVehicleMessage(plateNumber, "没有当前账号可审核的未审核数据"));
}
for (HotVehicleThreeInspectVo detail : candidateDetails) {
HotVehicleThreeInspectBo item = new HotVehicleThreeInspectBo(); HotVehicleThreeInspectBo item = new HotVehicleThreeInspectBo();
item.setId(detail.getId()); item.setId(detail.getId());
item.setTaskId(detail.getTaskId()); item.setTaskId(detail.getTaskId());
@@ -989,12 +1013,13 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
item.setAuditorName(detail.getAuditorName()); item.setAuditorName(detail.getAuditorName());
item.setEvaluatorId(bo.getEvaluatorId()); item.setEvaluatorId(bo.getEvaluatorId());
auditItems.add(item); auditItems.add(item);
pendingCount++;
} }
if (pendingCount == 0) { log.info("车辆三检批量审核候选明细全部入队: inspectId={}, plateNumber={}, queuedCount={}, queuedRecordIds={}",
throw new ServiceException(buildBatchAuditVehicleMessage(plateNumber, "没有当前账号可审核的未审核数据")); inspectId,
} plateNumber,
candidateDetails.size(),
candidateDetails.stream().map(HotVehicleThreeInspectVo::getId).filter(Objects::nonNull).toList());
} }
private boolean isPendingAuditRecord(HotVehicleThreeInspectVo detail) { private boolean isPendingAuditRecord(HotVehicleThreeInspectVo detail) {