Merge remote-tracking branch 'origin/master'

This commit is contained in:
ys.git 2025-12-15 09:41:16 +08:00
commit b0bc890c57
4 changed files with 80 additions and 21 deletions

View File

@ -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")
})

View File

@ -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",

View File

@ -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);

View File

@ -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<TodoTaskPojo> 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<TodoAndTemplateView> getApprovalList(ApprovalListForm form) {
// List<TodoAndTemplateView> todoAndTemplateViews = bd.getBusinessDatabase()
// .viewQueryMode(true)
// .view("getAllApproval")
// .doQuery(TodoAndTemplateView.class);
List<TodoAndTemplateView> approvalList = new ArrayList<>();
Set<String> flowIds = new HashSet<>(Objects.requireNonNull(redisTemplate.opsForSet().members(TODO_PREFIX + permissionGetter.getCurrentUserId())));
List<String> 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<TodoAndTemplateView> approvalList, List<TodoAndTemplateView> todoAndTemplateViews) {
todoAndTemplateViews.forEach(item -> {
if (item.getCurrentUsers() == null || item.getCurrentUsers().isEmpty()) {
item.setCurrentApprovers(null);
item.setCurrentUsers(null);
} else {
List<String> userIds = JSON.parseArray(item.getCurrentUsers()).toJavaList(String.class);
List<ApprovalXdapUsers> approvalXdapUsers = bd.getBusinessDatabase()
.in("id", userIds)
.doQuery(ApprovalXdapUsers.class);
item.setCurrentApprovers(approvalXdapUsers);
item.setCurrentUsers(null);
}
});
approvalList.addAll(todoAndTemplateViews);
}
// private void setCurrentApprovers(List<TodoAndTemplateView> approvalList, List<TodoAndTemplateView> todoAndTemplateViews) {
// todoAndTemplateViews.forEach(item -> {
// if (item.getCurrentUsers() == null || item.getCurrentUsers().isEmpty()) {
// item.setCurrentApprovers(null);
// item.setCurrentUsers(null);
// } else {
// List<String> userIds = JSON.parseArray(item.getCurrentUsers()).toJavaList(String.class);
// List<ApprovalXdapUsers> 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 "-";
}
}
}