修改:流程转办过程大改
This commit is contained in:
parent
5f7e8493e3
commit
5c87d67ac1
@ -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<TodoTaskPojo> 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<String> currentNodeUsers = getNodeUsers(flow, currentNode);
|
||||
List<String> 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<String> users = getNodeUsers(flow, node);
|
||||
users.forEach(userId -> {
|
||||
redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId());
|
||||
});
|
||||
// 新增待办
|
||||
List<TodoTaskPojo> 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<String> 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<String> getNodeUsers(ApprovalFlow flow, String node) {
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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<String> users = getNodeUsers(flow, node);
|
||||
users.forEach(userId -> {
|
||||
redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId());
|
||||
});
|
||||
// 新增待办
|
||||
List<TodoTaskPojo> 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<String> 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<String> currentNodeUsers = getNodeUsers(flow, currentNode);
|
||||
List<String> 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<String> getNodeUsers(ApprovalFlow flow, String node) {
|
||||
|
||||
@ -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<YcTodoTaskResultDTO> returnTodoTask(String userName) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class) // 发生任何异常都回滚
|
||||
public void batchInsertTodoTask(List<TodoTaskPojo> todoTaskPojos) {
|
||||
sw.buildFromDatasource("xdap_app_223770822127386625").doBatchInsert(todoTaskPojos);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user