修改:模板流程整体修改,所有退回都可以直送,完善退回、撤回和处理审批的细节;完善流程整体功能

This commit is contained in:
zjh 2026-01-10 14:42:29 +08:00
parent d2da60badc
commit 2ea9e70932
8 changed files with 219 additions and 117 deletions

View File

@ -24,6 +24,6 @@ public class BusinessDatabase {
@Bean @Bean
public MpaasQuery getTCDatabase() { public MpaasQuery getTCDatabase() {
return queryFactory.buildFromDatasource("yc_lrs_test_relsult"); return queryFactory.buildFromDatasource(DatasourceConstant.XDAP_MYSQL_PREFIX + tenantId);
} }
} }

View File

@ -5,6 +5,7 @@ import com.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.runtime.service.RuntimeDatasourceService; import com.xdap.runtime.service.RuntimeDatasourceService;
import com.xdap.self_development.controller.form.*; import com.xdap.self_development.controller.form.*;
import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.exception.CommonException;
import com.xdap.self_development.pojo.dto.ApprovalNodeDTO;
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
import com.xdap.self_development.pojo.view.DepartmentUserView; import com.xdap.self_development.pojo.view.DepartmentUserView;
import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TemplateChangeView;
@ -25,6 +26,15 @@ public class TemplateApprovalController {
@Resource @Resource
private RuntimeDatasourceService runtimeDatasourceService; private RuntimeDatasourceService runtimeDatasourceService;
// 获取流程审批人
@GetMapping("/getApprovalUsers")
public Response getApprovalUsers(
@NotBlank @RequestParam String templateId
) {
List<ApprovalUserNodeDTO> nodes = templateApprovalService.getApprovalUsers(templateId);
return Response.ok().data(nodes);
}
// 获取用户和部门 // 获取用户和部门
@GetMapping("/getUsersByCondition") @GetMapping("/getUsersByCondition")
public Response getUsersByCondition( public Response getUsersByCondition(
@ -51,13 +61,27 @@ public class TemplateApprovalController {
return Response.ok().data(templateApprovalService.startApproval(request)); return Response.ok().data(templateApprovalService.startApproval(request));
} }
// 发起人拒绝后重新发起审批 @PostMapping("/restartApproval")
@GetMapping("/restartApproval")
public Response restartApproval( public Response restartApproval(
@RequestBody @Valid StartApprovalRequest request,
BindingResult bindingResult
) {
if (bindingResult.hasErrors()) {
bindingResult.getFieldErrors().forEach(error -> {
throw new CommonException(error.getDefaultMessage());
});
}
templateApprovalService.restartApproval(request);
return Response.ok();
}
// 直送回退回的节点
@GetMapping("/directSendingApproval")
public Response directSendingApproval(
@RequestParam @NotBlank String templateId, @RequestParam @NotBlank String templateId,
@RequestParam @NotBlank String userId @RequestParam @NotBlank String userId
) { ) {
templateApprovalService.restartApproval(templateId, userId); templateApprovalService.directSendingApproval(templateId, userId);
return Response.ok(); return Response.ok();
} }

View File

@ -0,0 +1,14 @@
package com.xdap.self_development.controller.form;
import com.xdap.api.moudle.user.pojo.XdapUsers;
import com.xdap.self_development.pojo.view.XdapUserView;
import lombok.Data;
import java.util.List;
@Data
public class ApprovalUserNodeDTO {
private String nodeName;
private List<XdapUsers> assignees;
private Integer nodeOrder;
}

View File

@ -21,6 +21,7 @@ public class ApprovalFlow extends MpaasBasePojo {
private Integer currentNode; // 节点PROOFREAD, REVIEW, COUNTERSIGN, APPROVE private Integer currentNode; // 节点PROOFREAD, REVIEW, COUNTERSIGN, APPROVE
private String flowStatus; //DRAFT(草稿)APPROVING审批中COMPLETE(已完成)RETURNED(已撤回)REJECTED(已拒绝) private String flowStatus; //DRAFT(草稿)APPROVING审批中COMPLETE(已完成)RETURNED(已撤回)REJECTED(已拒绝)
private Integer returnNum; private Integer returnNum;
private Integer preNode;
private String createBy; private String createBy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

View File

@ -103,5 +103,9 @@ public class InitiatedTaskPojo implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date lastUpdateDate; private Date lastUpdateDate;
/**
* 是否可退回
*/
private Integer enableReturn;
} }

View File

@ -6,6 +6,7 @@ import com.xdap.self_development.pojo.ApprovalConfigPojo;
import com.xdap.self_development.pojo.ApprovalFlow; import com.xdap.self_development.pojo.ApprovalFlow;
import com.xdap.self_development.pojo.ApprovalRecord; import com.xdap.self_development.pojo.ApprovalRecord;
import com.xdap.self_development.pojo.Template; import com.xdap.self_development.pojo.Template;
import com.xdap.self_development.pojo.dto.ApprovalNodeDTO;
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView; import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TemplateChangeView;
import com.xdap.self_development.pojo.view.TodoAndTemplateView; import com.xdap.self_development.pojo.view.TodoAndTemplateView;
@ -17,7 +18,7 @@ import java.util.List;
public interface TemplateApprovalService { public interface TemplateApprovalService {
String startApproval(StartApprovalRequest request); String startApproval(StartApprovalRequest request);
void restartApproval(@NotBlank String templateId, @NotBlank String userId); void directSendingApproval(@NotBlank String templateId, @NotBlank String userId);
PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form); PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form);
@ -41,9 +42,13 @@ public interface TemplateApprovalService {
boolean checkNodeComplete(ApprovalFlow flow, ApprovalConfigPojo node); boolean checkNodeComplete(ApprovalFlow flow, ApprovalConfigPojo node);
void updateTasks(ApprovalFlow flow, String status); void updateTasks(ApprovalFlow flow, String status, Integer enableReturn);
void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy); void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy, Integer enableReturn);
List<String> getReturnNodes(@NotBlank String flowId); List<String> getReturnNodes(@NotBlank String flowId);
List<ApprovalUserNodeDTO> getApprovalUsers(@NotBlank String templateId);
void restartApproval(@Valid StartApprovalRequest request);
} }

View File

@ -47,7 +47,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String startApproval(StartApprovalRequest request) { public String startApproval(StartApprovalRequest request) {
// 验证模板能否发起审批 // 验证能否发起审批
Template template = bd.getBusinessDatabase() Template template = bd.getBusinessDatabase()
.rowid("id", request.getTemplateRowId()) .rowid("id", request.getTemplateRowId())
.doQueryFirst(Template.class); .doQueryFirst(Template.class);
@ -75,7 +75,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
throw new CommonException("空参数模板不允许发起审批"); throw new CommonException("空参数模板不允许发起审批");
} }
// 创建审批流程 // 新增流程
ApprovalFlow flow = new ApprovalFlow(); ApprovalFlow flow = new ApprovalFlow();
flow.setTemplateId(template.getId()); flow.setTemplateId(template.getId());
flow.setCurrentNode(1); flow.setCurrentNode(1);
@ -86,9 +86,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
flow.setFlowType(1); // 设置为模板审批流程 flow.setFlowType(1); // 设置为模板审批流程
flow.setExplanation(request.getExplanation()); flow.setExplanation(request.getExplanation());
flow.setReturnNum(template.getReturnNum()); flow.setReturnNum(template.getReturnNum());
flow.setPreNode(-1);// 标识没有退回节点
bd.getBusinessDatabase().doInsert(flow); bd.getBusinessDatabase().doInsert(flow);
// 创建审批配置 // 新增流程配置
List<ApprovalConfigPojo> approvalConfigs = new ArrayList<>(); List<ApprovalConfigPojo> approvalConfigs = new ArrayList<>();
ApprovalNodeDTO firstNode = new ApprovalNodeDTO(); ApprovalNodeDTO firstNode = new ApprovalNodeDTO();
boolean hasUsers = false; boolean hasUsers = false;
@ -118,7 +119,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
} }
bd.getBusinessDatabase().doBatchInsert(approvalConfigs); bd.getBusinessDatabase().doBatchInsert(approvalConfigs);
// 新增待办 // 新增我的待办
List<TodoTaskPojo> list = new ArrayList<>(); List<TodoTaskPojo> list = new ArrayList<>();
for (String person : firstNode.getAssignees()) { for (String person : firstNode.getAssignees()) {
TodoTaskPojo todoTask = new TodoTaskPojo(); TodoTaskPojo todoTask = new TodoTaskPojo();
@ -152,9 +153,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
initiatedTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); initiatedTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now()));
initiatedTask.setIsDelete(0); initiatedTask.setIsDelete(0);
initiatedTask.setModelId(flow.getTemplateId()); initiatedTask.setModelId(flow.getTemplateId());
initiatedTask.setEnableReturn(1);
bd.getBusinessDatabase().doInsert(initiatedTask); bd.getBusinessDatabase().doInsert(initiatedTask);
// 发起记录 // 增发起记录
bd.getBusinessDatabase().doInsert( bd.getBusinessDatabase().doInsert(
new ApprovalRecord( new ApprovalRecord(
flow.getId(), flow.getId(),
@ -168,7 +170,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
); );
// 更新模板状态为校对 // 更新模板状态为审批
template.setStatus("APPROVING"); template.setStatus("APPROVING");
bd.getBusinessDatabase() bd.getBusinessDatabase()
.rowid("id", template.getRowId()) .rowid("id", template.getRowId())
@ -179,51 +181,50 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void restartApproval(String templateId, String userId) { public void directSendingApproval(String templateId, String userId) {
// 判断当前模板是否存在 // 获取模板
Template template = bd.getBusinessDatabase() Template template = bd.getBusinessDatabase()
.eq("id", templateId) .eq("id", templateId)
.eq("status", "DRAFT")
.doQueryFirst(Template.class); .doQueryFirst(Template.class);
if (template == null) { if (template == null) {
throw new CommonException("模板不存在"); throw new CommonException("模板不存在");
} }
// 查找上次未完成的流程 // 获取到模板最近一次未完成的流程
ApprovalFlow approvalFlow = bd.getBusinessDatabase() ApprovalFlow flow = bd.getBusinessDatabase()
.eq("templateId", templateId) .eq("template_id", templateId)
.eq("flow_status", "REJECTED") .ne("pre_node", -1)
.orderBy("created_time", "desc") .orderBy("created_time", "desc")
.doQueryFirst(ApprovalFlow.class); .doQueryFirst(ApprovalFlow.class);
if (approvalFlow == null) { if (flow == null) {
throw new CommonException("没有上次未完成的流程"); throw new CommonException("模板没有未完成的流程");
} }
// 查找当前节点 // 根据状态不同获取节点和节点层级
ApprovalConfigPojo currentNode = bd.getBusinessDatabase() ApprovalConfigPojo preNode = bd.getBusinessDatabase()
.eq("approval_id", approvalFlow.getId()) .eq("approval_id", flow.getId())
.eq("node_order", approvalFlow.getCurrentNode()) .eq("node_order", flow.getPreNode())
.doQueryFirst(ApprovalConfigPojo.class); .doQueryFirst(ApprovalConfigPojo.class);
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
.eq("flow_id", flow.getId())
.orderBy("approval_time", "desc")
.doQueryFirst(ApprovalRecord.class) ;
Integer level = Objects.equals(lastedRecord.getResult(), "MSG") ? lastedRecord.getApprovalLevel() : lastedRecord.getApprovalLevel() + 1;
String lockKey = FLOW_LOCK_PREFIX + approvalFlow.getId() + ":" + currentNode.getNodeName();
String lockValue = UUID.randomUUID().toString();
boolean lockAcquired = redisLockUtil
.tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
if (!lockAcquired) {
throw new CommonException("当前节点正在处理,请稍后重试");
}
try {
// 重新创建待办继续流程 // 重新创建待办继续流程
myself.addNodeTodo( myself.addNodeTodo(
approvalFlow, flow,
currentNode, preNode,
template, template,
userId userId,
1
); );
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("id", approvalFlow.getId()) .eq("id", flow.getId())
.update("flow_status", "APPROVING") .update("flow_status", "APPROVING")
.update("current_node", flow.getPreNode())
.update("pre_node", -1)
.doUpdate(ApprovalFlow.class); .doUpdate(ApprovalFlow.class);
bd.getBusinessDatabase() bd.getBusinessDatabase()
@ -233,30 +234,22 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
// 清除拒绝提醒待办 // 清除拒绝提醒待办
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("document_no", approvalFlow.getId()) .eq("document_no", flow.getId())
.eq("current_node", currentNode.getNodeName())
.eq("data_type", "模板拒绝") .eq("data_type", "模板拒绝")
.update("is_delete", 1) .update("is_delete", 1)
.doUpdate(TodoTaskPojo.class); .doUpdate(TodoTaskPojo.class);
// 创建直送记录 // 创建直送记录
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
.eq("flow_id", approvalFlow.getId())
.orderBy("approval_time", "desc")
.doQueryFirst(ApprovalRecord.class);
ApprovalRecord record = new ApprovalRecord( ApprovalRecord record = new ApprovalRecord(
approvalFlow.getId(), flow.getId(),
"直送至" + currentNode.getNodeName(), "直送至" + preNode.getNodeName(),
xdapDeptUsersService.selectUserByID(userId).getUsername(), xdapDeptUsersService.selectUserByID(userId).getUsername(),
"直送", "直送",
"MSG", "MSG",
Timestamp.valueOf(LocalDateTime.now()), Timestamp.valueOf(LocalDateTime.now()),
lastedRecord.getApprovalLevel() + 1 level
); );
bd.getBusinessDatabase().doInsert(record); bd.getBusinessDatabase().doInsert(record);
} finally {
redisLockUtil.unlock(lockKey, lockValue);
}
} }
// 查询所有流程 // 查询所有流程
@ -293,7 +286,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void handleApproval(HandleApprovalRequest request) { public void handleApproval(HandleApprovalRequest request) {
// 验证流程状态 // 验证流程状态和用户权限
ApprovalFlow flow = bd.getBusinessDatabase() ApprovalFlow flow = bd.getBusinessDatabase()
.eq("id", request.getFlowId()) .eq("id", request.getFlowId())
.eq("flow_type", 1) .eq("flow_type", 1)
@ -301,14 +294,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
if (flow == null || !"APPROVING".equals(flow.getFlowStatus())) { if (flow == null || !"APPROVING".equals(flow.getFlowStatus())) {
throw new CommonException("流程不存在或已结束"); throw new CommonException("流程不存在或已结束");
} }
// 获取当前流程节点
ApprovalConfigPojo currentNode = bd.getBusinessDatabase() ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
.eq("approval_id", flow.getId()) .eq("approval_id", flow.getId())
.eq("node_order", flow.getCurrentNode()) .eq("node_order", flow.getCurrentNode())
.doQueryFirst(ApprovalConfigPojo.class); .doQueryFirst(ApprovalConfigPojo.class);
// 验证当前用户是否有权限处理
if (!hasPermission(currentNode, request.getUserId())) { if (!hasPermission(currentNode, request.getUserId())) {
throw new CommonException("无权限处理或已被处理"); throw new CommonException("无权限处理或已被处理");
} }
@ -319,7 +308,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.orderBy("approval_time", "desc") .orderBy("approval_time", "desc")
.doQueryFirst(ApprovalRecord.class); .doQueryFirst(ApprovalRecord.class);
// 抢签节点 // 处理审批节点
if (!"会签".equals(currentNode.getNodeName())) { if (!"会签".equals(currentNode.getNodeName())) {
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName(); String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName();
String lockValue = UUID.randomUUID().toString(); String lockValue = UUID.randomUUID().toString();
@ -329,7 +318,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
throw new CommonException("当前节点正在处理,请稍后重试"); throw new CommonException("当前节点正在处理,请稍后重试");
} }
try { try {
// 查询已完成的任务,检查当前节点是否完成 // 抢签节点需要验证是否被处理
int processedCount = bd.getBusinessDatabase() int processedCount = bd.getBusinessDatabase()
.eq("flow_id", flow.getId()) .eq("flow_id", flow.getId())
.eq("node", currentNode.getNodeName()) .eq("node", currentNode.getNodeName())
@ -359,7 +348,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord
) { ) {
// 记录当前审批结果 // 新增当前审批结果
ApprovalRecord record = new ApprovalRecord( ApprovalRecord record = new ApprovalRecord(
flow.getId(), flow.getId(),
currentNode.getNodeName(), currentNode.getNodeName(),
@ -371,15 +360,26 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
); );
bd.getBusinessDatabase().doInsert(record); bd.getBusinessDatabase().doInsert(record);
// 当前流程当前节点的所有待办全部删除 // 软删除当前节点当前处理人的待办
if (!Objects.equals(currentNode.getNodeName(), "会签")) {
// 抢签节点还需要软删除其他人的待办
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("document_no", flow.getId()) .eq("document_no", flow.getId())
.eq("current_node", currentNode.getNodeName()) .eq("current_node", currentNode.getNodeName())
.ne("owner_id", request.getUserId())
.update("is_delete", 1)
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
.doUpdate(TodoTaskPojo.class);
}
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.eq("current_node", currentNode.getNodeName())
.eq("owner_id", request.getUserId())
.update("is_delete", 1) .update("is_delete", 1)
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now())) .update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
.doUpdate(TodoTaskPojo.class); .doUpdate(TodoTaskPojo.class);
// 更新当前用户的已办 // 新增当前处理人的已办
CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo();
completedTaskPojo.setDocumentNo(flow.getId()); completedTaskPojo.setDocumentNo(flow.getId());
completedTaskPojo.setCreatedById(request.getUserId()); completedTaskPojo.setCreatedById(request.getUserId());
@ -406,12 +406,20 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
} }
public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) { public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) {
// 删除所有待办
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.eq("current_node", node.getNodeName())
.update("is_delete", 1)
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
.doUpdate(TodoTaskPojo.class);
// 更新流程状态 // 更新流程状态
flow.setFlowStatus(status); flow.setFlowStatus(status);
bd.getBusinessDatabase() bd.getBusinessDatabase()
.rowid("id", flow.getRowId()) .rowid("id", flow.getRowId())
.update("flow_status", flow.getFlowStatus()) .update("flow_status", flow.getFlowStatus())
.update("return_num", flow.getReturnNum() + 1) .update("return_num", flow.getReturnNum() + 1)
.update("pre_node", node.getNodeOrder())
.doUpdate(ApprovalFlow.class); .doUpdate(ApprovalFlow.class);
// 更新模板状态(重新打回草稿状态) // 更新模板状态(重新打回草稿状态)
Template template = bd.getBusinessDatabase() Template template = bd.getBusinessDatabase()
@ -443,7 +451,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
bd.getBusinessDatabase().doInsert(todoTask); bd.getBusinessDatabase().doInsert(todoTask);
} }
// 更新发起和已办 // 更新发起和已办
myself.updateTasks(flow, Objects.equals(status, "REJECTED") ? "已拒绝" : "已撤回"); myself.updateTasks(flow, Objects.equals(status, "REJECTED") ? "已拒绝" : "已撤回", 0);
} }
// 处理下一节点流转 // 处理下一节点流转
@ -480,12 +488,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.update("published_time", Timestamp.valueOf(LocalDateTime.now())) .update("published_time", Timestamp.valueOf(LocalDateTime.now()))
.doUpdate(Template.class); .doUpdate(Template.class);
// 待办环节修改 // 待办环节修改
myself.updateTasks(flow, "已完成"); myself.updateTasks(flow, "已完成", 0);
// 更新机型版本 // 更新机型版本
// dataEntryEngineModelService.updateModelForNewVersion(); // dataEntryEngineModelService.updateModelForNewVersion();
} else { } else {
flow.setCurrentNode(nextNode.getNodeOrder()); flow.setCurrentNode(nextNode.getNodeOrder());
myself.addNodeTodo(flow, nextNode, template, userId); myself.addNodeTodo(flow, nextNode, template, userId, 0);
} }
bd.getBusinessDatabase() bd.getBusinessDatabase()
@ -513,7 +521,13 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
} }
} }
public void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy) { public void addNodeTodo(
ApprovalFlow flow,
ApprovalConfigPojo node,
Template template,
String createBy,
Integer enableReturn
) {
// 获取处理人 // 获取处理人
List<String> users = JSON.parseArray(node.getAssignees()).toJavaList(String.class); List<String> users = JSON.parseArray(node.getAssignees()).toJavaList(String.class);
// 新增待办 // 新增待办
@ -538,7 +552,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
} }
// 更新已办和发起的状态 // 更新已办和发起的状态
myself.updateTasks(flow, node.getNodeName()); myself.updateTasks(flow, node.getNodeName(), enableReturn);
if (!list.isEmpty()) { if (!list.isEmpty()) {
bd.getBusinessDatabase().doBatchInsert(list); bd.getBusinessDatabase().doBatchInsert(list);
@ -560,7 +574,45 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public void updateTasks(ApprovalFlow flow, String status) { @Override
public List<ApprovalUserNodeDTO> getApprovalUsers(String templateId) {
List<ApprovalUserNodeDTO> list = new ArrayList<>();
// 获取到模板最近一次未完成的流程
ApprovalFlow flow = bd.getBusinessDatabase()
.eq("template_id", templateId)
.ne("pre_node", -1)
.orderBy("created_time", "desc")
.doQueryFirst(ApprovalFlow.class);
if (flow == null) {
return list;
}
// 获取流程节点
List<ApprovalConfigPojo> approvalConfigs = bd.getBusinessDatabase()
.eq("approval_id", flow.getId())
.doQuery(ApprovalConfigPojo.class);
approvalConfigs.forEach(node -> {
ApprovalUserNodeDTO dto = new ApprovalUserNodeDTO();
List<String> userIds = JSON.parseArray(node.getAssignees()).toJavaList(String.class);
dto.setNodeName(node.getNodeName());
dto.setNodeOrder(node.getNodeOrder());
dto.setAssignees(
bd.getBusinessDatabase()
.in("id", userIds)
.doQuery(XdapUsers.class)
);
});
return list;
}
@Override
public void restartApproval(StartApprovalRequest request) {
}
public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) {
// 更新已办和发起的节点状态 // 更新已办和发起的节点状态
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("document_no", flow.getId()) .eq("document_no", flow.getId())
@ -665,6 +717,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
for (Map.Entry<Integer, List<ApprovalRecord>> entry : levelMap.entrySet()) { for (Map.Entry<Integer, List<ApprovalRecord>> entry : levelMap.entrySet()) {
// 获取到每一层 // 获取到每一层
int level = entry.getKey(); int level = entry.getKey();
Set<Integer> nodeList = new HashSet<>();
List<ApprovalRecord> records = entry.getValue(); List<ApprovalRecord> records = entry.getValue();
List<ApprovalRecord> uniqueRecords = new ArrayList<>(records.stream() List<ApprovalRecord> uniqueRecords = new ArrayList<>(records.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
@ -677,6 +730,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode()); ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode());
if (approvalConfigPojo != null) { if (approvalConfigPojo != null) {
flowNodes.add(getFlowNodeView(approvalConfigPojo, form.getFlowId(), level)); flowNodes.add(getFlowNodeView(approvalConfigPojo, form.getFlowId(), level));
nodeList.add(approvalConfigPojo.getNodeOrder());
} else { } else {
FlowNode flowNode = new FlowNode(); FlowNode flowNode = new FlowNode();
flowNode.setNode(record.getNode()); flowNode.setNode(record.getNode());
@ -690,7 +744,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING") ) { if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING") ) {
// 最后一层添加待处理信息 // 最后一层添加待处理信息
nodes.forEach(node -> { nodes.forEach(node -> {
if (node.getNodeOrder() >= approvalFlow.getCurrentNode()) { if (!nodeList.contains(node.getNodeOrder()) && node.getNodeOrder() >= approvalFlow.getCurrentNode()) {
flowNodes.add(getFlowNodeView(node, form.getFlowId(), maxLevel)); flowNodes.add(getFlowNodeView(node, form.getFlowId(), maxLevel));
} }
}); });
@ -821,16 +875,23 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.orderBy("approval_time", "desc") .orderBy("approval_time", "desc")
.doQueryFirst(ApprovalRecord.class); .doQueryFirst(ApprovalRecord.class);
ApprovalRecord record = new ApprovalRecord( // 更新流程状态
bd.getBusinessDatabase()
.eq("id", flow.getId())
.update("flow_status", request.getResult())
.update("pre_node", flow.getCurrentNode())
.doUpdate(ApprovalFlow.class);
ApprovalRecord approvalRecord = new ApprovalRecord(
flow.getId(), flow.getId(),
currentNode.getNodeName(), "已撤回",
request.getUserId(), xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(),
request.getOpinion(), "撤回",
request.getResult(), "MSG",
Timestamp.valueOf(LocalDateTime.now()), Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)),
lastedRecord.getApprovalLevel() lastedRecord.getApprovalLevel() + 1
); );
bd.getBusinessDatabase().doInsert(record); bd.getBusinessDatabase().doInsert(approvalRecord);
// 申请人撤回 // 申请人撤回
myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId()); myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId());
@ -850,6 +911,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.eq("id", form.getFlowId()) .eq("id", form.getFlowId())
.doQueryFirst(ApprovalFlow.class); .doQueryFirst(ApprovalFlow.class);
if (flow == null) {
throw new CommonException("流程不存在");
}
// 查找模板 // 查找模板
Template template = bd.getBusinessDatabase() Template template = bd.getBusinessDatabase()
.eq("id", flow.getTemplateId()) .eq("id", flow.getTemplateId())
@ -889,14 +954,15 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
if (toNode == null) { if (toNode == null) {
throw new CommonException("找不到目标节点"); throw new CommonException("找不到目标节点");
} }
flow.setCurrentNode(toNode.getNodeOrder());
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("id", flow.getId()) .eq("id", flow.getId())
.update("current_node", flow.getCurrentNode()) .update("current_node", toNode.getNodeOrder())
.update("pre_node", flow.getCurrentNode())
.doUpdate(ApprovalFlow.class); .doUpdate(ApprovalFlow.class);
// 生成新的待办 // 生成新的待办
myself.addNodeTodo(flow, toNode, template, form.getCreateUserId()); myself.addNodeTodo(flow, toNode, template, form.getCreateUserId(), 0);
// 生成处理记录 // 生成处理记录
ApprovalRecord lastedRecord = bd.getBusinessDatabase() ApprovalRecord lastedRecord = bd.getBusinessDatabase()
@ -906,7 +972,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
ApprovalRecord record = new ApprovalRecord( ApprovalRecord record = new ApprovalRecord(
flow.getId(), flow.getId(),
currentNode.getNodeName(), currentNode.getNodeName(),
form.getCreateUserId(), form.getProcessUserId(),
"退回", "退回",
"RETURN", "RETURN",
Timestamp.valueOf(LocalDateTime.now()), Timestamp.valueOf(LocalDateTime.now()),
@ -916,7 +982,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
ApprovalRecord approvalRecord = new ApprovalRecord( ApprovalRecord approvalRecord = new ApprovalRecord(
flow.getId(), flow.getId(),
"退回至" + toNode.getNodeName(), "退回至" + toNode.getNodeName(),
xdapDeptUsersService.selectUserByID(form.getCreateUserId()).getUsername(), xdapDeptUsersService.selectUserByID(form.getProcessUserId()).getUsername(),
"退回", "退回",
"MSG", "MSG",
Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)), Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)),

View File

@ -65,18 +65,6 @@ mpaas.datasource[0].username=root
mpaas.datasource[0].password=qwer12 mpaas.datasource[0].password=qwer12
mpaas.datasource[0].minPoolSize=50 mpaas.datasource[0].minPoolSize=50
mpaas.datasource[0].maxPoolSize=1000 mpaas.datasource[0].maxPoolSize=1000
mpaas.datasource[1].name=yc_lrs_test_relsult
mpaas.datasource[1].url=jdbc:mysql://127.0.0.1:3306/yc_lrs_test_relsult?serverTimezone=GMT%2B8&characterEncoding=utf-8
mpaas.datasource[1].username=root
mpaas.datasource[1].password=qwer12
mpaas.datasource[1].type=mysql
mpaas.datasource[1].name=test_demo
mpaas.datasource[2].url=jdbc:mysql://127.0.0.1:3306/template_db2?serverTimezone=GMT%2B8&characterEncoding=utf-8
mpaas.datasource[2].username=root
mpaas.datasource[2].password=qwer12
mpaas.datasource[2].type=mysql
mpaas.datasource[2].name=template_db2
mpaas.security=false mpaas.security=false
mpaas.query.dbadatper=mysql mpaas.query.dbadatper=mysql