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 a3139bd..d6c291c 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 @@ -60,9 +60,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService @Value("${apaas.token.clientSecred}") private String clientSecret; - - private static final String TODO_PREFIX = "report:todo:"; - private static final String NODE_PROCESSED_PREFIX = "report:node:processed:"; private static final String FLOW_LOCK_PREFIX = "report:lock:"; private static final int FLOW_LOCK_EXPIRE_SECONDS = 15; @@ -113,11 +110,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService 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) { @@ -158,10 +150,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService flow.setExplanation(form.getExplanation()); bd.getBusinessDatabase().doInsert(flow); - form.getProofreadUsers().forEach(userId -> { - redisTemplate.opsForSet().add(TODO_PREFIX + userId, flow.getId()); - }); - List list = new ArrayList<>(); for (String person : form.getProofreadUsers()) { TodoTaskPojo todoTask = new TodoTaskPojo(); @@ -292,9 +280,11 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService throw new CommonException("当前节点正在处理,请稍后重试"); } try { - String processedKey = NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode; - long processedCount = Optional.ofNullable(redisTemplate.opsForSet().size(processedKey)) - .orElse(0L); + int processedCount = bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("is_delete", 1) + .eq("current_node", getNodeName(flow.getCurrentNode())) + .doQuery(TodoTaskPojo.class).size(); if (processedCount > 0) { throw new CommonException("此节点已被他人处理"); } @@ -373,20 +363,20 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); bd.getBusinessDatabase().doInsert(record); - redisTemplate.opsForSet().add(NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode, - request.getUserId()); bd.getBusinessDatabase() .eq("document_no", flow.getId()) .eq("owner_id", request.getUserId()) + .eq("current_node", getNodeName(flow.getCurrentNode())) .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) .update("is_delete", 1) .doUpdate(TodoTaskPojo.class); bd.getBusinessDatabase() .eq("document_no", flow.getId()) .ne("owner_id", request.getUserId()) + .eq("current_node", getNodeName(flow.getCurrentNode())) .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) .update("is_delete", 2) - .doDelete(TodoTaskPojo.class); + .doUpdate(TodoTaskPojo.class); // 处理驳回逻辑 if ("REJECT".equals(request.getResult())) { @@ -398,10 +388,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService } private void processNextNode(ApprovalFlow flow, String currentNode, String userId) { - // 检查当前节点是否满足流转条件 - if (!checkNodeComplete(flow, currentNode)) { - return; // 未满足条件,不流转 - } // 更新报告状态 BenchmarkingReport report = bd.getBusinessDatabase() @@ -418,7 +404,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .rowid("id", report.getRowId()) .update("status", report.getStatus()) .doUpdate(BenchmarkingReport.class); - clearProcessed(flow); } else { flow.setCurrentNode(nextNode); addNodeTodo(flow, nextNode, report, userId); @@ -429,27 +414,10 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .update("flow_status", flow.getFlowStatus()) .update("current_node", flow.getCurrentNode()) .doUpdate(ApprovalFlow.class); - // 清除当前节点待办 - clearNodeTodoSmart(flow, currentNode, nextNode); - } - - private void clearNodeTodoSmart(ApprovalFlow flow, String currentNode, String nextNode) { - List currentNodeUsers = getNodeUsers(flow, currentNode); - List nextNodeUsers = nextNode != null ? getNodeUsers(flow, nextNode) : Collections.emptyList(); - - // 只清除那些不在下一节点的用户的待办 - for (String userId : currentNodeUsers) { - if (!nextNodeUsers.contains(userId)) { - redisTemplate.opsForSet().remove(TODO_PREFIX + userId, flow.getId()); - } - } } private void addNodeTodo(ApprovalFlow flow, String node, BenchmarkingReport report, String createBy) { List users = getNodeUsers(flow, node); - users.forEach(userId -> { - redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId()); - }); // 新增待办 List list = new ArrayList<>(); for (String person : users) { @@ -472,14 +440,6 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService bd.getBusinessDatabase().doBatchInsert(list); } - private boolean checkNodeComplete(ApprovalFlow flow, String node) { - String key = NODE_PROCESSED_PREFIX + flow.getId() + ":" + node; - Long processedCount = redisTemplate.opsForSet().size(key); - if (processedCount == null) processedCount = 0L; - - return processedCount >= 1; - } - private String getNextNode(String currentNode, ApprovalFlow flow) { switch (currentNode) { case "PROOFREAD": @@ -510,32 +470,16 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .doUpdate(BenchmarkingReport.class); // 清除所有待办 clearAllTodo(flow, userId); - clearProcessed(flow); } private void clearAllTodo(ApprovalFlow flow, String userId) { - clearNodeTodo(flow, "PROOFREAD"); - clearNodeTodo(flow, "REVIEW"); - clearNodeTodo(flow, "APPROVE"); // 清除已有待办 bd.getBusinessDatabase() .eq("document_no", flow.getId()) - .ne("owner_id", userId) + .eq("is_delete", 0) .update("is_delete", 2) - .doDelete(TodoTaskPojo.class); - } - - private void clearProcessed(ApprovalFlow flow) { - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "PROOFREAD"); - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "REVIEW"); - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "APPROVE"); - } - - private void clearNodeTodo(ApprovalFlow flow, String node) { - List users = getNodeUsers(flow, node); - users.forEach(userId -> { - redisTemplate.opsForSet().remove(TODO_PREFIX+ userId, flow.getId()); - }); + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); } private List getNodeUsers(ApprovalFlow flow, String node) { 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 36f2714..0a2f234 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 @@ -294,7 +294,10 @@ public class ParameterServiceImpl implements ParameterService { .doQueryFirst(Parameter.class); int maxNum = newParameters.stream() - .mapToInt(Parameter::getParameterNumber) + .filter(Objects::nonNull) + .map(Parameter::getParameterNumber) + .filter(Objects::nonNull) + .mapToInt(Integer::intValue) .max() .orElse(0); 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 849fd8d..d3044a3 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 @@ -48,10 +48,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Resource private XdapDeptUsersService xdapDeptUsersService; - // 待办标志: userId -> flowId集合 - private static final String TODO_PREFIX = "approval:todo:"; - // 节点已处理用户标志: flowId:node -> userId集合 - private static final String NODE_PROCESSED_PREFIX = "approval:node:processed:"; // 分布式锁标志 private static final String FLOW_LOCK_PREFIX = "approval:lock:"; // 分布式锁有效时间 @@ -130,12 +126,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .rowid("id", template.getRowId()) .update("status", template.getStatus()) .doUpdate(Template.class); - - // 4. 初始化Redis待办信息(校对节点) - request.getProofreadUsers().forEach(userId -> { - redisTemplate.opsForSet().add(TODO_PREFIX + userId, flow.getId()); - }); - return flow.getId(); } @@ -206,17 +196,16 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { String lockValue = UUID.randomUUID().toString(); boolean lockAcquired = redisLockUtil .tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); - // 其他人正在处理 if (!lockAcquired) { throw new CommonException("当前节点正在处理,请稍后重试"); } - try { - String processedKey = NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode; - long processedCount = Optional.ofNullable(redisTemplate.opsForSet().size(processedKey)) - .orElse(0L); - + int processedCount = bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("current_node", getNodeName(flow.getCurrentNode())) + .eq("is_delete", 1) + .doQuery(TodoTaskPojo.class).size(); // 已被其他人处理 if (processedCount > 0) { throw new CommonException("此节点已被他人处理"); @@ -244,26 +233,23 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); bd.getBusinessDatabase().doInsert(record); - redisTemplate.opsForSet().add(NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode, - request.getUserId()); - // 删除当前节点的已处理待办 - if ("COUNTERSIGN".equals(flow.getCurrentNode())) { - redisTemplate.opsForSet().remove(TODO_PREFIX + request.getUserId(), flow.getId()); - } else { + if (!"COUNTERSIGN".equals(flow.getCurrentNode())) { bd.getBusinessDatabase() - .eq("document_no", flow.getId()) - .ne("owner_id", request.getUserId()) - .update("is_delete", 2) - .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) - .doDelete(TodoTaskPojo.class); + .eq("document_no", flow.getId()) + .ne("owner_id", request.getUserId()) + .eq("current_node", getNodeName(flow.getCurrentNode())) + .update("is_delete", 2) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); } bd.getBusinessDatabase() - .eq("document_no", flow.getId()) - .eq("owner_id", request.getUserId()) - .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) - .update("is_delete", 1) - .doUpdate(TodoTaskPojo.class); + .eq("document_no", flow.getId()) + .eq("owner_id", request.getUserId()) + .eq("current_node", getNodeName(flow.getCurrentNode())) + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .update("is_delete", 1) + .doUpdate(TodoTaskPojo.class); // 处理驳回逻辑 if ("REJECT".equals(request.getResult())) { @@ -403,7 +389,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .doUpdate(Template.class); // 更新机型版本 // dataEntryEngineModelService.updateModelForNewVersion(); - clearProcessed(flow, userId); } else { flow.setCurrentNode(nextNode); addNodeTodo(flow, nextNode, template, userId); @@ -414,8 +399,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .update("flow_status", flow.getFlowStatus()) .update("current_node", flow.getCurrentNode()) .doUpdate(ApprovalFlow.class); - // 清除当前节点待办 - clearNodeTodoSmart(flow, currentNode, nextNode); } // 获取下一节点 @@ -437,13 +420,14 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { // 检查节点是否完成 private boolean checkNodeComplete(ApprovalFlow flow, String node) { - String key = NODE_PROCESSED_PREFIX + flow.getId() + ":" + node; - Long processedCount = redisTemplate.opsForSet().size(key); - if (processedCount == null) processedCount = 0L; - + Integer processedCount = bd.getBusinessDatabase() + .eq("document_no", flow.getId()) + .eq("is_delete", 1) + .eq("current_node", getNodeName(flow.getCurrentNode())) + .doQuery(TodoTaskPojo.class).size(); // 会签节点需要所有人处理,其他节点只需1人 if ("COUNTERSIGN".equals(node)) { - return processedCount.equals((long) JSON.parseArray(flow.getCountersignUsers()).size()); + return processedCount.equals(JSON.parseArray(flow.getCountersignUsers()).size()); } else { return processedCount >= 1; } @@ -467,7 +451,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .doUpdate(Template.class); // 清除所有待办 clearAllTodo(flow, userId); - clearProcessed(flow, userId); } private boolean hasPermission(ApprovalFlow flow, String node, String userId) { @@ -487,9 +470,6 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { private void addNodeTodo(ApprovalFlow flow, String node, Template template, String createBy) { List users = getNodeUsers(flow, node); - users.forEach(userId -> { - redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId()); - }); // 新增待办 List list = new ArrayList<>(); for (String person : users) { @@ -512,47 +492,14 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { bd.getBusinessDatabase().doBatchInsert(list); } - private void clearNodeTodo(ApprovalFlow flow, String node) { - List users = getNodeUsers(flow, node); - users.forEach(userId -> { - redisTemplate.opsForSet().remove(TODO_PREFIX+ userId, flow.getId()); - }); - } - - private void clearProcessed(ApprovalFlow flow, String userId) { - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "PROOFREAD"); - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "REVIEW"); - if (flow.getCountersignUsers() != null) { - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "COUNTERSIGN"); - } - redisTemplate.delete(NODE_PROCESSED_PREFIX + flow.getId() + ":" + "APPROVE"); - } - private void clearAllTodo(ApprovalFlow flow, String userId) { - clearNodeTodo(flow, "PROOFREAD"); - clearNodeTodo(flow, "REVIEW"); - if (flow.getCountersignUsers() != null) { - clearNodeTodo(flow, "COUNTERSIGN"); - } - clearNodeTodo(flow, "APPROVE"); // 清除已有待办 bd.getBusinessDatabase() .eq("document_no", flow.getId()) - .ne("owner_id", userId) + .eq("is_delete", 0) .update("is_delete", 2) - .doDelete(TodoTaskPojo.class); - } - - private void clearNodeTodoSmart(ApprovalFlow flow, String currentNode, String nextNode) { - List currentNodeUsers = getNodeUsers(flow, currentNode); - List nextNodeUsers = nextNode != null ? getNodeUsers(flow, nextNode) : Collections.emptyList(); - - // 只清除那些不在下一节点的用户的待办 - for (String userId : currentNodeUsers) { - if (!nextNodeUsers.contains(userId)) { - redisTemplate.opsForSet().remove(TODO_PREFIX + userId, flow.getId()); - } - } + .update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) + .doUpdate(TodoTaskPojo.class); } private List getNodeUsers(ApprovalFlow flow, String node) { 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 54acb17..3d00199 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 @@ -11,6 +11,7 @@ import com.xdap.self_development.enums.DistributeStatusEnum; import com.xdap.self_development.pojo.*; import com.xdap.self_development.pojo.dto.EngineParamDetailDTO; import com.xdap.self_development.pojo.dto.PageResultDTO; +import com.xdap.self_development.pojo.dto.YcTodoTaskResultDTO; import com.xdap.self_development.service.DataEntryEngineModelService; import com.xdap.self_development.service.EngineParamDetailService; import com.xdap.self_development.service.TodoTaskService; @@ -20,10 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; /** @@ -236,6 +234,11 @@ public class TodoTaskServiceImpl implements TodoTaskService { } + @Override + public List returnTodoTask(String userName) { + return Collections.emptyList(); + } + @Transactional(rollbackFor = Exception.class) // 发生任何异常都回滚 public void batchInsertTodoTask(List todoTaskPojos) { sw.buildFromDatasource("xdap_app_223770822127386625").doBatchInsert(todoTaskPojos);