Skip to content

Commit 229f11a

Browse files
song-cc-rockfit2-zhao
authored andcommitted
feat: Add approval execute code
1 parent b4b8b1a commit 229f11a

4 files changed

Lines changed: 177 additions & 1 deletion

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cn.cordys.crm.system.domain;
2+
3+
import cn.cordys.common.domain.BaseModel;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import jakarta.persistence.Table;
6+
import lombok.Data;
7+
8+
@Data
9+
@Table(name = "approval_instance")
10+
public class ApprovalInstance extends BaseModel {
11+
12+
@Schema(description = "流程ID")
13+
private String flowId;
14+
15+
@Schema(description = "表单类型 quote(报价表单)、contract(合同表单)、invoice(发票表单)")
16+
private String type;
17+
18+
@Schema(description = "审批的数据ID")
19+
private String resourceId;
20+
21+
@Schema(description = "提交人ID")
22+
private String submitterId;
23+
24+
@Schema(description = "当前节点id")
25+
private String currentNodeId;
26+
27+
@Schema(description = "审批状态")
28+
private String approvalStatus;
29+
30+
@Schema(description = "提审时间")
31+
private Long submitTime;
32+
33+
@Schema(description = "审批完成时间")
34+
private Long approveTime;
35+
36+
@Schema(description = "审批结果")
37+
private String result;
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package cn.cordys.crm.system.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.List;
10+
11+
/**
12+
* 审批执行参数
13+
* @author song-cc-rock
14+
*/
15+
@Data
16+
@Builder
17+
@NoArgsConstructor
18+
@AllArgsConstructor
19+
public class ApprovalExecuteParam {
20+
21+
@Schema(description = "审批实例ID")
22+
private String instanceId;
23+
24+
@Schema(description = "审批任务ID")
25+
private String taskId;
26+
27+
@Schema(description = "审批意见")
28+
private String comment;
29+
30+
@Schema(description = "审批结果: 同意/驳回")
31+
private String result;
32+
33+
@Schema(description = "审批意见的附件集合")
34+
private List<String> attachmentIds;
35+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package cn.cordys.crm.system.service;
2+
3+
import cn.cordys.common.exception.GenericException;
4+
import cn.cordys.common.uid.IDGenerator;
5+
import cn.cordys.crm.system.domain.ApprovalInstance;
6+
import cn.cordys.crm.system.domain.ApprovalTask;
7+
import cn.cordys.crm.system.dto.request.ApprovalExecuteParam;
8+
import cn.cordys.mybatis.BaseMapper;
9+
import jakarta.annotation.Resource;
10+
import org.apache.commons.lang3.StringUtils;
11+
import org.springframework.stereotype.Service;
12+
13+
/**
14+
* 审批流程执行服务
15+
*/
16+
@Service
17+
public class ApprovalExecuteService {
18+
19+
@Resource
20+
private BaseMapper<ApprovalTask> approvalTaskMapper;
21+
@Resource
22+
private BaseMapper<ApprovalInstance> approvalInstanceMapper;
23+
24+
/**
25+
* 执行审批流程
26+
* @param executeParam 执行参数
27+
*/
28+
private void execute(ApprovalExecuteParam executeParam) {
29+
ApprovalTask currentTask;
30+
if (StringUtils.isNotEmpty(executeParam.getInstanceId())) {
31+
ApprovalInstance approvalInstance = approvalInstanceMapper.selectByPrimaryKey(executeParam.getInstanceId());
32+
currentTask = getCurrentTaskByInstanceNode(executeParam.getInstanceId(), approvalInstance.getCurrentNodeId());
33+
} else {
34+
currentTask = getTaskById(executeParam.getTaskId());
35+
}
36+
if (currentTask == null) {
37+
throw new GenericException("审批任务不存在!");
38+
}
39+
40+
/*
41+
* 1. 审批实例及当前审批任务流转, 并生成审批记录
42+
* 2. 追加下一个审批任务
43+
* TODO: 涉及到退回, 加签的逻辑后续补充
44+
*/
45+
currentTask.setTaskStatus(executeParam.getResult());
46+
currentTask.setUpdateTime(System.currentTimeMillis());
47+
currentTask.setUpdateUser(currentTask.getApproverId());
48+
approvalTaskMapper.update(currentTask);
49+
50+
ApprovalTask nextTask = new ApprovalTask();
51+
nextTask.setId(IDGenerator.nextStr());
52+
nextTask.setInstanceId(executeParam.getInstanceId());
53+
// TODO: 获取下一个节点信息, 审批人配置信息, 以及额外信息
54+
nextTask.setCreateTime(System.currentTimeMillis());
55+
nextTask.setUpdateTime(System.currentTimeMillis());
56+
approvalTaskMapper.insert(nextTask);
57+
}
58+
59+
60+
/**
61+
* 根据审批实例ID和当前节点ID获取当前审批任务
62+
* @param instanceId 审批实例ID
63+
* @param currentNodeId 当前节点ID
64+
* @return 审批任务
65+
*/
66+
private ApprovalTask getCurrentTaskByInstanceNode(String instanceId, String currentNodeId) {
67+
ApprovalTask task = new ApprovalTask();
68+
task.setInstanceId(instanceId);
69+
task.setNodeId(currentNodeId);
70+
return approvalTaskMapper.selectOne(task);
71+
}
72+
73+
/**
74+
* 根据任务ID获取审批任务
75+
* @param taskId 任务ID
76+
* @return 审批任务
77+
*/
78+
private ApprovalTask getTaskById(String taskId) {
79+
return approvalTaskMapper.selectByPrimaryKey(taskId);
80+
}
81+
}

backend/crm/src/main/resources/migration/1.7.0/ddl/V1.7.0_2__ga_ddl.sql

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,28 @@ COLLATE = utf8mb4_general_ci;
9494

9595
CREATE INDEX idx_flow_id_from_id ON approval_node_link(flow_id ASC,from_node_id ASC);
9696

97+
CREATE TABLE approval_instance(
98+
`id` VARCHAR(32) NOT NULL COMMENT 'id' ,
99+
`flow_id` VARCHAR(32) NOT NULL COMMENT '流程ID' ,
100+
`type` VARCHAR(20) NOT NULL COMMENT '表单类型 quote(报价表单)、contract(合同表单)、invoice(发票表单)' ,
101+
`resource_id` VARCHAR(32) NOT NULL COMMENT '审批的数据ID' ,
102+
`submitter_id` VARCHAR(32) NOT NULL COMMENT '提交人ID' ,
103+
`current_node_id` VARCHAR(32) COMMENT '当前节点id' ,
104+
`approval_status` VARCHAR(20) NOT NULL COMMENT '审批状态' ,
105+
`submit_time` BIGINT COMMENT '提审时间' ,
106+
`approve_time` BIGINT COMMENT '审批完成时间' ,
107+
`result` VARCHAR(20) COMMENT '审批结果: approved/rejected/withdrawn' ,
108+
`create_time` BIGINT NOT NULL COMMENT '创建时间' ,
109+
`update_time` BIGINT NOT NULL COMMENT '更新时间' ,
110+
`create_user` VARCHAR(32) NOT NULL COMMENT '创建人' ,
111+
`update_user` VARCHAR(32) NOT NULL COMMENT '更新人' ,
112+
PRIMARY KEY (id)
113+
) COMMENT = '审批实例表'
114+
ENGINE = InnoDB
115+
DEFAULT CHARSET = utf8mb4
116+
COLLATE = utf8mb4_general_ci;
117+
118+
CREATE INDEX idx_flow_resource ON approval_instance(flow_id ASC,resource_id ASC);
97119

98120
CREATE TABLE approval_task(
99121
`id` VARCHAR(32) NOT NULL COMMENT 'id' ,
@@ -121,7 +143,7 @@ CREATE TABLE approval_task(
121143
DEFAULT CHARSET = utf8mb4
122144
COLLATE = utf8mb4_general_ci;
123145

124-
CREATE INDEX idx_approver_id ON approval_task(approver_id ASC);
146+
CREATE INDEX idx_instance_node_id ON approval_task(instance_id ASC,node_id ASC);
125147
CREATE INDEX idx_instance_id ON approval_task(instance_id ASC);
126148

127149
-- set innodb lock wait timeout to default

0 commit comments

Comments
 (0)