|
@@ -2,11 +2,12 @@ package com.qmth.sop.business.activiti.service.impl;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.google.gson.reflect.TypeToken;
|
|
|
import com.qmth.boot.api.exception.ApiException;
|
|
|
import com.qmth.sop.business.activiti.service.ActivitiService;
|
|
|
import com.qmth.sop.business.bean.bean.FormPropertyBean;
|
|
|
-import com.qmth.sop.business.bean.result.FlowResult;
|
|
|
-import com.qmth.sop.business.bean.result.FlowTaskResult;
|
|
|
+import com.qmth.sop.business.bean.result.*;
|
|
|
import com.qmth.sop.business.entity.TFCustomFlow;
|
|
|
import com.qmth.sop.business.entity.TFCustomFlowEntity;
|
|
|
import com.qmth.sop.business.entity.TFFlowApprove;
|
|
@@ -44,6 +45,7 @@ import org.springframework.util.CollectionUtils;
|
|
|
import javax.annotation.Resource;
|
|
|
import java.io.IOException;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
import java.util.zip.ZipInputStream;
|
|
|
|
|
|
/**
|
|
@@ -149,7 +151,7 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
FlowResult flowResult = null;
|
|
|
if (Objects.nonNull(flowDeploymentId) && Objects.isNull(taskId)) {
|
|
|
TFCustomFlow tfCustomFlow = tfCustomFlowService.getOne(new QueryWrapper<TFCustomFlow>().lambda().eq(TFCustomFlow::getFlowDeploymentId, flowDeploymentId));
|
|
|
- Optional.ofNullable(tfCustomFlow.getFlowProcessVar()).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有部署数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlow.getFlowProcessVar()).orElseThrow(() -> ExceptionResultEnum.FLOW_PROCESS_VAR_NO_DATA.exception());
|
|
|
|
|
|
map.put(SystemConstant.DEFAULT_ASSIGNEE_LIST + 1, approveUserIds);
|
|
|
ProcessInstance processInstance = runtimeService.startProcessInstanceById(tfCustomFlow.getFlowDefinitionId(), map);
|
|
@@ -159,7 +161,7 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
flowResult = JSONObject.parseObject(tfCustomFlow.getFlowProcessVar(), FlowResult.class);
|
|
|
} else if (Objects.nonNull(taskId)) {
|
|
|
taskTemp = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
|
|
|
- Optional.ofNullable(taskTemp).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务数据为空!"));
|
|
|
+ Optional.ofNullable(taskTemp).orElseThrow(() -> ExceptionResultEnum.FLOW_TASK_NO_DATA.exception());
|
|
|
processFlowId = taskTemp.getProcessInstanceId();
|
|
|
}
|
|
|
|
|
@@ -173,11 +175,11 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
taskList = taskService.createTaskQuery().processInstanceId(processFlowId).list();
|
|
|
} else {
|
|
|
tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, Long.parseLong(processFlowId)));
|
|
|
- Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有实例数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
|
|
|
tfFlowApprove = tfFlowApproveService.getOne(new QueryWrapper<TFFlowApprove>().lambda().eq(TFFlowApprove::getFlowId, Long.parseLong(processFlowId)));
|
|
|
- Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有审批数据!"));
|
|
|
+ Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.FLOW_APPROVE_NO_DATA.exception());
|
|
|
taskList.add(taskTemp);
|
|
|
}
|
|
|
List<TFFlowLog> tfFlowLogList = new ArrayList<>();
|
|
@@ -336,7 +338,7 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
List<Task> taskList = null;
|
|
|
if (Objects.nonNull(flowDeploymentId)) {
|
|
|
tfCustomFlow = tfCustomFlowService.getOne(new QueryWrapper<TFCustomFlow>().lambda().eq(TFCustomFlow::getFlowDeploymentId, flowDeploymentId));
|
|
|
- Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有部署数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.FLOW_DEPLOYMENT_NO_DATA.exception());
|
|
|
if (Objects.isNull(tfCustomFlow.getFlowDefinitionId())) {
|
|
|
String processDefinitionId = this.findProcessDefinitionIdByDeploymentId(flowDeploymentId);
|
|
|
tfCustomFlow.setFlowDefinitionId(processDefinitionId);
|
|
@@ -370,9 +372,9 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
if (!CollectionUtils.isEmpty(taskList)) {
|
|
|
for (Task t : taskList) {
|
|
|
TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, Long.parseLong(t.getProcessInstanceId())));
|
|
|
- Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有实例数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
TFCustomFlow tfCustomFlow = tfCustomFlowService.getById(tfCustomFlowEntity.gettFCustomFlowId());
|
|
|
- Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有部署数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.FLOW_DEPLOYMENT_NO_DATA.exception());
|
|
|
|
|
|
FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
|
|
@@ -381,7 +383,7 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
map = this.getFlowFormPropertie(flowResult, map, currFlowTaskResult.getSetup());
|
|
|
}
|
|
|
TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(new QueryWrapper<TFFlowApprove>().lambda().eq(TFFlowApprove::getFlowId, Long.parseLong(t.getProcessInstanceId())));
|
|
|
- Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有审批数据!"));
|
|
|
+ Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.FLOW_APPROVE_NO_DATA.exception());
|
|
|
|
|
|
formPropertyList.add(new FormPropertyBean(Long.parseLong(t.getProcessInstanceId()), Long.parseLong(t.getId()), userId, (FlowTaskResult) map.get(SystemConstant.FORM_PROPERTIES), tfFlowApprove.getStatus(), String.valueOf(tfCustomFlowEntity.getId())));
|
|
|
}
|
|
@@ -394,17 +396,18 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
*
|
|
|
* @param userId
|
|
|
* @param taskId
|
|
|
+ * @return
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public void taskApproverExchange(Long userId, Long taskId) {
|
|
|
+ public Boolean taskApproverExchange(Long userId, Long taskId) {
|
|
|
boolean lock = memoryLock.lock(SystemConstant.LOCK_FLOW_EXCHANGE_PREFIX + taskId, taskId, SystemConstant.LOCK_FLOW_TIME_OUT);
|
|
|
if (!lock) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("正在转审中,请稍候再试!");
|
|
|
}
|
|
|
try {
|
|
|
Task task = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
|
|
|
- Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务数据为空!"));
|
|
|
+ Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.FLOW_TASK_NO_DATA.exception());
|
|
|
|
|
|
if (Objects.equals(task.getAssignee(), String.valueOf(userId))) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("不能转给自己!");
|
|
@@ -427,7 +430,7 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
taskService.setAssignee(String.valueOf(taskId), String.valueOf(userId));
|
|
|
|
|
|
TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, Long.parseLong(task.getProcessInstanceId())));
|
|
|
- Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有实例数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
|
|
|
FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
|
|
@@ -448,32 +451,34 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
} finally {
|
|
|
memoryLock.unlock(SystemConstant.LOCK_FLOW_EXCHANGE_PREFIX + taskId);
|
|
|
}
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 流程终止
|
|
|
*
|
|
|
* @param flowId
|
|
|
+ * @return
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public void flowEnd(Long flowId) {
|
|
|
+ public Boolean flowEnd(Long flowId) {
|
|
|
boolean lock = memoryLock.lock(SystemConstant.LOCK_FLOW_END_PREFIX + flowId, flowId, SystemConstant.LOCK_FLOW_TIME_OUT);
|
|
|
if (!lock) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("正在终止中,请稍候再试!");
|
|
|
}
|
|
|
try {
|
|
|
TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(new QueryWrapper<TFFlowApprove>().lambda().eq(TFFlowApprove::getFlowId, flowId));
|
|
|
- Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有审批数据!"));
|
|
|
+ Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.FLOW_APPROVE_NO_DATA.exception());
|
|
|
|
|
|
TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, flowId));
|
|
|
- Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有实例数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
|
|
|
FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
|
|
|
List<Task> taskList = taskService.createTaskQuery().processInstanceId(String.valueOf(flowId)).list();
|
|
|
if (CollectionUtils.isEmpty(taskList)) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("流程任务数据为空!");
|
|
|
+ throw ExceptionResultEnum.FLOW_TASK_NO_DATA.exception();
|
|
|
}
|
|
|
FlowTaskResult currFlowTaskResult = GsonUtil.fromJson(GsonUtil.toJson(setupMap.get(taskList.get(0).getTaskDefinitionKey())), FlowTaskResult.class);
|
|
|
|
|
@@ -499,6 +504,61 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
} finally {
|
|
|
memoryLock.unlock(SystemConstant.LOCK_FLOW_END_PREFIX + flowId);
|
|
|
}
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取流程详细信息接口
|
|
|
+ *
|
|
|
+ * @param flowId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public FlowViewResult flowView(Long flowId) {
|
|
|
+ TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, flowId));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
+
|
|
|
+ //获取当前流程节点
|
|
|
+ TFFlowApprove tfFlowApprove = tfFlowApproveService.getOne(new QueryWrapper<TFFlowApprove>().lambda().eq(TFFlowApprove::getFlowId, flowId));
|
|
|
+ Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.FLOW_APPROVE_NO_DATA.exception());
|
|
|
+
|
|
|
+ FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
+ LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
|
|
|
+
|
|
|
+ Gson gson = new Gson();
|
|
|
+ FlowTaskResult currFlowTaskResult = null;
|
|
|
+ List<FlowTaskResult> flowTaskHistoryList = null;
|
|
|
+ List<Long> taskIdList = null;
|
|
|
+
|
|
|
+ List<TFFlowViewLogResult> flowApproveHistoryList = null;
|
|
|
+ Map<Integer, Integer> approveSetupMap = new HashMap<>();
|
|
|
+ //获取流程审批历史
|
|
|
+ List<TFFlowLogResult> tfFlowLogResultList = tfFlowLogService.findByObjectId(tfCustomFlowEntity.getId());
|
|
|
+ if (!CollectionUtils.isEmpty(tfFlowLogResultList)) {
|
|
|
+ flowApproveHistoryList = gson.fromJson(gson.toJson(tfFlowLogResultList), new TypeToken<List<TFFlowViewLogResult>>() {
|
|
|
+ }.getType());
|
|
|
+ for (TFFlowViewLogResult t : flowApproveHistoryList) {
|
|
|
+ t.setMessageType(FlowMsgTypeEnum.STANDARD);
|
|
|
+ approveSetupMap.put(t.getApproveSetup(), t.getApproveSetup());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
|
|
|
+ FlowTaskResult flowTaskResult = gson.fromJson(gson.toJson(entry.getValue()), FlowTaskResult.class);
|
|
|
+ if (flowTaskResult.getSetup() > 0) {
|
|
|
+ //正在审批的表单
|
|
|
+ if (Objects.nonNull(tfFlowApprove.getSetup()) && flowTaskResult.getSetup().intValue() == tfFlowApprove.getSetup().intValue()) {
|
|
|
+ currFlowTaskResult = flowTaskResult;
|
|
|
+ List<Task> taskList = taskService.createTaskQuery().processInstanceId(String.valueOf(flowId)).list();
|
|
|
+ if (!CollectionUtils.isEmpty(taskList)) {
|
|
|
+ taskIdList = taskList.stream().map(s -> Long.parseLong(s.getId())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ } else if (approveSetupMap.containsKey(flowTaskResult.getSetup())) {//已经审批过的表单
|
|
|
+ flowTaskHistoryList = CollectionUtils.isEmpty(flowTaskHistoryList) ? new ArrayList<>(approveSetupMap.size()) : flowTaskHistoryList;
|
|
|
+ flowTaskHistoryList.add(flowTaskResult);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new FlowViewResult(flowId, tfFlowApprove.getStatus(), String.valueOf(tfFlowApprove.getId()), taskIdList, flowTaskHistoryList, currFlowTaskResult, flowApproveHistoryList);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -519,9 +579,9 @@ public class ActivitiServiceImpl implements ActivitiService {
|
|
|
}
|
|
|
Long flowId = Long.parseLong(taskList.get(0).getProcessInstanceId());
|
|
|
TFCustomFlowEntity tfCustomFlowEntity = tfCustomFlowEntityService.getOne(new QueryWrapper<TFCustomFlowEntity>().lambda().eq(TFCustomFlowEntity::getFlowId, flowId));
|
|
|
- Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有实例数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlowEntity).orElseThrow(() -> ExceptionResultEnum.FLOW_ENTITY_NO_DATA.exception());
|
|
|
tfCustomFlow = tfCustomFlowService.getById(tfCustomFlowEntity.gettFCustomFlowId());
|
|
|
- Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程没有部署数据!"));
|
|
|
+ Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.FLOW_DEPLOYMENT_NO_DATA.exception());
|
|
|
|
|
|
flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
|
|
|
LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
|