diff --git a/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java b/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java index 8c6c5fb..03f6135 100644 --- a/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java +++ b/src/main/java/com/xdap/self_development/pojo/ModelCommonParameters.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; @SQLQuery(value = { @SQL(view = "getCommonAndParameters", - sql = "SELECT ymcp.*, ymp.parameter_name, ymp.parameter_type, ymp.subsystem_name, ymp.parts_name FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.common_id IN (#ids)"), + sql = "SELECT ymcp.*, ymp.parameter_name as 'parameterName', ymp.parameter_type as 'parameterType', ymp.subsystem_name as 'subsystemName', ymp.parts_name as 'partsName' FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.common_id IN (#ids)"), @SQL(view = "getCommonById", sql = "SELECT ymcp.*, ymp.parameter_name as 'parameterName', ymp.parameter_type as 'parameterType', ymp.subsystem_name as 'subsystemName' FROM yfsjglpt_model_common_parameters ymcp LEFT JOIN yfsjglpt_model_parameter ymp ON ymcp.parameter_id = ymp.id WHERE ymcp.user_id = #userId") }) 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 53c0aaf..24b3886 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 @@ -10,6 +10,8 @@ import java.sql.Timestamp; import java.util.List; @SQLQuery(value = { + @SQL(view = "getAllApproval", + sql = "SELECT af.id AS \"flowId\", t.id AS \"templateId\", t.template_name AS \"templateName\", t.version AS \"version\", af.flow_status AS \"status\" , af.create_by AS \"createBy\" , xu.username AS \"username\", af.created_time AS \"createdTime\" , 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 LEFT JOIN xdap_users xu ON xu.id = af.create_by ORDER BY 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 = "getApprovalByUserIdAndIds", sql = "SELECT af.id AS \"flowId\", t.id AS \"templateId\", t.template_name AS \"templateName\", t.version AS \"version\", t.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 t.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/impl/CommonParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java index bdc321d..555c28c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java @@ -213,7 +213,8 @@ public class CommonParameterServiceImpl implements CommonParameterService { param.getParameterId(), param.getParameterName(), param.getSubsystemName(), - null,null + param.getSubsystemName(), + param.getPartsName() )) .collect(Collectors.toList()); item.setParameters(parameters); 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 8922a03..9d9e17b 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 @@ -14,6 +14,7 @@ import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TodoAndTemplateView; import com.xdap.self_development.service.DataEntryEngineModelService; import com.xdap.self_development.service.TemplateApprovalService; +import com.xdap.self_development.service.XdapDeptUsersService; import com.xdap.self_development.utils.RedisLockUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -44,6 +45,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { private DataEntryEngineModelService dataEntryEngineModelService; @Resource private UserPermissionGetter permissionGetter; + @Resource + private XdapDeptUsersService xdapDeptUsersService; // 待办标志: userId -> flowId集合 private static final String TODO_PREFIX = "approval:todo:"; @@ -55,7 +58,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { private static final int FLOW_LOCK_EXPIRE_SECONDS = 15; @Override - @Transactional + @Transactional(rollbackFor = CommonException.class) public String startApproval(StartApprovalRequest request) { // 验证模板存在 Template template = bd.getBusinessDatabase() @@ -100,6 +103,27 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { flow.setExplanation(request.getExplanation()); bd.getBusinessDatabase().doInsert(flow); + // 新增待办 +// List list = new ArrayList<>(); +// for (String person : request.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(template.getId()); +// todoTask.setModelName(template.getTemplateName()); +// todoTask.setProcessTitle("模板审核"); +// todoTask.setStatusCode(flow.getFlowStatus()); +// todoTask.setVersionNumber(template.getVersion()); +// todoTask.setOwnerId(person); +// list.add(todoTask); +// } +// bd.getBusinessDatabase().doBatchInsert(list); + // 3. 更新模板状态为校对中 template.setStatus("APPROVING"); bd.getBusinessDatabase() @@ -118,6 +142,11 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Override @Transactional public List getApprovalList(ApprovalListForm form) { + +// List todoAndTemplateViews = bd.getBusinessDatabase() +// .viewQueryMode(true) +// .view("getAllApproval") +// .doQuery(TodoAndTemplateView.class); List approvalList = new ArrayList<>(); Set flowIds = new HashSet<>(Objects.requireNonNull(redisTemplate.opsForSet().members(TODO_PREFIX + permissionGetter.getCurrentUserId()))); List ids = new ArrayList<>(flowIds); @@ -131,26 +160,26 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .setVar("createdTime", form.getCreateDate() == null ? "" : form.getCreateDate()) .setVar("username",form.getUsername()) .doQuery(TodoAndTemplateView.class); - setCurrentApprovers(approvalList, todoList); return approvalList; +// return todoAndTemplateViews; } - private void setCurrentApprovers(List approvalList, List todoAndTemplateViews) { - todoAndTemplateViews.forEach(item -> { - if (item.getCurrentUsers() == null || item.getCurrentUsers().isEmpty()) { - item.setCurrentApprovers(null); - item.setCurrentUsers(null); - } else { - List userIds = JSON.parseArray(item.getCurrentUsers()).toJavaList(String.class); - List approvalXdapUsers = bd.getBusinessDatabase() - .in("id", userIds) - .doQuery(ApprovalXdapUsers.class); - item.setCurrentApprovers(approvalXdapUsers); - item.setCurrentUsers(null); - } - }); - approvalList.addAll(todoAndTemplateViews); - } +// private void setCurrentApprovers(List approvalList, List todoAndTemplateViews) { +// todoAndTemplateViews.forEach(item -> { +// if (item.getCurrentUsers() == null || item.getCurrentUsers().isEmpty()) { +// item.setCurrentApprovers(null); +// item.setCurrentUsers(null); +// } else { +// List userIds = JSON.parseArray(item.getCurrentUsers()).toJavaList(String.class); +// List approvalXdapUsers = bd.getBusinessDatabase() +// .in("id", userIds) +// .doQuery(ApprovalXdapUsers.class); +// item.setCurrentApprovers(approvalXdapUsers); +// item.setCurrentUsers(null); +// } +// }); +// approvalList.addAll(todoAndTemplateViews); +// } @Override @Transactional(rollbackFor = CommonException.class) @@ -169,12 +198,14 @@ 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(); boolean lockAcquired = redisLockUtil .tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); + // 其他人正在处理 if (!lockAcquired) { throw new CommonException("当前节点正在处理,请稍后重试"); } @@ -183,6 +214,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { String processedKey = NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode; long processedCount = Optional.ofNullable(redisTemplate.opsForSet().size(processedKey)) .orElse(0L); + + // 已被其他人处理 if (processedCount > 0) { throw new CommonException("此节点已被他人处理"); } @@ -190,7 +223,9 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { } finally { redisLockUtil.unlock(lockKey, lockValue); } - } else { + } + // 抢签节点 + else { processApprovalLogic(flow, request, currentNode); } } @@ -210,8 +245,17 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { 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()); +// bd.getBusinessDatabase() +// .eq("document_no", flow.getId()) +// .eq("owner_id", permissionGetter.getCurrentUserId()) +// .doDelete(TodoTaskPojo.class); +// } else { +// bd.getBusinessDatabase() +// .eq("document_no", flow.getId()) +// .doDelete(TodoTaskPojo.class); } // 处理驳回逻辑 @@ -439,6 +483,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { users.forEach(userId -> { redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId()); }); + + } private void clearNodeTodo(ApprovalFlow flow, String node) { @@ -487,4 +533,14 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { default: return Collections.emptyList(); } } + + private String getNodeName(String node) { + switch (node) { + case "PROOFREAD": return "校对"; + case "REVIEW": return "审核"; + case "COUNTERSIGN": return "会签"; + case "APPROVE": return "批准"; + default: return "-"; + } + } }