From 8e3e1d59f7ed9d04f42e4cc792e65391a26b1caa Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Sun, 11 Jan 2026 09:52:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=AF=B9=E6=A0=87?= =?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=EF=BC=9B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8A=A5=E5=91=8A=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/BusinessDatabase.java | 2 +- .../BenchmarkingReportController.java | 82 ++- .../TemplateApprovalController.java | 23 +- .../self_development/pojo/ApprovalRecord.java | 3 - .../pojo/BenchmarkingReport.java | 2 + .../pojo/view/TodoAndReportListView.java | 2 +- .../pojo/view/TodoAndTemplateView.java | 3 +- .../service/BenchmarkingReportService.java | 17 +- .../service/TemplateApprovalService.java | 2 +- .../impl/BenchmarkingReportServiceImpl.java | 522 +++++++++++++++--- .../impl/TemplateApprovalServiceImpl.java | 57 +- 11 files changed, 566 insertions(+), 149 deletions(-) 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 2d2bc16..b1693f8 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(DatasourceConstant.XDAP_MYSQL_PREFIX + tenantId); + return queryFactory.buildFromDatasource("yc_lrs_test_relsult"); } } diff --git a/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java b/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java index e410be7..13bbb28 100644 --- a/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java +++ b/src/main/java/com/xdap/self_development/controller/BenchmarkingReportController.java @@ -16,6 +16,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.List; @RestController @RequestMapping("/custom/benchmark") @@ -48,7 +49,7 @@ public class BenchmarkingReportController { return Response.ok().setMessage("保存成功"); } - // 发起审批 + // 发起人发起审批 @PostMapping("/startReportApproval") public Response startReportApproval( @Valid @RequestBody ApprovalPersonForm form, @@ -63,6 +64,70 @@ public class BenchmarkingReportController { return Response.ok().setMessage("保存成功"); } + // 直送回退回的节点 + @GetMapping("/directSendingApproval") + public Response directSendingApproval( + @RequestParam @NotBlank String reportId, + @RequestParam @NotBlank String userId + ) { + benchmarkingReportService.directSendingApproval(reportId, userId); + return Response.ok(); + } + + // 处理人处理审批通过还是拒绝 + @PostMapping("/handleReportApproval") + public Response handleReportApproval( + @RequestBody @Valid HandleApprovalRequest request, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + benchmarkingReportService.handleReportApproval(request); + return Response.ok().setMessage("处理成功"); + } + + // 处理人退回指定节点 + @PostMapping("/handleReturnToNode") + public Response handleReturnToNode( + @RequestBody @Valid HandleReturnNodeForm form, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + benchmarkingReportService.handleReturnToNode(form); + return Response.ok(); + } + + // 发起人撤回审批 + @PostMapping("/handleReturn") + public Response handleReturn( + @RequestBody @Valid HandleApprovalRequest request, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + benchmarkingReportService.handleReturn(request); + return Response.ok(); + } + + // 删除对标报告 + @GetMapping("/deleteReport") + public Response deleteReport( + @NotBlank @RequestParam String reportId + ) { + benchmarkingReportService.deleteReport(reportId); + return Response.ok().setMessage("删除成功"); + } + // 修改对标报告 @PostMapping("/updateReport") public Response restartReportApproval( @@ -108,21 +173,6 @@ public class BenchmarkingReportController { return Response.ok().data(benchmarkingReportService.getApprovalList(form)); } - // 处理审批 - @PostMapping("/handleReportApproval") - public Response handleReportApproval( - @RequestBody @Valid HandleApprovalRequest request, - BindingResult bindingResult - ) { - if (bindingResult.hasErrors()) { - bindingResult.getFieldErrors().forEach(error -> { - throw new CommonException(error.getDefaultMessage()); - }); - } - benchmarkingReportService.handleReportApproval(request); - return Response.ok().setMessage("处理成功"); - } - // 查看对标报告详情 @GetMapping("/getReportDetail") public Response getReportDetail( 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 b85335b..e075abe 100644 --- a/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java +++ b/src/main/java/com/xdap/self_development/controller/TemplateApprovalController.java @@ -26,6 +26,15 @@ public class TemplateApprovalController { @Resource private RuntimeDatasourceService runtimeDatasourceService; + // 获取是否直送 + @GetMapping("/getIsDirect") + public Response getIsDirect( + @RequestParam String flowId + ) { + boolean flag = templateApprovalService.getIsDirect(flowId); + return Response.ok().data(flag); + } + // 获取流程审批人 @GetMapping("/getApprovalUsers") public Response getApprovalUsers( @@ -61,20 +70,6 @@ public class TemplateApprovalController { return Response.ok().data(templateApprovalService.startApproval(request)); } - @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( diff --git a/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java b/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java index 63a3dfa..b03a341 100644 --- a/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java +++ b/src/main/java/com/xdap/self_development/pojo/ApprovalRecord.java @@ -26,9 +26,6 @@ public class ApprovalRecord extends MpaasBasePojo { private Timestamp approvalTime; private Integer approvalLevel; - public ApprovalRecord() { - } - public ApprovalRecord(String flowId, String node, String userId, String opinion, String result, Timestamp approvalTime, Integer approvalLevel) { this.flowId = flowId; this.node = node; diff --git a/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java b/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java index 955fa42..37d0db9 100644 --- a/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java +++ b/src/main/java/com/xdap/self_development/pojo/BenchmarkingReport.java @@ -35,6 +35,8 @@ public class BenchmarkingReport extends MpaasBasePojo { private String projectName; private String projectNumber; + private Integer returnNum; + private String createBy; private Integer isDelete; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") diff --git a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportListView.java b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportListView.java index 463de91..f0213f2 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportListView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportListView.java @@ -12,7 +12,7 @@ import java.util.List; // CASE af.flow_status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'REJECTED' THEN 4 ELSE 5 END ASC, @SQLQuery(value = { @SQL(view = "getAllReportApprovalList", - sql = "SELECT af.id AS flowId, r.id AS reportId, af.process_title AS title, af.flow_status AS status, af.create_by AS createBy , xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_benchmarking_report r ON af.template_id = r.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 2 AND r.title LIKE CONCAT('%', #title, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') ORDER BY af.created_time DESC") + sql = "WITH RankedFlows AS ( SELECT af.id AS flowId, r.id AS reportId, af.process_title AS title, af.flow_status AS status, af.create_by AS createBy , xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users, ROW_NUMBER() OVER (PARTITION BY af.template_id ORDER BY af.created_time DESC) AS rn FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_benchmarking_report r ON af.template_id = r.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 2 ) SELECT flowId, reportId, title, status, createBy , username, createdTime, current_users FROM RankedFlows WHERE rn = 1 AND r.title LIKE CONCAT('%', #title, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') ORDER BY createdTime DESC") }) @Data public class TodoAndReportListView { diff --git a/src/main/java/com/xdap/self_development/pojo/view/TodoAndTemplateView.java b/src/main/java/com/xdap/self_development/pojo/view/TodoAndTemplateView.java index 5b97de1..debead8 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/TodoAndTemplateView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/TodoAndTemplateView.java @@ -4,6 +4,7 @@ import com.definesys.mpaas.query.annotation.SQL; import com.definesys.mpaas.query.annotation.SQLQuery; import com.fasterxml.jackson.annotation.JsonFormat; import com.xdap.self_development.pojo.ApprovalXdapUsers; +import lombok.AllArgsConstructor; import lombok.Data; import java.sql.Timestamp; @@ -12,7 +13,7 @@ import java.util.List; @SQLQuery(value = { // CASE af.flow_status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'REJECTED' THEN 4 ELSE 5 END ASC @SQL(view = "getAllApproval", - sql = "SELECT af.id AS flowId, t.id AS templateId, t.template_name AS templateName, t.version AS version, af.flow_status AS status , af.create_by AS createBy, xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_template t ON af.template_id = t.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE t.template_name LIKE CONCAT('%', #templateName, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') AND af.flow_type = 1 ORDER BY af.created_time desc"), + sql = "WITH RankedFlows AS ( SELECT af.id AS flowId, t.id AS templateId, t.template_name AS templateName, t.version AS version, af.flow_status AS status , af.create_by AS createBy, xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users , ROW_NUMBER() OVER (PARTITION BY af.template_id ORDER BY af.created_time DESC) AS rn FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_template t ON af.template_id = t.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 1 ) SELECT flowId, templateId, templateName, version, status , createBy, username, createdTime, current_users FROM RankedFlows WHERE t.template_name LIKE CONCAT('%', #templateName, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') AND rn = 1 ORDER BY createdTime DESC"), @SQL(view = "getApprovalByUserIdAndIds", sql = "SELECT af.id AS \"flowId\", t.id AS \"templateId\", t.template_name AS \"templateName\", t.version AS \"version\", af.flow_status AS \"status\" , af.create_by AS \"createBy\", af.created_time AS \"createdTime\" , CASE WHEN current_node = 'PROOFREAD' THEN proofread_users WHEN current_node = 'REVIEW' THEN review_users WHEN current_node = 'COUNTERSIGN' THEN countersign_users WHEN current_node = 'APPROVE' THEN approve_users END AS current_users FROM yfsjglpt_model_approval_flow af JOIN yfsjglpt_model_template t ON af.template_id = t.id WHERE t.template_name like CONCAT('%',#templateName, '%') and af.flow_status like CONCAT('%',#status, '%') and af.flow_type = 1 and af.id NOT IN (#ids) AND af.create_by = #createBy"), @SQL(view = "getTodoAndTemplate", diff --git a/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java b/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java index 62126ff..f27d401 100644 --- a/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java +++ b/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java @@ -4,6 +4,7 @@ import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.self_development.controller.form.*; 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.BenchmarkingReport; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.TodoAndReportListView; @@ -12,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; import javax.validation.constraints.NotBlank; +import java.util.List; public interface BenchmarkingReportService { PageQueryResult getBenchmarkingReportByCondition( @@ -21,6 +23,14 @@ public interface BenchmarkingReportService { void startReportApproval(ApprovalPersonForm form); + void directSendingApproval(@NotBlank String reportId, @NotBlank String userId); + + void handleReturnToNode(@Valid HandleReturnNodeForm form); + + void handleReturn(@Valid HandleApprovalRequest request); + + void deleteReport(@NotBlank String reportId); + void updateReport(@Valid UpdateBenchmarkingReportForm form); void handleReportApproval(@Valid HandleApprovalRequest request); @@ -35,11 +45,12 @@ public interface BenchmarkingReportService { void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId); - void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode); + void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord); - void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy); + void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy, Integer enableReturn); - void cancelProcess(ApprovalFlow flow, String status); + void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId); void updateTasks(ApprovalFlow flow, String status); + } 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 af3b352..1b4ec53 100644 --- a/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java +++ b/src/main/java/com/xdap/self_development/service/TemplateApprovalService.java @@ -50,5 +50,5 @@ public interface TemplateApprovalService { List getApprovalUsers(@NotBlank String templateId); - void restartApproval(@Valid StartApprovalRequest request); + boolean getIsDirect(String flowId); } diff --git a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java index a2359b2..4ab04ca 100644 --- a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java @@ -32,10 +32,11 @@ import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; @Service -public class BenchmarkingReportServiceImpl implements BenchmarkingReportService { +public class BenchmarkingReportServiceImpl implements BenchmarkingReportService { @Resource private BusinessDatabase bd; @Resource @@ -60,9 +61,13 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService @Override @Transactional(rollbackFor = Exception.class) public void startReportApproval(ApprovalPersonForm form) { + // 验证能否发起审批 BenchmarkingReport report = bd.getBusinessDatabase() .eq("id", form.getReportId()) .doQueryFirst(BenchmarkingReport.class); + if (report == null) { + throw new CommonException("该报告不存在"); + } ApprovalFlow approvalFlow = bd.getBusinessDatabase() .eq("template_id", report.getId()) @@ -71,7 +76,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService throw new CommonException("该报告正在审批中,请勿重复发起审批"); } - // 创建审批流程 + // 新增流程 ApprovalFlow flow = new ApprovalFlow(); flow.setTemplateId(report.getId()); flow.setCurrentNode(1); @@ -81,7 +86,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now())); flow.setFlowType(2); // 设置为报告审批流程 flow.setExplanation(form.getExplanation()); - flow.setProcessTitle(form.getProcessTitle()); + flow.setReturnNum(0); + flow.setPreNode(-1); bd.getBusinessDatabase().doInsert(flow); // 创建审批配置 @@ -102,7 +108,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } bd.getBusinessDatabase().doBatchInsert(approvalConfigs); - // 新增待办 + // 新增我的待办 List list = new ArrayList<>(); for (String person : firstNode.getAssignees()) { TodoTaskPojo todoTask = new TodoTaskPojo(); @@ -136,8 +142,22 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService 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(), + "发起审批", + xdapDeptUsersService.selectUserByID(form.getUserId()).getUsername(), + "发起审批", + "MSG", + Timestamp.valueOf(LocalDateTime.now()), + 1 + ) + ); + // 更新报告状态为校对中 bd.getBusinessDatabase() .eq("id", report.getId()) @@ -145,6 +165,262 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .doUpdate(BenchmarkingReport.class); } + @Override + @Transactional(rollbackFor = Exception.class) + public void directSendingApproval(String reportId, String userId) { + // 获取模板 + BenchmarkingReport report = bd.getBusinessDatabase() + .eq("id", reportId) + .doQueryFirst(BenchmarkingReport.class); + if (report == null) { + throw new CommonException("报告不存在"); + } + + // 获取到模板最近一次未完成的流程 + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("template_id", reportId) + .ne("pre_node", -1) + .eq("flow_status", "APPROVING") + .orderBy("created_time", "desc") + .doQueryFirst(ApprovalFlow.class); + if (flow == null) { + throw new CommonException("流程没有直送节点"); + } + + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_order", flow.getCurrentNode()) + .doQueryFirst(ApprovalConfigPojo.class); + + // 删除当前节点待办 + if (currentNode != null) { + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", currentNode.getNodeName()) + .update("is_delete", 1) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); + } + + // 根据状态不同获取节点和节点层级 + 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; + + // 重新创建待办继续流程 + myself.addNodeTodo( + flow, + preNode, + report, + userId, + 1 + ); + + 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", report.getId()) + .update("status", "APPROVING") + .doUpdate(BenchmarkingReport.class); + + // 清除拒绝提醒待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("data_type", "模板拒绝") + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); + + // 创建直送记录 + ApprovalRecord record = new ApprovalRecord( + flow.getId(), + "直送至" + preNode.getNodeName(), + xdapDeptUsersService.selectUserByID(userId).getUsername(), + "直送", + "MSG", + Timestamp.valueOf(LocalDateTime.now()), + level + ); + bd.getBusinessDatabase().doInsert(record); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleReturnToNode(HandleReturnNodeForm form) { + // 查找流程 + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("id", form.getFlowId()) + .doQueryFirst(ApprovalFlow.class); + + if (flow == null) { + throw new CommonException("流程不存在"); + } + + // 查找模板 + BenchmarkingReport report = bd.getBusinessDatabase() + .eq("id", flow.getTemplateId()) + .doQueryFirst(BenchmarkingReport.class); + + // 查找当前节点 + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_order", flow.getCurrentNode()) + .doQueryFirst(ApprovalConfigPojo.class); + + if (!currentNode.getAssignees().contains(form.getProcessUserId())) { + throw new CommonException("无权限操作"); + } + + String lockKey = FLOW_LOCK_PREFIX + flow.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 { + // 删除当前节点待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", currentNode.getNodeName()) + .update("is_delete", 1) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); + + // 更新流程节点 + ApprovalConfigPojo toNode = bd.getBusinessDatabase() + .eq("approval_id", form.getFlowId()) + .eq("node_name", form.getNodeName()) + .doQueryFirst(ApprovalConfigPojo.class); + if (toNode == null) { + throw new CommonException("找不到目标节点"); + } + + bd.getBusinessDatabase() + .eq("id", flow.getId()) + .update("current_node", toNode.getNodeOrder()) + .update("pre_node", flow.getCurrentNode()) + .doUpdate(ApprovalFlow.class); + + // 生成新的待办 + myself.addNodeTodo(flow, toNode, report, form.getCreateUserId(), 1); + + // 生成处理记录 + ApprovalRecord lastedRecord = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .orderBy("approval_time", "desc") + .doQueryFirst(ApprovalRecord.class); + ApprovalRecord record = new ApprovalRecord( + flow.getId(), + currentNode.getNodeName(), + form.getProcessUserId(), + "退回", + "RETURN", + Timestamp.valueOf(LocalDateTime.now()), + lastedRecord.getApprovalLevel() + ); + bd.getBusinessDatabase().doInsert(record); + ApprovalRecord approvalRecord = new ApprovalRecord( + flow.getId(), + "退回至" + toNode.getNodeName(), + xdapDeptUsersService.selectUserByID(form.getProcessUserId()).getUsername(), + "退回", + "MSG", + Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), + lastedRecord.getApprovalLevel() + 1 + ); + bd.getBusinessDatabase().doInsert(approvalRecord); + } finally { + redisLockUtil.unlock(lockKey, lockValue); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleReturn(HandleApprovalRequest request) { + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("id", request.getFlowId()) + .doQueryFirst(ApprovalFlow.class); + if (!Objects.equals(flow.getCreateBy(), request.getUserId())) { + throw new CommonException("不是申请人无法撤回"); + } + if (!Objects.equals(flow.getFlowStatus(), "APPROVING")) { + throw new CommonException("不在流程无法撤回"); + } + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", request.getFlowId()) + .eq("node_order", flow.getCurrentNode()) + .doQueryFirst(ApprovalConfigPojo.class); + + String lockKey = FLOW_LOCK_PREFIX + flow.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 { + if ("RETURN".equals(request.getResult())) { + ApprovalRecord lastedRecord = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .orderBy("approval_time", "desc") + .doQueryFirst(ApprovalRecord.class); + + ApprovalRecord approvalRecord = new ApprovalRecord( + flow.getId(), + "已撤回", + xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(), + "撤回", + "MSG", + Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), + lastedRecord.getApprovalLevel() + 1 + ); + bd.getBusinessDatabase().doInsert(approvalRecord); + + // 申请人撤回 + myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId()); + } else { + throw new CommonException("无法撤回"); + } + } finally { + redisLockUtil.unlock(lockKey, lockValue); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteReport(String reportId) { + BenchmarkingReport report = bd.getBusinessDatabase() + .eq("id", reportId) + .doQueryFirst(BenchmarkingReport.class); + if (report == null) { + throw new CommonException("该报告不存在"); + } + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("template_id", reportId) + .ne("pre_node", -1) + .eq("flow_status", "APPROVING") + .orderBy("created_time", "desc") + .doQueryFirst(ApprovalFlow.class); + if (flow != null) { + throw new CommonException("该报告正在审批中"); + } + bd.getBusinessDatabase() + .eq("id", reportId) + .update("is_delete", 1) + .doUpdate(BenchmarkingReport.class); + } + @Override public String uploadFile(MultipartFile file, String userId) { String currentTenantId = runtimeAppContextService.getCurrentTenantId(); @@ -237,6 +513,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService report.setStatus("DRAFT"); report.setCreateBy(form.getUserId()); report.setIsDelete(0); + report.setReturnNum(0); report.setFileName(form.getFileName()); bd.getBusinessDatabase().doInsert(report); } @@ -273,7 +550,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService @Override @Transactional(rollbackFor = Exception.class) public void handleReportApproval(HandleApprovalRequest request) { - // 验证流程状态 + // 验证流程状态和用户权限 ApprovalFlow flow = bd.getBusinessDatabase() .eq("id", request.getFlowId()) .eq("flow_type", 2) @@ -281,18 +558,20 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService 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("无权限处理或已被处理"); } + // 获取最新处理记录 + ApprovalRecord lastedRecord = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .orderBy("approval_time", "desc") + .doQueryFirst(ApprovalRecord.class); + String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode; String lockValue = UUID.randomUUID().toString(); boolean lockAcquired = redisLockUtil @@ -305,11 +584,12 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService int processedCount = bd.getBusinessDatabase() .eq("flow_id", flow.getId()) .eq("node", currentNode.getNodeName()) + .eq("approval_level", lastedRecord.getApprovalLevel()) .doQuery(ApprovalRecord.class).size(); if (processedCount > 0) { throw new CommonException("此节点已被他人处理"); } - myself.processApprovalLogic(flow, request, currentNode); + myself.processApprovalLogic(flow, request, currentNode, lastedRecord); } finally { redisLockUtil.unlock(lockKey, lockValue); } @@ -321,15 +601,22 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .toJavaList(String.class).contains(userId); } - public void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode) { + public void processApprovalLogic( + ApprovalFlow flow, + HandleApprovalRequest request, + ApprovalConfigPojo currentNode, + ApprovalRecord lastedRecord + ) { // 记录审批结果 - ApprovalRecord record = new ApprovalRecord(); - record.setFlowId(flow.getId()); - record.setNode(currentNode.getNodeName()); - record.setUserId(request.getUserId()); - record.setOpinion(request.getOpinion()); - record.setResult(request.getResult()); - record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + ApprovalRecord record = new ApprovalRecord( + flow.getId(), + currentNode.getNodeName(), + request.getUserId(), + request.getOpinion(), + request.getResult(), + Timestamp.valueOf(LocalDateTime.now()), + lastedRecord == null ? 1 : lastedRecord.getApprovalLevel() + ); bd.getBusinessDatabase().doInsert(record); bd.getBusinessDatabase() @@ -356,7 +643,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService // 处理驳回逻辑 if ("REJECT".equals(request.getResult())) { - myself.cancelProcess(flow, "REJECTED"); + myself.cancelProcess(flow, currentNode, "REJECTED", request.getUserId()); return; } // 处理通过逻辑,流转到下一节点 @@ -386,7 +673,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService myself.updateTasks(flow, "已完成"); } else { flow.setCurrentNode(nextNode.getNodeOrder()); - myself.addNodeTodo(flow, nextNode, report, userId); + myself.addNodeTodo(flow, nextNode, report, userId, 0); } bd.getBusinessDatabase() @@ -396,7 +683,13 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .doUpdate(ApprovalFlow.class); } - public void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy) { + public void addNodeTodo( + ApprovalFlow flow, + ApprovalConfigPojo node, + BenchmarkingReport report, + String createBy, + Integer enableReturn + ) { List users = JSON.parseArray(node.getAssignees()).toJavaList(String.class); // 新增待办 List list = new ArrayList<>(); @@ -427,11 +720,25 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } } - public void cancelProcess(ApprovalFlow flow, String status) { + 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); // 更新报告状态 BenchmarkingReport report = bd.getBusinessDatabase() @@ -441,6 +748,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService bd.getBusinessDatabase() .rowid("id", report.getRowId()) .update("status", report.getStatus()) + .update("return_num", report.getReturnNum() + 1) .doUpdate(BenchmarkingReport.class); myself.updateTasks(flow, "已拒绝"); @@ -477,50 +785,126 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService if (approvalFlow == null) { return flowNodeView; } + + List flowNodes = new ArrayList<>(); + + List allRecord = bd.getBusinessDatabase() + .eq("flow_id", approvalFlow.getId()) + .orderBy("approval_time", "asc") + .doQuery(ApprovalRecord.class); + BenchmarkingReport report = bd.getBusinessDatabase() .eq("id", approvalFlow.getTemplateId()) .doQueryFirst(BenchmarkingReport.class); + // 获取流程信息 flowNodeView.setProgressTitle(approvalFlow.getProcessTitle()); flowNodeView.setContentName(report.getTitle()); flowNodeView.setTemplateVersion(1); flowNodeView.setExplanation(approvalFlow.getExplanation()); flowNodeView.setFlowStatus(approvalFlow.getFlowStatus()); + // 获取节点信息 List nodes = bd.getBusinessDatabase() .eq("approval_id", flowId) .doQuery(ApprovalConfigPojo.class); - List flowNodes = new ArrayList<>(); - nodes.forEach(node -> { - FlowNode nodeView = new FlowNode(); - ApprovalRecord record = bd.getBusinessDatabase() - .eq("flow_id", flowId) - .eq("node", node.getNodeName()) - .doQueryFirst(ApprovalRecord.class); - if (record != null) { - // 节点已完成 - nodeView.setNodeOrder(node.getNodeOrder()); - nodeView.setNode(node.getNodeName()); - nodeView.setResult(record.getResult()); - nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion())); - nodeView.setApprovalTime(record.getApprovalTime()); - nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId()))); - nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class))); - } else { - // 节点未完成 - nodeView.setNodeOrder(node.getNodeOrder()); - nodeView.setNode(node.getNodeName()); - nodeView.setResult("待审批"); - nodeView.setTodoUserName(""); - nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class))); + + Map nodesMap = nodes.stream() + .filter(config -> config.getNodeName() != null) + .collect(Collectors.toMap( + ApprovalConfigPojo::getNodeName, + config -> config, + (existing, replacement) -> existing // 如果有重复键,保留第一个 + )); + + // 获取所有层级 + Map> levelMap = allRecord.stream() + .collect(Collectors.groupingBy( + ApprovalRecord::getApprovalLevel, + Collectors.collectingAndThen( + Collectors.toList(), + list -> list.stream() + .sorted(Comparator.comparing(ApprovalRecord::getApprovalTime)) + .collect(Collectors.toList()) + ) + )); + + // 获取最大层级 + int maxLevel = levelMap.keySet().stream().max(Integer::compare).orElse(1); + + 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( + ApprovalRecord::getNode, + Function.identity(), + (first, second) -> first + )) + .values()); + uniqueRecords.forEach(record -> { + ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode()); + if (approvalConfigPojo != null) { + flowNodes.add(getFlowNodeView(approvalConfigPojo, flowId, level)); + nodeList.add(approvalConfigPojo.getNodeOrder()); + } else { + FlowNode flowNode = new FlowNode(); + flowNode.setNode(record.getNode()); + flowNode.setTodoUserName(record.getUserId()); + flowNode.setResult(record.getResult()); + flowNode.setApprovalTime(record.getApprovalTime()); + flowNodes.add(flowNode); + } + }); + + if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING") ) { + // 最后一层,添加待处理信息 + nodes.forEach(node -> { + if (!nodeList.contains(node.getNodeOrder()) && node.getNodeOrder() >= approvalFlow.getCurrentNode()) { + flowNodes.add(getFlowNodeView(node, flowId, maxLevel)); + } + }); } - flowNodes.add(nodeView); - }); - List sortedNode = flowNodes.stream().sorted(Comparator.comparing(FlowNode::getNodeOrder)).collect(Collectors.toList()); + } + List sortedNode = flowNodes.stream() + .sorted(Comparator.comparing(FlowNode::getApprovalTime, + Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(FlowNode::getNodeOrder)) + .collect(Collectors.toList()); flowNodeView.setFlowNodes(sortedNode); return flowNodeView; } + private FlowNode getFlowNodeView( + ApprovalConfigPojo node, + String flowId, + int level + ) { + FlowNode nodeView = new FlowNode(); + ApprovalRecord record = bd.getBusinessDatabase() + .eq("flow_id", flowId) + .eq("node", node.getNodeName()) + .eq("approval_level", level) + .doQueryFirst(ApprovalRecord.class); + nodeView.setNodeOrder(node.getNodeOrder()); + nodeView.setNode(node.getNodeName()); + if (record != null) { + // 节点已完成 + nodeView.setResult(record.getResult()); + nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion())); + nodeView.setApprovalTime(record.getApprovalTime()); + nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId()))); + } else { + // 节点未完成 + nodeView.setResult("待审批"); + nodeView.setTodoUserName(""); + } + nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class))); + return nodeView; + } + private String getUserNames(List userIds) { StringJoiner joiner = new StringJoiner(" "); for (String userId : userIds) { @@ -534,46 +918,4 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } return joiner.toString(); } - - private Map batchQueryUsers(List userIds) { - if (userIds == null || userIds.isEmpty()) { - return new HashMap<>(); - } - - List users = bd.getBusinessDatabase() - .in("id", userIds) - .doQuery(ApprovalXdapUsers.class); - - return users.stream() - .collect(Collectors.toMap(ApprovalXdapUsers::getId, user -> user)); - } - - private List getNodeList(String flowId, String node) { - List list = bd.getBusinessDatabase() - .viewQueryMode(true) - .view("getApprovalNodeInfo") - .setVar("flowId", flowId) - .setVar("node", node) - .doQuery(ApprovalNodeView.class); - if (list != null && !list.isEmpty()) { - list.forEach(approvalNodeView -> { - ApprovalXdapUsers user = bd.getBusinessDatabase() - .eq("id", approvalNodeView.getUserId()) - .doQueryFirst(ApprovalXdapUsers.class); - approvalNodeView.setUserName(user.getUsername()); - approvalNodeView.setUserId(null); - }); - } - return list; - } - - private void clearAllTodo(ApprovalFlow flow, String userId) { - // 清除已有待办 - bd.getBusinessDatabase() - .eq("document_no", flow.getId()) - .eq("is_delete", 0) - .update("is_delete", 2) - .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) - .doUpdate(TodoTaskPojo.class); - } } 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 e838b6c..001213f 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 @@ -194,10 +194,26 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalFlow flow = bd.getBusinessDatabase() .eq("template_id", templateId) .ne("pre_node", -1) + .eq("flow_status", "APPROVING") .orderBy("created_time", "desc") .doQueryFirst(ApprovalFlow.class); if (flow == null) { - throw new CommonException("模板没有未完成的流程"); + throw new CommonException("流程没有直送节点"); + } + + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_order", flow.getCurrentNode()) + .doQueryFirst(ApprovalConfigPojo.class); + + // 删除当前节点待办 + if (currentNode != null) { + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", currentNode.getNodeName()) + .update("is_delete", 1) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); } // 根据状态不同获取节点和节点层级 @@ -345,7 +361,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } public void processApprovalLogic( - ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord + ApprovalFlow flow, + HandleApprovalRequest request, + ApprovalConfigPojo currentNode, + ApprovalRecord lastedRecord ) { // 新增当前审批结果 @@ -405,7 +424,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { myself.processNextNode(flow, currentNode, request.getUserId()); } - public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) { + public void cancelProcess( + ApprovalFlow flow, + ApprovalConfigPojo node, + String status, + String userId + ) { // 删除所有待办 bd.getBusinessDatabase() .eq("document_no", flow.getId()) @@ -582,6 +606,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { ApprovalFlow flow = bd.getBusinessDatabase() .eq("template_id", templateId) .ne("pre_node", -1) + .eq("flow_status", "APPROVING") .orderBy("created_time", "desc") .doQueryFirst(ApprovalFlow.class); if (flow == null) { @@ -603,13 +628,22 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .in("id", userIds) .doQuery(XdapUsers.class) ); + list.add(dto); }); return list; } @Override - public void restartApproval(StartApprovalRequest request) { + public boolean getIsDirect(String flowId) { + ApprovalFlow flow = bd.getBusinessDatabase() + .eq("id", flowId) + .doQueryFirst(ApprovalFlow.class); + if (flow == null) { + return false; + } + + return flow.getPreNode() != -1; } public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) { @@ -862,26 +896,11 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } try { if ("RETURN".equals(request.getResult())) { - // 删除待办 - bd.getBusinessDatabase() - .eq("document_no", flow.getId()) - .eq("current_node", currentNode.getNodeName()) - .update("is_delete", 1) - .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) - .doUpdate(TodoTaskPojo.class); - ApprovalRecord lastedRecord = bd.getBusinessDatabase() .eq("flow_id", flow.getId()) .orderBy("approval_time", "desc") .doQueryFirst(ApprovalRecord.class); - // 更新流程状态 - 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(), "已撤回",