diff --git a/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/callback/VehicleThreeInspectCallback.java b/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/callback/VehicleThreeInspectCallback.java index 62b5c1e..c9ffb4f 100644 --- a/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/callback/VehicleThreeInspectCallback.java +++ b/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/callback/VehicleThreeInspectCallback.java @@ -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.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 "未知阶段"; diff --git a/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/service/impl/HotVehicleThreeInspectServiceImpl.java b/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/service/impl/HotVehicleThreeInspectServiceImpl.java index 1730e6b..470040a 100644 --- a/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/service/impl/HotVehicleThreeInspectServiceImpl.java +++ b/src/main/java/com/hotwj/platform/config/vehicleThreeInspect/service/impl/HotVehicleThreeInspectServiceImpl.java @@ -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 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> 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 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 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) {