From 38ddb04eac4ca4f41239a485eee130d67bf9572f Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Mon, 15 Dec 2025 14:38:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=BB=E8=BE=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/form/ParameterForm.java | 2 +- .../impl/BenchmarkingReportServiceImpl.java | 84 +++++++++++++++++-- .../service/impl/ParameterServiceImpl.java | 9 +- .../impl/TemplateApprovalServiceImpl.java | 43 ++++++---- 4 files changed, 110 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java b/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java index d1a6e36..7c7d2df 100644 --- a/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java @@ -29,7 +29,7 @@ public class ParameterForm { private String numberOrFormula; - @NotBlank(message = "子部门不能为空") + @NotBlank(message = "部门不能为空") private String department; private String remarks; 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 c008f1a..3cb4ed9 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 @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; import com.xdap.runtime.service.RuntimeAppContextService; +import com.xdap.self_development.common.UserPermissionGetter; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.controller.form.BenchmarkingReportPageForm; import com.xdap.self_development.controller.form.HandleApprovalRequest; @@ -14,14 +15,12 @@ import com.xdap.self_development.feign.ApaasMyTokenFeign; import com.xdap.self_development.feign.dto.AppTokenDTO; import com.xdap.self_development.feign.dto.FileUploadDTO; import com.xdap.self_development.feign.dto.UserTokenDT0; -import com.xdap.self_development.pojo.ApprovalFlow; -import com.xdap.self_development.pojo.ApprovalRecord; -import com.xdap.self_development.pojo.ApprovalXdapUsers; -import com.xdap.self_development.pojo.BenchmarkingReport; +import com.xdap.self_development.pojo.*; import com.xdap.self_development.pojo.view.ApprovalFlowView; import com.xdap.self_development.pojo.view.ApprovalNodeView; import com.xdap.self_development.pojo.view.TodoAndReportView; import com.xdap.self_development.service.BenchmarkingReportService; +import com.xdap.self_development.service.XdapDeptUsersService; import com.xdap.self_development.utils.RedisLockUtil; import org.bson.types.ObjectId; import org.springframework.beans.BeanUtils; @@ -50,6 +49,10 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService private ApaasMyTokenFeign apaasMyTokenFeign; @Resource private RedisLockUtil redisLockUtil; + @Resource + private UserPermissionGetter permissionGetter; + @Resource + private XdapDeptUsersService xdapDeptUsersService; @Value("${apaas.token.clientId}") private String clientId; @@ -88,12 +91,42 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService flow.setExplanation(form.getExplanation()); bd.getBusinessDatabase().doInsert(flow); + // 新增待办 + List list = new ArrayList<>(); + for (String person : form.getProofreadUsers()) { + TodoTaskPojo todoTask = new TodoTaskPojo(); + todoTask.setCreatedById(permissionGetter.getCurrentUserId()); + todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(permissionGetter.getCurrentUserId()).getUsername()); + todoTask.setCurrentNode(getNodeName(flow.getCurrentNode())); + todoTask.setDataType("-"); + todoTask.setDocumentNo(flow.getId()); + todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTask.setIsDelete(0); + todoTask.setModelId(report.getId()); + todoTask.setModelName(report.getProjectName()+"对标报告"); + todoTask.setProcessTitle("对标报告审核"); + todoTask.setStatusCode(flow.getFlowStatus()); + todoTask.setVersionNumber(1); + todoTask.setOwnerId(person); + list.add(todoTask); + } + bd.getBusinessDatabase().doBatchInsert(list); + // 3. 初始化Redis待办信息(校对节点) form.getProofreadUsers().forEach(userId -> { redisTemplate.opsForSet().add(TODO_PREFIX + userId, flow.getId()); }); } + private String getNodeName(String node) { + switch (node) { + case "PROOFREAD": return "校对"; + case "REVIEW": return "审核"; + case "APPROVE": return "批准"; + default: return "-"; + } + } + @Override public void restartReportApproval(UpdateBenchmarkingReportForm form) { BenchmarkingReport originalReport = bd.getBusinessDatabase() @@ -287,7 +320,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } } - private void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, String currentNode) { + @Transactional(rollbackFor = CommonException.class) + public void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, String currentNode) { // 记录审批结果 ApprovalRecord record = new ApprovalRecord(); record.setFlowId(flow.getId()); @@ -300,6 +334,16 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService redisTemplate.opsForSet().add(NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode, request.getUserId()); + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .ne("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 2) + .doDelete(TodoTaskPojo.class); // 处理驳回逻辑 if ("REJECT".equals(request.getResult())) { @@ -334,7 +378,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService clearProcessed(flow); } else { flow.setCurrentNode(nextNode); - addNodeTodo(flow, nextNode); + addNodeTodo(flow, nextNode, report); } bd.getBusinessDatabase() @@ -358,11 +402,31 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } } - private void addNodeTodo(ApprovalFlow flow, String node) { + private void addNodeTodo(ApprovalFlow flow, String node, BenchmarkingReport report) { List users = getNodeUsers(flow, node); users.forEach(userId -> { redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId()); }); + // 新增待办 + List list = new ArrayList<>(); + for (String person : users) { + TodoTaskPojo todoTask = new TodoTaskPojo(); + todoTask.setCreatedById(permissionGetter.getCurrentUserId()); + todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(permissionGetter.getCurrentUserId()).getUsername()); + todoTask.setCurrentNode(getNodeName(flow.getCurrentNode())); + todoTask.setDataType("-"); + todoTask.setDocumentNo(flow.getId()); + todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); + todoTask.setIsDelete(0); + todoTask.setModelId(report.getId()); + todoTask.setModelName(report.getProjectName()+"对标报告"); + todoTask.setProcessTitle("对标报告审核"); + todoTask.setStatusCode(flow.getFlowStatus()); + todoTask.setVersionNumber(1); + todoTask.setOwnerId(person); + list.add(todoTask); + } + bd.getBusinessDatabase().doBatchInsert(list); } private boolean checkNodeComplete(ApprovalFlow flow, String node) { @@ -410,6 +474,12 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService clearNodeTodo(flow, "PROOFREAD"); clearNodeTodo(flow, "REVIEW"); clearNodeTodo(flow, "APPROVE"); + // 清除已有待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .ne("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 2) + .doDelete(TodoTaskPojo.class); } private void clearProcessed(ApprovalFlow flow) { diff --git a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java index 619c199..9cf2cc0 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java @@ -117,7 +117,7 @@ public class ParameterServiceImpl implements ParameterService { private void validateTemplateStatus(TemplateBenchmark benchmark) { // 当前修改的模板不为最新版 if (!Objects.equals(benchmark.getLastTemplate().getId(), benchmark.getBaseTemplate().getId())) { - throw new CommonException("该状态的模板不可修改"); + throw new CommonException("该模板不可修改,请修改最新版本"); } // 校验模板状态(仅允许草稿/已发布) @@ -336,15 +336,18 @@ public class ParameterServiceImpl implements ParameterService { // 如果是原模板,就更新 if (Objects.equals(baseTemplate.getId(), newTemplate.getId())) { BeanUtils.copyProperties(form, updatedParameter); - updatedParameter.setId(originalParameter.getId()); + updatedParameter.setId(null); updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId()); detail = getParameterChange(originalParameter, updatedParameter); - bd.getBusinessDatabase().rowid("id", originalParameter.getRowId()).doUpdate(updatedParameter); + bd.getBusinessDatabase() + .rowid("id", originalParameter.getRowId()) + .doUpdate(updatedParameter); } // 如果是新模板,就新增 else { BeanUtils.copyProperties(form, updatedParameter); updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId()); + updatedParameter.setId(null); detail = getParameterChange(originalParameter, updatedParameter); bd.getBusinessDatabase().doInsert(updatedParameter); } 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 e3fc533..4880473 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 @@ -198,7 +198,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { throw new CommonException("无权限处理或已被处理"); } - // 会签节点 + // 抢签节点 if (!"COUNTERSIGN".equals(currentNode)) { String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode; String lockValue = UUID.randomUUID().toString(); @@ -224,7 +224,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { redisLockUtil.unlock(lockKey, lockValue); } } - // 抢签节点 + // 会签节点 else { processApprovalLogic(flow, request, currentNode); } @@ -248,15 +248,18 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { // 删除当前节点的已处理待办 if ("COUNTERSIGN".equals(flow.getCurrentNode())) { redisTemplate.opsForSet().remove(TODO_PREFIX + request.getUserId(), flow.getId()); - bd.getBusinessDatabase() - .eq("document_no", flow.getId()) - .eq("owner_id", permissionGetter.getCurrentUserId()) - .doDelete(TodoTaskPojo.class); } else { bd.getBusinessDatabase() .eq("document_no", flow.getId()) + .ne("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 2) .doDelete(TodoTaskPojo.class); } + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); // 处理驳回逻辑 if ("REJECT".equals(request.getResult())) { @@ -280,17 +283,17 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .setVar("templateId", form.getTemplateId()) .doPageQuery(form.getPageNumber(), form.getPageSize(), TemplateChangeView.class); - results.getResult().forEach(item -> { - if (item.getPreTemplateId() != null) { - Parameter parameter = bd.getBusinessDatabase() - .viewQueryMode(true) - .view("selectParametersByTemplateId") - .setVar("templateId", item.getPreTemplateId()) - .eq("parameter_number", item.getParameterNumber()) - .doQueryFirst(Parameter.class); - BeanUtils.copyProperties(parameter, item); - } - }); +// results.getResult().forEach(item -> { +// if (item.getPreTemplateId() != null) { +// Parameter parameter = bd.getBusinessDatabase() +// .viewQueryMode(true) +// .view("selectParametersByTemplateId") +// .setVar("templateId", item.getPreTemplateId()) +// .eq("parameter_number", item.getParameterNumber()) +// .doQueryFirst(Parameter.class); +// BeanUtils.copyProperties(parameter, item); +// } +// }); return results; } @@ -528,6 +531,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { clearNodeTodo(flow, "COUNTERSIGN"); } clearNodeTodo(flow, "APPROVE"); + // 清除已有待办 + bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .ne("owner_id", permissionGetter.getCurrentUserId()) + .update("is_delete", 2) + .doDelete(TodoTaskPojo.class); } private void clearNodeTodoSmart(ApprovalFlow flow, String currentNode, String nextNode) {