表结构
CREATE TABLE `act_t_business` (
`id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL,
`task_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`proc_def_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`proc_inst_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`proc_def_key` varchar(255) COLLATE utf8mb3_bin DEFAULT NULL,
`proc_def_name` varchar(255) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '流程名称',
`project_id` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`project_name` varchar(255) COLLATE utf8mb3_bin DEFAULT NULL,
`apply_user` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '申请人',
`apply_user_name` varchar(50) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '申请人姓名',
`instance_title` varchar(255) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '任务名称',
`business_key` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '业务数据id',
`approval_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '审批节点名称',
`assingee` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL,
`is_cost` tinyint DEFAULT NULL COMMENT '是否是金额类:0是,1不是',
`apply_cost` varchar(50) COLLATE utf8mb3_bin DEFAULT NULL COMMENT '金额',
`create_by` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_by` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`approval_status` tinyint DEFAULT NULL COMMENT '审批状态 0:审批中、1:审批完成、2:审批驳回、3:审批撤回',
`remark` varchar(255) COLLATE utf8mb3_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='流程任务工作状态表';
新增
发起流程实例时新增流程任务工作状态
/**
* 发起流程实例
* @param processDefinitionKey 流程定义KEY
* @param businessKey 该流程数据的ID
* @param variables 其他参数
* @return
*/
public ProcessInstance startProcessInstance(String processDefinitionKey, String businessKey, Map<String, Object> variables) {
// 判断金额标识是否为空,用于判断金额和非金额审批
if(variables.get(IS_COST) == null){
throw new RuntimeException("请设置审批金额标识:'is_cost'参数!金额审批:0,非金额审批:1");
}
Authentication.setAuthenticatedUserId(String.valueOf(SecurityUtils.getUserId())); // 设置流程发起人
variables.put("apply", String.valueOf(SecurityUtils.getUserId())); //设置下一个办理人
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
// 保存流程任务工作状态
saveActTBusiness(processInstance, businessKey, variables);
return processInstance;
}
/**
* Description 保存流程任务工作状态
* date 2024/5/7
* @author guoxingzhan
**/
public void saveActTBusiness(ProcessInstance processInstance, String businessKey, Map<String, Object> variables){
ActTBusiness business = new ActTBusiness();
business.setProcInstId(processInstance.getProcessInstanceId());
business.setProcDefId(processInstance.getProcessDefinitionId());
business.setProcDefKey(processInstance.getProcessDefinitionKey());
business.setProcDefName(processInstance.getProcessDefinitionName());
business.setProjectId(variables.get(WorkFlowService.PROJECT_ID) != null ? variables.get(WorkFlowService.PROJECT_ID).toString() : null);
business.setProjectName(variables.get(WorkFlowService.PROJECT_NAME) != null ? variables.get(WorkFlowService.PROJECT_NAME).toString() : null);
business.setInstanceTitle(variables.get(WorkFlowService.INSTANCE_TITLE) != null ? variables.get(WorkFlowService.INSTANCE_TITLE).toString() : null);
business.setApplyUser(String.valueOf(SecurityUtils.getUserId()));
business.setApplyUserName(SecurityUtils.getLoginUser().getUser().getNickName());
Object apply_cost = variables.get(WorkFlowService.APPLY_COST);//审批金额
if(apply_cost != null){
business.setIsCost(0);
business.setApplyCost(String.valueOf(apply_cost));
}else{
business.setIsCost(1);
}
business.setCreateBy(String.valueOf(SecurityUtils.getUserId()));
business.setCreateTime(new Date());
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
if(task != null){
if(task.getAssignee() != null){
business.setAssingee(task.getAssignee());
} else {
List<IdentityLink> ils = taskService.getIdentityLinksForTask(task.getId());
StringBuffer sb = new StringBuffer();
ils.stream().forEach(item -> {
sb.append(item.getUserId()!=null?item.getUserId() : item.getGroupId()).append(",");
});
sb.deleteCharAt(sb.length() - 1);
business.setAssingee(sb.toString());
}
business.setTaskId(task.getId());
business.setApprovalName(task.getName());
}
business.setBusinessKey(businessKey);
// 审批状态
business.setApprovalStatus(WorkflowStatus.UNDER_APPROVAL.getCode());
businessService.save(business);
}
修改~
审批时修改流程任务工作状态
public Map<String, Object> complete(String taskId, String processInstanceId, String userId, Map<String, Object> variables) {
Map<String, Object> data = new HashMap<String, Object>();
if(StringUtils.isBlank(taskId)){
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskCandidateOrAssigned(userId).singleResult();
if (Objects.isNull(task)) {
task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
}
taskId = task.getId();
}
taskService.setAssignee(taskId, userId);
// 设置任务所有人
taskService.setOwner(taskId, userId);
if (variables != null && variables.get("comment") != null) {
taskService.addComment(taskId, processInstanceId, variables.get("comment").toString());
}
taskService.complete(taskId, variables);
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().listPage(0,1);
if(tasks != null && tasks.size() > 0){
Task task = tasks.get(0);
// 修改流程任务工作状态
businessService.update(new UpdateWrapper<ActTBusiness>()
.eq("proc_inst_id", processInstanceId)
.set("approval_status", WorkflowStatus.UNDER_APPROVAL.getCode())
.set("task_id", task.getId())
.set("approval_name", task.getName())
.set("assingee", userId)
);
}
return data;
}
审批完成时修改流程任务工作状态
@Override
public void success(DelegateTask delegateTask) {
if(delegateTask.getProcessInstanceId() != null){
// 根据instanceId获取对象
SysWorkLog model = mapper.selectSysWorkLogByInstanceId(delegateTask.getProcessInstanceId());
// 传入要修改的审批状态,只修改状态
updateStatus(model, WorkflowStatus.SUCCESS_APPROVAL.getCode(), true);
// 修改流程任务工作状态
businessService.update(new UpdateWrapper<ActTBusiness>()
.eq("proc_inst_id", delegateTask.getProcessInstanceId())
.set("approval_status", WorkflowStatus.SUCCESS_APPROVAL.getCode())
);
}
}
驳回时修改流程任务工作状态
public void back(String processInstanceId, String userId, Map<String,Object> variables, String reason) throws Exception {
// 根据流程id获取任务
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskCandidateOrAssigned(userId).singleResult();// 设置任务审批人
// 任务审批人id
taskService.setAssignee(task.getId(), userId);
// 设置任务所有人
taskService.setOwner(task.getId(), userId);
// 审批意见
if (variables != null && variables.get("comment") != null) {
taskService.addComment(task.getId(), processInstanceId, variables.get("comment").toString());
}
// 完成当前任务(将会沿着新给定的方向流转到指定的节点)
// taskService.complete(task.getId());
// 判断原因是否为空
if(StringUtils.isBlank(reason)){
reason = "驳回到发起人,流程结束";
}
// 结束流程实例
runtimeService.deleteProcessInstance(processInstanceId, reason);
// 修改流程任务工作状态
businessService.update(new UpdateWrapper<ActTBusiness>()
.eq("proc_inst_id", processInstanceId)
.set("approval_status", WorkflowStatus.BACK_APPROVAL.getCode())
.set("task_id", task.getId())
.set("approval_name", task.getName())
.set("assingee", userId)
);
}
撤回时修改流程任务工作状态
public Map<String,Object> cancelApply(String functionKey, String instanceId){
Map<String,Object> variables = new HashMap<>();
String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
TaskQuery taskQuery = taskService.createTaskQuery();
Task task = taskQuery.processInstanceId(instanceId).taskVariableValueEquals("apply_name", nickName).singleResult();
if(ObjectUtil.isEmpty(task)){
throw new ServiceException(500,"审批撤回操作只能由发起人进行");
}
runtimeService.deleteProcessInstance(instanceId, "发起人撤回");
// 修改流程任务工作状态
businessService.update(new UpdateWrapper<ActTBusiness>()
.eq("proc_inst_id", instanceId)
.set("approval_status", WorkflowStatus.CANCEL_APPROVAL.getCode())
.set("task_id", task.getId())
.set("approval_name", task.getName())
);
// 修改业务数据状态
completeTaskListener.cancelApply(functionKey, instanceId);
return variables;
}