/**
|
* 版权所有,侵权必究!
|
*/
|
|
package com.zt.modules.workflow.service;
|
|
import cn.hutool.core.convert.Convert;
|
import com.zt.common.entity.BaseEntity;
|
import com.zt.common.entity.BusiEntity;
|
import com.zt.common.entity.FlowInfo;
|
import com.zt.common.service.BaseService;
|
import com.zt.common.utils.UUIDUtil;
|
import com.zt.core.context.UserContext;
|
import com.zt.core.sys.model.SysUser;
|
import com.zt.modules.workflow.dao.WfRunTaskDao;
|
import com.zt.modules.workflow.dto.BizInfoDto;
|
import com.zt.modules.workflow.dto.QueryWfInfoDto;
|
import com.zt.modules.workflow.dto.TaskParamDto;
|
import com.zt.modules.workflow.model.WfRunInstance;
|
import com.zt.modules.workflow.model.WfRunTask;
|
import com.zt.modules.workflowconfig.dao.WfDefDao;
|
import com.zt.modules.workflowconfig.dao.WfDefStepDao;
|
import com.zt.modules.workflowconfig.model.WfDef;
|
import com.zt.modules.workflowconfig.model.WfDefStep;
|
import com.zt.modules.workflowconfig.service.WorkflowConfigService;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 工作流服务
|
*
|
* @author 朱曙光
|
* @since 1.0.0
|
*/
|
@Service
|
public class WorkflowService extends BaseService<WfRunTaskDao, WfRunTask> {
|
@Autowired
|
private WfDefStepDao wfDefStepDao;
|
|
@Autowired
|
private WfDefDao wfDefDao;
|
|
@Autowired
|
private WorkflowConfigService workflowConfigService;
|
|
@Autowired
|
private WfRunInstanceService wfRunInstanceService;
|
|
@Value("${zt.oss.local-server}")
|
private String localServer;
|
|
public QueryWfInfoDto queryWfStepInfo(String wfCode, String wfStepId) {
|
QueryWfInfoDto dto = new QueryWfInfoDto();
|
|
dto.setIsMyStep(0);
|
dto.setIsFirstStep(0);
|
dto.setIsFinallyStep(0);
|
|
WfDefStep firstStep = this.queryWfDefFirstStep(wfCode);
|
WfDefStep finallyStep = this.queryWfDefFinallyStep(wfCode);
|
WfDefStep currentStep;
|
if (wfStepId == null) {
|
currentStep = firstStep;
|
} else {
|
currentStep = wfDefStepDao.selectById(Convert.toLong(wfStepId));
|
}
|
if (currentStep == null)
|
currentStep = firstStep;
|
|
dto.setWfStepId(currentStep.getId());
|
dto.setIsCounterSign(currentStep.getIsCounterSign());
|
dto.setCanRefuse(currentStep.getCanRefuse());
|
dto.setStepName(currentStep.getName());
|
dto.setApproverIds(currentStep.getApproverIds());
|
|
if (firstStep.getId() == currentStep.getId()) {
|
dto.setIsFirstStep(1);
|
}
|
if (finallyStep.getId() == currentStep.getId()) {
|
dto.setIsFinallyStep(1);
|
}
|
if (("," + currentStep.getApproverIds() + ",").contains("," + UserContext.getUserId().toString() + ",")) {
|
dto.setIsMyStep(1);
|
}
|
return dto;
|
}
|
|
public WfDefStep queryWfDefStep(String wfIdCode, String stepIdMarker) {
|
List<WfDefStep> list = wfDefStepDao.queryWfDefStep(wfIdCode, stepIdMarker);
|
if (list.isEmpty()) {
|
return null;
|
} else {
|
WfDefStep step = list.get(0);
|
// step.setCurrentUserId(UserContext.getUserId().toString());
|
return step;
|
}
|
}
|
|
public WfDefStep queryWfDefFirstStep(String wfIdCode) {
|
List<WfDefStep> list = wfDefStepDao.queryWfDefFirstStep(wfIdCode);
|
if (list.isEmpty()) {
|
return null;
|
} else {
|
WfDefStep step = list.get(0);
|
// step.setCurrentUserId(UserContext.getUserId().toString());
|
return step;
|
}
|
}
|
|
public WfDefStep queryWfDefFinallyStep(String wfIdCode) {
|
List<WfDefStep> list = wfDefStepDao.queryWfDefFinallyStep(wfIdCode);
|
if (list.isEmpty()) {
|
return null;
|
} else {
|
WfDefStep step = list.get(0);
|
// step.setCurrentUserId(UserContext.getUserId().toString());
|
return step;
|
}
|
}
|
|
public WfDefStep queryWfDefNextStep(WfDefStep currentStep) {
|
if (currentStep == null) {
|
throw new RuntimeException("Null WfDefStep object.");
|
}
|
|
List<WfDefStep> list = wfDefStepDao.queryWfDefNextStep(currentStep);
|
if (list.isEmpty()) {
|
} else {
|
return list.get(0);
|
}
|
return null;
|
}
|
|
public WfDefStep queryWfDefPreStep(WfDefStep currentStep) {
|
if (currentStep == null) {
|
throw new RuntimeException("Null WfDefStep object.");
|
}
|
List<WfDefStep> list = wfDefStepDao.queryWfDefPreStep(currentStep);
|
if (list.isEmpty()) {
|
} else {
|
return list.get(0);
|
}
|
return null;
|
}
|
|
public WfDefStep queryCurrentTaskStep(String wfIdCode, Long bizId) {
|
List<WfDefStep> list = baseDao.queryCurrentTaskStep(wfIdCode, bizId);
|
if (list.size() > 0)
|
return list.get(0);
|
else
|
return null;
|
}
|
|
public WfDefStep queryCurrentTaskStep100(String wfIdCode, Long bizId) {
|
List<WfDefStep> list = baseDao.queryCurrentTaskStep100(wfIdCode, bizId);
|
if (list.size() > 0)
|
return list.get(0);
|
else
|
return null;
|
}
|
|
public Boolean isFlowFinish(String wfIdCode, Long bizId) {
|
Boolean result = true;
|
String[] wfIdCodeArr = wfIdCode.split(",");
|
for (String code : wfIdCodeArr) {
|
List<WfRunTask> list = baseDao.getFlowFinish(wfIdCode, bizId);
|
if (list.size() == 0) {
|
result = false;
|
break;
|
}
|
}
|
return result;
|
}
|
|
// 按task分組設置上一步狀體,並獲取設置狀態后縂的步驟狀態
|
public Boolean setMyStepStatus(Long prevStepId, Long currentStepId, Integer status, Long bizId, Integer option) {
|
Boolean result = false;
|
WfDefStep prevStep = workflowConfigService.get(prevStepId);
|
if (prevStep != null) {
|
String taskGroup = prevStep.getTaskGroup();
|
status = status == 0 ? 20 : 10; // (0:20 pass, 1:10 refuse)
|
|
// 设置状态 本人status 别人status+1 taskGroup
|
baseDao.setTaskStatus(bizId, prevStepId, status, UserContext.getUserId(),
|
UserContext.getUser().getRealName(), taskGroup, option);
|
if (prevStep.getStepType() != 0 && currentStepId == 0L)
|
return false;
|
|
if (option == 1) {
|
// 1 refuse 2 pass 已办任务不显示 施工清单已办
|
// 设置状态 是否是驳回的(撤回?)
|
// 如果是駁回的,則後面的步驟都設置 status2 =1, 查詢狀態或待辦任務的時候要剔出
|
baseDao.setTaskRefuse(bizId, currentStepId, 1);
|
}
|
|
if (status == 10) {
|
// 驳回肯定执行(如果是按专业、部门分组的话,都驳回)
|
result = true;
|
} else {
|
// 前进的话检查,是否所有的都完成了(taskGroup)
|
result = this.getFlowStepFinish(prevStep.getWfDefId().toString(), bizId, prevStep.getStepMarker());
|
}
|
}
|
return result;
|
}
|
|
public void setTaskPartFinish(Long bizId, Long currentStepId, Integer status) {
|
baseDao.setTaskPartFinish(bizId, currentStepId, status);
|
}
|
|
public void setTaskPartFinish2(Long bizId, Long receiveId, Integer status) {
|
baseDao.setTaskPartFinish2(bizId, receiveId, status);
|
}
|
|
public void setTaskPartFinish3(Long bizId, Long receiveDeptId, Integer status) {
|
baseDao.setTaskPartFinish3(bizId, receiveDeptId, status);
|
}
|
|
public void setFlowTask(Long prevStepId, Long currentStepId, Integer status, Long bizId, String deptIds,
|
Integer direct) {
|
Boolean result = true;
|
if (prevStepId > 0) {
|
// 设置上一步骤的分組状态,並獲取上一步骤縂的狀態
|
result = setMyStepStatus(prevStepId, currentStepId, status, bizId, direct);
|
}
|
if (result) {
|
/*
|
* int num = baseDao.isExistsStep(null, currentStepId, bizId); if (num == 0) {
|
* setNextFlowTask(prevStepId, currentStepId, status, bizId, deptIds); }
|
*/
|
setNextFlowTask(prevStepId, currentStepId, status, bizId, deptIds);
|
}
|
}
|
|
public int isExistsStep(String currentStepMarker, Long currentStepId, Long bizId) {
|
int num = baseDao.isExistsStep(currentStepMarker, currentStepId, bizId);
|
System.out.println("num:" + num);
|
return num;
|
}
|
|
public void setNextFlowTask(Long prevStepId, Long currentStepId, Integer status, Long bizId, String deptIds) {
|
int num = baseDao.isExistsRunningStep(null, currentStepId, bizId);
|
if (num > 0) {
|
// 已經存在該步驟了,不用繼續
|
return;
|
}
|
WfDefStep currentStep = workflowConfigService.get(currentStepId);
|
WfDefStep finallyStep = this.queryWfDefFinallyStep(currentStep.getWfDefId().toString());
|
|
WfDef wfDef = wfDefDao.queryWfDef(currentStep.getWfDefId(), null).get(0);
|
|
Long instanceId = UUIDUtil.generateId();
|
WfRunInstance wfRunInstanceOld = wfRunInstanceService.getFlowInstance(wfDef.getCode(), bizId);
|
Boolean isNewInstance = true;
|
if (wfRunInstanceOld != null) {
|
isNewInstance = false;
|
instanceId = wfRunInstanceOld.getId();
|
}
|
|
String sqlStr = wfDef.getBizSql();
|
sqlStr = sqlStr.replace("${bizId}", bizId.toString());
|
List<BizInfoDto> bizInfoList = baseDao.getSqlResult(sqlStr);
|
BizInfoDto bizInfoDto = bizInfoList.size() > 0 ? bizInfoList.get(0) : null;
|
|
Long preTaskId = 0L;
|
WfRunTask task = getFlowStepStatus(wfDef.getCode(), bizId, currentStep.getStepMarker());
|
if (task != null)
|
preTaskId = task.getId();
|
|
// sqlStr = "update project set subject='aaa' where id=${bizId}";
|
// sqlStr = sqlStr.replace("${bizId}",bizId.toString());
|
// baseDao.exeSql(sqlStr);
|
|
Map<Long, String> existsUsers = new HashMap<Long, String>();
|
|
TaskParamDto taskParamDto = new TaskParamDto();
|
taskParamDto.setInstanceId(instanceId);
|
taskParamDto.setPreTaskId(preTaskId);
|
taskParamDto.setPrevStepId(prevStepId);
|
taskParamDto.setBizId(bizId);
|
taskParamDto.setStatus(status);
|
taskParamDto.setStatus2(0);
|
taskParamDto.setGroupId(UUIDUtil.generateId());
|
taskParamDto.setGroupId2(null);
|
taskParamDto.setEventDate(new Date());
|
taskParamDto.setWfDef(wfDef);
|
taskParamDto.setCurrentStep(currentStep);
|
taskParamDto.setBizInfoDto(bizInfoDto);
|
|
if (finallyStep.getStepNo() > currentStep.getStepNo()) {
|
|
Integer isSelfDept = currentStep.getIsSelfDept();
|
if (isSelfDept > 0 && bizInfoDto!=null) {
|
deptIds = bizInfoDto.getDeptIds();
|
}
|
if (isSelfDept == 0)
|
deptIds = null;
|
|
String bizGroupId = bizInfoList.get(0).getBizId();
|
if ("br".equals(currentStep.getTaskGroup())) {
|
List<SysUser> listUser = baseDao.getAssignUser(wfDef.getCode(), currentStep.getStepMarker(), bizId);
|
for (SysUser user : listUser) {
|
if (existsUsers.containsKey(user.getId())) {
|
continue;
|
}
|
existsUsers.put(user.getId(), "");
|
taskParamDto.setUser(user);
|
taskParamDto.setGroupId2(user.getId());
|
insertFlowTaskData(taskParamDto);
|
}
|
}
|
else if (currentStep.getTaskGroup() !=null && "pall,zrr,csr,shr,pzr".contains(currentStep.getTaskGroup())) {
|
String userList = null;
|
if ("zrr".equals(currentStep.getTaskGroup())) {
|
userList = bizInfoDto.getZrr();
|
}
|
if ("csr".equals(currentStep.getTaskGroup())) {
|
userList = bizInfoDto.getCsr();
|
}
|
if ("shr".equals(currentStep.getTaskGroup())) {
|
userList = bizInfoDto.getShr();
|
}
|
if ("pzr".equals(currentStep.getTaskGroup())) {
|
userList = bizInfoDto.getPzr();
|
}
|
if ("pall".equals(currentStep.getTaskGroup())) {
|
userList = bizInfoDto.getPall();
|
}
|
if (userList != null) {
|
String[] userArr = userList.split(",");
|
Long groupId2 = UUIDUtil.generateId();
|
for (String userStr : userArr) {
|
Long userId = Convert.toLong(userStr);
|
SysUser user = baseDao.getUserById(userId);
|
existsUsers.put(userId, "");
|
taskParamDto.setUser(user);
|
taskParamDto.setGroupId2(groupId2);
|
insertFlowTaskData(taskParamDto);
|
}
|
}
|
} else if ("sqr".equals(currentStep.getTaskGroup())) {
|
SysUser user = baseDao.getUserById(bizInfoList.get(0).getApplyUserId());
|
existsUsers.put(user.getId(), "");
|
taskParamDto.setUser(user);
|
taskParamDto.setGroupId2(user.getId());
|
insertFlowTaskData(taskParamDto);
|
} else {
|
String roleIds = currentStep.getApproverRoleIds();
|
if (StringUtils.isBlank(roleIds)) {
|
throw new RuntimeException("没有设置下一步流程角色!");
|
}
|
String[] roleIdArr = roleIds.split(",");
|
for (String roleId : roleIdArr) {
|
if (StringUtils.isBlank(roleId))
|
continue;
|
List<SysUser> listUser = baseDao.getTaskUser(roleId, deptIds);
|
for (SysUser user : listUser) {
|
if (existsUsers.containsKey(user.getId())) {
|
continue;
|
}
|
existsUsers.put(user.getId(), "");
|
taskParamDto.setUser(user);
|
taskParamDto.setGroupId2(Convert.toLong(roleId));
|
insertFlowTaskData(taskParamDto);
|
}
|
}
|
}
|
if (existsUsers.size() == 0) {
|
throw new RuntimeException("没有符合(" + wfDef.getName() + ")流程的下一步(" + currentStep.getName() + ")执行人!");
|
}
|
|
WfDefStep prevStep = workflowConfigService.get(prevStepId);
|
if (prevStep!=null) {
|
String updateSql = prevStep.getUpdateSql();
|
if (org.apache.commons.lang3.StringUtils.isNotBlank(updateSql)) {
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${nickName}", UserContext.getUser().getRealName());
|
updateSql = updateSql.replace("${userId}", UserContext.getUser().getId().toString());
|
baseDao.exeSql(updateSql);
|
}
|
}
|
} else {
|
taskParamDto.setUser(null);
|
taskParamDto.setGroupId2(null);
|
status = 100;
|
taskParamDto.setFinishTime(new Date());
|
taskParamDto.setStatus(status);
|
insertFlowTaskData(taskParamDto);
|
|
String updateSql = currentStep.getUpdateSql();
|
if (org.apache.commons.lang3.StringUtils.isNotBlank(updateSql)) {
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${nickName}", UserContext.getUser().getRealName());
|
updateSql = updateSql.replace("${userId}", UserContext.getUser().getId().toString());
|
baseDao.exeSql(updateSql);
|
}
|
|
WfDefStep prevStep = workflowConfigService.get(prevStepId);
|
if (prevStep!=null) {
|
updateSql = prevStep.getUpdateSql();
|
if (org.apache.commons.lang3.StringUtils.isNotBlank(updateSql)) {
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${bizId}", bizId.toString());
|
updateSql = updateSql.replace("${nickName}", UserContext.getUser().getRealName());
|
updateSql = updateSql.replace("${userId}", UserContext.getUser().getId().toString());
|
baseDao.exeSql(updateSql);
|
}
|
}
|
|
if (!StringUtils.isBlank(currentStep.getNextFlows())) {
|
boolean canNext = true;
|
if (!StringUtils.isBlank(currentStep.getPreFlows())) {
|
if (!this.isFlowFinish(currentStep.getPreFlows(), bizId)) {
|
canNext = false;
|
}
|
}
|
if (canNext) {
|
String[] nextFlowArr = currentStep.getNextFlows().split(",");
|
for (String nextFlowCode : nextFlowArr) {
|
this.startFlow(nextFlowCode, bizId);
|
}
|
}
|
}
|
}
|
if (currentStep.getStepType() == 0) {
|
WfRunInstance wfRunInstance = new WfRunInstance();
|
|
wfRunInstance.setFlowId(wfDef.getId());
|
wfRunInstance.setFlowCode(wfDef.getCode());
|
|
wfRunInstance.setBizId(bizId);
|
wfRunInstance.setRunStatus(1);
|
|
wfRunInstance.setHasOut(0);
|
wfRunInstance.setStepSite(currentStep.getStepSite());
|
wfRunInstance.setStepId(currentStep.getStepId());
|
wfRunInstance.setStepMarker(currentStep.getStepMarker());
|
wfRunInstance.setStepName(currentStep.getName());
|
wfRunInstance.setStatus(status);
|
wfRunInstance.setPrevId(preTaskId);
|
wfRunInstance.setPrevStepId(prevStepId);
|
|
wfRunInstance.setSenderId(UserContext.getUser().getId());
|
wfRunInstance.setSenderName(UserContext.getUser().getRealName());
|
wfRunInstance.setSenderTime(taskParamDto.getEventDate());
|
|
String param = bizInfoDto == null ? "" : bizInfoDto.getParam();
|
param = "".equals(param) ? "" : " (" + param + ")";
|
wfRunInstance.setRemark(wfDef.getRemark() + param);
|
|
wfRunInstance.setTitle(wfDef.getName());
|
if (bizInfoList.size() > 0) {
|
wfRunInstance.setBizGroupId(taskParamDto.getBizInfoDto().getBizGroupId());
|
wfRunInstance.setApplyUserId(taskParamDto.getBizInfoDto().getApplyUserId());
|
wfRunInstance.setApplyUser(taskParamDto.getBizInfoDto().getApplyUser());
|
wfRunInstance.setApplyTime(taskParamDto.getBizInfoDto().getApplyTime());
|
wfRunInstance.setTopic(taskParamDto.getBizInfoDto().getTopic());
|
}
|
|
if (isNewInstance) {
|
// wfRunInstance = new WfRunInstance();
|
wfRunInstance.setId(instanceId);
|
wfRunInstanceService.insert(wfRunInstance);
|
} else {
|
wfRunInstance.setId(wfRunInstanceOld.getId());
|
wfRunInstanceService.update(wfRunInstance);
|
}
|
}
|
|
WfDefStep prevStep = workflowConfigService.get(prevStepId);
|
if (prevStep != null && currentStep.getStepType() == 0) {
|
if (prevStep.getCopyTo() != null) {
|
String[] copyStepArr = prevStep.getCopyTo().split(",");
|
for (String stepMarker : copyStepArr) {
|
WfDefStep wfDefStep = this.queryWfDefStep(null, stepMarker);
|
if (wfDefStep != null)
|
setNextFlowTask(prevStep.getId(), wfDefStep.getId(), 0, bizId, null);
|
}
|
}
|
}
|
}
|
|
public void insertFlowTaskData(TaskParamDto taskParamDto) {
|
WfRunTask wfRunTask = new WfRunTask();
|
wfRunTask.setInstanceId(taskParamDto.getInstanceId());
|
wfRunTask.setPrevId(taskParamDto.getPreTaskId());
|
wfRunTask.setPrevStepId(taskParamDto.getPrevStepId());
|
wfRunTask.setFlowCode(taskParamDto.getWfDef().getCode());
|
wfRunTask.setFlowId(taskParamDto.getCurrentStep().getWfDefId());
|
wfRunTask.setStepId(taskParamDto.getCurrentStep().getId());
|
wfRunTask.setStepName(taskParamDto.getCurrentStep().getName());
|
wfRunTask.setStepMarker(taskParamDto.getCurrentStep().getStepMarker());
|
|
wfRunTask.setHasOut(0);
|
wfRunTask.setStepSite(taskParamDto.getCurrentStep().getStepSite());
|
|
wfRunTask.setBizId(taskParamDto.getBizId());
|
wfRunTask.setGroupId(taskParamDto.getGroupId());
|
wfRunTask.setGroupId2(taskParamDto.getGroupId2());
|
|
wfRunTask.setSenderId(UserContext.getUser().getId());
|
wfRunTask.setSenderName(UserContext.getUser().getRealName());
|
wfRunTask.setSenderTime(taskParamDto.getEventDate());
|
|
if (taskParamDto.getUser() != null) {
|
wfRunTask.setReceiveId(taskParamDto.getUser().getId());
|
wfRunTask.setReceiveName(taskParamDto.getUser().getRealName());
|
}
|
|
wfRunTask.setReceiveTime(taskParamDto.getEventDate());
|
wfRunTask.setOpenTime(null);
|
wfRunTask.setFinishTime(null);
|
wfRunTask.setFinishTime2(null);
|
|
wfRunTask.setStatus(taskParamDto.getStatus());
|
String param = "";
|
if (taskParamDto.getBizInfoDto() != null) {
|
param = taskParamDto.getBizInfoDto().getParam();
|
wfRunTask.setBizGroupId(taskParamDto.getBizInfoDto().getBizGroupId());
|
wfRunTask.setApplyUserId(taskParamDto.getBizInfoDto().getApplyUserId());
|
wfRunTask.setApplyUser(taskParamDto.getBizInfoDto().getApplyUser());
|
wfRunTask.setApplyTime(taskParamDto.getBizInfoDto().getApplyTime());
|
wfRunTask.setTopic(taskParamDto.getBizInfoDto().getTopic());
|
}
|
if (StringUtils.isBlank(taskParamDto.getCurrentStep().getStepTitle())) {
|
wfRunTask.setTitle(taskParamDto.getWfDef().getName());
|
} else {
|
wfRunTask.setTitle(taskParamDto.getCurrentStep().getStepTitle());
|
}
|
param = "".equals(param) ? "" : " (" + param + ")";
|
wfRunTask.setRemark(taskParamDto.getWfDef().getRemark() + param);
|
|
baseDao.insert(wfRunTask);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public Boolean writeFlowTask(WfRunTask wfRunTask) {
|
Date eventDate = new Date();
|
Long groupId = UUIDUtil.generateId();
|
// wfRunTask.setPrevId(0L);
|
/// wfRunTask.setPrevStepId(0L);
|
// wfRunTask.setFlowId(currentStep.getWfDefId());
|
// wfRunTask.setFlowCode(wfDef.get(0).getCode());
|
// wfRunTask.setStepId(currentStep.getId());
|
// wfRunTask.setStepName(currentStep.getName());
|
// wfRunTask.setStepMarker(currentStep.getStepMarker());
|
// wfRunTask.setBizId(bizId);
|
// wfRunTask.setTitle(currentStep.getStepTitle());
|
wfRunTask.setSenderId(UserContext.getUser().getId());
|
wfRunTask.setSenderName(UserContext.getUser().getRealName());
|
wfRunTask.setSenderTime(eventDate);
|
|
wfRunTask.setGroupId(groupId);
|
wfRunTask.setGroupId2(groupId);
|
// wfRunTask.setReceiveId(UserContext.getUser().getId());
|
// wfRunTask.setReceiveName(UserContext.getUser().getRealName());
|
wfRunTask.setReceiveTime(eventDate);
|
wfRunTask.setOpenTime(null);
|
wfRunTask.setFinishTime(null);
|
wfRunTask.setFinishTime2(null);
|
|
// wfRunTask.setStatus(100);
|
wfRunTask.setApplyUserId(UserContext.getUser().getId());
|
wfRunTask.setApplyUser(UserContext.getUser().getRealName());
|
wfRunTask.setApplyTime(eventDate);
|
|
baseDao.insert(wfRunTask);
|
return true;
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public Boolean startFlow(String wfCode, Long bizId) {
|
if (hasExistFlow(wfCode, bizId)) {
|
return false;
|
}
|
WfDefStep firstStep = this.queryWfDefFirstStep(wfCode);
|
if (firstStep == null) {
|
throw new RuntimeException("没有定义流程" + wfCode);
|
}
|
|
// this.createFlowInstance(wfCode,bizId);
|
this.setFlowTask(0L, firstStep.getId(), 0, bizId, null, 0);
|
return true;
|
}
|
|
public void createFlowInstance(String wfCode, Long bizId) {
|
WfDef wfDef = wfDefDao.queryWfDef(null, wfCode).get(0);
|
WfRunInstance wfRunInstance = new WfRunInstance();
|
wfRunInstance.setFlowId(wfDef.getId());
|
wfRunInstance.setFlowCode(wfDef.getCode());
|
wfRunInstance.setBizId(bizId);
|
wfRunInstanceService.insert(wfRunInstance);
|
}
|
|
public void deleteFlowTask(String wfIdCodes, Long bizId) {
|
baseDao.deleteFlowTask(wfIdCodes, bizId);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public void approvePass(String wfIdCode, Long bizId, String stepIdMark) {
|
WfDefStep taskDbStep = this.queryCurrentTaskStep(wfIdCode, bizId);
|
if (taskDbStep == null) {
|
throw new RuntimeException("没有当前任务");
|
}
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该步骤");
|
}
|
|
WfDefStep endStep = this.queryWfDefFinallyStep(wfIdCode);
|
if (currentStep.getStepNo() == endStep.getStepNo()) {
|
throw new RuntimeException("已经完成了,不能继续提交");
|
}
|
|
if (taskDbStep.getStepNo() != currentStep.getStepNo()) {
|
throw new RuntimeException("其他用户已经提交");
|
} else {
|
Long nextStepId = 0L;
|
if (currentStep.getStepType() == 0) {
|
WfDefStep nextStep = this.queryWfDefNextStep(currentStep);
|
nextStepId = nextStep.getId();
|
}
|
this.setFlowTask(currentStep.getId(), nextStepId, 0, bizId, null, 2);
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public void approvePass2(String wfIdCode, Long bizId, String stepIdMark, String nextStepIdMark) {
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该当前步骤");
|
}
|
|
Long nextStepId = 0L;
|
if (currentStep.getStepType() == 0) {
|
WfDefStep nextStep = this.queryWfDefStep(wfIdCode, nextStepIdMark);
|
nextStepId = nextStep.getId();
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有指定下一步步骤");
|
}
|
}
|
|
WfDefStep endStep = this.queryWfDefFinallyStep(wfIdCode);
|
if (currentStep.getStepNo() == endStep.getStepNo()) {
|
throw new RuntimeException("已经完成了,不能继续提交");
|
}
|
this.setFlowTask(currentStep.getId(), nextStepId, 0, bizId, null, 2);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public void approveDirectPass(String wfIdCode, Long bizId, String stepIdMark, String nextStepIdMark) {
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该当前步骤");
|
}
|
|
Long nextStepId = 0L;
|
if (currentStep.getStepType() == 0) {
|
WfDefStep nextStep = this.queryWfDefStep(wfIdCode, nextStepIdMark);
|
nextStepId = nextStep.getId();
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有指定下一步步骤");
|
}
|
}
|
|
WfDefStep endStep = this.queryWfDefFinallyStep(wfIdCode);
|
if (currentStep.getStepNo() == endStep.getStepNo()) {
|
throw new RuntimeException("已经完成了,不能继续提交");
|
}
|
this.setNextFlowTask(currentStep.getId(), nextStepId, 0, bizId, null);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
// 驳回到上一步
|
public void approveRefuse(String wfIdCode, Long bizId, String stepIdMark) {
|
WfDefStep taskDbStep = this.queryCurrentTaskStep(wfIdCode, bizId);
|
if (taskDbStep == null) {
|
throw new RuntimeException("没有当前任务");
|
}
|
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该步骤");
|
}
|
|
WfDefStep firstStep = this.queryWfDefFirstStep(wfIdCode);
|
if (currentStep.getStepNo() == firstStep.getStepNo()) {
|
throw new RuntimeException("已经第一步了,不能驳回");
|
}
|
|
if (taskDbStep.getStepNo() != currentStep.getStepNo()) {
|
throw new RuntimeException("其他用户已经提交");
|
} else {
|
WfDefStep preStep = this.queryWfDefPreStep(currentStep);
|
this.setFlowTask(currentStep.getId(), preStep.getId(), 1, bizId, null, 1);
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
// 驳回到指定步骤
|
public void approveRefuse2(String wfIdCode, Long bizId, String stepIdMark, String prevStepIdMark) {
|
WfDefStep taskDbStep = this.queryCurrentTaskStep100(wfIdCode, bizId);
|
if (taskDbStep == null) {
|
throw new RuntimeException("没有当前任务");
|
}
|
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该当前步骤");
|
}
|
|
WfDefStep firstStep = this.queryWfDefFirstStep(wfIdCode);
|
if (currentStep.getStepNo() == firstStep.getStepNo()) {
|
throw new RuntimeException("已经第一步了,不能驳回");
|
}
|
|
WfDefStep preStep = this.queryWfDefStep(wfIdCode, prevStepIdMark);
|
if (preStep == null) {
|
throw new RuntimeException("该流程没有指定前一步步骤");
|
}
|
this.setFlowTask(currentStep.getId(), preStep.getId(), 1, bizId, null, 1);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
// 重新从某一步开始
|
public void reStartFlow(String wfIdCode, Long bizId, String stepIdMark, String prevStepIdMark) {
|
WfDefStep taskDbStep = this.queryCurrentTaskStep100(wfIdCode, bizId);
|
if (taskDbStep == null) {
|
throw new RuntimeException("没有当前任务");
|
}
|
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (currentStep == null) {
|
throw new RuntimeException("该流程没有该当前步骤");
|
}
|
|
WfDefStep firstStep = this.queryWfDefFirstStep(wfIdCode);
|
if (currentStep.getStepNo() == firstStep.getStepNo()) {
|
throw new RuntimeException("已经第一步了,不能驳回");
|
}
|
|
WfDefStep preStep = this.queryWfDefStep(wfIdCode, prevStepIdMark);
|
if (preStep == null) {
|
throw new RuntimeException("该流程没有指定前一步步骤");
|
}
|
baseDao.setReStartStatus(wfIdCode, bizId);
|
this.setFlowTask(currentStep.getId(), preStep.getId(), 0, bizId, null, 1);
|
}
|
|
public Map<String, WfRunTask> getSingleFlowStatus(String wfIdCodes, Long bizId) {
|
int lastStepStatus = 100;
|
Map<String, WfRunTask> result = new HashMap<>();
|
if ("yearPlanFlow".equals(wfIdCodes)) {
|
WfRunTask item_zl = new WfRunTask();
|
WfRunTask item_cz = new WfRunTask();
|
int count = baseDao.getRoleCount(UserContext.getUser().getId(), "zlbm");
|
if (count > 1) {
|
item_zl.setStatus(1);
|
item_cz.setStatus(0);
|
} else {
|
item_zl.setStatus(20);
|
item_cz.setStatus(1);
|
}
|
result.put("yearPlanFlow_zl", item_zl);
|
result.put("yearPlanFlow_cz", item_cz);
|
} else if ("yearPlanFlow2".equals(wfIdCodes)) {
|
WfRunTask item_zl = new WfRunTask();
|
WfRunTask item_cz = new WfRunTask();
|
int status = baseDao.getPlanStatus(bizId);
|
if (status == 10) {
|
item_zl.setStatus(20);
|
item_cz.setStatus(20);
|
} else if (status == 5) {
|
item_zl.setStatus(20);
|
item_cz.setStatus(1);
|
} else {
|
item_zl.setStatus(1);
|
item_cz.setStatus(0);
|
}
|
|
result.put("yearPlanFlow_zl", item_zl);
|
result.put("yearPlanFlow_cz", item_cz);
|
} else {
|
List<WfRunTask> list = baseDao.getSingleFlowStatus(wfIdCodes, bizId);
|
for (WfRunTask item : list) {
|
lastStepStatus = checkStaus(lastStepStatus, item.getStatus(), item);
|
item.setStatus(lastStepStatus);
|
result.put(item.getStepMarker(), item);
|
}
|
}
|
return result;
|
}
|
|
public int checkStaus(int lastStepStatus, int currentStepStatus, WfRunTask item) {
|
if (currentStepStatus > lastStepStatus && !"jzjys_sc".equals(item.getStepMarker())) {
|
return 0;
|
} else {
|
return currentStepStatus;
|
}
|
}
|
|
public Map<String, WfRunTask> getFlowStatus(String wfIdCodes, Long bizId) {
|
int lastStepStatus = 0;
|
String lastflowCode = "";
|
Map<String, WfRunTask> result = new HashMap<>();
|
List<WfRunTask> list = baseDao.getFlowStatus(wfIdCodes, bizId);
|
for (WfRunTask item : list) {
|
if (!lastflowCode.equals(item.getFlowCode())) {
|
lastflowCode = item.getFlowCode();
|
lastStepStatus = item.getStatus();
|
result.put(item.getStepMarker(), item);
|
} else {
|
lastStepStatus = checkStaus(lastStepStatus, item.getStatus(), item);
|
item.setStatus(lastStepStatus);
|
result.put(item.getStepMarker(), item);
|
}
|
}
|
|
List<WfRunTask> list2 = baseDao.getFlowStatus2(wfIdCodes, bizId);
|
for (WfRunTask item : list2) {
|
if (!lastflowCode.equals(item.getFlowCode())) {
|
lastflowCode = item.getFlowCode();
|
lastStepStatus = item.getStatus();
|
result.put(item.getStepMarker(), item);
|
} else {
|
lastStepStatus = checkStaus(lastStepStatus, item.getStatus(), item);
|
item.setStatus(lastStepStatus);
|
result.put(item.getStepMarker(), item);
|
}
|
}
|
return result;
|
}
|
|
public Map<String, WfRunTask> getFlowStatus2(String wfIdCodes, Long bizId) {
|
Map<String, WfRunTask> result = new HashMap<>();
|
List<WfRunTask> list = baseDao.getFlowStatus3(wfIdCodes, bizId);
|
for (WfRunTask item : list) {
|
result.put(item.getFlowCode(), item);
|
}
|
return result;
|
}
|
|
// 弃用
|
public Map<String, Integer> getPlanFlowStatus(Long bizId) {
|
Map<String, Integer> result = new HashMap<>();
|
/*
|
* List<WfRunTask> list = baseDao.getPLanFlowStatus(bizId); for (WfRunTask item
|
* : list) { result.put(item.getFlowCode(), item.getStatus()); }
|
*/
|
return result;
|
}
|
|
// 准备弃用
|
public Map<String, WfRunTask> getPlanFlowStatus2(Long bizId) {
|
Map<String, WfRunTask> result = new HashMap<>();
|
/*
|
* List<WfRunTask> list = baseDao.getPLanFlowStatus(bizId); for (WfRunTask item
|
* : list) { if ("planFlow".equals(item.getFlowCode()))
|
* result.put("gcjd_plan_tybx", item); else if
|
* ("sgmxFlow".equals(item.getFlowCode())) result.put("gcjd_sgmx_bb", item);
|
* else if ("sgqdFlow".equals(item.getFlowCode())) result.put("gcjd_sgqd_cz",
|
* item); else if ("gckyFlow".equals(item.getFlowCode()))
|
* result.put("gcjd_gcky_bb", item); else if
|
* ("gywjFlow".equals(item.getFlowCode())) result.put("gcjd_gywj_sc", item);
|
* else if ("jzjFlow".equals(item.getFlowCode())) result.put("gcjd_jzj_bb",
|
* item); else if ("wltFlow".equals(item.getFlowCode()))
|
* result.put("gcjd_wlt_pz", item); else if
|
* ("wxsbFlow".equals(item.getFlowCode())) result.put("gcjd_wxsb_wxsb", item);
|
* else if ("jsfaFlow".equals(item.getFlowCode())) result.put("gcjd_jsfa_sc",
|
* item); else if ("yxscFlow".equals(item.getFlowCode()))
|
* result.put("gcjd_yxsc_bb", item); }
|
*/
|
return result;
|
}
|
|
public Map<String, WfRunTask> getPhaseFlowStatus(String wfIdCode, Long bizId) {
|
Map<String, WfRunTask> result = new HashMap<>();
|
List<WfRunTask> list = baseDao.getPhaseFlowStatus(wfIdCode, bizId);
|
for (WfRunTask item : list) {
|
result.put(item.getFlowCode(), item);
|
}
|
return result;
|
}
|
|
public Boolean getFlowStepFinish(String wfIdCode, Long bizId, String stepIdMark) {
|
Integer finishNum = baseDao.getFlowStepFinish(wfIdCode, bizId, stepIdMark);
|
if (finishNum > 0)
|
return false;
|
else
|
return true;
|
}
|
|
public Boolean getFlowStepFinish2(String wfIdCode, Long bizId, String stepIdMark) {
|
Integer finishNum = baseDao.getFlowStepFinish2(wfIdCode, bizId, stepIdMark);
|
if (finishNum > 0)
|
return true;
|
else
|
return false;
|
}
|
|
public Boolean isMyStepFinish(String wfIdCode, Long bizId, String stepIdMark) {
|
Integer finishNum = baseDao.isMyStepFinish(wfIdCode, bizId, stepIdMark, UserContext.getUser().getId());
|
if (finishNum > 0) {
|
// 我的完成了
|
return true;
|
} else {
|
// 我的未完成了
|
return false;
|
}
|
}
|
|
/*
|
* myStatus 0: 不是我的步骤 1: 是我的步骤,当前正需要我执行 2:其他情况 5:步骤执行过了
|
*/
|
public WfRunTask getFlowStepStatus(String wfIdCode, Long bizId, String stepIdMark) {
|
WfRunTask result = null;
|
WfDefStep requestStep = this.queryWfDefStep(wfIdCode, stepIdMark);
|
if (requestStep != null) {
|
List<WfRunTask> list = baseDao.getFlowStepStatus(wfIdCode, bizId);
|
if (list.size() > 0) {
|
result = list.get(0);
|
result.setMyStatus(0);
|
WfDefStep currentStep = this.queryWfDefStep(wfIdCode, list.get(0).getStepMarker());
|
Integer myStep = baseDao.isMyStep(wfIdCode, bizId, requestStep.getStepMarker(),
|
UserContext.getUser().getId());
|
if (myStep > 0)
|
result.setMyStatus(1);
|
else if (currentStep.getStepNo() > requestStep.getStepNo()) {
|
result.setMyStatus(5); // 执行过了
|
} else if (currentStep.getStepNo() == requestStep.getStepNo()) {
|
result.setMyStatus(2);
|
}
|
}
|
}
|
return result;
|
}
|
|
public WfRunTask getFlowStepStatus2(String wfIdCode, Long bizId, String stepIdMark) {
|
List<WfRunTask> list = baseDao.getFlowStepStatus(wfIdCode, bizId);
|
WfRunTask result = null;
|
if (list.size() > 0) {
|
result = list.get(0);
|
result.setMyStatus(0);
|
if (result.getStatus() == 0 || result.getStatus() == 1) {
|
Integer myStep = baseDao.isMyStep(wfIdCode, bizId, result.getStepMarker(),
|
UserContext.getUser().getId());
|
if (myStep > 0)
|
result.setMyStatus(1);
|
else
|
result.setMyStatus(2);
|
}
|
}
|
return result;
|
}
|
|
public List<Map<String, Object>> getStepCount(String wfIdCode, Long bizId) {
|
List<WfRunTask> list = baseDao.getStepCount(wfIdCode, bizId);
|
List<Map<String, Object>> result = new ArrayList<>();
|
Map<String, Object> map = new HashMap<>();
|
map.put("name", "数量");
|
for (WfRunTask item : list) {
|
map.put(item.getStepMarker(), item.getStatus());
|
}
|
result.add(map);
|
return result;
|
}
|
|
public Boolean hasExistFlow(String wfIdCode, Long bizId) {
|
Integer num = baseDao.getBizTaskCount(wfIdCode, bizId);
|
return num > 0 ? true : false;
|
}
|
|
public String recallFlow(String wfIdCode, Long bizId, String stepMarker, Long taskId, Long taskPrevId) {
|
WfRunTask task = getFlowStepStatus(wfIdCode, bizId, stepMarker);
|
if (task != null) {
|
if (task.getStatus() == 0 || task.getStatus() == 1) {
|
if (localServer.equals(task.getStepSite()) || localServer.equals("yjs") || task.getHasOut() == 0) {
|
baseDao.setTaskRecall(taskId, wfIdCode);
|
WfRunTask task2 = baseDao.selectById(taskId);
|
if (task2 != null) {
|
Long stepId = task2.getStepId();
|
WfDefStep wfDefStep = workflowConfigService.get(stepId);
|
this.refuseExecSql(wfDefStep, bizId);
|
}
|
return "OK";
|
} else {
|
return "已经导出到其他服务器执行,不能撤回了";
|
}
|
}
|
}
|
return "任务已经执行完毕,不能撤回了";
|
}
|
|
public void refuseExecSql(WfDefStep wfDefStep, Long bizId) {
|
if (wfDefStep != null) {
|
String sqlStr = wfDefStep.getRecallSql();
|
if (StringUtils.isNotEmpty(sqlStr)) {
|
sqlStr = sqlStr.replace("${bizId}", bizId.toString());
|
baseDao.exeSql(sqlStr);
|
}
|
}
|
}
|
|
public Map<String, Map<String, String>> getAllSteps() {
|
Map<String, String> bean = new HashMap<>();
|
bean.put("status", "");
|
bean.put("receiveName", "");
|
Map<String, Map<String, String>> result = new HashMap<>();
|
List<String> list = wfDefStepDao.getAllSteps();
|
for (String item : list) {
|
result.put(item, bean);
|
}
|
return result;
|
}
|
|
public List<WfRunTask> getConnectInformation(String oldShipTeam) {
|
return baseDao.getConnectInformation(oldShipTeam);
|
}
|
|
public void updateConnect(String oldShipTeam) {
|
baseDao.updateConnect(oldShipTeam);
|
}
|
|
public List<WfRunTask> getFlowTrack(String flowCode, Long bizId) {
|
List<WfRunTask> flowTrack = baseDao.getFlowTrack(flowCode, bizId);
|
return flowTrack;
|
}
|
|
public String getFlowStepName(String wfIdCodes, Long bizId) {
|
return baseDao.getFlowStepName(wfIdCodes, bizId);
|
}
|
|
public void deleteFlowStep(String wfIdCode, String stepIdMark, Long bizId){
|
baseDao.deleteFlowStep(wfIdCode,stepIdMark,bizId);
|
}
|
|
public void getRunFlow(List<? extends BusiEntity> dataList, String flowCode) {
|
List<Long> ids = dataList.stream().map(f -> f.getId()).collect(Collectors.toList());
|
Map<String, Object> params = new HashMap<String, Object>();
|
params.put("bizIds", ids);
|
params.put("flowCode", flowCode);
|
List<FlowInfo> list = baseDao.getRunFlow(params);
|
for (BaseEntity item : dataList) {
|
List<FlowInfo> list2 = list.stream().filter(item2->item2.getBizId().equals(item.getId())).collect(Collectors.toList());
|
if (list2.size()>0) {
|
item.setFlowInfo(list2.get(0));
|
}else{
|
item.setFlowInfo(new FlowInfo());
|
}
|
}
|
}
|
}
|