From 04bc3d96c929fc21190a6acdf12a687d2583334a Mon Sep 17 00:00:00 2001 From: yeyijiu Date: Thu, 28 May 2026 20:28:38 +0800 Subject: [PATCH] Fix-deduplication-logic --- .../domain/pojo/DataChangeCommentPojo.java | 2 +- .../impl/ActivitiProcessServiceImpl.java | 98 ++++++++++++++++++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/xdap/self_development/domain/pojo/DataChangeCommentPojo.java b/src/main/java/com/xdap/self_development/domain/pojo/DataChangeCommentPojo.java index 0163c9b..3585c1b 100644 --- a/src/main/java/com/xdap/self_development/domain/pojo/DataChangeCommentPojo.java +++ b/src/main/java/com/xdap/self_development/domain/pojo/DataChangeCommentPojo.java @@ -17,7 +17,7 @@ import java.util.Date; */ @SQLQuery(value = { @SQL(view = "selectLastedComment" - , sql = "SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY subsystem_name, parameter_name ORDER BY creation_date DESC) AS rn FROM data_change_comment WHERE param_detail_id IN (#paramIds) ) ranked WHERE rn = 1 ORDER BY subsystem_name, parameter_name") + , sql = "SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY param_detail_id ORDER BY creation_date DESC) AS rn FROM data_change_comment WHERE param_detail_id IN (#paramIds) ) ranked WHERE rn = 1 ORDER BY subsystem_name, parameter_name") }) @Data @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java index 1946fdf..aa3ddb8 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java @@ -15,7 +15,7 @@ import com.xdap.self_development.domain.view.FlowNode; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.service.*; import com.xdap.self_development.utils.RedisLockUtils; -import groovy.util.logging.Slf4j; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -173,6 +173,9 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { public void startActiviti(ApprovalNodeRequest approvalNodeRequest) { String processTitle = approvalNodeRequest.getProcessTitle(); String userId = approvalNodeRequest.getUserId(); + log.info("startActiviti 开始执行, modelId: {}, userId: {}, processTitle: {}", + approvalNodeRequest.getModelId(), userId, processTitle); + // 1. 获取第一个审批环节(按nodeOrder排序取最小) ApprovalNodeDTO firstNode = approvalNodeRequest.getNodeList().stream() .min(Comparator.comparingInt(ApprovalNodeDTO::getNodeOrder)) @@ -182,9 +185,15 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { .eq("id", approvalNodeRequest.getModelId()) .doQueryFirst(DataEntryEngineModelPojo.class); if (ObjectUtils.isEmpty(model)) { + log.error("机型不存在, modelId: {}", approvalNodeRequest.getModelId()); throw new CommonException("机型不存在,请检查"); } + log.info("查询机型成功, modelId: {}, modelName: {}, versionNumber: {}", + model.getId(), model.getModelName(), model.getVersionNumber()); + // 检查当前参数是否全部填写完成 + log.info("查询待办任务: model_id={}, data_type={}, owner_id={}, process_title={}", + model.getId(), CurrentNodeEnum.REPAIR.getDesc(), userId, model.getModelName() + "-" + "填写参数任务"); TodoTaskPojo filledTodo = bd.getBusinessDatabase() .eq("model_id", model.getId()) .eq("data_type", CurrentNodeEnum.REPAIR.getDesc()) @@ -192,7 +201,11 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { .eq("owner_id", userId) .eq("process_title", model.getModelName() + "-" + "填写参数任务") .doQueryFirst(TodoTaskPojo.class); + log.info("查询待办任务结果: {}", filledTodo != null ? "找到待办" : "未找到待办"); + if (filledTodo != null) { + log.info("查询待填写参数: engine_model_id={}, major_version={}, filled_by={}", + model.getId(), model.getVersionNumber(), userId); List toBeFilledParams = bd.getBusinessDatabase() .eq("engine_model_id", model.getId()) .eq("major_version", model.getVersionNumber()) @@ -200,6 +213,8 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { .isNull("minor_version") .in("version_status", Arrays.asList(1, null)) .doQuery(EngineParamDetailPojo.class); + log.info("查询待填写参数结果: 数量={}", toBeFilledParams.size()); + if (!ObjectUtils.isEmpty(toBeFilledParams)) { StringBuilder errorMsg = new StringBuilder("填写人在当前机型的参数未全部填写完成,请检查:\n"); for (EngineParamDetailPojo param : toBeFilledParams) { @@ -215,11 +230,14 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { } // 查询机型最新版本的参数,过滤出操作为更新且由当前用户更新的参数 + log.info("查询用户更新的参数: engine_model_id={}, major_version={}, last_updated_by={}", + model.getId(), model.getVersionNumber(), userId); List paramList = bd.getBusinessDatabase() .eq("engine_model_id", model.getId()) .eq("major_version", model.getVersionNumber()) .eq("last_updated_by", userId) .doQuery(EngineParamDetailPojo.class); + log.info("查询用户更新的参数结果: 数量={}", paramList.size()); if (paramList.isEmpty()) { throw new CommonException("没有找到您需要填写的参数"); @@ -232,6 +250,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { if (approvalNodeRequest.getFlowId() != null && !approvalNodeRequest.getFlowId().isEmpty()) { // 清除拒绝提醒待办 + log.info("清除拒绝提醒待办: document_no={}, data_type=数据拒绝", approvalNodeRequest.getFlowId()); bd.getBusinessDatabase() .eq("document_no", approvalNodeRequest.getFlowId()) .eq("data_type", "数据拒绝") @@ -258,6 +277,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { engineReviewListPojo.setReturnNum(0); engineReviewListPojo.setPreNode(-1); + log.info("插入审批记录: approvalId={}, modelId={}, statusCode={}", approvalId, model.getId(), ParamValueVersionEnum.UNDER.getCode()); bd.getBusinessDatabase().doInsert(engineReviewListPojo); //分发待办 @@ -279,6 +299,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { todoTaskPojo.setIsDelete(0); list.add(todoTaskPojo); } + log.info("批量插入待办任务: 数量={}", list.size()); bd.getBusinessDatabase().doBatchInsert(list); //创建审批发起 @@ -294,10 +315,12 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { initiatedTaskPojo.setCreationDate(engineReviewListPojo.getCreationDate()); initiatedTaskPojo.setIsDelete(0); initiatedTaskPojo.setEnableReturn(1); + log.info("插入发起任务: approvalId={}", approvalId); bd.getBusinessDatabase().doInsert(initiatedTaskPojo); //将参数绑定到该机型审批流程中 List collected = paramList.stream().map(EngineParamDetailPojo::getId).collect(Collectors.toList()); + log.info("更新参数状态: approvalId={}, 参数数量={}", approvalId, collected.size()); bd.getBusinessDatabase() .update("version_status", ParamValueVersionEnum.UNDER.getCode()) // 更新版本状态为审核中 .update("approval_id", approvalId) // 关联审批ID @@ -327,9 +350,11 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { approvalConfigs.add(config); b = false; } + log.info("批量插入审批配置: 数量={}", approvalConfigs.size()); bd.getBusinessDatabase().doBatchInsert(approvalConfigs); //记录审批提交操作 + log.info("插入审批记录: approvalId={}, 操作=发起审批", approvalId); bd.getBusinessDatabase().doInsert( new ParamApprovalRecordPojo( approvalId, @@ -345,14 +370,18 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { ); // 参数发起审批后,删除填写人的待办 + log.info("查询用户待办: owner_id={}, model_id={}, data_type=数据维护", userId, model.getId()); TodoTaskPojo todoTaskPojo = bd.getBusinessDatabase() .eq("owner_id", userId) .eq("model_id", model.getId()) .eq("data_type", "数据维护") .eq("is_delete", 0) .doQueryFirst(TodoTaskPojo.class); + log.info("查询用户待办结果: {}", todoTaskPojo != null ? "找到待办" : "未找到待办"); + if (todoTaskPojo != null) { // 修改待办和发起的任务状态 + log.info("删除待办: document_no={}", todoTaskPojo.getDocumentNo()); bd.getBusinessDatabase() .update("is_delete", 1) .update("current_node", "已维护") @@ -369,6 +398,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { completedTaskPojo.setCreationDate(engineReviewListPojo.getCreationDate()); completedTaskPojo.setIsDelete(0); completedTaskPojo.setCurrentNode("已维护"); + log.info("插入已办任务: document_no={}", todoTaskPojo.getDocumentNo()); bd.getBusinessDatabase().doInsert(completedTaskPojo); InitiatedTaskPojo initiatedTask = new InitiatedTaskPojo(); @@ -379,8 +409,10 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { initiatedTask.setCreationDate(engineReviewListPojo.getCreationDate()); initiatedTask.setIsDelete(0); initiatedTask.setCurrentNode("已维护"); + log.info("插入发起任务: document_no={}", todoTaskPojo.getDocumentNo()); bd.getBusinessDatabase().doInsert(initiatedTask); } + log.info("startActiviti 执行完成"); } /** @@ -907,6 +939,70 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { .doUpdate(EngineReviewListPojo.class); } + // 清理旧的 data_change_comment 数据并重新生成 + List paramDetailPojos = bd.getBusinessDatabase() + .eq("approval_id", reviewListPojo.getId()) + .doQuery(EngineParamDetailPojo.class); + + if (!ObjectUtils.isEmpty(paramDetailPojos)) { + Set paramDetailIds = paramDetailPojos.stream() + .map(EngineParamDetailPojo::getId) + .collect(Collectors.toSet()); + + // 删除旧的变更说明数据 + bd.getBusinessDatabase() + .in("param_detail_id", paramDetailIds) + .doDelete(DataChangeCommentPojo.class); + + // 重新生成变更说明数据 + List newDataChangeComments = new ArrayList<>(); + for (EngineParamDetailPojo paramDetail : paramDetailPojos) { + String parameterId = paramDetail.getParameterId(); + List parameters = bd.getBusinessDatabase() + .eq("id", parameterId) + .doQuery(ParameterPojo.class); + + ParameterPojo parameter = ObjectUtils.isEmpty(parameters) ? null : parameters.get(0); + + String com = ""; + String operation = paramDetail.getOperation(); + if (ParamOperationEnum.UPDATE.toString().equals(operation)) { + String parameterValue = StringUtils.isEmpty(paramDetail.getParameterValue()) ? + "" : paramDetail.getParameterValue(); + if (ObjectUtils.isEmpty(parameterValue)) { + com = "填写为:" + paramDetail.getMinorVersion(); + } else { + com = "修改:" + parameterValue + "改为" + paramDetail.getMinorVersion(); + } + } + if (ParamOperationEnum.INSERT.toString().equals(operation)) { + com = "新增"; + } + if (ParamOperationEnum.DELETE.toString().equals(operation)) { + com = "删除"; + } + + DataChangeCommentPojo dataChangeCommentPojo = new DataChangeCommentPojo(); + BeanUtils.copyProperties(paramDetail, dataChangeCommentPojo, "id"); + if (parameter != null) { + dataChangeCommentPojo.setPartsName(parameter.getPartsName()); + dataChangeCommentPojo.setUnit(parameter.getUnit()); + } + dataChangeCommentPojo.setParamDetailId(paramDetail.getId()); + dataChangeCommentPojo.setChangeComment(com); + dataChangeCommentPojo.setParameterValue(paramDetail.getMinorVersion()); + dataChangeCommentPojo.setCreatedBy(userId); + dataChangeCommentPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + + newDataChangeComments.add(dataChangeCommentPojo); + } + + // 批量插入新的变更说明数据 + if (!ObjectUtils.isEmpty(newDataChangeComments)) { + bd.getBusinessDatabase().doBatchInsert(newDataChangeComments); + } + } + // 添加新待办 myself.addNodeTodo( reviewListPojo,