From 2ea9e70932c7b682f3e0707af384f5f0927a8419 Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Sat, 10 Jan 2026 14:42:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=95=B4=E4=BD=93=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E6=9C=89=E9=80=80=E5=9B=9E=E9=83=BD=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E7=9B=B4=E9=80=81=EF=BC=8C=E5=AE=8C=E5=96=84=E9=80=80=E5=9B=9E?= =?UTF-8?q?=E3=80=81=E6=92=A4=E5=9B=9E=E5=92=8C=E5=A4=84=E7=90=86=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E7=9A=84=E7=BB=86=E8=8A=82=EF=BC=9B=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=95=B4=E4=BD=93=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/BusinessDatabase.java | 2 +- .../TemplateApprovalController.java | 30 +- .../controller/form/ApprovalUserNodeDTO.java | 14 + .../self_development/pojo/ApprovalFlow.java | 1 + .../pojo/InitiatedTaskPojo.java | 4 + .../service/TemplateApprovalService.java | 11 +- .../impl/TemplateApprovalServiceImpl.java | 262 +++++++++++------- src/main/resources/application.properties | 12 - 8 files changed, 219 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/xdap/self_development/controller/form/ApprovalUserNodeDTO.java diff --git a/src/main/java/com/xdap/self_development/config/BusinessDatabase.java b/src/main/java/com/xdap/self_development/config/BusinessDatabase.java index b1693f8..2d2bc16 100644 --- a/src/main/java/com/xdap/self_development/config/BusinessDatabase.java +++ b/src/main/java/com/xdap/self_development/config/BusinessDatabase.java @@ -24,6 +24,6 @@ public class BusinessDatabase { @Bean public MpaasQuery getTCDatabase() { - return queryFactory.buildFromDatasource("yc_lrs_test_relsult"); + return queryFactory.buildFromDatasource(DatasourceConstant.XDAP_MYSQL_PREFIX + tenantId); } } diff --git a/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java b/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java index 860bbd0..b85335b 100644 --- a/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java +++ b/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java @@ -5,6 +5,7 @@ import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.runtime.service.RuntimeDatasourceService; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; +import com.xdap.self_development.pojo.dto.ApprovalNodeDTO; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.DepartmentUserView; import com.xdap.self_development.pojo.view.TemplateChangeView; @@ -25,6 +26,15 @@ public class TemplateApprovalController { @Resource private RuntimeDatasourceService runtimeDatasourceService; + // 获取流程审批人 + @GetMapping("/getApprovalUsers") + public Response getApprovalUsers( + @NotBlank @RequestParam String templateId + ) { + List nodes = templateApprovalService.getApprovalUsers(templateId); + return Response.ok().data(nodes); + } + // 获取用户和部门 @GetMapping("/getUsersByCondition") public Response getUsersByCondition( @@ -51,13 +61,27 @@ public class TemplateApprovalController { return Response.ok().data(templateApprovalService.startApproval(request)); } - // 发起人拒绝后重新发起审批 - @GetMapping("/restartApproval") + @PostMapping("/restartApproval") public Response restartApproval( + @RequestBody @Valid StartApprovalRequest request, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + templateApprovalService.restartApproval(request); + return Response.ok(); + } + + // 直送回退回的节点 + @GetMapping("/directSendingApproval") + public Response directSendingApproval( @RequestParam @NotBlank String templateId, @RequestParam @NotBlank String userId ) { - templateApprovalService.restartApproval(templateId, userId); + templateApprovalService.directSendingApproval(templateId, userId); return Response.ok(); } diff --git a/src/main/java/com/xdap/self_development/controller/form/ApprovalUserNodeDTO.java b/src/main/java/com/xdap/self_development/controller/form/ApprovalUserNodeDTO.java new file mode 100644 index 0000000..ddc3483 --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/form/ApprovalUserNodeDTO.java @@ -0,0 +1,14 @@ +package com.xdap.self_development.controller.form; + +import com.xdap.api.moudle.user.pojo.XdapUsers; +import com.xdap.self_development.pojo.view.XdapUserView; +import lombok.Data; + +import java.util.List; + +@Data +public class ApprovalUserNodeDTO { + private String nodeName; + private List assignees; + private Integer nodeOrder; +} diff --git a/src/main/java/com/xdap/self_development/pojo/ApprovalFlow.java b/src/main/java/com/xdap/self_development/pojo/ApprovalFlow.java index 368ba11..d0240a0 100644 --- a/src/main/java/com/xdap/self_development/pojo/ApprovalFlow.java +++ b/src/main/java/com/xdap/self_development/pojo/ApprovalFlow.java @@ -21,6 +21,7 @@ public class ApprovalFlow extends MpaasBasePojo { private Integer currentNode; // 节点:PROOFREAD, REVIEW, COUNTERSIGN, APPROVE private String flowStatus; //DRAFT(草稿)、APPROVING(审批中)、COMPLETE(已完成)、RETURNED(已撤回)、REJECTED(已拒绝) private Integer returnNum; + private Integer preNode; private String createBy; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") diff --git a/src/main/java/com/xdap/self_development/pojo/InitiatedTaskPojo.java b/src/main/java/com/xdap/self_development/pojo/InitiatedTaskPojo.java index c596ef1..5c0a3ed 100644 --- a/src/main/java/com/xdap/self_development/pojo/InitiatedTaskPojo.java +++ b/src/main/java/com/xdap/self_development/pojo/InitiatedTaskPojo.java @@ -103,5 +103,9 @@ public class InitiatedTaskPojo implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date lastUpdateDate; + /** + * 是否可退回 + */ + private Integer enableReturn; } diff --git a/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java b/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java index 86930b0..af3b352 100644 --- a/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java +++ b/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java @@ -6,6 +6,7 @@ import com.xdap.self_development.pojo.ApprovalConfigPojo; import com.xdap.self_development.pojo.ApprovalFlow; import com.xdap.self_development.pojo.ApprovalRecord; import com.xdap.self_development.pojo.Template; +import com.xdap.self_development.pojo.dto.ApprovalNodeDTO; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TodoAndTemplateView; @@ -17,7 +18,7 @@ import java.util.List; public interface TemplateApprovalService { String startApproval(StartApprovalRequest request); - void restartApproval(@NotBlank String templateId, @NotBlank String userId); + void directSendingApproval(@NotBlank String templateId, @NotBlank String userId); PageQueryResult getApprovalList(ApprovalListForm form); @@ -41,9 +42,13 @@ public interface TemplateApprovalService { boolean checkNodeComplete(ApprovalFlow flow, ApprovalConfigPojo node); - void updateTasks(ApprovalFlow flow, String status); + void updateTasks(ApprovalFlow flow, String status, Integer enableReturn); - void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy); + void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy, Integer enableReturn); List getReturnNodes(@NotBlank String flowId); + + List getApprovalUsers(@NotBlank String templateId); + + void restartApproval(@Valid StartApprovalRequest request); } diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java index 355e27c..e838b6c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java @@ -47,7 +47,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Override @Transactional(rollbackFor = Exception.class) public String startApproval(StartApprovalRequest request) { - // 验证模板能否发起审批 + // 验证能否发起审批 Template template = bd.getBusinessDatabase() .rowid("id", request.getTemplateRowId()) .doQueryFirst(Template.class); @@ -75,7 +75,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { throw new CommonException("空参数模板不允许发起审批"); } - // 创建审批流程 + // 新增流程 ApprovalFlow flow = new ApprovalFlow(); flow.setTemplateId(template.getId()); flow.setCurrentNode(1); @@ -86,9 +86,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { flow.setFlowType(1); // 设置为模板审批流程 flow.setExplanation(request.getExplanation()); flow.setReturnNum(template.getReturnNum()); + flow.setPreNode(-1);// 标识没有退回节点 bd.getBusinessDatabase().doInsert(flow); - // 创建审批配置 + // 新增流程配置 List approvalConfigs = new ArrayList<>(); ApprovalNodeDTO firstNode = new ApprovalNodeDTO(); boolean hasUsers = false; @@ -118,7 +119,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } bd.getBusinessDatabase().doBatchInsert(approvalConfigs); - // 新增待办 + // 新增我的待办 List list = new ArrayList<>(); for (String person : firstNode.getAssignees()) { TodoTaskPojo todoTask = new TodoTaskPojo(); @@ -152,9 +153,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { initiatedTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); initiatedTask.setIsDelete(0); initiatedTask.setModelId(flow.getTemplateId()); + initiatedTask.setEnableReturn(1); bd.getBusinessDatabase().doInsert(initiatedTask); - // 增加发起记录 + // 新增发起记录 bd.getBusinessDatabase().doInsert( new ApprovalRecord( flow.getId(), @@ -168,7 +170,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ); - // 更新模板状态为校对中 + // 更新模板状态为审批中 template.setStatus("APPROVING"); bd.getBusinessDatabase() .rowid("id", template.getRowId()) @@ -179,84 +181,75 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Override @Transactional(rollbackFor = Exception.class) - public void restartApproval(String templateId, String userId) { - // 判断当前模板是否存在 + public void directSendingApproval(String templateId, String userId) { + // 获取模板 Template template = bd.getBusinessDatabase() .eq("id", templateId) - .eq("status", "DRAFT") .doQueryFirst(Template.class); if (template == null) { throw new CommonException("模板不存在"); } - // 查找上次未完成的流程 - ApprovalFlow approvalFlow = bd.getBusinessDatabase() - .eq("templateId", templateId) - .eq("flow_status", "REJECTED") + // 获取到模板最近一次未完成的流程 + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("template_id", templateId) + .ne("pre_node", -1) .orderBy("created_time", "desc") .doQueryFirst(ApprovalFlow.class); - if (approvalFlow == null) { - throw new CommonException("没有上次未完成的流程"); + if (flow == null) { + throw new CommonException("模板没有未完成的流程"); } - // 查找当前节点 - ApprovalConfigPojo currentNode = bd.getBusinessDatabase() - .eq("approval_id", approvalFlow.getId()) - .eq("node_order", approvalFlow.getCurrentNode()) + // 根据状态不同获取节点和节点层级 + ApprovalConfigPojo preNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_order", flow.getPreNode()) .doQueryFirst(ApprovalConfigPojo.class); + ApprovalRecord lastedRecord = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .orderBy("approval_time", "desc") + .doQueryFirst(ApprovalRecord.class) ; + Integer level = Objects.equals(lastedRecord.getResult(), "MSG") ? lastedRecord.getApprovalLevel() : lastedRecord.getApprovalLevel() + 1; - String lockKey = FLOW_LOCK_PREFIX + approvalFlow.getId() + ":" + currentNode.getNodeName(); - String lockValue = UUID.randomUUID().toString(); - boolean lockAcquired = redisLockUtil - .tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); - if (!lockAcquired) { - throw new CommonException("当前节点正在处理,请稍后重试"); - } - try { - // 重新创建待办继续流程 - myself.addNodeTodo( - approvalFlow, - currentNode, - template, - userId - ); + // 重新创建待办继续流程 + myself.addNodeTodo( + flow, + preNode, + template, + userId, + 1 + ); - bd.getBusinessDatabase() - .eq("id", approvalFlow.getId()) - .update("flow_status", "APPROVING") - .doUpdate(ApprovalFlow.class); + bd.getBusinessDatabase() + .eq("id", flow.getId()) + .update("flow_status", "APPROVING") + .update("current_node", flow.getPreNode()) + .update("pre_node", -1) + .doUpdate(ApprovalFlow.class); - bd.getBusinessDatabase() - .eq("id", template.getId()) - .update("status", "APPROVING") - .doUpdate(Template.class); + bd.getBusinessDatabase() + .eq("id", template.getId()) + .update("status", "APPROVING") + .doUpdate(Template.class); - // 清除拒绝提醒待办 - bd.getBusinessDatabase() - .eq("document_no", approvalFlow.getId()) - .eq("current_node", currentNode.getNodeName()) - .eq("data_type", "模板拒绝") - .update("is_delete", 1) - .doUpdate(TodoTaskPojo.class); + // 清除拒绝提醒待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("data_type", "模板拒绝") + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); - // 创建直送记录 - ApprovalRecord lastedRecord = bd.getBusinessDatabase() - .eq("flow_id", approvalFlow.getId()) - .orderBy("approval_time", "desc") - .doQueryFirst(ApprovalRecord.class); - ApprovalRecord record = new ApprovalRecord( - approvalFlow.getId(), - "直送至" + currentNode.getNodeName(), - xdapDeptUsersService.selectUserByID(userId).getUsername(), - "直送", - "MSG", - Timestamp.valueOf(LocalDateTime.now()), - lastedRecord.getApprovalLevel() + 1 - ); - bd.getBusinessDatabase().doInsert(record); - } finally { - redisLockUtil.unlock(lockKey, lockValue); - } + // 创建直送记录 + ApprovalRecord record = new ApprovalRecord( + flow.getId(), + "直送至" + preNode.getNodeName(), + xdapDeptUsersService.selectUserByID(userId).getUsername(), + "直送", + "MSG", + Timestamp.valueOf(LocalDateTime.now()), + level + ); + bd.getBusinessDatabase().doInsert(record); } // 查询所有流程 @@ -293,7 +286,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Override @Transactional(rollbackFor = Exception.class) public void handleApproval(HandleApprovalRequest request) { - // 验证流程状态 + // 验证流程状态和用户权限 ApprovalFlow flow = bd.getBusinessDatabase() .eq("id", request.getFlowId()) .eq("flow_type", 1) @@ -301,14 +294,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { if (flow == null || !"APPROVING".equals(flow.getFlowStatus())) { throw new CommonException("流程不存在或已结束"); } - - // 获取当前流程节点 ApprovalConfigPojo currentNode = bd.getBusinessDatabase() .eq("approval_id", flow.getId()) .eq("node_order", flow.getCurrentNode()) .doQueryFirst(ApprovalConfigPojo.class); - - // 验证当前用户是否有权限处理 if (!hasPermission(currentNode, request.getUserId())) { throw new CommonException("无权限处理或已被处理"); } @@ -319,7 +308,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .orderBy("approval_time", "desc") .doQueryFirst(ApprovalRecord.class); - // 抢签节点 + // 处理审批节点 if (!"会签".equals(currentNode.getNodeName())) { String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName(); String lockValue = UUID.randomUUID().toString(); @@ -329,7 +318,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { throw new CommonException("当前节点正在处理,请稍后重试"); } try { - // 查询已完成的任务,检查当前节点是否完成 + // 抢签节点需要验证是否被处理 int processedCount = bd.getBusinessDatabase() .eq("flow_id", flow.getId()) .eq("node", currentNode.getNodeName()) @@ -359,7 +348,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord ) { - // 记录当前审批结果 + // 新增当前审批结果 ApprovalRecord record = new ApprovalRecord( flow.getId(), currentNode.getNodeName(), @@ -371,15 +360,26 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ); bd.getBusinessDatabase().doInsert(record); - // 当前流程当前节点的所有待办全部删除 + // 软删除当前节点当前处理人的待办 + if (!Objects.equals(currentNode.getNodeName(), "会签")) { + // 抢签节点还需要软删除其他人的待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", currentNode.getNodeName()) + .ne("owner_id", request.getUserId()) + .update("is_delete", 1) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); + } bd.getBusinessDatabase() .eq("document_no", flow.getId()) .eq("current_node", currentNode.getNodeName()) + .eq("owner_id", request.getUserId()) .update("is_delete", 1) .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) .doUpdate(TodoTaskPojo.class); - // 更新当前用户的已办 + // 新增当前处理人的已办 CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); completedTaskPojo.setDocumentNo(flow.getId()); completedTaskPojo.setCreatedById(request.getUserId()); @@ -406,12 +406,20 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) { + // 删除所有待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", node.getNodeName()) + .update("is_delete", 1) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); // 更新流程状态 flow.setFlowStatus(status); bd.getBusinessDatabase() .rowid("id", flow.getRowId()) .update("flow_status", flow.getFlowStatus()) .update("return_num", flow.getReturnNum() + 1) + .update("pre_node", node.getNodeOrder()) .doUpdate(ApprovalFlow.class); // 更新模板状态(重新打回草稿状态) Template template = bd.getBusinessDatabase() @@ -443,7 +451,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { bd.getBusinessDatabase().doInsert(todoTask); } // 更新发起和已办 - myself.updateTasks(flow, Objects.equals(status, "REJECTED") ? "已拒绝" : "已撤回"); + myself.updateTasks(flow, Objects.equals(status, "REJECTED") ? "已拒绝" : "已撤回", 0); } // 处理下一节点流转 @@ -480,12 +488,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .update("published_time", Timestamp.valueOf(LocalDateTime.now())) .doUpdate(Template.class); // 待办环节修改 - myself.updateTasks(flow, "已完成"); + myself.updateTasks(flow, "已完成", 0); // 更新机型版本 // dataEntryEngineModelService.updateModelForNewVersion(); } else { flow.setCurrentNode(nextNode.getNodeOrder()); - myself.addNodeTodo(flow, nextNode, template, userId); + myself.addNodeTodo(flow, nextNode, template, userId, 0); } bd.getBusinessDatabase() @@ -513,7 +521,13 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } } - public void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy) { + public void addNodeTodo( + ApprovalFlow flow, + ApprovalConfigPojo node, + Template template, + String createBy, + Integer enableReturn + ) { // 获取处理人 List users = JSON.parseArray(node.getAssignees()).toJavaList(String.class); // 新增待办 @@ -538,7 +552,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } // 更新已办和发起的状态 - myself.updateTasks(flow, node.getNodeName()); + myself.updateTasks(flow, node.getNodeName(), enableReturn); if (!list.isEmpty()) { bd.getBusinessDatabase().doBatchInsert(list); @@ -560,7 +574,45 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .collect(Collectors.toList()); } - public void updateTasks(ApprovalFlow flow, String status) { + @Override + public List getApprovalUsers(String templateId) { + List list = new ArrayList<>(); + + // 获取到模板最近一次未完成的流程 + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("template_id", templateId) + .ne("pre_node", -1) + .orderBy("created_time", "desc") + .doQueryFirst(ApprovalFlow.class); + if (flow == null) { + return list; + } + + // 获取流程节点 + List approvalConfigs = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .doQuery(ApprovalConfigPojo.class); + + approvalConfigs.forEach(node -> { + ApprovalUserNodeDTO dto = new ApprovalUserNodeDTO(); + List userIds = JSON.parseArray(node.getAssignees()).toJavaList(String.class); + dto.setNodeName(node.getNodeName()); + dto.setNodeOrder(node.getNodeOrder()); + dto.setAssignees( + bd.getBusinessDatabase() + .in("id", userIds) + .doQuery(XdapUsers.class) + ); + }); + return list; + } + + @Override + public void restartApproval(StartApprovalRequest request) { + + } + + public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) { // 更新已办和发起的节点状态 bd.getBusinessDatabase() .eq("document_no", flow.getId()) @@ -665,6 +717,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { for (Map.Entry> entry : levelMap.entrySet()) { // 获取到每一层 int level = entry.getKey(); + Set nodeList = new HashSet<>(); List records = entry.getValue(); List uniqueRecords = new ArrayList<>(records.stream() .collect(Collectors.toMap( @@ -677,6 +730,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode()); if (approvalConfigPojo != null) { flowNodes.add(getFlowNodeView(approvalConfigPojo, form.getFlowId(), level)); + nodeList.add(approvalConfigPojo.getNodeOrder()); } else { FlowNode flowNode = new FlowNode(); flowNode.setNode(record.getNode()); @@ -687,10 +741,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } }); - if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING")) { + if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING") ) { // 最后一层,添加待处理信息 nodes.forEach(node -> { - if (node.getNodeOrder() >= approvalFlow.getCurrentNode()) { + if (!nodeList.contains(node.getNodeOrder()) && node.getNodeOrder() >= approvalFlow.getCurrentNode()) { flowNodes.add(getFlowNodeView(node, form.getFlowId(), maxLevel)); } }); @@ -821,16 +875,23 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .orderBy("approval_time", "desc") .doQueryFirst(ApprovalRecord.class); - ApprovalRecord record = new ApprovalRecord( + // 更新流程状态 + bd.getBusinessDatabase() + .eq("id", flow.getId()) + .update("flow_status", request.getResult()) + .update("pre_node", flow.getCurrentNode()) + .doUpdate(ApprovalFlow.class); + + ApprovalRecord approvalRecord = new ApprovalRecord( flow.getId(), - currentNode.getNodeName(), - request.getUserId(), - request.getOpinion(), - request.getResult(), - Timestamp.valueOf(LocalDateTime.now()), - lastedRecord.getApprovalLevel() + "已撤回", + xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(), + "撤回", + "MSG", + Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), + lastedRecord.getApprovalLevel() + 1 ); - bd.getBusinessDatabase().doInsert(record); + bd.getBusinessDatabase().doInsert(approvalRecord); // 申请人撤回 myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId()); @@ -850,6 +911,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .eq("id", form.getFlowId()) .doQueryFirst(ApprovalFlow.class); + if (flow == null) { + throw new CommonException("流程不存在"); + } + // 查找模板 Template template = bd.getBusinessDatabase() .eq("id", flow.getTemplateId()) @@ -889,14 +954,15 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { if (toNode == null) { throw new CommonException("找不到目标节点"); } - flow.setCurrentNode(toNode.getNodeOrder()); + bd.getBusinessDatabase() .eq("id", flow.getId()) - .update("current_node", flow.getCurrentNode()) + .update("current_node", toNode.getNodeOrder()) + .update("pre_node", flow.getCurrentNode()) .doUpdate(ApprovalFlow.class); // 生成新的待办 - myself.addNodeTodo(flow, toNode, template, form.getCreateUserId()); + myself.addNodeTodo(flow, toNode, template, form.getCreateUserId(), 0); // 生成处理记录 ApprovalRecord lastedRecord = bd.getBusinessDatabase() @@ -906,7 +972,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalRecord record = new ApprovalRecord( flow.getId(), currentNode.getNodeName(), - form.getCreateUserId(), + form.getProcessUserId(), "退回", "RETURN", Timestamp.valueOf(LocalDateTime.now()), @@ -916,7 +982,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalRecord approvalRecord = new ApprovalRecord( flow.getId(), "退回至" + toNode.getNodeName(), - xdapDeptUsersService.selectUserByID(form.getCreateUserId()).getUsername(), + xdapDeptUsersService.selectUserByID(form.getProcessUserId()).getUsername(), "退回", "MSG", Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index cefa10f..1af3758 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -65,18 +65,6 @@ mpaas.datasource[0].username=root mpaas.datasource[0].password=qwer12 mpaas.datasource[0].minPoolSize=50 mpaas.datasource[0].maxPoolSize=1000 -mpaas.datasource[1].name=yc_lrs_test_relsult -mpaas.datasource[1].url=jdbc:mysql://127.0.0.1:3306/yc_lrs_test_relsult?serverTimezone=GMT%2B8&characterEncoding=utf-8 -mpaas.datasource[1].username=root -mpaas.datasource[1].password=qwer12 -mpaas.datasource[1].type=mysql -mpaas.datasource[1].name=test_demo - -mpaas.datasource[2].url=jdbc:mysql://127.0.0.1:3306/template_db2?serverTimezone=GMT%2B8&characterEncoding=utf-8 -mpaas.datasource[2].username=root -mpaas.datasource[2].password=qwer12 -mpaas.datasource[2].type=mysql -mpaas.datasource[2].name=template_db2 mpaas.security=false mpaas.query.dbadatper=mysql