commit:同步2.0版本

This commit is contained in:
Jerry
2021-10-20 12:11:51 +08:00
parent 50807a7a7e
commit abbbd90690
54 changed files with 4443 additions and 72 deletions

View File

@@ -0,0 +1,47 @@
package com.flow.demo.common.flow.base.service;
import com.alibaba.fastjson.JSONObject;
import com.flow.demo.common.core.base.service.BaseService;
import com.flow.demo.common.flow.constant.FlowApprovalType;
import com.flow.demo.common.flow.constant.FlowTaskStatus;
import com.flow.demo.common.flow.model.FlowTaskComment;
import com.flow.demo.common.flow.service.FlowApiService;
import com.flow.demo.common.flow.service.FlowWorkOrderService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
public abstract class BaseFlowService<M, K extends Serializable> extends BaseService<M, K> {
@Autowired
private FlowApiService flowApiService;
@Autowired
private FlowWorkOrderService flowWorkOrderService;
public void startAndTakeFirst(
String processDefinitionId, K dataId, FlowTaskComment comment, JSONObject variables) {
ProcessInstance instance = flowApiService.startAndTakeFirst(
processDefinitionId, dataId, comment, variables);
flowWorkOrderService.saveNew(instance, dataId, null);
}
public void takeFirstTask(
String processInstanceId, String taskId, K dataId, FlowTaskComment comment, JSONObject variables) {
Task task = flowApiService.getProcessInstanceActiveTask(processInstanceId, taskId);
flowApiService.setBusinessKeyForProcessInstance(processInstanceId, dataId);
flowApiService.completeTask(task, comment, variables);
ProcessInstance instance = flowApiService.getProcessInstance(processInstanceId);
flowWorkOrderService.saveNew(instance, dataId, null);
}
public void takeTask(Task task, K dataId, FlowTaskComment comment, JSONObject variables) {
int flowStatus = FlowTaskStatus.APPROVING;
if (comment.getApprovalType().equals(FlowApprovalType.REFUSE)) {
flowStatus = FlowTaskStatus.REFUSED;
}
flowWorkOrderService.updateFlowStatusByBusinessKey(dataId.toString(), flowStatus);
flowApiService.completeTask(task, comment, variables);
}
}

View File

@@ -12,7 +12,7 @@ import lombok.Data;
public class FlowWorkOrderDto {
/**
* 流程状态。
* 流程状态。参考FlowTaskStatus常量值对象。
*/
private Integer flowStatus;

View File

@@ -66,7 +66,7 @@ public class FlowWorkOrder {
private String businessKey;
/**
* 流程状态。
* 流程状态。参考FlowTaskStatus常量值对象。
*/
@TableField(value = "flow_status")
private Integer flowStatus;

View File

@@ -57,6 +57,14 @@ public interface FlowWorkOrderService extends IBaseService<FlowWorkOrder, Long>
*/
List<FlowWorkOrder> getFlowWorkOrderListWithRelation(FlowWorkOrder filter, String orderBy);
/**
* 根据流程实例Id查询关联的工单对象。
*
* @param processInstanceId 流程实例Id。
* @return 工作流工单对象。
*/
FlowWorkOrder getFlowWorkOrderByProcessInstanceId(String processInstanceId);
/**
* 根据业务主键,查询是否存在指定的工单。
*
@@ -66,6 +74,13 @@ public interface FlowWorkOrderService extends IBaseService<FlowWorkOrder, Long>
*/
boolean existByBusinessKey(Object businessKey, boolean unfinished);
/**
* 根据业务数据的主键Id更新流程状态。
* @param businessKey 业务数据主键Id。
* @param flowStatus 新的流程状态值。
*/
void updateFlowStatusByBusinessKey(String businessKey, int flowStatus);
/**
* 根据流程实例Id更新流程状态。
*

View File

@@ -1,6 +1,7 @@
package com.flow.demo.common.flow.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.flow.demo.common.core.base.dao.BaseDaoMapper;
import com.flow.demo.common.core.constant.GlobalDeletedFlag;
import com.flow.demo.common.core.object.MyRelationParam;
@@ -109,6 +110,13 @@ public class FlowWorkOrderServiceImpl extends BaseService<FlowWorkOrder, Long> i
return resultList;
}
@Override
public FlowWorkOrder getFlowWorkOrderByProcessInstanceId(String processInstanceId) {
FlowWorkOrder filter = new FlowWorkOrder();
filter.setProcessInstanceId(processInstanceId);
return flowWorkOrderMapper.selectOne(new QueryWrapper<>(filter));
}
@Override
public boolean existByBusinessKey(Object businessKey, boolean unfinished) {
LambdaQueryWrapper<FlowWorkOrder> queryWrapper = new LambdaQueryWrapper<>();
@@ -120,6 +128,20 @@ public class FlowWorkOrderServiceImpl extends BaseService<FlowWorkOrder, Long> i
return flowWorkOrderMapper.selectCount(queryWrapper) > 0;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateFlowStatusByBusinessKey(String businessKey, int flowStatus) {
FlowWorkOrder flowWorkOrder = new FlowWorkOrder();
flowWorkOrder.setFlowStatus(flowStatus);
if (FlowTaskStatus.FINISHED != flowStatus) {
flowWorkOrder.setUpdateTime(new Date());
flowWorkOrder.setUpdateUserId(TokenData.takeFromRequest().getUserId());
}
LambdaQueryWrapper<FlowWorkOrder> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(FlowWorkOrder::getBusinessKey, businessKey);
flowWorkOrderMapper.update(flowWorkOrder, queryWrapper);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateFlowStatusByProcessInstanceId(String processInstanceId, int flowStatus) {

View File

@@ -7,11 +7,14 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.flow.demo.common.core.constant.ErrorCodeEnum;
import com.flow.demo.common.core.object.CallResult;
import com.flow.demo.common.core.object.ResponseResult;
import com.flow.demo.common.core.object.TokenData;
import com.flow.demo.common.core.util.MyModelUtil;
import com.flow.demo.common.flow.constant.FlowApprovalType;
import com.flow.demo.common.flow.constant.FlowConstant;
import com.flow.demo.common.flow.constant.FlowTaskStatus;
import com.flow.demo.common.flow.dto.FlowTaskCommentDto;
import com.flow.demo.common.flow.dto.FlowWorkOrderDto;
import com.flow.demo.common.flow.model.FlowEntry;
import com.flow.demo.common.flow.model.FlowEntryPublish;
@@ -22,8 +25,11 @@ import com.flow.demo.common.flow.service.FlowEntryService;
import com.flow.demo.common.flow.vo.FlowWorkOrderVo;
import com.flow.demo.common.flow.vo.TaskInfoVo;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskInfo;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -71,6 +77,103 @@ public class FlowOperationHelper {
return ResponseResult.success(flowEntry);
}
/**
* 工作流静态表单的参数验证工具方法。根据流程定义标识,获取关联的流程并对其进行合法性验证。
*
* @param processDefinitionKey 流程定义标识。
* @return 返回流程对象。
*/
public ResponseResult<FlowEntry> verifyFullAndGetFlowEntry(String processDefinitionKey) {
String errorMessage;
// 验证流程管理数据状态的合法性。
ResponseResult<FlowEntry> flowEntryResult = this.verifyAndGetFlowEntry(processDefinitionKey);
if (!flowEntryResult.isSuccess()) {
return ResponseResult.errorFrom(flowEntryResult);
}
// 验证流程一个用户任务的合法性。
FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
if (!flowEntryPublish.getActiveStatus()) {
errorMessage = "数据验证失败,当前流程发布对象已被挂起,不能启动新流程!";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
ResponseResult<TaskInfoVo> taskInfoResult =
this.verifyAndGetInitialTaskInfo(flowEntryPublish, true);
if (!taskInfoResult.isSuccess()) {
return ResponseResult.errorFrom(taskInfoResult);
}
return flowEntryResult;
}
/**
* 工作流静态表单的参数验证工具方法。根据参数验证并获取指定的流程任务对象。
*
* @param processInstanceId 流程实例Id。
* @param taskId 流程任务Id。
* @param flowTaskComment 流程审批对象。
* @return 验证后的流程任务对象。
*/
public ResponseResult<Task> verifySubmitAndGetTask(
String processInstanceId, String taskId, FlowTaskCommentDto flowTaskComment) {
// 验证流程任务的合法性。
Task task = flowApiService.getProcessInstanceActiveTask(processInstanceId, taskId);
ResponseResult<TaskInfoVo> taskInfoResult = this.verifyAndGetRuntimeTaskInfo(task);
if (!taskInfoResult.isSuccess()) {
return ResponseResult.errorFrom(taskInfoResult);
}
CallResult assigneeVerifyResult = flowApiService.verifyAssigneeOrCandidateAndClaim(task);
if (!assigneeVerifyResult.isSuccess()) {
return ResponseResult.errorFrom(assigneeVerifyResult);
}
ProcessInstance instance = flowApiService.getProcessInstance(processInstanceId);
if (StrUtil.isBlank(instance.getBusinessKey())) {
return ResponseResult.success(task);
}
String errorMessage;
if (StrUtil.equals(flowTaskComment.getApprovalType(), FlowApprovalType.TRANSFER)) {
if (StrUtil.isBlank(flowTaskComment.getDelegateAssginee())) {
errorMessage = "数据验证失败,加签或转办任务指派人不能为空!!";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
}
return ResponseResult.success(task);
}
/**
* 工作流静态表单的参数验证工具方法。根据参数验证并获取指定的历史流程实例对象。
* 仅当登录用户为任务的分配人时,才能通过验证。
*
* @param processInstanceId 历史流程实例Id。
* @param taskId 历史流程任务Id。
* @return 验证后并返回的历史流程实例对象。
*/
public ResponseResult<HistoricProcessInstance> verifyAndHistoricProcessInstance(String processInstanceId, String taskId) {
String errorMessage;
// 验证流程实例的合法性。
HistoricProcessInstance instance = flowApiService.getHistoricProcessInstance(processInstanceId);
if (instance == null) {
errorMessage = "数据验证失败指定的流程实例Id并不存在请刷新后重试";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
String loginName = TokenData.takeFromRequest().getLoginName();
if (StrUtil.isBlank(taskId)) {
if (!StrUtil.equals(loginName, instance.getStartUserId())) {
errorMessage = "数据验证失败,指定历史流程的发起人与当前用户不匹配!";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
} else {
HistoricTaskInstance taskInstance = flowApiService.getHistoricTaskInstance(processInstanceId, taskId);
if (taskInstance == null) {
errorMessage = "数据验证失败指定的任务Id并不存在请刷新后重试";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
if (!StrUtil.equals(loginName, taskInstance.getAssignee())) {
errorMessage = "数据验证失败,历史任务的指派人与当前用户不匹配!";
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
}
return ResponseResult.success(instance);
}
/**
* 验证并获取流程的实时任务信息。
*

View File

@@ -51,7 +51,7 @@ public class FlowWorkOrderVo {
private String businessKey;
/**
* 流程状态。
* 流程状态。参考FlowTaskStatus常量值对象。
*/
private Integer flowStatus;