add 添加业务状态枚举。添加流程启动,审批,终止等状态

This commit is contained in:
gssong 2023-06-17 19:01:26 +08:00
parent 2dff183e4f
commit db64ae65ea
6 changed files with 168 additions and 15 deletions

View File

@ -0,0 +1,91 @@
package org.dromara.workflow.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.exception.ServiceException;
/**
* 业务状态枚举
*
* @author may
*/
@Getter
@AllArgsConstructor
public enum BusinessStatusEnum {
/**
* 已撤销
*/
CANCEL("cancel", "已撤销"),
/**
* 草稿
*/
DRAFT("draft", "草稿"),
/**
* 待审核
*/
WAITING("waiting", "待审核"),
/**
* 已完成
*/
FINISH("finish", "已完成"),
/**
* 已作废
*/
INVALID("invalid", "已作废"),
/**
* 已退回
*/
BACK("back", "已退回"),
/**
* 已终止
*/
TERMINATION("termination", "已终止");
/**
* 状态
*/
private final String status;
/**
* 描述
*/
private final String desc;
/**
* 启动流程校验
*
* @param status 状态
*/
public static void checkStartStatus(String status) {
if (status.equals(WAITING.getStatus())) {
throw new ServiceException("该单据已提交过申请,正在审批中!");
} else if (status.equals(FINISH.getStatus())) {
throw new ServiceException("该单据已完成申请!");
} else if (status.equals(INVALID.getStatus())) {
throw new ServiceException("该单据已作废!");
} else if (status.equals(TERMINATION.getStatus())) {
throw new ServiceException("该单据已终止!");
}
}
/**
* 校验流程申请
*
* @param status 状态
*/
public static void checkStatus(String status) {
if (status.equals(FINISH.getStatus())) {
throw new ServiceException("该单据已完成申请!");
} else if (status.equals(INVALID.getStatus())) {
throw new ServiceException("该单据已作废!");
} else if (status.equals(CANCEL.getStatus())) {
throw new ServiceException("该单据已撤销!");
} else if (status.equals(BACK.getStatus())) {
throw new ServiceException("该单据已退回!");
} else if (status.equals(TERMINATION.getStatus())) {
throw new ServiceException("该单据已终止!");
}
}
}

View File

@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -78,7 +79,7 @@ public class ActProcessInstanceController extends BaseController {
*/ */
@Log(title = "流程实例管理", businessType = BusinessType.DELETE) @Log(title = "流程实例管理", businessType = BusinessType.DELETE)
@PostMapping("/deleteRuntimeProcessInst") @PostMapping("/deleteRuntimeProcessInst")
public R<Void> deleteRuntimeProcessInst(@RequestBody ProcessInvalidBo processInvalidBo) { public R<Void> deleteRuntimeProcessInst(@Validated(AddGroup.class) @RequestBody ProcessInvalidBo processInvalidBo) {
return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo)); return toAjax(iActProcessInstanceService.deleteRuntimeProcessInst(processInvalidBo));
} }

View File

@ -1,6 +1,8 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import org.dromara.common.core.validate.AddGroup;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -19,7 +21,8 @@ public class ProcessInvalidBo implements Serializable {
/** /**
* 流程实例id * 流程实例id
*/ */
private String processInstId; @NotBlank(message = "流程实例id不能为空", groups = {AddGroup.class})
private String processInstanceId;
/** /**
* 作废原因 * 作废原因

View File

@ -0,0 +1,37 @@
package org.dromara.workflow.flowable.cmd;
import org.dromara.common.core.exception.ServiceException;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntityManager;
import org.flowable.engine.impl.util.CommandContextUtil;
/**
* 修改流程状态
*
* @author may
*/
public class UpdateBusinessStatusCmd implements Command<Boolean> {
private final String processInstanceId;
private final String status;
public UpdateBusinessStatusCmd(String processInstanceId, String status) {
this.processInstanceId = processInstanceId;
this.status = status;
}
@Override
public Boolean execute(CommandContext commandContext) {
try {
HistoricProcessInstanceEntityManager manager = CommandContextUtil.getHistoricProcessInstanceEntityManager();
HistoricProcessInstanceEntity processInstance = manager.findById(processInstanceId);
processInstance.setBusinessStatus(status);
manager.update(processInstance);
return true;
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
}
}

View File

@ -16,6 +16,7 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.BusinessStatusEnum;
import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInstanceBo;
import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo;
import org.dromara.workflow.domain.vo.ActHistoryInfoVo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo;
@ -326,20 +327,24 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
*/ */
@Override @Override
public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) { public boolean deleteRuntimeProcessInst(ProcessInvalidBo processInvalidBo) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInvalidBo.getProcessInstId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult();
try { try {
List<Task> list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstId()) List<Task> list = taskService.createTaskQuery().processInstanceId(processInvalidBo.getProcessInstanceId())
.taskTenantId(TenantHelper.getTenantId()).list(); .taskTenantId(TenantHelper.getTenantId()).list();
List<Task> subTasks = list.stream().filter(e -> StringUtils.isNotBlank(e.getParentTaskId())).collect(Collectors.toList()); List<Task> subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId()));
if (CollUtil.isNotEmpty(subTasks)) { if (CollUtil.isNotEmpty(subTasks)) {
subTasks.forEach(e -> taskService.deleteTask(e.getId())); subTasks.forEach(e -> taskService.deleteTask(e.getId()));
} }
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey(processInvalidBo.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult();
if (ObjectUtil.isNotEmpty(historicProcessInstance)) {
BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus());
}
String deleteReason = LoginHelper.getUsername() + "作废了当前申请!"; String deleteReason = LoginHelper.getUsername() + "作废了当前申请!";
if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) { if (StringUtils.isNotBlank(processInvalidBo.getDeleteReason())) {
deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason(); deleteReason = LoginHelper.getUsername() + "作废理由:" + processInvalidBo.getDeleteReason();
} }
runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstId(), deleteReason); runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus());
runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -351,7 +356,6 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
* 运行中的实例 删除程实例删除历史记录删除业务与流程关联信息 * 运行中的实例 删除程实例删除历史记录删除业务与流程关联信息
* *
* @param processInstanceId 流程实例id * @param processInstanceId 流程实例id
* @return
*/ */
@Override @Override
public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) { public boolean deleteRuntimeProcessAndHisInst(String processInstanceId) {

View File

@ -14,15 +14,14 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.BusinessStatusEnum;
import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.domain.vo.TaskVo;
import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd;
import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.service.IActTaskService;
import org.dromara.workflow.utils.WorkflowUtils; import org.dromara.workflow.utils.WorkflowUtils;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.HistoryService; import org.flowable.engine.*;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task; import org.flowable.task.api.Task;
@ -51,6 +50,7 @@ public class ActTaskServiceImpl implements IActTaskService {
private final TaskService taskService; private final TaskService taskService;
private final HistoryService historyService; private final HistoryService historyService;
private final IdentityService identityService; private final IdentityService identityService;
private final ManagementService managementService;
/** /**
* 启动任务 * 启动任务
@ -65,11 +65,14 @@ public class ActTaskServiceImpl implements IActTaskService {
throw new ServiceException("启动工作流时必须包含业务ID"); throw new ServiceException("启动工作流时必须包含业务ID");
} }
// 判断当前业务是否启动过流程 // 判断当前业务是否启动过流程
List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery() HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantIdLike(TenantHelper.getTenantId()).list(); .processInstanceBusinessKey(startProcessBo.getBusinessKey()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult();
if (ObjectUtil.isNotEmpty(historicProcessInstance)) {
BusinessStatusEnum.checkStartStatus(historicProcessInstance.getBusinessStatus());
}
TaskQuery taskQuery = taskService.createTaskQuery(); TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); List<Task> taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list();
if (CollUtil.isNotEmpty(instanceList)) { if (CollUtil.isNotEmpty(taskResult)) {
map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("processInstanceId", taskResult.get(0).getProcessInstanceId());
map.put("taskId", taskResult.get(0).getId()); map.put("taskId", taskResult.get(0).getId());
return map; return map;
@ -89,6 +92,8 @@ public class ActTaskServiceImpl implements IActTaskService {
if (taskList.size() > 1) { if (taskList.size() > 1) {
throw new ServiceException("请检查流程第一个环节是否为申请人!"); throw new ServiceException("请检查流程第一个环节是否为申请人!");
} }
runtimeService.updateBusinessStatus(pi.getProcessInstanceId(), BusinessStatusEnum.DRAFT.getStatus());
taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString()); taskService.setAssignee(taskList.get(0).getId(), LoginHelper.getUserId().toString());
taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId()); taskService.setVariable(taskList.get(0).getId(), "processInstanceId", pi.getProcessInstanceId());
map.put("processInstanceId", pi.getProcessInstanceId()); map.put("processInstanceId", pi.getProcessInstanceId());
@ -126,10 +131,16 @@ public class ActTaskServiceImpl implements IActTaskService {
taskService.complete(newTask.getId()); taskService.complete(newTask.getId());
return true; return true;
} }
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus());
//办理意见 //办理意见
taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage()); taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage());
//办理任务 //办理任务
taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables()); taskService.complete(completeTaskBo.getTaskId(), completeTaskBo.getVariables());
List<Task> list = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(task.getProcessInstanceId()).list();
if (CollUtil.isEmpty(list)) {
UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus());
managementService.executeCommand(updateBusinessStatusCmd);
}
return true; return true;
} catch (Exception e) { } catch (Exception e) {
throw new ServiceException(e.getMessage()); throw new ServiceException(e.getMessage());
@ -233,6 +244,11 @@ public class ActTaskServiceImpl implements IActTaskService {
if (task.isSuspended()) { if (task.isSuspended()) {
throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED);
} }
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey(task.getProcessInstanceId()).processInstanceTenantId(TenantHelper.getTenantId()).singleResult();
if (ObjectUtil.isNotEmpty(historicProcessInstance)) {
BusinessStatusEnum.checkStatus(historicProcessInstance.getBusinessStatus());
}
try { try {
if (StringUtils.isBlank(terminationBo.getComment())) { if (StringUtils.isBlank(terminationBo.getComment())) {
terminationBo.setComment(LoginHelper.getUsername() + "终止了申请"); terminationBo.setComment(LoginHelper.getUsername() + "终止了申请");
@ -249,6 +265,7 @@ public class ActTaskServiceImpl implements IActTaskService {
} }
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY);
} }
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus());
return true; return true;
} catch (Exception e) { } catch (Exception e) {
throw new ServiceException(e.getMessage()); throw new ServiceException(e.getMessage());