From c45f9938e9fda75394ea40321394c1aa5d257fac Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Mon, 12 Jan 2026 09:26:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E6=95=B0=E6=8D=AE?= =?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?=E5=A2=9E=E5=8A=A0=E7=9B=B4=E9=80=81=E3=80=81=E6=92=A4=E5=9B=9E?= =?UTF-8?q?=E3=80=81=E9=80=80=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ActivitiProcessController.java | 103 +- .../pojo/EngineReviewListPojo.java | 9 +- .../pojo/ParamApprovalRecordPojo.java | 22 + .../pojo/dto/ActivitiDataAndRecordDTO.java | 4 +- .../pojo/view/TodoAndReportListView.java | 2 +- .../pojo/view/TodoAndReportView.java | 1 + .../pojo/view/TodoAndTemplateView.java | 2 +- .../service/ActivitiProcessService.java | 51 + .../service/BenchmarkingReportService.java | 2 +- .../impl/ActivitiProcessServiceImpl.java | 1397 ++++++++++------- .../impl/BenchmarkingReportServiceImpl.java | 33 +- .../impl/TemplateApprovalServiceImpl.java | 7 +- .../service/impl/TodoTaskServiceImpl.java | 2 +- 13 files changed, 1054 insertions(+), 581 deletions(-) diff --git a/src/main/java/com/xdap/self_development/controller/ActivitiProcessController.java b/src/main/java/com/xdap/self_development/controller/ActivitiProcessController.java index 9059f0f..d5e9502 100644 --- a/src/main/java/com/xdap/self_development/controller/ActivitiProcessController.java +++ b/src/main/java/com/xdap/self_development/controller/ActivitiProcessController.java @@ -2,15 +2,22 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; -import com.xdap.self_development.controller.request.ApprovalByPlatformRequest; +import com.xdap.self_development.controller.form.ApprovalUserNodeDTO; +import com.xdap.self_development.controller.form.HandleApprovalRequest; +import com.xdap.self_development.controller.form.HandleReturnNodeForm; import com.xdap.self_development.controller.request.ApprovalNodeRequest; import com.xdap.self_development.controller.request.EngineReviewListRequest; +import com.xdap.self_development.exception.CommonException; +import com.xdap.self_development.pojo.EngineReviewListPojo; import com.xdap.self_development.pojo.dto.*; import com.xdap.self_development.service.ActivitiProcessService; import com.xdap.self_development.service.EngineReviewListService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import java.util.List; /** @@ -51,7 +58,8 @@ public class ActivitiProcessController { //查看审批详情 @PostMapping(value = "/showActiviti") public Response showActiviti(@RequestBody ShowActivitiDTO showActivitiDTO) { - ActivitiDataAndRecordDTO activitiDataAndRecordDTO = activitiProcessService.showActivitiData(showActivitiDTO); + ActivitiDataAndRecordDTO activitiDataAndRecordDTO = activitiProcessService + .showActivitiData(showActivitiDTO); return Response.ok().data(activitiDataAndRecordDTO); } //操作审批 @@ -63,7 +71,7 @@ public class ActivitiProcessController { //查看审批 @PostMapping(value = "/showEngReview") public Response showEngReview(@RequestBody EngineReviewListRequest engineReviewListRequest) { - PageResultDTO msg = engineReviewListService.selectEngineReviewListByUserId(engineReviewListRequest); + PageResultDTO msg = engineReviewListService.selectEngineReviewListByUserId(engineReviewListRequest); return Response.ok().data(msg); }; //申请人退回审批 @@ -72,33 +80,66 @@ public class ActivitiProcessController { String msg = engineReviewListService.returnApproval(approvalId); return Response.ok().data(msg); }; - -// -// //查询删除所有部署信息(谨慎使用) -// @GetMapping(value = "/deleteDeployment") -// public void deleteDeployment() { -// -// List deployments = repositoryService.createDeploymentQuery().list(); -// for (Deployment deployment : deployments) { -// System.out.println("--------" + deployment); -// repositoryService.deleteDeployment(deployment.getId()); -// } -// } -// //查询删除所有流程信息(谨慎使用) -// @GetMapping(value = "/deleteProcessInstances") -// public void deleteProcessInstances(@RequestParam(value = "processkey")String processDefinitionKey) { -// // 1. 查询该流程定义下的所有流程实例ID -// List instances = runtimeService.createProcessInstanceQuery() -// .processDefinitionKey(processDefinitionKey) -// .list(); -// -// // 2. 逐个删除流程实例(级联删除任务、变量等) -// for (ProcessInstance instance : instances) { -// // 删除流程实例(true表示级联删除所有关联数据) -// runtimeService.deleteProcessInstance(instance.getId(), "删除原因:清理测试数据"); -// } -// } - - + // 获取是否直送 + @GetMapping("/getIsDirect") + public Response getIsDirect( + @RequestParam String flowId + ) { + boolean flag = activitiProcessService.getIsDirect(flowId); + return Response.ok().data(flag); + } + // 获取流程审批人 + @GetMapping("/getApprovalUsers") + public Response getApprovalUsers( + @NotBlank @RequestParam String templateId + ) { + List nodes = activitiProcessService.getApprovalUsers(templateId); + return Response.ok().data(nodes); + } + // 直送回退回的节点 + @GetMapping("/directSendingApproval") + public Response directSendingApproval( + @RequestParam @NotBlank String templateId, + @RequestParam @NotBlank String userId + ) { + activitiProcessService.directSendingApproval(templateId, userId); + return Response.ok(); + } + // 获取可退回节点 + @GetMapping("/getReturnNodes") + public Response getReturnNodes( + @NotBlank String flowId + ) { + List result = activitiProcessService.getReturnNodes(flowId); + return Response.ok().data(result); + } + // 处理人退回指定节点 + @PostMapping("/handleReturnToNode") + public Response handleReturnToNode( + @RequestBody @Valid HandleReturnNodeForm form, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + activitiProcessService.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()); + }); + } + activitiProcessService.handleReturn(request); + return Response.ok(); + } } diff --git a/src/main/java/com/xdap/self_development/pojo/EngineReviewListPojo.java b/src/main/java/com/xdap/self_development/pojo/EngineReviewListPojo.java index 81ec9b3..329e0f2 100644 --- a/src/main/java/com/xdap/self_development/pojo/EngineReviewListPojo.java +++ b/src/main/java/com/xdap/self_development/pojo/EngineReviewListPojo.java @@ -105,6 +105,13 @@ public class EngineReviewListPojo implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date lastUpdateDate; - + /** + * 退回标记 + */ + private Integer returnNum; + /** + * 前一个节点 + */ + private Integer preNode; } diff --git a/src/main/java/com/xdap/self_development/pojo/ParamApprovalRecordPojo.java b/src/main/java/com/xdap/self_development/pojo/ParamApprovalRecordPojo.java index 9d8d902..79fc6c5 100644 --- a/src/main/java/com/xdap/self_development/pojo/ParamApprovalRecordPojo.java +++ b/src/main/java/com/xdap/self_development/pojo/ParamApprovalRecordPojo.java @@ -84,5 +84,27 @@ public class ParamApprovalRecordPojo implements Serializable { */ private Date lastUpdateDate; + private Integer approvalLevel; + public ParamApprovalRecordPojo( + String approvalId, + String nodeName, + String assignee, + String operator, + Date operateTime, + String approvalComment, + Integer nodeOrder, + Date creationDate, + Integer approvalLevel + ) { + this.approvalId = approvalId; + this.nodeName = nodeName; + this.assignee = assignee; + this.operator = operator; + this.operateTime = operateTime; + this.approvalComment = approvalComment; + this.nodeOrder = nodeOrder; + this.creationDate = creationDate; + this.approvalLevel = approvalLevel; + } } diff --git a/src/main/java/com/xdap/self_development/pojo/dto/ActivitiDataAndRecordDTO.java b/src/main/java/com/xdap/self_development/pojo/dto/ActivitiDataAndRecordDTO.java index 8b7c919..b6432ec 100644 --- a/src/main/java/com/xdap/self_development/pojo/dto/ActivitiDataAndRecordDTO.java +++ b/src/main/java/com/xdap/self_development/pojo/dto/ActivitiDataAndRecordDTO.java @@ -1,8 +1,10 @@ package com.xdap.self_development.pojo.dto; +import com.xdap.self_development.pojo.view.FlowNode; import lombok.Data; import java.util.ArrayList; +import java.util.List; @Data public class ActivitiDataAndRecordDTO { @@ -10,6 +12,6 @@ public class ActivitiDataAndRecordDTO { private String processTitle; private String modelName; private ArrayList activitiDataDTOS; - private ArrayList activitiRecordDTOS; + private List flowNodes; } 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 f0213f2..172241c 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 = "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") + 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 title LIKE CONCAT('%', #title, '%') AND status LIKE CONCAT('%', #status, '%') AND createdTime LIKE CONCAT('%', #createdTime, '%') AND username LIKE CONCAT('%', #username, '%') ORDER BY createdTime DESC") }) @Data public class TodoAndReportListView { diff --git a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java index 5be8a5f..2e859ba 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/TodoAndReportView.java @@ -31,6 +31,7 @@ public class TodoAndReportView { private String projectName; private String projectNumber; private String createBy; + private Integer returnNum; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Timestamp uploadTime; private String filePath; 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 debead8..7cc9a66 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 @@ -13,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 = "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 = "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 rn = 1 AND templateName LIKE CONCAT('%', #templateName, '%')AND status LIKE CONCAT('%', #status, '%')AND createdTime LIKE CONCAT('%', #createdTime, '%')AND username LIKE CONCAT('%', #username, '%') 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/ActivitiProcessService.java b/src/main/java/com/xdap/self_development/service/ActivitiProcessService.java index 8085baf..0591f58 100644 --- a/src/main/java/com/xdap/self_development/service/ActivitiProcessService.java +++ b/src/main/java/com/xdap/self_development/service/ActivitiProcessService.java @@ -1,13 +1,21 @@ package com.xdap.self_development.service; +import com.xdap.self_development.controller.form.ApprovalUserNodeDTO; +import com.xdap.self_development.controller.form.HandleApprovalRequest; +import com.xdap.self_development.controller.form.HandleReturnNodeForm; import com.xdap.self_development.controller.request.ApprovalByPlatformRequest; import com.xdap.self_development.controller.request.ApprovalNodeRequest; +import com.xdap.self_development.enums.ParamValueVersionEnum; +import com.xdap.self_development.pojo.*; import com.xdap.self_development.pojo.dto.ActivitiDataAndRecordDTO; import com.xdap.self_development.pojo.dto.ActivitiDataDTO; import com.xdap.self_development.pojo.dto.HandleApprovalDTO; import com.xdap.self_development.pojo.dto.ShowActivitiDTO; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.ArrayList; import java.util.List; public interface ActivitiProcessService { @@ -20,4 +28,47 @@ public interface ActivitiProcessService { String handleApproval(HandleApprovalDTO handleApprovalDTO); void startActivitiByPlatform(ApprovalByPlatformRequest request); + + boolean getIsDirect(String flowId); + + List getApprovalUsers(@NotBlank String flowId); + + void directSendingApproval(@NotBlank String templateId, @NotBlank String userId); + + List getReturnNodes(@NotBlank String flowId); + + void handleReturnToNode(@Valid HandleReturnNodeForm form); + + void handleReturn(@Valid HandleApprovalRequest request); + + void processApproval( + EngineReviewListPojo flow, + HandleApprovalDTO request, + ApprovalConfigPojo currentNode, + ParamApprovalRecordPojo lastedRecord, + ArrayList list + ); + void cancelProcess( + EngineReviewListPojo flow, + ApprovalConfigPojo node, + ParamValueVersionEnum status, + String userId + ); + void updateTasks( + EngineReviewListPojo flow, + String status, + Integer enableReturn + ); + void processNextNode( + EngineReviewListPojo flow, + ApprovalConfigPojo currentNode, + String userId, + List list + ); + void addNodeTodo( + EngineReviewListPojo flow, + ApprovalConfigPojo node, + String createBy, + Integer enableReturn + ); } 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 f27d401..6a27daa 100644 --- a/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java +++ b/src/main/java/com/xdap/self_development/service/BenchmarkingReportService.java @@ -51,6 +51,6 @@ public interface BenchmarkingReportService { void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId); - void updateTasks(ApprovalFlow flow, String status); + void updateTasks(ApprovalFlow flow, String status, Integer enableReturn); } 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 790eac2..026c3e5 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 @@ -3,15 +3,22 @@ package com.xdap.self_development.service.impl; import com.alibaba.fastjson2.JSON; import com.definesys.mpaas.query.MpaasQueryFactory; import com.xdap.api.moudle.user.pojo.XdapUsers; +import com.xdap.self_development.config.BusinessDatabase; +import com.xdap.self_development.controller.form.ApprovalUserNodeDTO; +import com.xdap.self_development.controller.form.HandleApprovalRequest; +import com.xdap.self_development.controller.form.HandleReturnNodeForm; import com.xdap.self_development.controller.request.ApprovalByPlatformRequest; import com.xdap.self_development.controller.request.ApprovalNodeRequest; import com.xdap.self_development.enums.ApprovalOrderEnum; import com.xdap.self_development.enums.CurrentNodeEnum; import com.xdap.self_development.enums.ParamOperation; import com.xdap.self_development.enums.ParamValueVersionEnum; +import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.pojo.*; import com.xdap.self_development.pojo.dto.*; +import com.xdap.self_development.pojo.view.FlowNode; import com.xdap.self_development.service.*; +import com.xdap.self_development.utils.RedisLockUtil; import groovy.util.logging.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -20,35 +27,46 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; 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; -@lombok.extern.slf4j.Slf4j @Service @Slf4j public class ActivitiProcessServiceImpl implements ActivitiProcessService { - - @Autowired + @Resource private DataEntryEngineModelService dataEntryEngineModelService; - @Autowired + @Resource private EngineParamDetailService engineParamDetailService; - @Autowired + @Resource private XdapDeptUsersService xdapDeptUsersService; + @Resource + private BusinessDatabase bd; + @Resource + private RedisLockUtil redisLockUtil; + @Resource + private ActivitiProcessService myself; + + private static final String FLOW_LOCK_PREFIX = "data:lock:"; + private static final int FLOW_LOCK_EXPIRE_SECONDS = 5; - private String processTopic = "参数审批"; - - @Autowired - private MpaasQueryFactory sw; - - - //保存编辑之后 审批前的界面初始化1.生成审批修改数据的修改说明,返回给前端看,并存入表里 + /** + * 发起审批流程 - 初始化审批数据 + * 根据机型ID和用户ID查找待审批的参数数据,生成变更说明并返回给前端显示 + * @param modelID 发动机型号ID + * @param userID 用户ID + * @return 包含审批数据的DTO列表 + */ @Override + @Transactional(rollbackFor = Exception.class) public List initiateApproval(String modelID, String userID) { - //通过机型ID查找参数过滤更新的 - List engineParamDetailPojos = null; + // 通过机型ID查找参数过滤更新的 + List engineParamDetailPojos; try { engineParamDetailPojos = engineParamDetailService.selectByModelNewVersion(modelID) .stream() @@ -64,8 +82,9 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { ArrayList das = new ArrayList<>(); for (EngineParamDetailPojo engineParamDetailPojo : engineParamDetailPojos) { String parameterId = engineParamDetailPojo.getParameterId(); - List parameters = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("id", parameterId).doQuery(Parameter.class); + List parameters = bd.getBusinessDatabase() + .eq("id", parameterId) + .doQuery(Parameter.class); if (ObjectUtils.isEmpty(parameters)) { throw new RuntimeException("未找到对应参数模板中的参数"); } @@ -111,18 +130,21 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { activitiDataDTOS.add(activitiDataDTO); das.add(dataChangeCommentPojo); } - sw.buildFromDatasource("xdap_app_223770822127386625") - .doBatchInsert(das); + bd.getBusinessDatabase().doBatchInsert(das); return activitiDataDTOS; } + /** + * 开始审批流程 + * 创建审批记录、分配待办任务、设置审批环节配置等 + * + * @param approvalNodeRequest 审批节点请求对象,包含审批配置信息 + */ @Override public void startActiviti(ApprovalNodeRequest approvalNodeRequest) { - //新增审批数据 if (ObjectUtils.isEmpty(approvalNodeRequest)) { - log.info("参与审批的数据为空"); - return; + throw new CommonException("请先填写参数"); } String processTitle = approvalNodeRequest.getProcessTitle(); String userId = approvalNodeRequest.getUserId(); @@ -130,10 +152,9 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { ApprovalNodeDTO firstNode = approvalNodeRequest.getNodeList().stream() .min(Comparator.comparingInt(ApprovalNodeDTO::getNodeOrder)) .orElseThrow(() -> new RuntimeException("审批环节配置不能为空")); - //获取参数列表 - List paramList = approvalNodeRequest.getParamList(); + List paramList; String modelId = approvalNodeRequest.getModelId(); - //通过机型ID查找参数过滤更新的 + // 查询机型最新版本的参数,过滤出操作为更新且由当前用户更新的参数 try { paramList = engineParamDetailService.selectByModelNewVersion(modelId) .stream() @@ -145,27 +166,20 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { } catch (Exception e) { throw new RuntimeException("找不到机型ID对应的参数或机型参数里最新版本没有UPDATE的数据"); } - //获取机型 String engineModelId = approvalNodeRequest.getModelId(); + // 查询旧的发动机型号信息 DataEntryEngineModelPojo modelPojoOld = dataEntryEngineModelService.selectBymodelId(engineModelId); //获取提交人 XdapUsers XdapUsers = xdapDeptUsersService.selectUserByID(userId); String createBy = ObjectUtils.isNotEmpty(XdapUsers) ? XdapUsers.getUsername() : null; - //根据子系统分别创建审批流 -// Map> listBySubSystem = paramList.stream().collect(Collectors.groupingBy(EngineParamDetailPojo::getSubsystemName)); -// for (Map.Entry> stringListEntry : listBySubSystem.entrySet()) { String approvalId = UUID.randomUUID().toString(); - //子系统 -// String subSystem = stringListEntry.getKey(); - - + // 创建发动机审核列表POJO对象 EngineReviewListPojo engineReviewListPojo = new EngineReviewListPojo(); engineReviewListPojo.setId(approvalId); engineReviewListPojo.setModelId(engineModelId); engineReviewListPojo.setModelName(modelPojoOld.getModelName()); engineReviewListPojo.setYcOrOth(modelPojoOld.getYcOrOth()); engineReviewListPojo.setProcessTopic(processTitle); -// engineReviewListPojo.setSubsystemName(subSystem); engineReviewListPojo.setStatusCode(ParamValueVersionEnum.UNDER.getCode()); engineReviewListPojo.setApplicant(userId); engineReviewListPojo.setStatusDescription(ParamValueVersionEnum.UNDER.getDesc()); @@ -174,9 +188,13 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { engineReviewListPojo.setReviewComment(approvalNodeRequest.getComment()); engineReviewListPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); engineReviewListPojo.setCreatedBy(userId); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(engineReviewListPojo); + + engineReviewListPojo.setReturnNum(0); + engineReviewListPojo.setPreNode(-1); + bd.getBusinessDatabase().doInsert(engineReviewListPojo); //分发待办 + List list = new ArrayList<>(); for (String assigneeId : firstNode.getAssignees()) { TodoTaskPojo todoTaskPojo = new TodoTaskPojo(); todoTaskPojo.setDocumentNo(approvalId); @@ -192,8 +210,10 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { todoTaskPojo.setCreatedBy(createBy); todoTaskPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); todoTaskPojo.setIsDelete(0); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(todoTaskPojo); + list.add(todoTaskPojo); } + bd.getBusinessDatabase().doBatchInsert(list); + //创建发起 InitiatedTaskPojo initiatedTaskPojo = new InitiatedTaskPojo(); initiatedTaskPojo.setDocumentNo(approvalId); @@ -206,21 +226,22 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { initiatedTaskPojo.setModelName(modelPojoOld.getModelName()); initiatedTaskPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); initiatedTaskPojo.setIsDelete(0); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(initiatedTaskPojo); + initiatedTaskPojo.setEnableReturn(1); + bd.getBusinessDatabase().doInsert(initiatedTaskPojo); + //将参数绑定到该机型审批流程中 - for (EngineParamDetailPojo engineParamDetailPojo : paramList) { - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("version_status", ParamValueVersionEnum.UNDER.getCode()) - .update("approval_id", approvalId) - .update("last_update_date", new Date()) - .eq("id", engineParamDetailPojo.getId()) - .doUpdate(EngineParamDetailPojo.class); - } + List collected = paramList.stream().map(EngineParamDetailPojo::getId).collect(Collectors.toList()); + bd.getBusinessDatabase() + .update("version_status", ParamValueVersionEnum.UNDER.getCode()) // 更新版本状态为审核中 + .update("approval_id", approvalId) // 关联审批ID + .update("last_update_date", new Date()) // 更新最后修改日期为当前日期 + .in("id", collected) + .doUpdate(EngineParamDetailPojo.class); // 执行更新操作 boolean b = false; // 保存审批环节配置 + List approvalConfigs = new ArrayList<>(); for (ApprovalNodeDTO nodeDTO : approvalNodeRequest.getNodeList()) { - if (ObjectUtils.isEmpty(nodeDTO.getAssignees())) { b = true; continue; @@ -236,197 +257,311 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { config.setNodeOrder(nodeOrder); config.setCreatedBy(userId); config.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(config); + approvalConfigs.add(config); b = false; } + bd.getBusinessDatabase().doBatchInsert(approvalConfigs); + //记录审批提交操作 - ParamApprovalRecordPojo record = new ParamApprovalRecordPojo(); - record.setApprovalId(approvalId); - record.setAssignee(userId); - record.setOperator("提交"); - record.setNodeName("提交"); - record.setNodeOrder(0); - record.setOperateTime(Timestamp.valueOf(LocalDateTime.now())); - record.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - record.setApprovalComment("提交流程"); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(record); - -// } - - + bd.getBusinessDatabase().doInsert( + new ParamApprovalRecordPojo( + approvalId, + "发起审批", + xdapDeptUsersService.selectUserByID(userId).getUsername(), + "发起审批", + Timestamp.valueOf(LocalDateTime.now()), + "提交流程", + firstNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now()), + 1 + ) + ); } - //完成我的任务 + /** + * 处理审批操作 + * 根据用户的审批操作(通过/拒绝)来推进审批流程,并更新相关数据状态 + * + * @param handleApprovalDTO 审批处理请求对象 + * @return 审批结果描述 + */ @Override @Transactional(rollbackFor = Exception.class) public String handleApproval(HandleApprovalDTO handleApprovalDTO) { - String approvalId = handleApprovalDTO.getApprovalId(); //流程ID - String approver = handleApprovalDTO.getUserId(); //审批人 - String operator = handleApprovalDTO.getOperator(); //操作 - String comment = handleApprovalDTO.getComment(); //审批意见 - ArrayList list = new ArrayList<>(); //审批通过后准备升版的数据 - //不是会签 - boolean notAll = true; + String approvalId = handleApprovalDTO.getApprovalId(); + String approver = handleApprovalDTO.getUserId(); + ArrayList list = new ArrayList<>(); - EngineReviewListPojo reviewListPojo = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("id", approvalId).doQuery(EngineReviewListPojo.class).get(0); - if (reviewListPojo == null || reviewListPojo.getStatusCode() == ParamValueVersionEnum.REFUSE.getCode() - || reviewListPojo.getStatusCode() == ParamValueVersionEnum.PASSED.getCode()) { - throw new RuntimeException("无效的审批记录请检查是否已经审批完成或被拒绝"); - } - String processTopic = reviewListPojo.getProcessTopic(); - //查看当前人是否有权限审批 - String currentAssignees = reviewListPojo.getApproverPersons(); - List assigneeList = Arrays.asList(currentAssignees.split(",")); + // 验证流程状态和用户权限 + EngineReviewListPojo reviewListPojo = bd.getBusinessDatabase() + .eq("id", approvalId) + .doQueryFirst(EngineReviewListPojo.class); + List assigneeList = getStrings(reviewListPojo); if (!assigneeList.contains(approver)) { throw new RuntimeException("当前用户无权限处理此审批环节"); } - if (reviewListPojo.getNodeName().equals("会签")) { - notAll = false; - } - //找到当前机型 - DataEntryEngineModelPojo modelPojo = dataEntryEngineModelService.selectBymodelId(reviewListPojo.getModelId()); - //找到当前节点的配置 - ApprovalConfigPojo approvalConfigPojo = sw.buildFromDatasource("xdap_app_223770822127386625") + + ParamApprovalRecordPojo lastedRecord = bd.getBusinessDatabase() + .eq("approval_id", approvalId) + .orderBy("operate_time", "desc") + .doQueryFirst(ParamApprovalRecordPojo.class); + ApprovalConfigPojo approvalConfigPojo = bd.getBusinessDatabase() .eq("approval_id", approvalId) .eq("node_name", reviewListPojo.getNodeName()) - .doQuery(ApprovalConfigPojo.class).get(0); - Integer nodeOrder = approvalConfigPojo.getNodeOrder(); - - XdapUsers XdapUsers = xdapDeptUsersService.selectUserByID(approvalConfigPojo.getCreatedBy()); - String createBy = ObjectUtils.isNotEmpty(XdapUsers) ? XdapUsers.getUsername() : null; - //记录审批操作 - ParamApprovalRecordPojo record = new ParamApprovalRecordPojo(); - record.setApprovalId(approvalId); - record.setAssignee(approver); - record.setOperator(operator); - record.setNodeName(reviewListPojo.getNodeName()); - record.setNodeOrder(nodeOrder); - record.setOperateTime(Timestamp.valueOf(LocalDateTime.now())); - record.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - record.setApprovalComment(comment); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(record); - - if (!"REJECT".equals(operator) && !"PASS".equals(operator)) { - throw new RuntimeException("无法识别的操作"); - } - //驳回处理 - if ("REJECT".equals(operator)) { - //更改参数状态 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("version_status", ParamValueVersionEnum.REFUSE.getCode())//改为已拒绝 - .update("operation", "")//清空操作状态 - .update("minor_version", "")//小版本清空 -// .update("approval_id", "")//关联的审批流清空 - .update("last_update_date", new Date()) - .eq("approval_id", approvalId).doUpdate(EngineParamDetailPojo.class); - //审批流改为已拒绝 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("status_code", ParamValueVersionEnum.REFUSE.getCode()) - .update("status_description", ParamValueVersionEnum.REFUSE.getDesc()) - .update("approver_persons", "") - .update("last_update_date", new Date()) - .eq("id", approvalId).doUpdate(EngineReviewListPojo.class); - //审批流的事项全部处理 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("is_delete", 1) - .update("current_node", ParamValueVersionEnum.REFUSE.getDesc()) - .update("last_update_date", new Date()) - .eq("document_no", approvalId).doUpdate(TodoTaskPojo.class); - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("current_node", ParamValueVersionEnum.REFUSE.getDesc()) - .update("last_update_date", new Date()) - .eq("document_no", approvalId).doUpdate(InitiatedTaskPojo.class); - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("current_node", ParamValueVersionEnum.REFUSE.getDesc()) - .update("last_update_date", new Date()) - .eq("document_no", approvalId).doUpdate(CompletedTaskPojo.class); - //生成已办 - TodoTaskPojo todoTaskPojo = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("document_no", approvalId) - .eq("owner_id", approver) - .eq("current_node", reviewListPojo.getNodeName()) - .doQueryFirst(TodoTaskPojo.class); - CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); - BeanUtils.copyProperties(todoTaskPojo, completedTaskPojo, "id"); - completedTaskPojo.setIsDelete(0); - completedTaskPojo.setCurrentNode(ParamValueVersionEnum.REFUSE.getDesc()); - completedTaskPojo.setCurrentProcessor(todoTaskPojo.getCurrentProcessor()); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(completedTaskPojo); - - return "已拒绝"; - } - //通过处理 - //检查当前环节所有处理人是否已操作 - List nodeRecords = - sw.buildFromDatasource("xdap_app_223770822127386625") + .doQueryFirst(ApprovalConfigPojo.class); + if (!Objects.equals(reviewListPojo.getNodeName(), "会签")) { + String lockKey = FLOW_LOCK_PREFIX + approvalId + ":" + reviewListPojo.getNodeName(); + String lockValue = UUID.randomUUID().toString(); + boolean lockAcquired = redisLockUtil + .tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); + if (!lockAcquired) { + throw new CommonException("当前节点正在处理,请稍后重试"); + } + try { + // 查询已完成的任务,检查当前节点是否完成 + int processedCount = bd.getBusinessDatabase() .eq("approval_id", approvalId) - .eq("node_name", reviewListPojo.getNodeName()).doQuery(ParamApprovalRecordPojo.class); - //获取已经处理过的人 - Set operatedUsers = nodeRecords.stream() - .map(ParamApprovalRecordPojo::getAssignee) - .collect(Collectors.toSet()); - // 获取下一个环节 - List approvalConfigPojos = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("approval_id", approvalId) - .eq("node_order", (nodeOrder + 1)) - .doQuery(ApprovalConfigPojo.class); - - - //必须已经全部通过 不是会签的话例外 - if (operatedUsers.containsAll(assigneeList) || notAll) { - String nodeName = ""; - String currentProcessor = ""; - - // 更新待办 - if (ObjectUtils.isNotEmpty(approvalConfigPojos)) { - - - ApprovalConfigPojo approvalConfigPojo1 = approvalConfigPojos.get(0); - nodeName = approvalConfigPojo1.getNodeName(); - currentProcessor = JSON.toJSONString(Arrays.asList(approvalConfigPojos.get(0).getAssignees().split(","))); - - //更新审批流到下个审批节点 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("approver_persons", approvalConfigPojo1.getAssignees()) - .update("node_name", nodeName) - .update("last_update_date", new Date()) - .eq("id", approvalId).doUpdate(EngineReviewListPojo.class); - //为下个环节的人生成待办 - for (String nextAssId : Arrays.asList(approvalConfigPojo1.getAssignees().split(","))) { - TodoTaskPojo todoTaskPojo = new TodoTaskPojo(); - todoTaskPojo.setDocumentNo(approvalId); - todoTaskPojo.setProcessTitle(processTopic); - todoTaskPojo.setCurrentNode(nodeName); - todoTaskPojo.setCurrentProcessor(currentProcessor); - todoTaskPojo.setModelId(reviewListPojo.getModelId()); - todoTaskPojo.setVersionNumber(modelPojo.getVersionNumber()); - todoTaskPojo.setOwnerId(nextAssId); - todoTaskPojo.setDataType(CurrentNodeEnum.DATAAPPROVAL.getDesc()); - todoTaskPojo.setModelName(modelPojo.getModelName()); - todoTaskPojo.setCreatedById(approvalConfigPojo.getCreatedBy()); - todoTaskPojo.setCreatedBy(createBy); - todoTaskPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); - todoTaskPojo.setIsDelete(0); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(todoTaskPojo); + .eq("node_name", reviewListPojo.getNodeName()) + .eq("approval_level", lastedRecord.getApprovalLevel()) + .doQuery(ParamApprovalRecordPojo.class).size(); + if (processedCount > 0) { + throw new CommonException("此节点已被他人处理"); } + myself.processApproval(reviewListPojo, handleApprovalDTO, approvalConfigPojo, lastedRecord, list); + } finally { + redisLockUtil.unlock(lockKey, lockValue); + } + } + // 会签节点 + else { + myself.processApproval(reviewListPojo, handleApprovalDTO, approvalConfigPojo, lastedRecord, list); + } - } else { + // 如果有待插入的参数明细数据,则执行批量插入 + if (ObjectUtils.isNotEmpty(list)) { + batchInsertParamDetail(list); + } + return "已审批"; + } + + private static List getStrings(EngineReviewListPojo reviewListPojo) { + if (reviewListPojo == null || Objects.equals(reviewListPojo.getStatusCode(), ParamValueVersionEnum.REFUSE.getCode()) + || Objects.equals(reviewListPojo.getStatusCode(), ParamValueVersionEnum.PASSED.getCode())) { + throw new RuntimeException("无效的审批记录请检查是否已经审批完成或被拒绝"); + } + String currentAssignees = reviewListPojo.getApproverPersons(); + return Arrays.asList(currentAssignees.split(",")); + } + + public void processApproval( + EngineReviewListPojo flow, + HandleApprovalDTO request, + ApprovalConfigPojo currentNode, + ParamApprovalRecordPojo lastedRecord, + ArrayList list + ) { + // 新增当前审批结果 + bd.getBusinessDatabase().doInsert(new ParamApprovalRecordPojo( + flow.getId(), + currentNode.getNodeName(), + request.getUserId(), + request.getOperator(), + Timestamp.valueOf(LocalDateTime.now()), + request.getComment(), + currentNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now()), + lastedRecord.getApprovalLevel() + )); + + // 软删除当前节点当前处理人的待办 + 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()); + completedTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername()); + completedTaskPojo.setCurrentNode(currentNode.getNodeName()); + completedTaskPojo.setCurrentProcessor(currentNode.getAssignees()); + completedTaskPojo.setDataType("数据审批"); + completedTaskPojo.setOwnerId(request.getUserId()); + completedTaskPojo.setProcessTitle(flow.getProcessTopic()); + completedTaskPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + completedTaskPojo.setIsDelete(0); + completedTaskPojo.setModelId(flow.getModelId()); + bd.getBusinessDatabase().doInsert(completedTaskPojo); + + // 处理驳回逻辑 + if ("REJECT".equals(request.getOperator())) { + myself.cancelProcess( + flow, + currentNode, + ParamValueVersionEnum.DRAFT, + request.getUserId() + ); + return; + } + + // 通过当前节点 + myself.processNextNode( + flow, + currentNode, + request.getUserId(), + list + ); + } + + // 检查节点是否完成 + public boolean checkNodeComplete(EngineReviewListPojo flow, ApprovalConfigPojo node) { + ParamApprovalRecordPojo lastedRecord = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .orderBy("approval_time", "desc") + .doQueryFirst(ParamApprovalRecordPojo.class); + Integer processedCount = bd.getBusinessDatabase() + .eq("flow_id", flow.getId()) + .eq("node", node.getNodeName()) + .eq("approval_level", lastedRecord.getApprovalLevel()) + .doQuery(ParamApprovalRecordPojo.class).size(); + if ("会签".equals(node.getNodeName())) { + return processedCount.equals(Arrays.asList(node.getAssignees().split(",")).size()); + } else { + return processedCount >= 1; + } + } + + public void cancelProcess( + EngineReviewListPojo flow, + ApprovalConfigPojo node, + ParamValueVersionEnum 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); + // 更改参数状态为草稿 + bd.getBusinessDatabase() + .update("version_status", status.getCode())// 改为已拒绝 + .update("operation", "")// 清空操作状态 + .update("minor_version", "")// 小版本清空 + .update("last_update_date", new Date()) + .eq("approval_id", flow.getId()) + .doUpdate(EngineParamDetailPojo.class); + // 审批流改为已拒绝 + bd.getBusinessDatabase() + .update("status_code", status.getCode()) + .update("status_description", status.getDesc()) + .update("approver_persons", "") + .update("last_update_date", new Date()) + .update("return_num", flow.getReturnNum() + 1) + .update("pre_node", node.getNodeOrder()) + .eq("id", flow.getId()) + .doUpdate(EngineReviewListPojo.class); + // 生成拒绝提醒 + if (status.getCode() == 4) { + TodoTaskPojo todoTask = new TodoTaskPojo(); + todoTask.setCreatedById(userId); + todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(userId).getUsername()); + todoTask.setCurrentNode(node.getNodeName()); + todoTask.setDataType("数据拒绝"); + todoTask.setDocumentNo(flow.getId()); + todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTask.setIsDelete(0); + todoTask.setModelId(flow.getModelId()); + todoTask.setModelName(flow.getModelName()); + todoTask.setProcessTitle("拒绝提醒:"+flow.getProcessTopic()); + todoTask.setStatusCode(flow.getStatusDescription()); + todoTask.setVersionNumber(0); + todoTask.setOwnerId(flow.getCreatedBy()); + todoTask.setCurrentProcessor(JSON.toJSONString(Collections.singletonList(flow.getCreatedBy()))); + bd.getBusinessDatabase().doInsert(todoTask); + // 更新发起和已办 + myself.updateTasks(flow, status.getDesc(), 0); + } + } + public void updateTasks( + EngineReviewListPojo flow, + String status, + Integer enableReturn + ) { + // 更新已发起的任务状态 + bd.getBusinessDatabase() + .update("current_node", status) + .update("last_update_date", new Date()) + .eq("document_no", flow.getId()) + .update("enable_return", enableReturn) + .doUpdate(InitiatedTaskPojo.class); + // 更新已完成的任务状态 + bd.getBusinessDatabase() + .update("current_node", status) + .update("last_update_date", new Date()) + .eq("document_no", flow.getId()) + .doUpdate(CompletedTaskPojo.class); + } + + public void processNextNode( + EngineReviewListPojo flow, + ApprovalConfigPojo currentNode, + String userId, + List list + ) { + // 处理通过逻辑 + ApprovalConfigPojo approvalConfigPojo = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_order", currentNode.getNodeOrder() + 1) + .doQueryFirst(ApprovalConfigPojo.class); + + // 检查当前节点已完成 + if (checkNodeComplete(flow, currentNode)) { + // 更新待办 + if (approvalConfigPojo != null) { + myself.addNodeTodo( + flow, + approvalConfigPojo, + userId, + 0 + ); + } + else { + // 待办环节修改 + myself.updateTasks(flow, ParamValueVersionEnum.PASSED.getDesc(), 0); // 所有环节完成 - DataEntryEngineModelPojo modelPojos = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("id", reviewListPojo.getModelId()).doQuery(DataEntryEngineModelPojo.class).get(0); + DataEntryEngineModelPojo modelPojos = bd.getBusinessDatabase() + .eq("id", flow.getModelId()) + .doQueryFirst(DataEntryEngineModelPojo.class); Integer versionNumber = modelPojos.getVersionNumber(); // 这个机型下所有参数都全部写入一版且版本加一 没有参与审批的参数时原来的值,参与审批的参数值要取小版本值作为大版本 - List oldDetails = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("engine_model_id", reviewListPojo.getModelId()) + List oldDetails = bd.getBusinessDatabase() + .eq("engine_model_id", flow.getModelId()) .eq("major_version", versionNumber) .doQuery(EngineParamDetailPojo.class); - List passDetail = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("approval_id", approvalId) + List passDetail = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) .eq("operation", ParamOperation.UPDATE) .doQuery(EngineParamDetailPojo.class); - List ids = passDetail.stream().map(x -> x.getId()).collect(Collectors.toList()); + List ids = passDetail.stream() + .map(EngineParamDetailPojo::getId) + .collect(Collectors.toList()); for (EngineParamDetailPojo oldDetail : oldDetails) { EngineParamDetailPojo engineParamDetailPojo = new EngineParamDetailPojo(); BeanUtils.copyProperties(oldDetail, engineParamDetailPojo @@ -441,110 +576,76 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { engineParamDetailPojo.setParameterValue(oldDetail.getMinorVersion()); } engineParamDetailPojo.setMajorVersion(versionNumber + 1); + // 添加到待插入列表 list.add(engineParamDetailPojo); } // 这一批数据改成审核通过, - sw.buildFromDatasource("xdap_app_223770822127386625") + bd.getBusinessDatabase() .update("version_status", ParamValueVersionEnum.PASSED.getCode()) .update("last_update_date", new Date()) - .eq("approval_id", approvalId).doUpdate(EngineParamDetailPojo.class); + .eq("approval_id", flow.getId()) + .doUpdate(EngineParamDetailPojo.class); // 这个机型版本加一, - sw.buildFromDatasource("xdap_app_223770822127386625") + bd.getBusinessDatabase() .update("version_number", (versionNumber + 1)) - .eq("id", reviewListPojo.getModelId()) + .eq("id", flow.getModelId()) .doUpdate(DataEntryEngineModelPojo.class); - //审批流改为已通过 - sw.buildFromDatasource("xdap_app_223770822127386625") + // 审批流改为已通过 + bd.getBusinessDatabase() .update("status_code", ParamValueVersionEnum.PASSED.getCode()) .update("status_description", ParamValueVersionEnum.PASSED.getDesc()) .update("approver_persons", "") .update("last_update_date", new Date()) - .eq("id", approvalId).doUpdate(EngineReviewListPojo.class); - //待办环节修改 - nodeName = ParamValueVersionEnum.PASSED.getDesc(); - currentProcessor = ""; + .eq("id", flow.getId()).doUpdate(EngineReviewListPojo.class); } - //当前环节审批人 用来完成当前环节审批人的待办 - String assignees = approvalConfigPojo.getAssignees(); - for (String assID : Arrays.asList(assignees.split(","))) { - //为当前人生成已办 - if (assID.equals(approver)) { - TodoTaskPojo todoTaskPojo = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("document_no", approvalId) - .eq("owner_id", assID) - .eq("current_node", reviewListPojo.getNodeName()) - .doQueryFirst(TodoTaskPojo.class); - CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); - BeanUtils.copyProperties(todoTaskPojo, completedTaskPojo, "id"); - completedTaskPojo.setIsDelete(0); - completedTaskPojo.setCurrentNode(nodeName); - completedTaskPojo.setCurrentProcessor(currentProcessor); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(completedTaskPojo); - } - - } - //完成这个节点的所有待办 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("is_delete", 1) - .update("current_node", nodeName) - .update("last_update_date", new Date()) - .update("current_processor", currentProcessor) - .eq("document_no", approvalId) - .eq("current_node", reviewListPojo.getNodeName()) - .doUpdate(TodoTaskPojo.class); - //更新发起的事项状态 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("current_node", nodeName) - .update("last_update_date", new Date()) - .update("current_processor", currentProcessor) - .eq("document_no", approvalId) - .doUpdate(InitiatedTaskPojo.class); - - } else { - //如果还有未通过的 找到未通过的 - List remainingAssignees = assigneeList.stream() - .filter(assignee -> !operatedUsers.contains(assignee)) - .collect(Collectors.toList()); - List complateAssignees = assigneeList.stream() - .filter(assignee -> operatedUsers.contains(assignee)) - .collect(Collectors.toList()); - String remainingAssigneesJson = JSON.toJSONString(remainingAssignees); - //已完成人的待办is_delete=1 - for (String complateAssignee : complateAssignees) { - TodoTaskPojo todoTaskPojo1 = sw.buildFromDatasource("xdap_app_223770822127386625") - .eq("document_no", approvalId) - .eq("current_node", reviewListPojo.getNodeName()) - .eq("owner_id", complateAssignee) - .doQueryFirst(TodoTaskPojo.class); - - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("is_delete", 1) - .update("last_update_date", new Date()) - .update("current_processor", remainingAssigneesJson) - .eq("id", todoTaskPojo1.getId()) - .doUpdate(TodoTaskPojo.class); - - //生成已完成人的已办 - CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); - BeanUtils.copyProperties(todoTaskPojo1, completedTaskPojo, "id"); - completedTaskPojo.setIsDelete(0); - completedTaskPojo.setCurrentProcessor(remainingAssigneesJson); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(completedTaskPojo); - } - - //更新机型审批数据的当前审批人去掉已经审批通过的那个人 - sw.buildFromDatasource("xdap_app_223770822127386625") - .update("approver_persons", String.join(",", remainingAssignees)) - .eq("id", approvalId).doUpdate(EngineReviewListPojo.class); - } - - if (ObjectUtils.isNotEmpty(list)) { - batchInsertParamDetail(list); + else { + return; } - return "已审批"; } + public void addNodeTodo( + EngineReviewListPojo flow, + ApprovalConfigPojo node, + String createBy, + Integer enableReturn + ) { + // 更新审批流到下个审批节点 + bd.getBusinessDatabase() + .update("approver_persons", node.getAssignees()) + .update("node_name", node.getNodeName()) + .update("last_update_date", new Date()) + .eq("id", flow.getId()) + .doUpdate(EngineReviewListPojo.class); + // 为下个环节的人生成待办任务 + DataEntryEngineModelPojo modelPojo = dataEntryEngineModelService.selectBymodelId(flow.getModelId()); + for (String nextAssId : node.getAssignees().split(",")) { + TodoTaskPojo todoTaskPojo = new TodoTaskPojo(); + todoTaskPojo.setDocumentNo(flow.getId()); + todoTaskPojo.setProcessTitle(flow.getProcessTopic()); + todoTaskPojo.setCurrentNode(node.getNodeName()); + todoTaskPojo.setCurrentProcessor(JSON.toJSONString(Arrays.asList(node.getAssignees().split(",")))); + // TODO:可以改为用机型去获取 + todoTaskPojo.setModelId(flow.getModelId()); + todoTaskPojo.setVersionNumber(modelPojo.getVersionNumber()); + todoTaskPojo.setOwnerId(nextAssId); + todoTaskPojo.setDataType(CurrentNodeEnum.DATAAPPROVAL.getDesc()); + todoTaskPojo.setModelName(modelPojo.getModelName()); + todoTaskPojo.setCreatedById(createBy); + todoTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(createBy).getUsername()); + todoTaskPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTaskPojo.setIsDelete(0); + bd.getBusinessDatabase().doInsert(todoTaskPojo); + } + myself.updateTasks(flow, node.getNodeName(), enableReturn); + } + + /** + * 平台发起审批流程 + * 从外部平台发起审批时,在本地系统创建相应的审批流程记录 + * + * @param request 审批请求对象,包含审批的基本信息 + */ @Override public void startActivitiByPlatform(ApprovalByPlatformRequest request) { @@ -554,6 +655,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { engineReviewListPojo.setModelId(request.getModelID()); engineReviewListPojo.setModelName(dataEntryEngineModelPojo.getModelName()); engineReviewListPojo.setYcOrOth(dataEntryEngineModelPojo.getYcOrOth()); + String processTopic = "参数审批"; engineReviewListPojo.setProcessTopic(processTopic); engineReviewListPojo.setStatusCode(ParamValueVersionEnum.UNDER.getCode()); engineReviewListPojo.setApplicant(request.getApplicant()); @@ -562,16 +664,322 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { engineReviewListPojo.setApproverPersons(String.join(",", request.getApproverPersons())); engineReviewListPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); engineReviewListPojo.setCreatedBy(request.getApplicant()); - sw.buildFromDatasource("xdap_app_223770822127386625").doInsert(engineReviewListPojo); + bd.getBusinessDatabase().doInsert(engineReviewListPojo); } + @Override + public boolean getIsDirect(String flowId) { + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", flowId) + .doQueryFirst(EngineReviewListPojo.class); + + if (flow == null) { + return false; + } + + return flow.getPreNode() != -1; + } + + @Override + public List getApprovalUsers(String flowId) { + List list = new ArrayList<>(); + + // 获取到模板最近一次未完成的流程 + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", flowId) + .doQueryFirst(EngineReviewListPojo.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 = Arrays.asList(node.getAssignees().split(",")); + dto.setNodeName(node.getNodeName()); + dto.setNodeOrder(node.getNodeOrder()); + dto.setAssignees( + bd.getBusinessDatabase() + .in("id", userIds) + .doQuery(XdapUsers.class) + ); + list.add(dto); + }); + return list; + } + + @Override + public void directSendingApproval(String flowId, String userId) { + // 获取当前流程审批的参数 + List engineParamDetails = bd.getBusinessDatabase() + .eq("approval_id", flowId) // 关联审批ID + .doQuery(EngineParamDetailPojo.class); + if (engineParamDetails.isEmpty()) { + throw new CommonException("流程无关联参数"); + } + + // 获取到未完成的流程 + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", flowId) + .ne("pre_node", -1) + .doQueryFirst(EngineReviewListPojo.class); + if (flow == null) { + throw new CommonException("流程没有直送节点"); + } + + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_name", flow.getNodeName()) + .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); + ParamApprovalRecordPojo lastedRecord = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .orderBy("operate_time", "desc") + .doQueryFirst(ParamApprovalRecordPojo.class) ; + Integer level = Objects.equals(lastedRecord.getOperator(), "MSG") ? lastedRecord.getApprovalLevel() : lastedRecord.getApprovalLevel() + 1; + + // 重新创建待办继续流程 + myself.addNodeTodo( + flow, + preNode, + userId, + 1 + ); + + // 这一批数据改成审核中, + bd.getBusinessDatabase() + .update("version_status", ParamValueVersionEnum.UNDER.getCode()) + .update("last_update_date", new Date()) + .eq("approval_id", flow.getId()) + .doUpdate(EngineParamDetailPojo.class); + // 审批流改为审核中 + bd.getBusinessDatabase() + .update("status_code", ParamValueVersionEnum.UNDER.getCode()) + .update("status_description", ParamValueVersionEnum.UNDER.getDesc()) + .update("approver_persons", "") + .update("last_update_date", new Date()) + .eq("id", flow.getId()).doUpdate(EngineReviewListPojo.class); + + // 清除拒绝提醒待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("data_type", "模板拒绝") + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); + + // 创建直送记录 + ParamApprovalRecordPojo record = new ParamApprovalRecordPojo( + flow.getId(), + "直送至" + preNode.getNodeName(), + xdapDeptUsersService.selectUserByID(userId).getUsername(), + "MSG", + Timestamp.valueOf(LocalDateTime.now()), + "直送", + currentNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now()), + level + ); + bd.getBusinessDatabase().doInsert(record); + } + + @Override + public List getReturnNodes(String flowId) { + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", flowId) + .doQueryFirst(EngineReviewListPojo.class); + ApprovalConfigPojo approvalConfigPojo = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_name", flow.getNodeName()) + .doQueryFirst(ApprovalConfigPojo.class); + return bd.getBusinessDatabase() + .eq("approval_id", flowId) + .lt("node_order", approvalConfigPojo.getNodeOrder()) + .doQuery(ApprovalConfigPojo.class) + .stream().sorted(Comparator.comparingInt(ApprovalConfigPojo::getNodeOrder)) + .collect(Collectors.toList()) + .stream().map(ApprovalConfigPojo::getNodeName) + .collect(Collectors.toList()); + } + + @Override + public void handleReturnToNode(HandleReturnNodeForm form) { + // 查找流程 + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", form.getFlowId()) + .doQueryFirst(EngineReviewListPojo.class); + if (flow == null) { + throw new CommonException("流程不存在"); + } + + // 查找当前节点 + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .eq("node_name", flow.getNodeName()) + .doQueryFirst(ApprovalConfigPojo.class); + + if (!Arrays.asList(currentNode.getAssignees().split(",")).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", currentNode.getNodeOrder()) + .doUpdate(ApprovalFlow.class); + + // 生成新的待办 + myself.addNodeTodo(flow, toNode, form.getCreateUserId(), 0); + + // 生成处理记录 + ParamApprovalRecordPojo lastedRecord = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .orderBy("operate_time", "desc") + .doQueryFirst(ParamApprovalRecordPojo.class); + ParamApprovalRecordPojo record = new ParamApprovalRecordPojo( + flow.getId(), + currentNode.getNodeName(), + form.getProcessUserId(), + "RETURN", + Timestamp.valueOf(LocalDateTime.now()), + "退回", + currentNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now()), + lastedRecord.getApprovalLevel() + ); + bd.getBusinessDatabase().doInsert(record); + ParamApprovalRecordPojo approvalRecord = new ParamApprovalRecordPojo( + flow.getId(), + "退回至" + toNode.getNodeName(), + xdapDeptUsersService.selectUserByID(form.getProcessUserId()).getUsername(), + "MSG", + Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), + "退回", + currentNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), + lastedRecord.getApprovalLevel() + 1 + ); + bd.getBusinessDatabase().doInsert(approvalRecord); + } finally { + redisLockUtil.unlock(lockKey, lockValue); + } + } + + @Override + public void handleReturn(HandleApprovalRequest request) { + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", request.getFlowId()) + .doQueryFirst(EngineReviewListPojo.class); + if (!Objects.equals(flow.getCreatedBy(), request.getUserId())) { + throw new CommonException("不是申请人无法撤回"); + } + if (!Objects.equals(flow.getStatusCode(), ParamValueVersionEnum.UNDER.getCode())) { + throw new CommonException("不在流程无法撤回"); + } + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() + .eq("approval_id", request.getFlowId()) + .eq("node_name", flow.getNodeName()) + .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())) { + ParamApprovalRecordPojo lastedRecord = bd.getBusinessDatabase() + .eq("approval_id", flow.getId()) + .orderBy("operate_time", "desc") + .doQueryFirst(ParamApprovalRecordPojo.class); + + ParamApprovalRecordPojo approvalRecord = new ParamApprovalRecordPojo( + flow.getId(), + "已撤回", + xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(), + "MSG", + Timestamp.valueOf(LocalDateTime.now()), + "撤回", + currentNode.getNodeOrder(), + Timestamp.valueOf(LocalDateTime.now()), + lastedRecord.getApprovalLevel() + 1 + ); + bd.getBusinessDatabase().doInsert(approvalRecord); + + // 申请人撤回 + myself.cancelProcess(flow, currentNode, ParamValueVersionEnum.WITHDRAWN, request.getUserId()); + } else { + throw new CommonException("无法撤回"); + } + } finally { + redisLockUtil.unlock(lockKey, lockValue); + } + } + + /** + * 批量插入参数明细数据 + * 在审批通过后,批量插入新版本的参数数据 + * + * @param engineParamDetailPojos 参数明细POJO列表 + */ @Transactional(rollbackFor = Exception.class) // 发生任何异常都回滚 public void batchInsertParamDetail(List engineParamDetailPojos) { - sw.buildFromDatasource("xdap_app_223770822127386625").doBatchInsert(engineParamDetailPojos); + bd.getBusinessDatabase().doBatchInsert(engineParamDetailPojos); } - //查看审批 + /** + * 查看审批详情 + * 根据审批ID获取审批过程中的数据和审批记录,供用户查看审批进度 + * + * @param showActivitiDTO 显示审批请求对象 + * @return 包含审批数据和审批记录的DTO + */ @Override public ActivitiDataAndRecordDTO showActivitiData(ShowActivitiDTO showActivitiDTO) { String approvalId = showActivitiDTO.getApprovalId(); @@ -584,14 +992,15 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { ArrayList activitiDataDTOS = new ArrayList<>(); //通过审批ID找到审批中的参数 通过参数ID匹配参数变动说明 - List detailPojos = sw.buildFromDatasource("xdap_app_223770822127386625") + List detailPojos = bd.getBusinessDatabase() .eq("approval_id", approvalId) .doQuery(EngineParamDetailPojo.class); - List ids = detailPojos.stream().map(x -> x.getId()).collect(Collectors.toList()); + List ids = detailPojos.stream().map(EngineParamDetailPojo::getId).collect(Collectors.toList()); if (ObjectUtils.isEmpty(ids)) { throw new RuntimeException("该审批流没有绑定的参数,请维护好参数后重新发起审批"); } - List dataChangeCommentPojos = sw.buildFromDatasource("xdap_app_223770822127386625") + // 查询数据变更评论 + List dataChangeCommentPojos = bd.getBusinessDatabase() .in("param_detail_id", ids) .doQuery(DataChangeCommentPojo.class); for (DataChangeCommentPojo dataChangeCommentPojo : dataChangeCommentPojos) { @@ -603,256 +1012,172 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { activitiDataDTOS.add(activitiDataDTO); } activitiDataAndRecordDTO.setActivitiDataDTOS(activitiDataDTOS); - - //查找审批记录 - ArrayList activitiRecordDTOS = new ArrayList<>(); - List paramApprovalRecordPojos = sw.buildFromDatasource("xdap_app_223770822127386625") + // 生成审批记录节点 + List flowNodes = new ArrayList<>(); + EngineReviewListPojo flow = bd.getBusinessDatabase() + .eq("id", approvalId) + .doQueryFirst(EngineReviewListPojo.class); + ApprovalConfigPojo currentNode = bd.getBusinessDatabase() .eq("approval_id", approvalId) + .eq("node_name", flow.getNodeName()) + .doQueryFirst(ApprovalConfigPojo.class); + // 查询所有流程记录 + List allRecord = bd.getBusinessDatabase() + .eq("approval_id", approvalId) + .orderBy("creation_date", "desc") .doQuery(ParamApprovalRecordPojo.class); //获取配置 - List approvalConfigPojos = sw.buildFromDatasource("xdap_app_223770822127386625") + List nodes = bd.getBusinessDatabase() .eq("approval_id", approvalId) .doQuery(ApprovalConfigPojo.class); -// for (ApprovalConfigPojo approvalConfigPojo : approvalConfigPojos) { -// String nodeName = approvalConfigPojo.getNodeName(); -// paramApprovalRecordPojos.stream().forEach(x -> { -// if (x.getNodeName().equals(nodeName)) { -// -// } -// }); -// if ("会签".equals(nodeName)) { -// -// } -// approvalConfigPojo.getAssignees() -// } + Map nodesMap = nodes.stream() + .filter(config -> config.getNodeName() != null) + .collect(Collectors.toMap( + ApprovalConfigPojo::getNodeName, + config -> config, + (existing, replacement) -> existing // 如果有重复键,保留第一个 + )); - // 存储已审批的人员信息 - Map> approvedPersonsByNode = new HashMap<>(); - List dtos = new ArrayList<>(); - for (ParamApprovalRecordPojo record : paramApprovalRecordPojos) { + // 获取所有层级 + Map> levelMap = allRecord.stream() + .collect(Collectors.groupingBy( + ParamApprovalRecordPojo::getApprovalLevel, + Collectors.collectingAndThen( + Collectors.toList(), + list -> list.stream() + .sorted(Comparator.comparing(ParamApprovalRecordPojo::getApprovalLevel)) + .collect(Collectors.toList()) + ) + )); - ActivitiRecordDTO activitiRecordDTO = new ActivitiRecordDTO(); - activitiRecordDTO.setNode(record.getNodeName()); - activitiRecordDTO.setApproverPersons(record.getAssignee()); - activitiRecordDTO.setCommon(record.getApprovalComment()); - activitiRecordDTO.setNodeOrder(record.getNodeOrder()); - activitiRecordDTO.setOperateTime(record.getOperateTime()); - activitiRecordDTO.setOperate(record.getOperator()); - dtos.add(activitiRecordDTO); - if (!approvedPersonsByNode.containsKey(record.getNodeName())) { - approvedPersonsByNode.put(record.getNodeName(), new ArrayList<>()); - } - approvedPersonsByNode.get(record.getNodeName()).add(activitiRecordDTO); - } - - // 存储未审批的人员信息 - Map> pendingPersonsByNode = new HashMap<>(); - for (ApprovalConfigPojo config : approvalConfigPojos) { - String nodeName = config.getNodeName(); - String assignees = config.getAssignees(); - ActivitiRecordDTO activitiRecordDTO = new ActivitiRecordDTO(); - activitiRecordDTO.setNode(nodeName); - activitiRecordDTO.setApproverPersons(assignees); - activitiRecordDTO.setNodeOrder(config.getNodeOrder()); - activitiRecordDTO.setOperate("待审批"); - // 将逗号分隔的审批人列表转换为数组 - List allAssignees = Arrays.asList(assignees.split(",")); - - // 获取该节点已审批的人员 - List approvedPersons = approvedPersonsByNode.getOrDefault(nodeName, new ArrayList<>()); - List strings = approvedPersons.stream().map(x -> x.getApproverPersons()).collect(Collectors.toList()); - // 找出未审批的人员 - List pending = new ArrayList<>(); - for (String assignee : allAssignees) { - if (!strings.contains(assignee.trim())) { - pending.add(activitiRecordDTO); - } - } - - if (!pending.isEmpty()) { - dtos.add(activitiRecordDTO); - } - } - for (ActivitiRecordDTO dto : dtos) { - System.out.println(dto); - } - System.out.println("-------------"); - // 将所有ActivitiRecordDTO对象按照node节点分组 - Map> dtosByNode = dtos.stream() - .collect(Collectors.groupingBy(ActivitiRecordDTO::getNode)); - - // 遍历dtosByNode生成新的ActivitiRecordDTO,同一节点的审批人放在approverPersons字符串中,所有审批人放在unapprovedPersons中 - List mergedDtos = new ArrayList<>(); - for (Map.Entry> entry : dtosByNode.entrySet()) { - String nodeName = entry.getKey(); - List nodeDtos = entry.getValue(); - - ActivitiRecordDTO mergedDto = new ActivitiRecordDTO(); - mergedDto.setNode(nodeName); - //找到所有审批人 - List collect = approvalConfigPojos.stream().filter(x -> nodeName.equals(x.getNodeName())).collect(Collectors.toList()); - String assignees = ""; - if (ObjectUtils.isNotEmpty(collect)) { - assignees = collect.get(0).getAssignees(); - } - // 分离已审批和未审批的人员 - List approvedPersons = new ArrayList<>(); - List unapprovedPersons = new ArrayList<>(); - StringBuilder stringBuilder = new StringBuilder(); - Date operateTime = null; - for (ActivitiRecordDTO dto : nodeDtos) { - String approver = dto.getApproverPersons(); - String operate = dto.getOperate(); - - if (!"待审批".equals(operate)) { - // 已审批人员 - if (StringUtils.isNotEmpty(approver)) { - List strings = Arrays.asList(approver.split(",")).stream().map(x -> { - XdapUsers xdapUsers = xdapDeptUsersService.selectUserByID(x); - if (ObjectUtils.isNotEmpty(xdapUsers)) { - return xdapUsers.getUsername(); - } else { - return "未知用户名:" + x; - } - }).collect(Collectors.toList()); - approvedPersons.addAll(strings); - stringBuilder.append(strings.get(0) + ":" + dto.getCommon() + "。"); - } - } - - mergedDto.setCommon(stringBuilder.toString()); - mergedDto.setNodeOrder(dto.getNodeOrder()); - - mergedDto.setOperate(dto.getOperate()); - if (ObjectUtils.isNotEmpty(dto.getOperateTime())) { - operateTime = dto.getOperateTime(); - } - } - mergedDto.setOperateTime(operateTime); - - // 设置审批人和未审批人 - if (!approvedPersons.isEmpty()) { - mergedDto.setApproverPersons(String.join(",", approvedPersons)); - } else { - mergedDto.setApproverPersons(""); - } - - - List strings = Arrays.stream(assignees.split(",")).map(x -> { - XdapUsers xdapUsers = xdapDeptUsersService.selectUserByID(x); - if (ObjectUtils.isNotEmpty(xdapUsers)) { - return xdapUsers.getUsername(); + // 获取最大层级 + 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( + ParamApprovalRecordPojo::getNodeName, + Function.identity(), + (first, second) -> first + )) + .values()); + uniqueRecords.forEach(record -> { + ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNodeName()); + if (approvalConfigPojo != null) { + flowNodes.add(getFlowNodeView(approvalConfigPojo, approvalId, level)); + nodeList.add(approvalConfigPojo.getNodeOrder()); } else { - return "未知用户名:" + x; + FlowNode flowNode = new FlowNode(); + flowNode.setNode(record.getNodeName()); + flowNode.setTodoUserName(record.getCreatedBy()); + flowNode.setResult(record.getOperator()); + flowNode.setApprovalTime((Timestamp) record.getOperateTime()); + flowNodes.add(flowNode); } - }).collect(Collectors.toList()); - if (ObjectUtils.isEmpty(assignees)) { - mergedDto.setUnapprovedPerson(String.join(",", approvedPersons)); - } else { - mergedDto.setUnapprovedPerson(String.join(",", strings)); - } + }); - // 如果没有任何审批人信息,则跳过 - if (StringUtils.isNotEmpty(mergedDto.getApproverPersons()) || - StringUtils.isNotEmpty(mergedDto.getUnapprovedPerson())) { - mergedDtos.add(mergedDto); + if (level == maxLevel && Objects.equals(flow.getStatusCode(), ParamValueVersionEnum.UNDER.getCode()) ) { + // 最后一层,添加待处理信息 + nodes.forEach(node -> { + if (!nodeList.contains(node.getNodeOrder()) && node.getNodeOrder() >= currentNode.getNodeOrder()) { + flowNodes.add(getFlowNodeView(node, approvalId, maxLevel)); + } + }); } } - // 使用合并后的数据替换原来的dtos - dtos = mergedDtos; - dtos = dtos.stream().sorted(Comparator.comparing(ActivitiRecordDTO::getNodeOrder)).collect(Collectors.toList()); - dtos = dtos.stream().map(x -> { - if ((!x.getUnapprovedPerson().equals(x.getApproverPersons())) && "会签".equals(x.getNode())) { - x.setOperate("待审批"); - } - if (ObjectUtils.isNotEmpty(x.getApproverPersons()) && !"会签".equals(x.getNode()) - && !"REJECT".equals(x.getOperate())) { - x.setOperate("PASS"); - } - return x; - }).collect(Collectors.toList()); - // 已完成审批的节点及人员 -// for (Map.Entry> entry : approvedPersonsByNode.entrySet()) { -// ActivitiRecordDTO activitiRecordDTO = new ActivitiRecordDTO(); -// activitiRecordDTO.setNode(entry.getKey()); -// ArrayList strings = new ArrayList<>(); -// for (String id : entry.getValue()) { -// XdapUsers XdapUsers = xdapDeptUsersService.selectUserByID(id); -// if (ObjectUtils.isNotEmpty(XdapUsers)) { -// String username = XdapUsers.getUsername(); -// strings.add(username); -// } -// } -// activitiRecordDTO.setApproverPersons(String.join(",", strings)); -// -// activitiRecordDTO.setCommon(paramApprovalRecordPojo.getApprovalComment()); -// activitiRecordDTO.setNodeOrder(paramApprovalRecordPojo.getNodeOrder()); -// activitiRecordDTO.setOperateTime(paramApprovalRecordPojo.getOperateTime()); -// activitiRecordDTO.setOperate(paramApprovalRecordPojo.getOperator()); -// activitiRecordDTOS.add(activitiRecordDTO); -// -// System.out.println("节点: " + entry.getKey() + ", 已审批人员: " + String.join(", ", entry.getValue())); -// } - -// // 未完成审批的节点及人员 -// for (Map.Entry> entry : pendingPersonsByNode.entrySet()) { -// System.out.println("节点: " + entry.getKey() + ", 未审批人员: " + String.join(", ", entry.getValue())); -// } - -// -// for (ParamApprovalRecordPojo paramApprovalRecordPojo : paramApprovalRecordPojos) { -// String approverPerson = paramApprovalRecordPojo.getAssignee(); -// ActivitiRecordDTO activitiRecordDTO = new ActivitiRecordDTO(); -// activitiRecordDTO.setNode(paramApprovalRecordPojo.getNodeName()); -// activitiRecordDTO.setApproverPersons(approverPerson); -// activitiRecordDTO.setCommon(paramApprovalRecordPojo.getApprovalComment()); -// activitiRecordDTO.setNodeOrder(paramApprovalRecordPojo.getNodeOrder()); -// activitiRecordDTO.setOperateTime(paramApprovalRecordPojo.getOperateTime()); -// activitiRecordDTO.setOperate(paramApprovalRecordPojo.getOperator()); -// activitiRecordDTOS.add(activitiRecordDTO); -// } -// //找到下一级审批人 -// List engineReviewListPojos = sw.buildFromDatasource("xdap_app_223770822127386625") -// .eq("id", approvalId).doQuery(EngineReviewListPojo.class); -// -// if (ObjectUtils.isNotEmpty(engineReviewListPojos)) { -// EngineReviewListPojo engineReviewListPojo = engineReviewListPojos.get(0); -// activitiDataAndRecordDTO.setApprovalStatus(engineReviewListPojo.getStatusDescription()); -// if (StringUtils.isNotEmpty(engineReviewListPojo.getApproverPersons())) { -// ActivitiRecordDTO recordNextApprover = new ActivitiRecordDTO(); -// recordNextApprover.setApproverPersons(engineReviewListPojo.getApproverPersons()); -// recordNextApprover.setCommon(""); -// recordNextApprover.setNode("待审批"); -// recordNextApprover.setNodeOrder(999); -// activitiRecordDTOS.add(recordNextApprover); -// } -// } -// ArrayList activitiRecordDTOS1 = new ArrayList<>(); -// //将activitiRecordDTOS数据的ID改为姓名 -// for (ActivitiRecordDTO activitiRecordDTO : activitiRecordDTOS) { -// ArrayList strings = new ArrayList<>(); -// for (String id : Arrays.stream(activitiRecordDTO.getApproverPersons().split(",")).collect(Collectors.toList())) { -// XdapUsers XdapUsers = xdapDeptUsersService.selectUserByID(id); -// if (ObjectUtils.isNotEmpty(XdapUsers)) { -// String username = XdapUsers.getUsername(); -// strings.add(username); -// } -// } -// ActivitiRecordDTO activitiRecordDTO1 = new ActivitiRecordDTO(); -// BeanUtils.copyProperties(activitiRecordDTO, activitiRecordDTO1); -// activitiRecordDTO1.setApproverPersons(String.join(",", strings)); -// activitiRecordDTOS1.add(activitiRecordDTO1); -// } - ArrayList arrayList1 = new ArrayList<>(dtos); - EngineReviewListPojo engineReviewListPojos = sw.buildFromDatasource("xdap_app_223770822127386625") + EngineReviewListPojo engineReviewListPojos = bd.getBusinessDatabase() .eq("id", approvalId).doQueryFirst(EngineReviewListPojo.class); activitiDataAndRecordDTO.setModelName(engineReviewListPojos.getModelName()); activitiDataAndRecordDTO.setApprovalStatus(engineReviewListPojos.getStatusDescription()); activitiDataAndRecordDTO.setProcessTitle(engineReviewListPojos.getProcessTopic()); - activitiDataAndRecordDTO.setActivitiRecordDTOS(arrayList1); + List sortedNode = flowNodes.stream() + .sorted(Comparator.comparing(FlowNode::getApprovalTime, + Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(FlowNode::getNodeOrder)) + .collect(Collectors.toList()); + activitiDataAndRecordDTO.setFlowNodes(sortedNode); return activitiDataAndRecordDTO; } -} + private FlowNode getFlowNodeView( + ApprovalConfigPojo node, + String flowId, + int level + ) { + FlowNode nodeView = new FlowNode(); + if (Objects.equals(node.getNodeName(), "会签")) { + List records = bd.getBusinessDatabase() + .eq("approval_id", flowId) + .eq("node_name", node.getNodeName()) + .eq("approval_level", level) + .doQuery(ParamApprovalRecordPojo.class); + List results = records.stream() + .map(ParamApprovalRecordPojo::getOperator).collect(Collectors.toList()); + List reversedTime = records.stream().sorted(Comparator + .comparing(ParamApprovalRecordPojo::getOperateTime).reversed()).collect(Collectors.toList()); + if (records.size() == Arrays.asList(node.getAssignees().split(",")).size() || results.contains("REJECT") || results.contains("RETURN")) { + // 节点已完成 + nodeView.setNodeOrder(node.getNodeOrder()); + String r = results.contains("RETURN") ? "RETURN" : "PASS"; + if (results.contains("REJECT")) { + r = "REJECT"; + } + nodeView.setResult(r); + nodeView.setNode(node.getNodeName()); + nodeView.setUndoUserName(getUserNames(Arrays.asList(node.getAssignees().split(",")))); + nodeView.setTodoUserName(getUserNames(Arrays.asList(node.getAssignees().split(",")))); + nodeView.setApprovalTime((Timestamp) reversedTime.get(0).getOperateTime()); + nodeView.setOpinions(records.stream().map(approvalRecord -> + getUserNames(Collections.singletonList(approvalRecord.getCreatedBy())) + ":" + approvalRecord.getApprovalComment()).collect(Collectors.toList())); + } else { + // 节点未完成 + nodeView.setNodeOrder(node.getNodeOrder()); + nodeView.setNode(node.getNodeName()); + nodeView.setResult("待审批"); + List includedIds = records.stream().map(ParamApprovalRecordPojo::getCreatedBy).collect(Collectors.toList()); + nodeView.setTodoUserName(getUserNames(includedIds)); + nodeView.setUndoUserName(getUserNames(Arrays.asList(node.getAssignees().split(",")))); + } + } else { + ParamApprovalRecordPojo record = bd.getBusinessDatabase() + .eq("approval_id", flowId) + .eq("node_Name", node.getNodeName()) + .eq("approval_level", level) + .doQueryFirst(ParamApprovalRecordPojo.class); + nodeView.setNodeOrder(node.getNodeOrder()); + nodeView.setNode(node.getNodeName()); + if (record != null) { + // 节点已完成 + nodeView.setResult(record.getOperator()); + nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getCreatedBy())) + ":" + record.getApprovalComment())); + nodeView.setApprovalTime((Timestamp) record.getOperateTime()); + nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getCreatedBy()))); + } else { + // 节点未完成 + nodeView.setResult("待审批"); + nodeView.setTodoUserName(""); + } + nodeView.setUndoUserName(getUserNames(Arrays.asList(node.getAssignees().split(",")))); + } + return nodeView; + } + + private String getUserNames(List userIds) { + StringJoiner joiner = new StringJoiner(" "); + for (String userId : userIds) { + String username = bd.getBusinessDatabase().eq("id", userId).doQueryFirst(XdapUsers.class).getUsername(); + if (username != null) { + joiner.add(username); + } else { + // 处理空值情况 + joiner.add(userId); + } + } + return joiner.toString(); + } +} \ No newline at end of file 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 4ab04ca..09f2df7 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 @@ -572,7 +572,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .orderBy("approval_time", "desc") .doQueryFirst(ApprovalRecord.class); - String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode; + 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); @@ -670,7 +670,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .update("status", report.getStatus()) .doUpdate(BenchmarkingReport.class); // 待办环节修改 - myself.updateTasks(flow, "已完成"); + myself.updateTasks(flow, "已完成", 0); } else { flow.setCurrentNode(nextNode.getNodeOrder()); myself.addNodeTodo(flow, nextNode, report, userId, 0); @@ -713,7 +713,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } // 更新已办和发起的状态 - myself.updateTasks(flow, node.getNodeName()); + myself.updateTasks(flow, node.getNodeName(), enableReturn); if (!list.isEmpty()) { bd.getBusinessDatabase().doBatchInsert(list); @@ -747,14 +747,32 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService report.setStatus(status); bd.getBusinessDatabase() .rowid("id", report.getRowId()) - .update("status", report.getStatus()) + .update("status", "DRAFT") .update("return_num", report.getReturnNum() + 1) .doUpdate(BenchmarkingReport.class); - - myself.updateTasks(flow, "已拒绝"); + // 增加拒绝待办 + if (Objects.equals(status, "REJECTED")) { + TodoTaskPojo todoTask = new TodoTaskPojo(); + todoTask.setCreatedById(userId); + todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(userId).getUsername()); + todoTask.setCurrentNode(node.getNodeName()); + todoTask.setDataType("对标报告拒绝"); + todoTask.setDocumentNo(flow.getId()); + todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTask.setIsDelete(0); + todoTask.setModelId(report.getId()); + todoTask.setModelName(report.getTitle()); + todoTask.setProcessTitle("拒绝提醒:"+flow.getProcessTitle()); + todoTask.setStatusCode(flow.getFlowStatus()); + todoTask.setVersionNumber(0); + todoTask.setOwnerId(flow.getCreateBy()); + todoTask.setCurrentProcessor(JSON.toJSONString(Collections.singletonList(flow.getCreateBy()))); + bd.getBusinessDatabase().doInsert(todoTask); + } + myself.updateTasks(flow, Objects.equals(report.getStatus(), "RETURNED") ? "已撤回" : "已拒绝", 0); } - public void updateTasks(ApprovalFlow flow, String status) { + public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) { // 更新已办和发起的节点状态 bd.getBusinessDatabase() .eq("document_no", flow.getId()) @@ -763,6 +781,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService bd.getBusinessDatabase() .eq("document_no", flow.getId()) .update("current_node", status) + .update("enable_return", enableReturn) .doUpdate(InitiatedTaskPojo.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 001213f..387110c 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 @@ -479,7 +479,11 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } // 处理下一节点流转 - public void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId) { + public void processNextNode( + ApprovalFlow flow, + ApprovalConfigPojo currentNode, + String userId + ) { // 检查当前节点是否满足流转条件 if (!myself.checkNodeComplete(flow, currentNode)) { return; @@ -655,6 +659,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { bd.getBusinessDatabase() .eq("document_no", flow.getId()) .update("current_node", status) + .update("enable_return", enableReturn) .doUpdate(InitiatedTaskPojo.class); } diff --git a/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java index 2bd48ea..998f11b 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java @@ -230,7 +230,7 @@ public class TodoTaskServiceImpl implements TodoTaskService { ArrayList todoTaskPojos = new ArrayList<>(); ArrayList taskPojos = new ArrayList<>(); - // todo清除待办 + // TODO:清除待办 XdapUsers xdapUsersPojo = xdapDeptUsersService.selectUserByID(userID); DataEntryEngineModelPojo modelPojo = dataEntryEngineModelService.selectBymodelId(modelId);