mirror of
https://gitee.com/orangeform/orange-admin.git
synced 2026-01-17 18:46:36 +08:00
commit:同步2.0版本
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import lombok.Data;
|
||||
public class FlowWorkOrderDto {
|
||||
|
||||
/**
|
||||
* 流程状态。
|
||||
* 流程状态。参考FlowTaskStatus常量值对象。
|
||||
*/
|
||||
private Integer flowStatus;
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ public class FlowWorkOrder {
|
||||
private String businessKey;
|
||||
|
||||
/**
|
||||
* 流程状态。
|
||||
* 流程状态。参考FlowTaskStatus常量值对象。
|
||||
*/
|
||||
@TableField(value = "flow_status")
|
||||
private Integer flowStatus;
|
||||
|
||||
@@ -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,更新流程状态。
|
||||
*
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证并获取流程的实时任务信息。
|
||||
*
|
||||
|
||||
@@ -51,7 +51,7 @@ public class FlowWorkOrderVo {
|
||||
private String businessKey;
|
||||
|
||||
/**
|
||||
* 流程状态。
|
||||
* 流程状态。参考FlowTaskStatus常量值对象。
|
||||
*/
|
||||
private Integer flowStatus;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user