修改:对标流程整体修改,所有退回都可以直送,完善退回、撤回和处理审批的细节;完善流程整体功能;增加报告删除
This commit is contained in:
parent
2ea9e70932
commit
8e3e1d59f7
@ -24,6 +24,6 @@ public class BusinessDatabase {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public MpaasQuery getTCDatabase() {
|
public MpaasQuery getTCDatabase() {
|
||||||
return queryFactory.buildFromDatasource(DatasourceConstant.XDAP_MYSQL_PREFIX + tenantId);
|
return queryFactory.buildFromDatasource("yc_lrs_test_relsult");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import javax.annotation.Resource;
|
|||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/custom/benchmark")
|
@RequestMapping("/custom/benchmark")
|
||||||
@ -48,7 +49,7 @@ public class BenchmarkingReportController {
|
|||||||
return Response.ok().setMessage("保存成功");
|
return Response.ok().setMessage("保存成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发起审批
|
// 发起人发起审批
|
||||||
@PostMapping("/startReportApproval")
|
@PostMapping("/startReportApproval")
|
||||||
public Response startReportApproval(
|
public Response startReportApproval(
|
||||||
@Valid @RequestBody ApprovalPersonForm form,
|
@Valid @RequestBody ApprovalPersonForm form,
|
||||||
@ -63,6 +64,70 @@ public class BenchmarkingReportController {
|
|||||||
return Response.ok().setMessage("保存成功");
|
return Response.ok().setMessage("保存成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 直送回退回的节点
|
||||||
|
@GetMapping("/directSendingApproval")
|
||||||
|
public Response directSendingApproval(
|
||||||
|
@RequestParam @NotBlank String reportId,
|
||||||
|
@RequestParam @NotBlank String userId
|
||||||
|
) {
|
||||||
|
benchmarkingReportService.directSendingApproval(reportId, userId);
|
||||||
|
return Response.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理人处理审批通过还是拒绝
|
||||||
|
@PostMapping("/handleReportApproval")
|
||||||
|
public Response handleReportApproval(
|
||||||
|
@RequestBody @Valid HandleApprovalRequest request,
|
||||||
|
BindingResult bindingResult
|
||||||
|
) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
bindingResult.getFieldErrors().forEach(error -> {
|
||||||
|
throw new CommonException(error.getDefaultMessage());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
benchmarkingReportService.handleReportApproval(request);
|
||||||
|
return Response.ok().setMessage("处理成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理人退回指定节点
|
||||||
|
@PostMapping("/handleReturnToNode")
|
||||||
|
public Response handleReturnToNode(
|
||||||
|
@RequestBody @Valid HandleReturnNodeForm form,
|
||||||
|
BindingResult bindingResult
|
||||||
|
) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
bindingResult.getFieldErrors().forEach(error -> {
|
||||||
|
throw new CommonException(error.getDefaultMessage());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
benchmarkingReportService.handleReturnToNode(form);
|
||||||
|
return Response.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发起人撤回审批
|
||||||
|
@PostMapping("/handleReturn")
|
||||||
|
public Response handleReturn(
|
||||||
|
@RequestBody @Valid HandleApprovalRequest request,
|
||||||
|
BindingResult bindingResult
|
||||||
|
) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
bindingResult.getFieldErrors().forEach(error -> {
|
||||||
|
throw new CommonException(error.getDefaultMessage());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
benchmarkingReportService.handleReturn(request);
|
||||||
|
return Response.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除对标报告
|
||||||
|
@GetMapping("/deleteReport")
|
||||||
|
public Response deleteReport(
|
||||||
|
@NotBlank @RequestParam String reportId
|
||||||
|
) {
|
||||||
|
benchmarkingReportService.deleteReport(reportId);
|
||||||
|
return Response.ok().setMessage("删除成功");
|
||||||
|
}
|
||||||
|
|
||||||
// 修改对标报告
|
// 修改对标报告
|
||||||
@PostMapping("/updateReport")
|
@PostMapping("/updateReport")
|
||||||
public Response restartReportApproval(
|
public Response restartReportApproval(
|
||||||
@ -108,21 +173,6 @@ public class BenchmarkingReportController {
|
|||||||
return Response.ok().data(benchmarkingReportService.getApprovalList(form));
|
return Response.ok().data(benchmarkingReportService.getApprovalList(form));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理审批
|
|
||||||
@PostMapping("/handleReportApproval")
|
|
||||||
public Response handleReportApproval(
|
|
||||||
@RequestBody @Valid HandleApprovalRequest request,
|
|
||||||
BindingResult bindingResult
|
|
||||||
) {
|
|
||||||
if (bindingResult.hasErrors()) {
|
|
||||||
bindingResult.getFieldErrors().forEach(error -> {
|
|
||||||
throw new CommonException(error.getDefaultMessage());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
benchmarkingReportService.handleReportApproval(request);
|
|
||||||
return Response.ok().setMessage("处理成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查看对标报告详情
|
// 查看对标报告详情
|
||||||
@GetMapping("/getReportDetail")
|
@GetMapping("/getReportDetail")
|
||||||
public Response getReportDetail(
|
public Response getReportDetail(
|
||||||
|
|||||||
@ -26,6 +26,15 @@ public class TemplateApprovalController {
|
|||||||
@Resource
|
@Resource
|
||||||
private RuntimeDatasourceService runtimeDatasourceService;
|
private RuntimeDatasourceService runtimeDatasourceService;
|
||||||
|
|
||||||
|
// 获取是否直送
|
||||||
|
@GetMapping("/getIsDirect")
|
||||||
|
public Response getIsDirect(
|
||||||
|
@RequestParam String flowId
|
||||||
|
) {
|
||||||
|
boolean flag = templateApprovalService.getIsDirect(flowId);
|
||||||
|
return Response.ok().data(flag);
|
||||||
|
}
|
||||||
|
|
||||||
// 获取流程审批人
|
// 获取流程审批人
|
||||||
@GetMapping("/getApprovalUsers")
|
@GetMapping("/getApprovalUsers")
|
||||||
public Response getApprovalUsers(
|
public Response getApprovalUsers(
|
||||||
@ -61,20 +70,6 @@ public class TemplateApprovalController {
|
|||||||
return Response.ok().data(templateApprovalService.startApproval(request));
|
return Response.ok().data(templateApprovalService.startApproval(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/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")
|
@GetMapping("/directSendingApproval")
|
||||||
public Response directSendingApproval(
|
public Response directSendingApproval(
|
||||||
|
|||||||
@ -26,9 +26,6 @@ public class ApprovalRecord extends MpaasBasePojo {
|
|||||||
private Timestamp approvalTime;
|
private Timestamp approvalTime;
|
||||||
private Integer approvalLevel;
|
private Integer approvalLevel;
|
||||||
|
|
||||||
public ApprovalRecord() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public ApprovalRecord(String flowId, String node, String userId, String opinion, String result, Timestamp approvalTime, Integer approvalLevel) {
|
public ApprovalRecord(String flowId, String node, String userId, String opinion, String result, Timestamp approvalTime, Integer approvalLevel) {
|
||||||
this.flowId = flowId;
|
this.flowId = flowId;
|
||||||
this.node = node;
|
this.node = node;
|
||||||
|
|||||||
@ -35,6 +35,8 @@ public class BenchmarkingReport extends MpaasBasePojo {
|
|||||||
private String projectName;
|
private String projectName;
|
||||||
private String projectNumber;
|
private String projectNumber;
|
||||||
|
|
||||||
|
private Integer returnNum;
|
||||||
|
|
||||||
private String createBy;
|
private String createBy;
|
||||||
private Integer isDelete;
|
private Integer isDelete;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import java.util.List;
|
|||||||
// CASE af.flow_status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'REJECTED' THEN 4 ELSE 5 END ASC,
|
// CASE af.flow_status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'REJECTED' THEN 4 ELSE 5 END ASC,
|
||||||
@SQLQuery(value = {
|
@SQLQuery(value = {
|
||||||
@SQL(view = "getAllReportApprovalList",
|
@SQL(view = "getAllReportApprovalList",
|
||||||
sql = "SELECT af.id AS flowId, r.id AS reportId, af.process_title AS title, af.flow_status AS status, af.create_by AS createBy , xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_benchmarking_report r ON af.template_id = r.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 2 AND r.title LIKE CONCAT('%', #title, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') ORDER BY af.created_time DESC")
|
sql = "WITH RankedFlows AS ( SELECT af.id AS flowId, r.id AS reportId, af.process_title AS title, af.flow_status AS status, af.create_by AS createBy , xu.username AS username, af.created_time AS createdTime, ac.assignees AS current_users, ROW_NUMBER() OVER (PARTITION BY af.template_id ORDER BY af.created_time DESC) AS rn FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_benchmarking_report r ON af.template_id = r.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 2 ) SELECT flowId, reportId, title, status, createBy , username, createdTime, current_users FROM RankedFlows WHERE rn = 1 AND r.title LIKE CONCAT('%', #title, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') ORDER BY createdTime DESC")
|
||||||
})
|
})
|
||||||
@Data
|
@Data
|
||||||
public class TodoAndReportListView {
|
public class TodoAndReportListView {
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import com.definesys.mpaas.query.annotation.SQL;
|
|||||||
import com.definesys.mpaas.query.annotation.SQLQuery;
|
import com.definesys.mpaas.query.annotation.SQLQuery;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.xdap.self_development.pojo.ApprovalXdapUsers;
|
import com.xdap.self_development.pojo.ApprovalXdapUsers;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
@ -12,7 +13,7 @@ import java.util.List;
|
|||||||
@SQLQuery(value = {
|
@SQLQuery(value = {
|
||||||
// CASE af.flow_status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'REJECTED' THEN 4 ELSE 5 END ASC
|
// 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 = "getAllApproval",
|
@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, ac.assignees AS current_users FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_template t ON af.template_id = t.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE t.template_name LIKE CONCAT('%', #templateName, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') AND af.flow_type = 1 ORDER BY af.created_time desc"),
|
sql = "WITH RankedFlows AS ( 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, ac.assignees AS current_users , ROW_NUMBER() OVER (PARTITION BY af.template_id ORDER BY af.created_time DESC) AS rn FROM yfsjglpt_model_approval_flow af LEFT JOIN approval_config ac ON af.id = ac.approval_id AND af.current_node = ac.node_order LEFT JOIN yfsjglpt_model_template t ON af.template_id = t.id LEFT JOIN xdap_users xu ON xu.id = af.create_by WHERE af.flow_type = 1 ) SELECT flowId, templateId, templateName, version, status , createBy, username, createdTime, current_users FROM RankedFlows WHERE t.template_name LIKE CONCAT('%', #templateName, '%') AND af.flow_status LIKE CONCAT('%', #status, '%') AND af.created_time LIKE CONCAT('%', #createdTime, '%') AND xu.username LIKE CONCAT('%', #username, '%') AND rn = 1 ORDER BY createdTime DESC"),
|
||||||
@SQL(view = "getApprovalByUserIdAndIds",
|
@SQL(view = "getApprovalByUserIdAndIds",
|
||||||
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\", 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 af.flow_status like CONCAT('%',#status, '%') and af.flow_type = 1 and af.id NOT IN (#ids) AND af.create_by = #createBy"),
|
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\", 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 af.flow_status like CONCAT('%',#status, '%') and af.flow_type = 1 and af.id NOT IN (#ids) AND af.create_by = #createBy"),
|
||||||
@SQL(view = "getTodoAndTemplate",
|
@SQL(view = "getTodoAndTemplate",
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import com.definesys.mpaas.query.db.PageQueryResult;
|
|||||||
import com.xdap.self_development.controller.form.*;
|
import com.xdap.self_development.controller.form.*;
|
||||||
import com.xdap.self_development.pojo.ApprovalConfigPojo;
|
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.BenchmarkingReport;
|
import com.xdap.self_development.pojo.BenchmarkingReport;
|
||||||
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
|
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
|
||||||
import com.xdap.self_development.pojo.view.TodoAndReportListView;
|
import com.xdap.self_development.pojo.view.TodoAndReportListView;
|
||||||
@ -12,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface BenchmarkingReportService {
|
public interface BenchmarkingReportService {
|
||||||
PageQueryResult<TodoAndReportView> getBenchmarkingReportByCondition(
|
PageQueryResult<TodoAndReportView> getBenchmarkingReportByCondition(
|
||||||
@ -21,6 +23,14 @@ public interface BenchmarkingReportService {
|
|||||||
|
|
||||||
void startReportApproval(ApprovalPersonForm form);
|
void startReportApproval(ApprovalPersonForm form);
|
||||||
|
|
||||||
|
void directSendingApproval(@NotBlank String reportId, @NotBlank String userId);
|
||||||
|
|
||||||
|
void handleReturnToNode(@Valid HandleReturnNodeForm form);
|
||||||
|
|
||||||
|
void handleReturn(@Valid HandleApprovalRequest request);
|
||||||
|
|
||||||
|
void deleteReport(@NotBlank String reportId);
|
||||||
|
|
||||||
void updateReport(@Valid UpdateBenchmarkingReportForm form);
|
void updateReport(@Valid UpdateBenchmarkingReportForm form);
|
||||||
|
|
||||||
void handleReportApproval(@Valid HandleApprovalRequest request);
|
void handleReportApproval(@Valid HandleApprovalRequest request);
|
||||||
@ -35,11 +45,12 @@ public interface BenchmarkingReportService {
|
|||||||
|
|
||||||
void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId);
|
void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId);
|
||||||
|
|
||||||
void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode);
|
void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord);
|
||||||
|
|
||||||
void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy);
|
void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy, Integer enableReturn);
|
||||||
|
|
||||||
void cancelProcess(ApprovalFlow flow, String status);
|
void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId);
|
||||||
|
|
||||||
void updateTasks(ApprovalFlow flow, String status);
|
void updateTasks(ApprovalFlow flow, String status);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -50,5 +50,5 @@ public interface TemplateApprovalService {
|
|||||||
|
|
||||||
List<ApprovalUserNodeDTO> getApprovalUsers(@NotBlank String templateId);
|
List<ApprovalUserNodeDTO> getApprovalUsers(@NotBlank String templateId);
|
||||||
|
|
||||||
void restartApproval(@Valid StartApprovalRequest request);
|
boolean getIsDirect(String flowId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,10 +32,11 @@ import java.sql.Timestamp;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class BenchmarkingReportServiceImpl implements BenchmarkingReportService {
|
public class BenchmarkingReportServiceImpl implements BenchmarkingReportService {
|
||||||
@Resource
|
@Resource
|
||||||
private BusinessDatabase bd;
|
private BusinessDatabase bd;
|
||||||
@Resource
|
@Resource
|
||||||
@ -60,9 +61,13 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void startReportApproval(ApprovalPersonForm form) {
|
public void startReportApproval(ApprovalPersonForm form) {
|
||||||
|
// 验证能否发起审批
|
||||||
BenchmarkingReport report = bd.getBusinessDatabase()
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
.eq("id", form.getReportId())
|
.eq("id", form.getReportId())
|
||||||
.doQueryFirst(BenchmarkingReport.class);
|
.doQueryFirst(BenchmarkingReport.class);
|
||||||
|
if (report == null) {
|
||||||
|
throw new CommonException("该报告不存在");
|
||||||
|
}
|
||||||
|
|
||||||
ApprovalFlow approvalFlow = bd.getBusinessDatabase()
|
ApprovalFlow approvalFlow = bd.getBusinessDatabase()
|
||||||
.eq("template_id", report.getId())
|
.eq("template_id", report.getId())
|
||||||
@ -71,7 +76,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
throw new CommonException("该报告正在审批中,请勿重复发起审批");
|
throw new CommonException("该报告正在审批中,请勿重复发起审批");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建审批流程
|
// 新增流程
|
||||||
ApprovalFlow flow = new ApprovalFlow();
|
ApprovalFlow flow = new ApprovalFlow();
|
||||||
flow.setTemplateId(report.getId());
|
flow.setTemplateId(report.getId());
|
||||||
flow.setCurrentNode(1);
|
flow.setCurrentNode(1);
|
||||||
@ -81,7 +86,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now()));
|
flow.setCreatedTime(Timestamp.valueOf(LocalDateTime.now()));
|
||||||
flow.setFlowType(2); // 设置为报告审批流程
|
flow.setFlowType(2); // 设置为报告审批流程
|
||||||
flow.setExplanation(form.getExplanation());
|
flow.setExplanation(form.getExplanation());
|
||||||
flow.setProcessTitle(form.getProcessTitle());
|
flow.setReturnNum(0);
|
||||||
|
flow.setPreNode(-1);
|
||||||
bd.getBusinessDatabase().doInsert(flow);
|
bd.getBusinessDatabase().doInsert(flow);
|
||||||
|
|
||||||
// 创建审批配置
|
// 创建审批配置
|
||||||
@ -102,7 +108,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
}
|
}
|
||||||
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();
|
||||||
@ -136,8 +142,22 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
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(
|
||||||
|
new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"发起审批",
|
||||||
|
xdapDeptUsersService.selectUserByID(form.getUserId()).getUsername(),
|
||||||
|
"发起审批",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
1
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// 更新报告状态为校对中
|
// 更新报告状态为校对中
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
.eq("id", report.getId())
|
.eq("id", report.getId())
|
||||||
@ -145,6 +165,262 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
.doUpdate(BenchmarkingReport.class);
|
.doUpdate(BenchmarkingReport.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void directSendingApproval(String reportId, String userId) {
|
||||||
|
// 获取模板
|
||||||
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
|
.eq("id", reportId)
|
||||||
|
.doQueryFirst(BenchmarkingReport.class);
|
||||||
|
if (report == null) {
|
||||||
|
throw new CommonException("报告不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取到模板最近一次未完成的流程
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("template_id", reportId)
|
||||||
|
.ne("pre_node", -1)
|
||||||
|
.eq("flow_status", "APPROVING")
|
||||||
|
.orderBy("created_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
if (flow == null) {
|
||||||
|
throw new CommonException("流程没有直送节点");
|
||||||
|
}
|
||||||
|
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flow.getId())
|
||||||
|
.eq("node_order", flow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
// 删除当前节点待办
|
||||||
|
if (currentNode != null) {
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据状态不同获取节点和节点层级
|
||||||
|
ApprovalConfigPojo preNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flow.getId())
|
||||||
|
.eq("node_order", flow.getPreNode())
|
||||||
|
.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;
|
||||||
|
|
||||||
|
// 重新创建待办继续流程
|
||||||
|
myself.addNodeTodo(
|
||||||
|
flow,
|
||||||
|
preNode,
|
||||||
|
report,
|
||||||
|
userId,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", flow.getId())
|
||||||
|
.update("flow_status", "APPROVING")
|
||||||
|
.update("current_node", flow.getPreNode())
|
||||||
|
.update("pre_node", -1)
|
||||||
|
.doUpdate(ApprovalFlow.class);
|
||||||
|
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", report.getId())
|
||||||
|
.update("status", "APPROVING")
|
||||||
|
.doUpdate(BenchmarkingReport.class);
|
||||||
|
|
||||||
|
// 清除拒绝提醒待办
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("data_type", "模板拒绝")
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
|
||||||
|
// 创建直送记录
|
||||||
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"直送至" + preNode.getNodeName(),
|
||||||
|
xdapDeptUsersService.selectUserByID(userId).getUsername(),
|
||||||
|
"直送",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
level
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void handleReturnToNode(HandleReturnNodeForm form) {
|
||||||
|
// 查找流程
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("id", form.getFlowId())
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
|
||||||
|
if (flow == null) {
|
||||||
|
throw new CommonException("流程不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找模板
|
||||||
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
|
.eq("id", flow.getTemplateId())
|
||||||
|
.doQueryFirst(BenchmarkingReport.class);
|
||||||
|
|
||||||
|
// 查找当前节点
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flow.getId())
|
||||||
|
.eq("node_order", flow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
if (!currentNode.getAssignees().contains(form.getProcessUserId())) {
|
||||||
|
throw new CommonException("无权限操作");
|
||||||
|
}
|
||||||
|
|
||||||
|
String lockKey = FLOW_LOCK_PREFIX + flow.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 {
|
||||||
|
// 删除当前节点待办
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
|
||||||
|
// 更新流程节点
|
||||||
|
ApprovalConfigPojo toNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", form.getFlowId())
|
||||||
|
.eq("node_name", form.getNodeName())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
if (toNode == null) {
|
||||||
|
throw new CommonException("找不到目标节点");
|
||||||
|
}
|
||||||
|
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", flow.getId())
|
||||||
|
.update("current_node", toNode.getNodeOrder())
|
||||||
|
.update("pre_node", flow.getCurrentNode())
|
||||||
|
.doUpdate(ApprovalFlow.class);
|
||||||
|
|
||||||
|
// 生成新的待办
|
||||||
|
myself.addNodeTodo(flow, toNode, report, form.getCreateUserId(), 1);
|
||||||
|
|
||||||
|
// 生成处理记录
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
currentNode.getNodeName(),
|
||||||
|
form.getProcessUserId(),
|
||||||
|
"退回",
|
||||||
|
"RETURN",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord.getApprovalLevel()
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
ApprovalRecord approvalRecord = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"退回至" + toNode.getNodeName(),
|
||||||
|
xdapDeptUsersService.selectUserByID(form.getProcessUserId()).getUsername(),
|
||||||
|
"退回",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)),
|
||||||
|
lastedRecord.getApprovalLevel() + 1
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(approvalRecord);
|
||||||
|
} finally {
|
||||||
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void handleReturn(HandleApprovalRequest request) {
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("id", request.getFlowId())
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
if (!Objects.equals(flow.getCreateBy(), request.getUserId())) {
|
||||||
|
throw new CommonException("不是申请人无法撤回");
|
||||||
|
}
|
||||||
|
if (!Objects.equals(flow.getFlowStatus(), "APPROVING")) {
|
||||||
|
throw new CommonException("不在流程无法撤回");
|
||||||
|
}
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", request.getFlowId())
|
||||||
|
.eq("node_order", flow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
String lockKey = FLOW_LOCK_PREFIX + flow.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 {
|
||||||
|
if ("RETURN".equals(request.getResult())) {
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
|
||||||
|
ApprovalRecord approvalRecord = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"已撤回",
|
||||||
|
xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(),
|
||||||
|
"撤回",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)),
|
||||||
|
lastedRecord.getApprovalLevel() + 1
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(approvalRecord);
|
||||||
|
|
||||||
|
// 申请人撤回
|
||||||
|
myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId());
|
||||||
|
} else {
|
||||||
|
throw new CommonException("无法撤回");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void deleteReport(String reportId) {
|
||||||
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
|
.eq("id", reportId)
|
||||||
|
.doQueryFirst(BenchmarkingReport.class);
|
||||||
|
if (report == null) {
|
||||||
|
throw new CommonException("该报告不存在");
|
||||||
|
}
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("template_id", reportId)
|
||||||
|
.ne("pre_node", -1)
|
||||||
|
.eq("flow_status", "APPROVING")
|
||||||
|
.orderBy("created_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
if (flow != null) {
|
||||||
|
throw new CommonException("该报告正在审批中");
|
||||||
|
}
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", reportId)
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.doUpdate(BenchmarkingReport.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String uploadFile(MultipartFile file, String userId) {
|
public String uploadFile(MultipartFile file, String userId) {
|
||||||
String currentTenantId = runtimeAppContextService.getCurrentTenantId();
|
String currentTenantId = runtimeAppContextService.getCurrentTenantId();
|
||||||
@ -237,6 +513,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
report.setStatus("DRAFT");
|
report.setStatus("DRAFT");
|
||||||
report.setCreateBy(form.getUserId());
|
report.setCreateBy(form.getUserId());
|
||||||
report.setIsDelete(0);
|
report.setIsDelete(0);
|
||||||
|
report.setReturnNum(0);
|
||||||
report.setFileName(form.getFileName());
|
report.setFileName(form.getFileName());
|
||||||
bd.getBusinessDatabase().doInsert(report);
|
bd.getBusinessDatabase().doInsert(report);
|
||||||
}
|
}
|
||||||
@ -273,7 +550,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void handleReportApproval(HandleApprovalRequest request) {
|
public void handleReportApproval(HandleApprovalRequest request) {
|
||||||
// 验证流程状态
|
// 验证流程状态和用户权限
|
||||||
ApprovalFlow flow = bd.getBusinessDatabase()
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
.eq("id", request.getFlowId())
|
.eq("id", request.getFlowId())
|
||||||
.eq("flow_type", 2)
|
.eq("flow_type", 2)
|
||||||
@ -281,18 +558,20 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
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("无权限处理或已被处理");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取最新处理记录
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
|
||||||
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode;
|
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode;
|
||||||
String lockValue = UUID.randomUUID().toString();
|
String lockValue = UUID.randomUUID().toString();
|
||||||
boolean lockAcquired = redisLockUtil
|
boolean lockAcquired = redisLockUtil
|
||||||
@ -305,11 +584,12 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
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())
|
||||||
|
.eq("approval_level", lastedRecord.getApprovalLevel())
|
||||||
.doQuery(ApprovalRecord.class).size();
|
.doQuery(ApprovalRecord.class).size();
|
||||||
if (processedCount > 0) {
|
if (processedCount > 0) {
|
||||||
throw new CommonException("此节点已被他人处理");
|
throw new CommonException("此节点已被他人处理");
|
||||||
}
|
}
|
||||||
myself.processApprovalLogic(flow, request, currentNode);
|
myself.processApprovalLogic(flow, request, currentNode, lastedRecord);
|
||||||
} finally {
|
} finally {
|
||||||
redisLockUtil.unlock(lockKey, lockValue);
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
}
|
}
|
||||||
@ -321,15 +601,22 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
.toJavaList(String.class).contains(userId);
|
.toJavaList(String.class).contains(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode) {
|
public void processApprovalLogic(
|
||||||
|
ApprovalFlow flow,
|
||||||
|
HandleApprovalRequest request,
|
||||||
|
ApprovalConfigPojo currentNode,
|
||||||
|
ApprovalRecord lastedRecord
|
||||||
|
) {
|
||||||
// 记录审批结果
|
// 记录审批结果
|
||||||
ApprovalRecord record = new ApprovalRecord();
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
record.setFlowId(flow.getId());
|
flow.getId(),
|
||||||
record.setNode(currentNode.getNodeName());
|
currentNode.getNodeName(),
|
||||||
record.setUserId(request.getUserId());
|
request.getUserId(),
|
||||||
record.setOpinion(request.getOpinion());
|
request.getOpinion(),
|
||||||
record.setResult(request.getResult());
|
request.getResult(),
|
||||||
record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now()));
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord == null ? 1 : lastedRecord.getApprovalLevel()
|
||||||
|
);
|
||||||
bd.getBusinessDatabase().doInsert(record);
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
@ -356,7 +643,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
|
|
||||||
// 处理驳回逻辑
|
// 处理驳回逻辑
|
||||||
if ("REJECT".equals(request.getResult())) {
|
if ("REJECT".equals(request.getResult())) {
|
||||||
myself.cancelProcess(flow, "REJECTED");
|
myself.cancelProcess(flow, currentNode, "REJECTED", request.getUserId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 处理通过逻辑,流转到下一节点
|
// 处理通过逻辑,流转到下一节点
|
||||||
@ -386,7 +673,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
myself.updateTasks(flow, "已完成");
|
myself.updateTasks(flow, "已完成");
|
||||||
} else {
|
} else {
|
||||||
flow.setCurrentNode(nextNode.getNodeOrder());
|
flow.setCurrentNode(nextNode.getNodeOrder());
|
||||||
myself.addNodeTodo(flow, nextNode, report, userId);
|
myself.addNodeTodo(flow, nextNode, report, userId, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
@ -396,7 +683,13 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
.doUpdate(ApprovalFlow.class);
|
.doUpdate(ApprovalFlow.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, BenchmarkingReport report, String createBy) {
|
public void addNodeTodo(
|
||||||
|
ApprovalFlow flow,
|
||||||
|
ApprovalConfigPojo node,
|
||||||
|
BenchmarkingReport report,
|
||||||
|
String createBy,
|
||||||
|
Integer enableReturn
|
||||||
|
) {
|
||||||
List<String> users = JSON.parseArray(node.getAssignees()).toJavaList(String.class);
|
List<String> users = JSON.parseArray(node.getAssignees()).toJavaList(String.class);
|
||||||
// 新增待办
|
// 新增待办
|
||||||
List<TodoTaskPojo> list = new ArrayList<>();
|
List<TodoTaskPojo> list = new ArrayList<>();
|
||||||
@ -427,11 +720,25 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelProcess(ApprovalFlow flow, String status) {
|
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("pre_node", node.getNodeOrder())
|
||||||
.doUpdate(ApprovalFlow.class);
|
.doUpdate(ApprovalFlow.class);
|
||||||
// 更新报告状态
|
// 更新报告状态
|
||||||
BenchmarkingReport report = bd.getBusinessDatabase()
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
@ -441,6 +748,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
.rowid("id", report.getRowId())
|
.rowid("id", report.getRowId())
|
||||||
.update("status", report.getStatus())
|
.update("status", report.getStatus())
|
||||||
|
.update("return_num", report.getReturnNum() + 1)
|
||||||
.doUpdate(BenchmarkingReport.class);
|
.doUpdate(BenchmarkingReport.class);
|
||||||
|
|
||||||
myself.updateTasks(flow, "已拒绝");
|
myself.updateTasks(flow, "已拒绝");
|
||||||
@ -477,50 +785,126 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
if (approvalFlow == null) {
|
if (approvalFlow == null) {
|
||||||
return flowNodeView;
|
return flowNodeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<FlowNode> flowNodes = new ArrayList<>();
|
||||||
|
|
||||||
|
List<ApprovalRecord> allRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", approvalFlow.getId())
|
||||||
|
.orderBy("approval_time", "asc")
|
||||||
|
.doQuery(ApprovalRecord.class);
|
||||||
|
|
||||||
BenchmarkingReport report = bd.getBusinessDatabase()
|
BenchmarkingReport report = bd.getBusinessDatabase()
|
||||||
.eq("id", approvalFlow.getTemplateId())
|
.eq("id", approvalFlow.getTemplateId())
|
||||||
.doQueryFirst(BenchmarkingReport.class);
|
.doQueryFirst(BenchmarkingReport.class);
|
||||||
|
|
||||||
// 获取流程信息
|
// 获取流程信息
|
||||||
flowNodeView.setProgressTitle(approvalFlow.getProcessTitle());
|
flowNodeView.setProgressTitle(approvalFlow.getProcessTitle());
|
||||||
flowNodeView.setContentName(report.getTitle());
|
flowNodeView.setContentName(report.getTitle());
|
||||||
flowNodeView.setTemplateVersion(1);
|
flowNodeView.setTemplateVersion(1);
|
||||||
flowNodeView.setExplanation(approvalFlow.getExplanation());
|
flowNodeView.setExplanation(approvalFlow.getExplanation());
|
||||||
flowNodeView.setFlowStatus(approvalFlow.getFlowStatus());
|
flowNodeView.setFlowStatus(approvalFlow.getFlowStatus());
|
||||||
|
|
||||||
// 获取节点信息
|
// 获取节点信息
|
||||||
List<ApprovalConfigPojo> nodes = bd.getBusinessDatabase()
|
List<ApprovalConfigPojo> nodes = bd.getBusinessDatabase()
|
||||||
.eq("approval_id", flowId)
|
.eq("approval_id", flowId)
|
||||||
.doQuery(ApprovalConfigPojo.class);
|
.doQuery(ApprovalConfigPojo.class);
|
||||||
List<FlowNode> flowNodes = new ArrayList<>();
|
|
||||||
nodes.forEach(node -> {
|
Map<String, ApprovalConfigPojo> nodesMap = nodes.stream()
|
||||||
FlowNode nodeView = new FlowNode();
|
.filter(config -> config.getNodeName() != null)
|
||||||
ApprovalRecord record = bd.getBusinessDatabase()
|
.collect(Collectors.toMap(
|
||||||
.eq("flow_id", flowId)
|
ApprovalConfigPojo::getNodeName,
|
||||||
.eq("node", node.getNodeName())
|
config -> config,
|
||||||
.doQueryFirst(ApprovalRecord.class);
|
(existing, replacement) -> existing // 如果有重复键,保留第一个
|
||||||
if (record != null) {
|
));
|
||||||
// 节点已完成
|
|
||||||
nodeView.setNodeOrder(node.getNodeOrder());
|
// 获取所有层级
|
||||||
nodeView.setNode(node.getNodeName());
|
Map<Integer, List<ApprovalRecord>> levelMap = allRecord.stream()
|
||||||
nodeView.setResult(record.getResult());
|
.collect(Collectors.groupingBy(
|
||||||
nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion()));
|
ApprovalRecord::getApprovalLevel,
|
||||||
nodeView.setApprovalTime(record.getApprovalTime());
|
Collectors.collectingAndThen(
|
||||||
nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId())));
|
Collectors.toList(),
|
||||||
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
list -> list.stream()
|
||||||
} else {
|
.sorted(Comparator.comparing(ApprovalRecord::getApprovalTime))
|
||||||
// 节点未完成
|
.collect(Collectors.toList())
|
||||||
nodeView.setNodeOrder(node.getNodeOrder());
|
)
|
||||||
nodeView.setNode(node.getNodeName());
|
));
|
||||||
nodeView.setResult("待审批");
|
|
||||||
nodeView.setTodoUserName("");
|
// 获取最大层级
|
||||||
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
int maxLevel = levelMap.keySet().stream().max(Integer::compare).orElse(1);
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, List<ApprovalRecord>> entry : levelMap.entrySet()) {
|
||||||
|
// 获取到每一层
|
||||||
|
int level = entry.getKey();
|
||||||
|
Set<Integer> nodeList = new HashSet<>();
|
||||||
|
List<ApprovalRecord> records = entry.getValue();
|
||||||
|
List<ApprovalRecord> uniqueRecords = new ArrayList<>(records.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
ApprovalRecord::getNode,
|
||||||
|
Function.identity(),
|
||||||
|
(first, second) -> first
|
||||||
|
))
|
||||||
|
.values());
|
||||||
|
uniqueRecords.forEach(record -> {
|
||||||
|
ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode());
|
||||||
|
if (approvalConfigPojo != null) {
|
||||||
|
flowNodes.add(getFlowNodeView(approvalConfigPojo, flowId, level));
|
||||||
|
nodeList.add(approvalConfigPojo.getNodeOrder());
|
||||||
|
} else {
|
||||||
|
FlowNode flowNode = new FlowNode();
|
||||||
|
flowNode.setNode(record.getNode());
|
||||||
|
flowNode.setTodoUserName(record.getUserId());
|
||||||
|
flowNode.setResult(record.getResult());
|
||||||
|
flowNode.setApprovalTime(record.getApprovalTime());
|
||||||
|
flowNodes.add(flowNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING") ) {
|
||||||
|
// 最后一层,添加待处理信息
|
||||||
|
nodes.forEach(node -> {
|
||||||
|
if (!nodeList.contains(node.getNodeOrder()) && node.getNodeOrder() >= approvalFlow.getCurrentNode()) {
|
||||||
|
flowNodes.add(getFlowNodeView(node, flowId, maxLevel));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
flowNodes.add(nodeView);
|
}
|
||||||
});
|
List<FlowNode> sortedNode = flowNodes.stream()
|
||||||
List<FlowNode> sortedNode = flowNodes.stream().sorted(Comparator.comparing(FlowNode::getNodeOrder)).collect(Collectors.toList());
|
.sorted(Comparator.comparing(FlowNode::getApprovalTime,
|
||||||
|
Comparator.nullsLast(Comparator.naturalOrder()))
|
||||||
|
.thenComparing(FlowNode::getNodeOrder))
|
||||||
|
.collect(Collectors.toList());
|
||||||
flowNodeView.setFlowNodes(sortedNode);
|
flowNodeView.setFlowNodes(sortedNode);
|
||||||
return flowNodeView;
|
return flowNodeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private FlowNode getFlowNodeView(
|
||||||
|
ApprovalConfigPojo node,
|
||||||
|
String flowId,
|
||||||
|
int level
|
||||||
|
) {
|
||||||
|
FlowNode nodeView = new FlowNode();
|
||||||
|
ApprovalRecord record = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flowId)
|
||||||
|
.eq("node", node.getNodeName())
|
||||||
|
.eq("approval_level", level)
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
nodeView.setNodeOrder(node.getNodeOrder());
|
||||||
|
nodeView.setNode(node.getNodeName());
|
||||||
|
if (record != null) {
|
||||||
|
// 节点已完成
|
||||||
|
nodeView.setResult(record.getResult());
|
||||||
|
nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion()));
|
||||||
|
nodeView.setApprovalTime(record.getApprovalTime());
|
||||||
|
nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId())));
|
||||||
|
} else {
|
||||||
|
// 节点未完成
|
||||||
|
nodeView.setResult("待审批");
|
||||||
|
nodeView.setTodoUserName("");
|
||||||
|
}
|
||||||
|
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
||||||
|
return nodeView;
|
||||||
|
}
|
||||||
|
|
||||||
private String getUserNames(List<String> userIds) {
|
private String getUserNames(List<String> userIds) {
|
||||||
StringJoiner joiner = new StringJoiner(" ");
|
StringJoiner joiner = new StringJoiner(" ");
|
||||||
for (String userId : userIds) {
|
for (String userId : userIds) {
|
||||||
@ -534,46 +918,4 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
}
|
}
|
||||||
return joiner.toString();
|
return joiner.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, ApprovalXdapUsers> batchQueryUsers(List<String> userIds) {
|
|
||||||
if (userIds == null || userIds.isEmpty()) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ApprovalXdapUsers> users = bd.getBusinessDatabase()
|
|
||||||
.in("id", userIds)
|
|
||||||
.doQuery(ApprovalXdapUsers.class);
|
|
||||||
|
|
||||||
return users.stream()
|
|
||||||
.collect(Collectors.toMap(ApprovalXdapUsers::getId, user -> user));
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<ApprovalNodeView> getNodeList(String flowId, String node) {
|
|
||||||
List<ApprovalNodeView> list = bd.getBusinessDatabase()
|
|
||||||
.viewQueryMode(true)
|
|
||||||
.view("getApprovalNodeInfo")
|
|
||||||
.setVar("flowId", flowId)
|
|
||||||
.setVar("node", node)
|
|
||||||
.doQuery(ApprovalNodeView.class);
|
|
||||||
if (list != null && !list.isEmpty()) {
|
|
||||||
list.forEach(approvalNodeView -> {
|
|
||||||
ApprovalXdapUsers user = bd.getBusinessDatabase()
|
|
||||||
.eq("id", approvalNodeView.getUserId())
|
|
||||||
.doQueryFirst(ApprovalXdapUsers.class);
|
|
||||||
approvalNodeView.setUserName(user.getUsername());
|
|
||||||
approvalNodeView.setUserId(null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void clearAllTodo(ApprovalFlow flow, String userId) {
|
|
||||||
// 清除已有待办
|
|
||||||
bd.getBusinessDatabase()
|
|
||||||
.eq("document_no", flow.getId())
|
|
||||||
.eq("is_delete", 0)
|
|
||||||
.update("is_delete", 2)
|
|
||||||
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
|
||||||
.doUpdate(TodoTaskPojo.class);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -194,10 +194,26 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
ApprovalFlow flow = bd.getBusinessDatabase()
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
.eq("template_id", templateId)
|
.eq("template_id", templateId)
|
||||||
.ne("pre_node", -1)
|
.ne("pre_node", -1)
|
||||||
|
.eq("flow_status", "APPROVING")
|
||||||
.orderBy("created_time", "desc")
|
.orderBy("created_time", "desc")
|
||||||
.doQueryFirst(ApprovalFlow.class);
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
if (flow == null) {
|
if (flow == null) {
|
||||||
throw new CommonException("模板没有未完成的流程");
|
throw new CommonException("流程没有直送节点");
|
||||||
|
}
|
||||||
|
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flow.getId())
|
||||||
|
.eq("node_order", flow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
// 删除当前节点待办
|
||||||
|
if (currentNode != null) {
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据状态不同获取节点和节点层级
|
// 根据状态不同获取节点和节点层级
|
||||||
@ -345,7 +361,10 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void processApprovalLogic(
|
public void processApprovalLogic(
|
||||||
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord
|
ApprovalFlow flow,
|
||||||
|
HandleApprovalRequest request,
|
||||||
|
ApprovalConfigPojo currentNode,
|
||||||
|
ApprovalRecord lastedRecord
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// 新增当前审批结果
|
// 新增当前审批结果
|
||||||
@ -405,7 +424,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
myself.processNextNode(flow, currentNode, request.getUserId());
|
myself.processNextNode(flow, currentNode, request.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) {
|
public void cancelProcess(
|
||||||
|
ApprovalFlow flow,
|
||||||
|
ApprovalConfigPojo node,
|
||||||
|
String status,
|
||||||
|
String userId
|
||||||
|
) {
|
||||||
// 删除所有待办
|
// 删除所有待办
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
.eq("document_no", flow.getId())
|
.eq("document_no", flow.getId())
|
||||||
@ -582,6 +606,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
ApprovalFlow flow = bd.getBusinessDatabase()
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
.eq("template_id", templateId)
|
.eq("template_id", templateId)
|
||||||
.ne("pre_node", -1)
|
.ne("pre_node", -1)
|
||||||
|
.eq("flow_status", "APPROVING")
|
||||||
.orderBy("created_time", "desc")
|
.orderBy("created_time", "desc")
|
||||||
.doQueryFirst(ApprovalFlow.class);
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
if (flow == null) {
|
if (flow == null) {
|
||||||
@ -603,13 +628,22 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
.in("id", userIds)
|
.in("id", userIds)
|
||||||
.doQuery(XdapUsers.class)
|
.doQuery(XdapUsers.class)
|
||||||
);
|
);
|
||||||
|
list.add(dto);
|
||||||
});
|
});
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restartApproval(StartApprovalRequest request) {
|
public boolean getIsDirect(String flowId) {
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("id", flowId)
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
|
||||||
|
if (flow == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flow.getPreNode() != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) {
|
public void updateTasks(ApprovalFlow flow, String status, Integer enableReturn) {
|
||||||
@ -862,26 +896,11 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if ("RETURN".equals(request.getResult())) {
|
if ("RETURN".equals(request.getResult())) {
|
||||||
// 删除待办
|
|
||||||
bd.getBusinessDatabase()
|
|
||||||
.eq("document_no", flow.getId())
|
|
||||||
.eq("current_node", currentNode.getNodeName())
|
|
||||||
.update("is_delete", 1)
|
|
||||||
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
|
||||||
.doUpdate(TodoTaskPojo.class);
|
|
||||||
|
|
||||||
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
.eq("flow_id", flow.getId())
|
.eq("flow_id", flow.getId())
|
||||||
.orderBy("approval_time", "desc")
|
.orderBy("approval_time", "desc")
|
||||||
.doQueryFirst(ApprovalRecord.class);
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
|
||||||
// 更新流程状态
|
|
||||||
bd.getBusinessDatabase()
|
|
||||||
.eq("id", flow.getId())
|
|
||||||
.update("flow_status", request.getResult())
|
|
||||||
.update("pre_node", flow.getCurrentNode())
|
|
||||||
.doUpdate(ApprovalFlow.class);
|
|
||||||
|
|
||||||
ApprovalRecord approvalRecord = new ApprovalRecord(
|
ApprovalRecord approvalRecord = new ApprovalRecord(
|
||||||
flow.getId(),
|
flow.getId(),
|
||||||
"已撤回",
|
"已撤回",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user