|
@@ -8,10 +8,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
import com.dayou.common.BaseEntity;
|
|
import com.dayou.common.BaseEntity;
|
|
import com.dayou.dto.HandlerPermissionDTO;
|
|
import com.dayou.dto.HandlerPermissionDTO;
|
|
import com.dayou.dto.WorkNodeCommit;
|
|
import com.dayou.dto.WorkNodeCommit;
|
|
|
|
+import com.dayou.dto.WorkNodeDTO;
|
|
import com.dayou.entity.*;
|
|
import com.dayou.entity.*;
|
|
import com.dayou.enums.MainBusinessEnum;
|
|
import com.dayou.enums.MainBusinessEnum;
|
|
import com.dayou.enums.workflow.HandlerPermissionEnum;
|
|
import com.dayou.enums.workflow.HandlerPermissionEnum;
|
|
import com.dayou.enums.workflow.NodeLogEnum;
|
|
import com.dayou.enums.workflow.NodeLogEnum;
|
|
|
|
+import com.dayou.enums.workflow.NodeStateEnum;
|
|
|
|
+import com.dayou.enums.workflow.WorkflowNodeEnum;
|
|
import com.dayou.exception.ErrorCode;
|
|
import com.dayou.exception.ErrorCode;
|
|
import com.dayou.mapper.DepartmentMapper;
|
|
import com.dayou.mapper.DepartmentMapper;
|
|
import com.dayou.mapper.MajorMapper;
|
|
import com.dayou.mapper.MajorMapper;
|
|
@@ -21,8 +24,11 @@ import com.dayou.service.IUserPostService;
|
|
import com.dayou.service.IUserService;
|
|
import com.dayou.service.IUserService;
|
|
import com.dayou.service.workflow.IWorkFlowLogService;
|
|
import com.dayou.service.workflow.IWorkFlowLogService;
|
|
import com.dayou.service.workflow.IWorkFlowNodeInstanceService;
|
|
import com.dayou.service.workflow.IWorkFlowNodeInstanceService;
|
|
|
|
+import com.dayou.service.workflow.IWorkNodeService;
|
|
import com.dayou.service.workflow.IWorkTaskRecordService;
|
|
import com.dayou.service.workflow.IWorkTaskRecordService;
|
|
import com.dayou.utils.LoginContext;
|
|
import com.dayou.utils.LoginContext;
|
|
|
|
+import com.dayou.workflow.handler.MajorNodeHandler;
|
|
|
|
+import com.dayou.workflow.handler.PersonalNodeHandler;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -31,6 +37,9 @@ import java.time.LocalDateTime;
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
|
|
|
+import static com.dayou.common.Constants.MAJOR_HANDLER;
|
|
|
|
+import static com.dayou.common.Constants.PERSONAL_HANDLER;
|
|
|
|
+import static com.dayou.enums.workflow.NodeLogEnum.PASS;
|
|
import static com.dayou.enums.workflow.NodeStateEnum.*;
|
|
import static com.dayou.enums.workflow.NodeStateEnum.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -52,32 +61,53 @@ public class WorkNodeProcessable {
|
|
@Autowired
|
|
@Autowired
|
|
private WorkTaskRecordMapper workTaskRecordMapper;
|
|
private WorkTaskRecordMapper workTaskRecordMapper;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkNodeService workNodeService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 前进
|
|
|
|
|
|
+ * 提交流程前置处理
|
|
* @param commit
|
|
* @param commit
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public boolean forward(WorkNodeCommit commit){
|
|
|
|
- WorkFlowNodeInstance instanceNode = workFlowNodeInstanceService.getById(commit.getInstanceNodeId());
|
|
|
|
-
|
|
|
|
|
|
+ @Transactional
|
|
|
|
+ protected WorkNodeDTO beforeForward(WorkNodeCommit commit,WorkFlowNodeInstance currentInstanceNode){
|
|
//节点控制前置处理。
|
|
//节点控制前置处理。
|
|
//当任务不需要当前节点处理人产生业务数据的时候,则把任务状态改为已完成。
|
|
//当任务不需要当前节点处理人产生业务数据的时候,则把任务状态改为已完成。
|
|
- List<Long> notBusinessHandleTaskId = workTaskRecordMapper.getNotBusinessHandleTaskId(instanceNode.getId());
|
|
|
|
|
|
+ List<Long> notBusinessHandleTaskId = workTaskRecordMapper.getNotBusinessHandleTaskId(currentInstanceNode.getId());
|
|
if (CollectionUtil.isNotEmpty(notBusinessHandleTaskId)){
|
|
if (CollectionUtil.isNotEmpty(notBusinessHandleTaskId)){
|
|
- return workTaskRecordService.update(new LambdaUpdateWrapper<WorkTaskRecord>().set(WorkTaskRecord::getFinished,Boolean.TRUE)
|
|
|
|
|
|
+ workTaskRecordService.update(new LambdaUpdateWrapper<WorkTaskRecord>().set(WorkTaskRecord::getFinished,Boolean.TRUE)
|
|
.set(WorkTaskRecord::getFinishTime, LocalDateTime.now()).in(BaseEntity::getId,notBusinessHandleTaskId));
|
|
.set(WorkTaskRecord::getFinishTime, LocalDateTime.now()).in(BaseEntity::getId,notBusinessHandleTaskId));
|
|
}
|
|
}
|
|
|
|
|
|
- // 校验相同节点是否已创建
|
|
|
|
-// WorkFlowNodeInstance nextInstanceNode = workFlowNodeInstanceService.getOne(new LambdaQueryWrapper<WorkFlowNodeInstance>()
|
|
|
|
-// .eq(WorkFlowNodeInstance::getFlowId, instanceNode.getFlowId()).eq(WorkFlowNodeInstance::getBusinessId, instanceNode.getBusinessId())
|
|
|
|
-// .eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
|
|
|
+ if (commit.getState().equals(PASS) && commit.getIfCheckTask()){
|
|
|
|
+ if (checkCurrentNodeTaskState(currentInstanceNode)){
|
|
|
|
+ //将当前节点状态变更成已完成
|
|
|
|
+ workFlowNodeInstanceService.update(new LambdaUpdateWrapper<WorkFlowNodeInstance>().set(WorkFlowNodeInstance::getState,NodeStateEnum.FINISHED)
|
|
|
|
+ .set(WorkFlowNodeInstance::getComment,commit.getComments()).eq(BaseEntity::getId,currentInstanceNode.getId()));
|
|
|
|
+ addWorkflowLog(commit,currentInstanceNode);
|
|
|
|
+ }else {
|
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.TASK_NOT_FINISHED);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //确认当前节点是否需要校验业务数据
|
|
|
|
+ //寻找下一个节点,有可能下一个节点并非流程配置的节点,需根据业务数据变动
|
|
|
|
+ WorkNodeDTO nextWorkNode = workNodeService.getNextWorkNode(currentInstanceNode.getFlowId(), currentInstanceNode.getNodeId());
|
|
|
|
+
|
|
|
|
+ if (nextWorkNode==null && !currentInstanceNode.getNodeCode().equals(WorkflowNodeEnum.BUSINESS_ARCHIVING.name())){
|
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.NEXT_NODE_NOT_EXISTS);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nextWorkNode;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
- return instanceNode!=null;
|
|
|
|
|
|
+ public boolean forward(WorkNodeCommit workNodeCommit) {
|
|
|
|
+ return Boolean.FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 跳过
|
|
* 跳过
|
|
* @param commit
|
|
* @param commit
|
|
@@ -123,15 +153,7 @@ public class WorkNodeProcessable {
|
|
workTaskRecordService.remove(new LambdaQueryWrapper<WorkTaskRecord>().eq(WorkTaskRecord::getInstanceId,instanceNodeId));
|
|
workTaskRecordService.remove(new LambdaQueryWrapper<WorkTaskRecord>().eq(WorkTaskRecord::getInstanceId,instanceNodeId));
|
|
|
|
|
|
//添加日志
|
|
//添加日志
|
|
- WorkFlowLog log = new WorkFlowLog();
|
|
|
|
- log.setBusinessId(currentNode.getBusinessId());
|
|
|
|
- log.setBusinessType(currentNode.getBusinessType());
|
|
|
|
- log.setHandingTime(new Date().getTime() - currentNode.getCreated().getTime());
|
|
|
|
- log.setHandlerId(LoginContext.getCurrentUserId());
|
|
|
|
- log.setComments(commit.getComments());
|
|
|
|
- log.setState(NodeLogEnum.REVERSE.name());
|
|
|
|
- log.setInstanceId(commit.getInstanceNodeId());
|
|
|
|
- return workFlowLogService.add(log);
|
|
|
|
|
|
+ return addWorkflowLog(commit,currentNode);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -160,19 +182,81 @@ public class WorkNodeProcessable {
|
|
.eq(WorkFlowNodeInstance::getId,commit.getInstanceNodeId()));
|
|
.eq(WorkFlowNodeInstance::getId,commit.getInstanceNodeId()));
|
|
|
|
|
|
//添加日志
|
|
//添加日志
|
|
- WorkFlowLog log = new WorkFlowLog();
|
|
|
|
- log.setBusinessId(currentNode.getBusinessId());
|
|
|
|
- log.setBusinessType(currentNode.getBusinessType());
|
|
|
|
- log.setHandingTime(new Date().getTime() - currentNode.getCreated().getTime());
|
|
|
|
- log.setHandlerId(LoginContext.getCurrentUserId());
|
|
|
|
- log.setComments(commit.getComments());
|
|
|
|
- log.setState(NodeLogEnum.TERMINATE.name());
|
|
|
|
- log.setInstanceId(commit.getInstanceNodeId());
|
|
|
|
- return workFlowLogService.add(log);
|
|
|
|
|
|
+ return addWorkflowLog(commit,currentNode);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
public Long searchHandlerId(WorkFlowNodeInstance instanceNode, HandlerPermissionDTO handlerPermissionDTO){
|
|
public Long searchHandlerId(WorkFlowNodeInstance instanceNode, HandlerPermissionDTO handlerPermissionDTO){
|
|
return 0L;
|
|
return 0L;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 检查节点任务状态
|
|
|
|
+ * @param currentInstanceNode
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private Boolean checkCurrentNodeTaskState(WorkFlowNodeInstance currentInstanceNode){
|
|
|
|
+ List<WorkTaskRecord> notFinish = workTaskRecordService.list(new LambdaQueryWrapper<WorkTaskRecord>().eq(WorkTaskRecord::getInstanceId, currentInstanceNode.getId())
|
|
|
|
+ .eq(WorkTaskRecord::getFinished,Boolean.FALSE)
|
|
|
|
+ .eq(BaseEntity::getDeleted, Boolean.FALSE));
|
|
|
|
+ return CollectionUtil.isEmpty(notFinish);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 添加流程日志
|
|
|
|
+ * @param workNodeCommit
|
|
|
|
+ */
|
|
|
|
+ protected boolean addWorkflowLog(WorkNodeCommit workNodeCommit,WorkFlowNodeInstance currentInstanceNode){
|
|
|
|
+ WorkFlowLog log = new WorkFlowLog();
|
|
|
|
+ log.setBusinessId(currentInstanceNode.getBusinessId());
|
|
|
|
+ log.setBusinessType(currentInstanceNode.getBusinessType());
|
|
|
|
+ log.setHandingTime(new Date().getTime() - currentInstanceNode.getCreated().getTime());
|
|
|
|
+ log.setHandlerId(LoginContext.getCurrentUserId());
|
|
|
|
+ log.setComments(workNodeCommit.getComments());
|
|
|
|
+ log.setState(workNodeCommit.getState().name());
|
|
|
|
+ log.setInstanceId(workNodeCommit.getInstanceNodeId());
|
|
|
|
+ log.setBusinessSubId(workNodeCommit.getBusinessSubId());
|
|
|
|
+ log.setBusinessMinId(workNodeCommit.getBusinessMinId());
|
|
|
|
+ return workFlowLogService.add(log);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建节点实例
|
|
|
|
+ * @param nextWorkNode
|
|
|
|
+ * @param currentInstanceNode
|
|
|
|
+ * @param businessSubId
|
|
|
|
+ * @param businessMinId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private WorkFlowNodeInstance buildNodeInstance(WorkNodeDTO nextWorkNode, WorkFlowNodeInstance currentInstanceNode, String businessSubId, String businessMinId){
|
|
|
|
+ WorkFlowNodeInstance nodeInstance = new WorkFlowNodeInstance();
|
|
|
|
+ nodeInstance.setNodeId(nextWorkNode.getId());
|
|
|
|
+ nodeInstance.setFlowId(nextWorkNode.getFlowId());
|
|
|
|
+ nodeInstance.setBusinessId(currentInstanceNode.getBusinessId());
|
|
|
|
+ nodeInstance.setBusinessSubId(businessSubId);
|
|
|
|
+ nodeInstance.setBusinessMinId(businessMinId);
|
|
|
|
+ nodeInstance.setBusinessType(currentInstanceNode.getBusinessType());
|
|
|
|
+ nodeInstance.setSequence((currentInstanceNode.getSequence()==null?0:currentInstanceNode.getSequence())+1);
|
|
|
|
+ nodeInstance.setState(NodeStateEnum.PENDING.name());
|
|
|
|
+ return nodeInstance;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 创建运行时的下一个节点实例
|
|
|
|
+ * @param currentInstanceNode
|
|
|
|
+ */
|
|
|
|
+ protected void addNextInstanceNode(WorkFlowNodeInstance currentInstanceNode,WorkNodeDTO nextWorkNode,Long handlerId,String businessSubId,String businessMinId){
|
|
|
|
+ if (nextWorkNode!=null){
|
|
|
|
+ List<WorkNodeTask> tasks = nextWorkNode.getTasks();
|
|
|
|
+ //如果该节点下面只有一个任务,且由系统控制。则需要相关条件判断需不需要创建该节点实例
|
|
|
|
+ WorkFlowNodeInstance nodeInstance = buildNodeInstance(nextWorkNode, currentInstanceNode,businessSubId,businessMinId);
|
|
|
|
+ workFlowNodeInstanceService.add(nodeInstance);
|
|
|
|
+ if (CollectionUtil.isNotEmpty(tasks)){
|
|
|
|
+ workTaskRecordService.doCreateNodeTaskRecord(this,tasks,nodeInstance,handlerId);
|
|
|
|
+ }
|
|
|
|
+ // 节点下面没有任务,说明是状态节点。状态节点业务上未定义逻辑
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|