diff --git a/src/main/java/com/xujie/sys/modules/erf/service/ErfFlowEngineService.java b/src/main/java/com/xujie/sys/modules/erf/service/ErfFlowEngineService.java index be3ad178..867f42a5 100644 --- a/src/main/java/com/xujie/sys/modules/erf/service/ErfFlowEngineService.java +++ b/src/main/java/com/xujie/sys/modules/erf/service/ErfFlowEngineService.java @@ -33,19 +33,13 @@ public interface ErfFlowEngineService { void startFlowWithApprovers(String applyNo, String buCode, Long creatorUserId, Map approverInfo); /** - * 重新启动流程(驳回后重新下达) + * 删除申请单的所有流程节点实例 * - *

与 startFlowWithApprovers 的区别:

- * + *

撤回操作时调用,清空节点记录,下次下达时重新创建

* * @param applyNo 申请单号 - * @param approverInfo 审批人信息(techManagerId, prodManagerIds, qualityManagerIds) */ - void restartFlowWithApprovers(String applyNo, Map approverInfo); + void deleteFlowNodes(String applyNo); /** * 流转到下一个节点 diff --git a/src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java b/src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java index a246158c..9715c51e 100644 --- a/src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java @@ -140,19 +140,9 @@ public class ErfExpApplyServiceImpl extends ServiceImpl flowQuery = new QueryWrapper<>(); - flowQuery.eq("apply_no", data.getApplyNo()); - ErfFlowInstance existingFlow = erfFlowInstanceMapper.selectOne(flowQuery); - - boolean isFirstSubmit = (existingFlow == null); - String action = isFirstSubmit ? "首次下达" : - ("已驳回".equals(entity.getStatus()) ? "驳回后重新下达" : "撤回后重新下达"); + String action = "已驳回".equals(entity.getStatus()) ? "驳回后重新下达" : "下达"; - log.info("申请单: {}, 流程实例存在: {}, 当前状态: {}, 操作: {}", - data.getApplyNo(), existingFlow != null, entity.getStatus(), action); + log.info("申请单: {}, 当前状态: {}, 操作: {}", data.getApplyNo(), entity.getStatus(), action); // 更新申请单状态(updateTime由MyBatis-Plus自动填充) entity.setStatus("已下达"); @@ -166,22 +156,13 @@ public class ErfExpApplyServiceImpl extends ServiceImpl approverInfo) { - log.info("=== 重新启动流程(驳回后重新下达)=== 申请单号: {}", applyNo); - - Long techManagerId = (Long) approverInfo.get("techManagerId"); - @SuppressWarnings("unchecked") - List prodManagerIds = (List) approverInfo.get("prodManagerIds"); - @SuppressWarnings("unchecked") - List qualityManagerIds = (List) approverInfo.get("qualityManagerIds"); - - log.info("审批人信息 - 技术经理: {}, 生产经理: {}, 质量经理: {}", - techManagerId, prodManagerIds, qualityManagerIds); - // 1. 查询已有的流程实例 + // 3. 创建或更新流程实例 QueryWrapper flowQuery = new QueryWrapper<>(); flowQuery.eq("apply_no", applyNo); ErfFlowInstance flowInstance = erfFlowInstanceMapper.selectOne(flowQuery); - + boolean isNewInstance = (flowInstance == null); if (flowInstance == null) { - throw new XJException("流程实例不存在,无法重新下达"); + flowInstance = new ErfFlowInstance(); + flowInstance.setApplyNo(applyNo); + flowInstance.setFlowCode("EXP_APPLY_" + buCode); + flowInstance.setFlowVersion(1); + flowInstance.setStartTime(new Date()); } - - // 2. 更新流程实例的审批人信息和状态 flowInstance.setStatus("运行中"); flowInstance.setCurrentNodeCode("技术经理审批"); - - // 更新审批人信息到remark字段 - String approverJson = String.format( - "{\"techManagerId\":%d,\"prodManagerIds\":[%s],\"qualityManagerIds\":[%s]}", - techManagerId, - prodManagerIds.stream().map(String::valueOf).collect(Collectors.joining(",")), - qualityManagerIds.stream().map(String::valueOf).collect(Collectors.joining(",")) - ); flowInstance.setRemark(approverJson); - erfFlowInstanceMapper.updateById(flowInstance); - - log.info("更新流程实例,当前节点:技术经理审批"); - // 3. 查询技术经理审批节点的最大attempt_no - QueryWrapper nodeQuery = new QueryWrapper<>(); - nodeQuery.eq("apply_no", applyNo) - .eq("node_code", "技术经理审批") - .orderByDesc("attempt_no") - .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"); - ErfFlowNodeInstance lastInstance = erfFlowNodeInstanceMapper.selectOne(nodeQuery); - - int nextAttemptNo = (lastInstance != null) ? lastInstance.getAttemptNo() + 1 : 1; + if (isNewInstance) { + erfFlowInstanceMapper.insert(flowInstance); + log.info("新建流程实例"); + } else { + erfFlowInstanceMapper.updateById(flowInstance); + log.info("更新已有流程实例"); + } - // 4. 创建新的技术经理审批节点实例(attempt_no递增) + // 4. 创建第一个审批节点实例(技术经理审批) ErfFlowNodeInstance nodeInstance = new ErfFlowNodeInstance(); nodeInstance.setApplyNo(applyNo); nodeInstance.setNodeCode("技术经理审批"); - nodeInstance.setAttemptNo(nextAttemptNo); + nodeInstance.setAttemptNo(1); nodeInstance.setStatus("待审核"); nodeInstance.setReceiveTime(new Date()); - nodeInstance.setAssigneeUserId(techManagerId); // 使用新的技术经理ID - // 根据审批人id查询审批人名称并设置到节点实例(冗余存储,方便查询和展示) + nodeInstance.setAssigneeUserId(techManagerId); nodeInstance.setAssigneeName(sysUserDao.getUserDisplayById(techManagerId)); erfFlowNodeInstanceMapper.insert(nodeInstance); - log.info("流程重新启动成功,当前节点:技术经理审批,尝试次数:{},审批人ID:{}", - nextAttemptNo, techManagerId); + log.info("流程启动成功,当前节点:技术经理审批,审批人ID:{}", techManagerId); + } + + @Override + public void deleteFlowNodes(String applyNo) { + int deletedCount = erfFlowNodeInstanceMapper.delete( + new QueryWrapper().eq("apply_no", applyNo) + ); + log.info("删除申请单 {} 的流程节点实例,共 {} 条", applyNo, deletedCount); } @Override