refactor(vehicleThreeInspect): 优化批量审核与隐患治理流程,完善日志与异常处理
- 为车辆三检批量审核流程添加多阶段详细日志便于排查问题 - 重构批量审核筛选逻辑,新增各跳过原因统计及无候选数据提前抛出异常 - 修复隐患治理流程重复创建问题,新增重复记录检查逻辑 - 优化隐患治理流程的参数处理与日志输出,新增审核结果翻译工具方法 - 更新流程回调日志,补充实例ID、流程编码等上下文信息
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
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.mapper.HotVehicleThreeInspectMapper;
|
||||
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.mapper.HotHiddenDangerMapper;
|
||||
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.StringUtils;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -48,7 +49,7 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
|
||||
|
||||
@Override
|
||||
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);
|
||||
// 去掉try catch,防止事务无法正常回滚
|
||||
HotVehicleThreeInspect inspect = inspectMapper.selectById(id);
|
||||
@@ -74,45 +75,70 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
|
||||
* 创建隐患治理流程
|
||||
*/
|
||||
private void createHiddenDangerFlow(HotVehicleThreeInspect inspect) {
|
||||
if (inspect.getHasHiddenDanger() != null && inspect.getHasHiddenDanger() == 1L) {
|
||||
log.info("车辆三检存在隐患,自动创建隐患治理流程,业务ID: {}", inspect.getId());
|
||||
|
||||
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);
|
||||
if (!Long.valueOf(1L).equals(inspect.getHasHiddenDanger())) {
|
||||
log.info("车辆三检未标记隐患,跳过隐患治理创建: recordId={}, inspectId={}", inspect.getId(), inspect.getInspectId());
|
||||
return;
|
||||
}
|
||||
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) {
|
||||
@@ -139,13 +165,27 @@ public class VehicleThreeInspectCallback implements IFlowCallback {
|
||||
if (StringUtils.isNotBlank(rejectReason)) {
|
||||
return "您的车辆三检【" + phaseName + "】未通过,不通过原因:" + rejectReason;
|
||||
}
|
||||
String auditResult = StringUtils.trimToEmpty(inspect.getAuditResult());
|
||||
String auditResult = StringUtils.trimToEmpty(resolveReadableAuditResult(inspect.getAuditResult()));
|
||||
if (StringUtils.isNotBlank(auditResult)) {
|
||||
return "您的车辆三检【" + phaseName + "】未通过,审核意见:" + auditResult;
|
||||
}
|
||||
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) {
|
||||
if (phase == null) {
|
||||
return "未知阶段";
|
||||
|
||||
@@ -4,23 +4,19 @@ import cn.hutool.core.date.DateUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
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.databind.JsonNode;
|
||||
import com.hotwj.platform.common.helper.DriverLoginContextHelper;
|
||||
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.HotVehicleThreeInspectBo;
|
||||
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.vo.HotVehicleThreeInspectProcessVo;
|
||||
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.domain.vo.*;
|
||||
import com.hotwj.platform.config.vehicleThreeInspect.mapper.HotVehicleThreeInspectMapper;
|
||||
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.integration.ocr.SignatureVerifyService;
|
||||
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 lombok.RequiredArgsConstructor;
|
||||
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.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.json.utils.JsonUtils;
|
||||
@@ -49,16 +45,7 @@ import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
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.*;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
/**
|
||||
@@ -905,12 +892,15 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
|
||||
if (inspectIdSet.isEmpty()) {
|
||||
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));
|
||||
if (detailList == null || detailList.isEmpty()) {
|
||||
throw new ServiceException("未查询到可批量审核的车辆三检数据");
|
||||
}
|
||||
fillTaskId(detailList);
|
||||
log.info("车辆三检批量审核明细加载完成: detailCount={}, inspectCount={}", detailList.size(), inspectIdSet.size());
|
||||
|
||||
Map<Long, List<HotVehicleThreeInspectVo>> detailMap = new LinkedHashMap<>();
|
||||
for (HotVehicleThreeInspectVo detail : detailList) {
|
||||
@@ -933,6 +923,10 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
|
||||
if (auditItems.isEmpty()) {
|
||||
throw new ServiceException("没有符合批量审核条件的数据");
|
||||
}
|
||||
log.info("车辆三检批量审核审核项构建完成: inspectCount={}, auditItemCount={}, auditItemRecordIds={}",
|
||||
inspectIdSet.size(),
|
||||
auditItems.size(),
|
||||
auditItems.stream().map(HotVehicleThreeInspectBo::getId).filter(Objects::nonNull).toList());
|
||||
return auditItems;
|
||||
}
|
||||
|
||||
@@ -945,11 +939,14 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
|
||||
List<HotVehicleThreeInspectBo> auditItems) {
|
||||
boolean hasBackCheck = false;
|
||||
String plateNumber = null;
|
||||
int pendingCount = 0;
|
||||
Long inspectId = null;
|
||||
for (HotVehicleThreeInspectVo detail : currentDetails) {
|
||||
if (detail == null) {
|
||||
continue;
|
||||
}
|
||||
if (inspectId == null) {
|
||||
inspectId = detail.getInspectId();
|
||||
}
|
||||
if (Objects.equals(detail.getInspectPhase(), 3L)) {
|
||||
hasBackCheck = true;
|
||||
}
|
||||
@@ -961,22 +958,49 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
|
||||
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) {
|
||||
if (detail == null) {
|
||||
continue;
|
||||
}
|
||||
if (currentCompanyId != null && !Objects.equals(currentCompanyId, detail.getCompanyId())) {
|
||||
skippedByCompany++;
|
||||
continue;
|
||||
}
|
||||
if (!Objects.equals(currentAuditorId, detail.getAuditorId())) {
|
||||
skippedByAuditor++;
|
||||
continue;
|
||||
}
|
||||
if (!isPendingAuditRecord(detail)) {
|
||||
skippedByStatus++;
|
||||
continue;
|
||||
}
|
||||
if (StringUtils.isBlank(detail.getTaskId())) {
|
||||
skippedByTask++;
|
||||
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();
|
||||
item.setId(detail.getId());
|
||||
item.setTaskId(detail.getTaskId());
|
||||
@@ -989,12 +1013,13 @@ public class HotVehicleThreeInspectServiceImpl implements IHotVehicleThreeInspec
|
||||
item.setAuditorName(detail.getAuditorName());
|
||||
item.setEvaluatorId(bo.getEvaluatorId());
|
||||
auditItems.add(item);
|
||||
pendingCount++;
|
||||
}
|
||||
|
||||
if (pendingCount == 0) {
|
||||
throw new ServiceException(buildBatchAuditVehicleMessage(plateNumber, "没有当前账号可审核的未审核数据"));
|
||||
}
|
||||
log.info("车辆三检批量审核候选明细全部入队: inspectId={}, plateNumber={}, queuedCount={}, queuedRecordIds={}",
|
||||
inspectId,
|
||||
plateNumber,
|
||||
candidateDetails.size(),
|
||||
candidateDetails.stream().map(HotVehicleThreeInspectVo::getId).filter(Objects::nonNull).toList());
|
||||
}
|
||||
|
||||
private boolean isPendingAuditRecord(HotVehicleThreeInspectVo detail) {
|
||||
|
||||
Reference in New Issue
Block a user