package jnpf.flowable.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.common.collect.ImmutableList; import jnpf.base.Pagination; import jnpf.base.model.flow.FlowFormDataModel; import jnpf.base.service.SuperServiceImpl; import jnpf.constant.MsgCode; import jnpf.exception.WorkFlowException; import jnpf.flowable.entity.*; import jnpf.flowable.enums.*; import jnpf.flowable.job.FlowJobUtil; import jnpf.flowable.mapper.OperatorMapper; import jnpf.flowable.model.candidates.CandidateCheckFo; import jnpf.flowable.model.candidates.CandidateCheckVo; import jnpf.flowable.model.candidates.CandidateUserVo; import jnpf.flowable.model.flowable.*; import jnpf.flowable.model.message.FlowMsgModel; import jnpf.flowable.model.operator.*; import jnpf.flowable.model.record.NodeRecordModel; import jnpf.flowable.model.task.AuditModel; import jnpf.flowable.model.task.FlowMethod; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.task.TaskPagination; import jnpf.flowable.model.templatejson.TemplateJsonInfoVO; import jnpf.flowable.model.templatenode.BackNodeModel; import jnpf.flowable.model.templatenode.FlowErrorModel; import jnpf.flowable.model.templatenode.nodejson.NodeModel; import jnpf.flowable.model.templatenode.nodejson.TemplateJsonModel; import jnpf.flowable.model.util.*; import jnpf.flowable.service.*; import jnpf.flowable.util.*; import jnpf.model.FlowWorkListVO; import jnpf.model.FlowWorkModel; import jnpf.permission.entity.UserEntity; import jnpf.permission.model.user.WorkHandoverModel; import jnpf.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 类的描述 * * @author JNPF@YinMai Info. Co., Ltd * @version 5.0.x * @since 2024/4/18 15:30 */ @Service public class OperatorServiceImpl extends SuperServiceImpl implements OperatorService { @Autowired private FlowAbleUrl flowAbleUrl; @Autowired private TaskUtil taskUtil; @Autowired private TaskService taskService; @Autowired private ServiceUtil serviceUtil; @Autowired private OperatorUtil operatorUtil; @Autowired private ConditionService conditionService; @Autowired private TemplateNodeService templateNodeService; @Autowired private TemplateJsonService templateJsonService; @Autowired private RecordUtil recordUtil; @Autowired private CirculateUtil circulateUtil; @Autowired private CandidatesService candidatesService; @Autowired private MsgUtil msgUtil; @Autowired private RejectDataService rejectDataService; @Autowired private RecordService recordService; @Autowired private LaunchUserService launchUserService; @Autowired private DelegateService delegateService; @Autowired private TemplateService templateService; @Autowired private ButtonUtil buttonUtil; @Autowired private RedisUtil redisUtil; @Autowired private NodeRecordService nodeRecordService; @Autowired private TaskLineService taskLineService; @Autowired private RevokeService revokeService; @Autowired private EventLogService eventLogService; @Override public OperatorEntity getInfo(String id) throws WorkFlowException { if (StringUtil.isBlank(id)) { return null; } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getId, id); OperatorEntity operator = this.getOne(queryWrapper); if (null == operator) { throw new WorkFlowException(MsgCode.FA001.get()); } return operator; } @Override public List getList(String taskId) { if (StringUtil.isBlank(taskId)) { return new ArrayList<>(); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).orderByDesc(OperatorEntity::getCreatorTime); return this.list(queryWrapper); } @Override public List getList(TaskPagination pagination) { String loginUserId = StringUtil.isNotEmpty(pagination.getUserId()) ? pagination.getUserId() : UserProvider.getLoginUserId(); List statusList = ImmutableList.of(TemplateStatueEnum.up.getCode(), TemplateStatueEnum.downContinue.getCode()); MPJLambdaWrapper wrapper = JoinWrappers.lambda(OperatorEntity.class) .selectAll(OperatorEntity.class) .selectAs(OperatorEntity::getStatus, OperatorVo::getStatus) .selectAs(OperatorEntity::getNodeName, OperatorVo::getCurrentNodeName) .selectAs(TaskEntity::getCreatorUserId, OperatorVo::getCreatorUserId) .selectAs(TaskEntity::getUrgent, OperatorVo::getFlowUrgent) .selectAs(TaskEntity::getFullName, OperatorVo::getFullName) .selectAs(TaskEntity::getFlowName, OperatorVo::getFlowName) .selectAs(TaskEntity::getStartTime, OperatorVo::getStartTime) .selectAs(TaskEntity::getFlowId, OperatorVo::getFlowId) .selectAs(TaskEntity::getFlowVersion, OperatorVo::getFlowVersion) .selectAs(TaskEntity::getFlowCategory, OperatorVo::getFlowCategory) .selectAs(TemplateEntity::getSystemId, OperatorVo::getSystemName) .leftJoin(TaskEntity.class, TaskEntity::getId, OperatorEntity::getTaskId) .leftJoin(TemplateEntity.class, TemplateEntity::getId, TaskEntity::getTemplateId) .in(TemplateEntity::getStatus, statusList) .eq(OperatorEntity::getCompletion, FlowNature.Normal) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Waiting.getCode()) .ne(TaskEntity::getStatus, TaskStatusEnum.CANCEL.getCode()) .ne(TaskEntity::getStatus, TaskStatusEnum.REVOKED.getCode()); CategoryEnum categoryEnum = CategoryEnum.getType(pagination.getCategory()); switch (categoryEnum) { case Sign: // 待签 wrapper.isNull(OperatorEntity::getSignTime).isNull(OperatorEntity::getStartHandleTime) .isNull(OperatorEntity::getHandleStatus); break; case Todo: // 待办 wrapper.isNotNull(OperatorEntity::getSignTime).isNull(OperatorEntity::getStartHandleTime) .isNull(OperatorEntity::getHandleStatus); break; case Doing: // 在办 wrapper.isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime) .isNull(OperatorEntity::getHandleStatus); break; case BatchDoing: // 批量在办 wrapper.isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime) .isNull(OperatorEntity::getHandleStatus) .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()) .ne(OperatorEntity::getStatus, OperatorStateEnum.AddSign.getCode()); } Integer status = pagination.getStatus(); if (null != status) { if (status == -2) {// 超时 wrapper.isNotNull(OperatorEntity::getDuedate); } else {// 7.协办 5.退回 wrapper.eq(OperatorEntity::getStatus, status); } } // 版本 String flowId = pagination.getFlowId(); if (ObjectUtil.isNotEmpty(flowId)) { wrapper.eq(TaskEntity::getFlowId, flowId); } String nodeCode = pagination.getNodeCode(); if (StringUtil.isNotBlank(nodeCode)) { wrapper.eq(OperatorEntity::getNodeCode, nodeCode); } Boolean delegateType = pagination.getDelegateType(); Map delegateListAll = new HashMap<>(); List handleId = new ArrayList<>(); // 是否委托 if (delegateType) { List delegateList = delegateService.getByToUserId(loginUserId); for (DelegateEntity delegate : delegateList) { if (StringUtil.isNotEmpty(delegate.getFlowId())) { String[] flowIds = delegate.getFlowId().split(","); delegateListAll.put(delegate.getUserId(), flowIds); } else { handleId.add(delegate.getUserId()); } } } wrapper.and(t -> { t.eq(OperatorEntity::getHandleId, loginUserId); if (!handleId.isEmpty()) { t.or(t1 -> t1.in(OperatorEntity::getHandleId, handleId).ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode())); } if (delegateType) { for (String key : delegateListAll.keySet()) { t.or(tw -> tw.in(TaskEntity::getTemplateId, delegateListAll.get(key)).eq(OperatorEntity::getHandleId, key) .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode())); } } }); //关键字 String keyWord = pagination.getKeyword(); if (ObjectUtil.isNotEmpty(keyWord)) { wrapper.and(t -> t.like(TaskEntity::getEnCode, keyWord).or().like(TaskEntity::getFullName, keyWord)); } //所属分类 String category = pagination.getFlowCategory(); if (ObjectUtil.isNotEmpty(category)) { List categoryList = Arrays.stream(category.split(",")).collect(Collectors.toList()); wrapper.in(TaskEntity::getFlowCategory, categoryList); } // 所属流程 String templateId = pagination.getTemplateId(); if (ObjectUtil.isNotEmpty(templateId)) { wrapper.eq(TaskEntity::getTemplateId, templateId); } // 紧急程度 Integer flowUrgent = pagination.getFlowUrgent(); if (ObjectUtil.isNotEmpty(flowUrgent)) { wrapper.eq(TaskEntity::getUrgent, flowUrgent); } // 发起人员 String creatorUserId = pagination.getCreatorUserId(); if (ObjectUtil.isNotEmpty(creatorUserId)) { wrapper.eq(TaskEntity::getCreatorUserId, creatorUserId); } // 日期范围(近7天、近1月、近3月、自定义) if (ObjectUtil.isNotEmpty(pagination.getStartTime()) && ObjectUtil.isNotEmpty(pagination.getEndTime())) { wrapper.between(TaskEntity::getStartTime, new Date(pagination.getStartTime()), new Date(pagination.getEndTime())); } //应用主键 String systemId = pagination.getSystemId(); if (ObjectUtil.isNotEmpty(systemId)) { wrapper.eq(TemplateEntity::getSystemId, systemId); } wrapper.orderByDesc(OperatorEntity::getCreatorTime); Page page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize()); IPage operatorVoPage = this.selectJoinListPage(page, OperatorVo.class, wrapper); for (OperatorVo record : operatorVoPage.getRecords()) { boolean isUser = record.getHandleId().equals(loginUserId); record.setDelegateUser(!isUser ? record.getCreatorUserId() : null); // 待签状态 if (Objects.equals(categoryEnum, CategoryEnum.Sign)) { record.setStatus(OperatorStateEnum.WaitSign.getCode()); } } return pagination.setData(operatorVoPage.getRecords(), page.getTotal()); } @Override public List handleOperator(FlowModel flowModel) throws Exception { TaskEntity taskEntity = flowModel.getTaskEntity(); List nodeEntityList = flowModel.getNodeEntityList(); Map nodes = flowModel.getNodes(); Map formData = flowModel.getFormData(); String instanceId = taskEntity.getInstanceId(); String deploymentId = flowModel.getDeploymentId(); NodeModel global = nodes.get(NodeEnum.global.getType()); OperatorEntity operatorEntity = flowModel.getOperatorEntity(); // 最终要返回一个所有节点下的审批人的集合 List list = new ArrayList<>(); // 原来的当前节点 List srcCurrentList = StringUtil.isNotEmpty(taskEntity.getCurrentNodeCode()) ? Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList()) : new ArrayList<>(); // 获取引擎当前任务 List taskModelList = flowAbleUrl.getCurrentTask(instanceId); if (CollectionUtil.isEmpty(taskModelList)) { return list; } taskUtil.updateCurrentNode(taskModelList, nodes, taskEntity); List types = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.approver.getType(), NodeEnum.processing.getType(), NodeEnum.outside.getType()); List errorList = new ArrayList<>(); // 生成经办 for (FlowableTaskModel model : taskModelList) { // 当前节点已存在,跳过 if (CollectionUtil.isNotEmpty(srcCurrentList) && srcCurrentList.contains(model.getTaskKey())) { continue; } // 获取对应的节点信息 TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> e.getNodeCode().equals(model.getTaskKey())).findFirst().orElse(null); if (null == nodeEntity) { continue; } NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); if (nodeModel == null) { continue; } // 不是审批、子流程、外部、办理节点 if (!types.contains(nodeModel.getType())) { continue; } FlowMethod flowMethod = new FlowMethod(); flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); flowMethod.setNodeEntityList(nodeEntityList); flowMethod.setFlowModel(flowModel); // 流程参数 taskUtil.updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData()); flowModel.setFlowableTaskId(model.getTaskId()); List typeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.outside.getType()); // 处理子流程节点、外部节点,传递表单数据 boolean isOutside = Objects.equals(nodeModel.getType(), NodeEnum.outside.getType()); if (typeList.contains(nodeModel.getType())) { if (StringUtil.isEmpty(taskEntity.getRejectDataId()) && CollectionUtil.isEmpty(flowModel.getErrorRuleUserList())) { FlowMethod method = new FlowMethod(); method.setDeploymentId(flowModel.getDeploymentId()); method.setNodeCode(nodeModel.getNodeId()); method.setNodes(flowModel.getNodes()); method.setFormData(flowModel.getFormData()); List nextApprover = taskUtil.getNextApprover(method); int nextError = taskUtil.checkNextError(flowModel, nextApprover, true, true, true); if (nextError == 3) { errorList.addAll(flowModel.getErrorList()); flowModel.setErrorList(new ArrayList<>()); continue; } else if (nextError == 2) { throw new WorkFlowException(MsgCode.WF061.get()); } } flowModel.setOperatorEntity(operatorEntity); if (isOutside) { //外部节点 String eventId = RandomUtil.uuId(); Map> outsideOptions = nodeModel.getOutsideOptions(); String resultNodeCode = taskUtil.resultNodeCode(flowMethod); List templateJsonModelList = outsideOptions.get(resultNodeCode) != null ? outsideOptions.get(resultNodeCode) : new ArrayList<>(); FlowModel outsideModel = JsonUtil.getJsonToBean(flowModel, FlowModel.class); outsideModel.setNodeCode(nodeModel.getNodeId()); TemplateNodeEntity resultNode = nodeEntityList.stream().filter(e -> Objects.equals(e.getNodeCode(), resultNodeCode)).findFirst().orElse(null); if (resultNode != null) { outsideModel.setFormData(taskUtil.infoData(resultNode.getFormId(), taskEntity.getId())); } Map parameterData = operatorUtil.outsideData(outsideModel, templateJsonModelList, FlowContextHolder.getAllData(), resultNodeCode, eventId); //保存外部节点事件数据 EventLogEntity eventLog = new EventLogEntity(); eventLog.setId(eventId); eventLog.setTaskId(taskEntity.getId()); eventLog.setNodeId(model.getTaskId()); eventLog.setNodeName(nodeModel.getNodeName()); eventLog.setNodeCode(nodeModel.getNodeId()); eventLog.setType(nodeModel.getType()); eventLog.setUpNode(resultNodeCode); eventLog.setInterfaceId(nodeModel.getFormId()); eventLog.setData(JsonUtil.getObjectToString(formData)); eventLog.setStatus(FlowNature.Lose); eventLogService.create(eventLog); EventModel event = JsonUtil.getJsonToBean(eventLog, EventModel.class); event.setParameterData(parameterData); FlowEventHolder.addOutsideEvent(event, FlowContextHolder.getAllData()); } else { //子流程 operatorUtil.handleSubFlow(nodeEntity, flowModel); } continue; } taskUtil.dataTransfer(flowMethod); flowMethod.setNodeModel(nodeModel); flowMethod.setFormData(formData); flowMethod.setDeploymentId(deploymentId); flowMethod.setNodeCode(nodeEntity.getNodeCode()); flowMethod.setNodes(nodes); // 节点自动审批 if (taskEntity.getRejectDataId() == null) { int flag = operatorUtil.checkAuto(flowMethod); if (flag == 1 || flag == 2) { // 判断下一级是否存在候选人,存在候选人返回false List nextApprover; boolean mark = true; try { nextApprover = taskUtil.getNextApprover(flowMethod); } catch (WorkFlowException e) { nextApprover = null; mark = false; } Map resMap = conditionService.handleCondition(flowMethod); try { conditionService.checkCondition(resMap, nodes); } catch (WorkFlowException e) { mark = false; } // 下一节点的条件判断不满足,不触发系统审批 if (mark) { boolean isBranch = taskUtil.checkBranch(nodeModel); int nextError = taskUtil.checkNextError(flowModel, nextApprover, false, false); if (!isBranch && taskUtil.checkNextCandidates(nextApprover) && nextError == 0) { flowModel.setHandleOpinion("系统审批"); flowModel.setSignImg(null); flowModel.setFileList(null); flowModel.setHandleStatus(flag == 1 ? FlowNature.AuditCompletion : FlowNature.RejectCompletion); flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class)); flowMethod.setNodeModel(nodeModel); OperatorEntity operator = operatorUtil.saveSystemOperator(flowMethod); SystemAuditModel systemAuditModel = new SystemAuditModel(); systemAuditModel.setOperator(operator); systemAuditModel.setFlowModel(flowMethod.getFlowModel()); SystemAuditHolder.add(systemAuditModel); continue; } } } } // 获取审批人 flowMethod.setErrorRule(true); flowMethod.setExtraRule(true); List userIds = taskUtil.userListAll(flowMethod); // 获取正常的用户 List users = serviceUtil.getUserName(userIds, true); // 全局异常处理 if (users.isEmpty()) { // 自动通过 Integer pass = flowMethod.getPass(); if (pass > 0) { // 自动审批 要判断候选人等 boolean mark = true; List nextApprover; try { nextApprover = taskUtil.getNextApprover(flowMethod); } catch (WorkFlowException e) { // 异常节点(默认通过)下条件不满足、候选人,走admin兜底方案 nextApprover = null; mark = false; } Map resMap = conditionService.handleCondition(flowMethod); try { conditionService.checkCondition(resMap, nodes); } catch (WorkFlowException e) { mark = false; } if (mark && !taskUtil.checkBranch(nodeModel) && taskUtil.checkNextCandidates(nextApprover)) { flowModel.setHandleOpinion(ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ? "默认办理通过" : "默认审批通过"); flowModel.setSignImg(null); flowModel.setFileList(null); flowModel.setHandleStatus(FlowNature.AuditCompletion); flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class)); flowMethod.setNodeModel(nodeModel); OperatorEntity operator = operatorUtil.saveSystemOperator(flowMethod); SystemAuditModel systemAuditModel = new SystemAuditModel(); systemAuditModel.setOperator(operator); systemAuditModel.setFlowModel(flowMethod.getFlowModel()); SystemAuditHolder.add(systemAuditModel); continue; } else { String admin = serviceUtil.getAdmin(); UserEntity userEntity = serviceUtil.getUserInfo(admin); users.add(userEntity); } } // 上一节点审批人指定处理人 Integer node = flowMethod.getNode(); if (node > 0) { operatorUtil.handleErrorRule(nodeModel, errorList); } // 无法提交 Integer notSubmit = flowMethod.getNotSubmit(); if (notSubmit > 0) { throw new WorkFlowException(MsgCode.WF061.get()); } } userIds = users.stream().map(UserEntity::getId).collect(Collectors.toList()); flowMethod.setNodeModel(nodeModel); flowMethod.setUserIds(userIds); flowMethod.setFlowModel(flowModel); List operator = operatorUtil.createOperator(flowMethod); list.addAll(operator); //保存逐级用户数据 LaunchUserEntity launchUser = flowMethod.getLaunchUser(); if (launchUser != null) { launchUserService.save(launchUser); } } if (!errorList.isEmpty()) { AuditModel model = new AuditModel(); model.setErrorCodeList(errorList); throw new WorkFlowException(200, JsonUtil.getObjectToString(model)); } operatorUtil.addOperatorList(list, flowModel); return list; } @DSTransactional @Override public void auditWithCheck(String id, FlowModel flowModel) throws Exception { this.audit(id, flowModel); } @Override public void audit(String id, FlowModel flowModel) throws Exception { OperatorEntity operator = operatorUtil.checkOperator(id); taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); String handleOpinion = flowModel.getHandleOpinion(); String signId = flowModel.getSignId(); String signImg = flowModel.getSignImg(); Boolean useSignNext = flowModel.getUseSignNext(); Map formData = flowModel.getFormData(); Map nodes = flowModel.getNodes(); NodeModel global = nodes.get(NodeEnum.global.getType()); NodeModel nodeModel = nodes.get(operator.getNodeCode()); TemplateJsonEntity jsonEntity = flowModel.getJsonEntity(); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null); String formId = null != nodeEntity ? nodeEntity.getFormId() : ""; // 获取流程参数 taskUtil.getGlobalParam(taskEntity, nodeModel, global, formData); flowModel.setTaskEntity(taskEntity); RevokeEntity revokeEntity = revokeService.getRevokeTask(taskEntity.getId()); if (CollectionUtil.isNotEmpty(formData) && null == revokeEntity) { FlowFormDataModel model = new FlowFormDataModel(); model.setFormId(formId); model.setId(taskEntity.getId()); model.setFormOperates(nodeModel.getFormOperates()); model.setMap(formData); model.setFlowId(jsonEntity.getId()); serviceUtil.saveOrUpdateFormData(model); } formData = serviceUtil.infoData(formId, taskEntity.getId()); // 表单 if (CollectionUtil.isNotEmpty(formData)) { flowModel.setFormData(formData); // 保存表单到线程 FlowContextHolder.addChildData(taskEntity.getId(), formId, formData, nodeModel.getFormOperates(), false); } this.audit(operator, flowModel); if (useSignNext) { serviceUtil.updateSign(signId, signImg); } serviceUtil.addCommonWordsNum(handleOpinion); // 保存表单数据 //FlowContextHolder.delete(taskEntity.getId(), formId); FlowContextHolder.deleteFormOperator(); serviceUtil.handleFormData(taskEntity.getFlowId(), true); } @Override public void audit(OperatorEntity operator, FlowModel flowModel) throws Exception { TaskEntity taskEntity = flowModel.getTaskEntity(); //判断是否审批过 if (null != operator.getHandleStatus()) { return; } taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); if (null == flowModel.getUserInfo()) { flowModel.setUserInfo(UserProvider.getUser()); } RevokeEntity revokeEntity = revokeService.getRevokeTask(taskEntity.getId()); if (null != revokeEntity) { // 处理撤销的经办 operatorUtil.addTask(ImmutableList.of(revokeEntity.getTaskId())); operatorUtil.handleRevoke(flowModel, operator, revokeEntity); return; } operatorUtil.addTask(ImmutableList.of(taskEntity.getId())); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null); if (nodeEntity == null) { throw new WorkFlowException(MsgCode.WF076.get()); } flowModel.setNodeEntity(nodeEntity); String deploymentId = flowModel.getDeploymentId(); Map nodes = flowModel.getNodes(); NodeModel nodeModel = nodes.get(operator.getNodeCode()); // 全局节点 TemplateNodeEntity globalEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity()); NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class); // 表单 Map formData = flowModel.getFormData(); if (CollectionUtil.isNotEmpty(flowModel.getCandidateList())) { // 或签,删除其他人选择的候选人 if (ObjectUtil.equals(nodeModel.getCounterSign(), FlowNature.FixedApprover)) { NextOrPrevFo nextOrPrevFo = new NextOrPrevFo(); nextOrPrevFo.setDeploymentId(flowModel.getDeploymentId()); nextOrPrevFo.setTaskKey(operator.getNodeCode()); List nextModels = flowAbleUrl.getNext(nextOrPrevFo); List nextCodes = nextModels.stream().map(FlowableNodeModel::getId).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(nextCodes)) { candidatesService.deleteByCodes(operator.getTaskId(), nextCodes); } } } // 保存候选人、异常人 candidatesService.create(flowModel, operator.getTaskId(), nodeEntityList, operator); // 流程参数 taskUtil.updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData()); flowModel.setTaskEntity(taskEntity); FlowMethod flowMethod = new FlowMethod(); Integer handleStatus = flowModel.getHandleStatus(); boolean isAudit = handleStatus.equals(FlowNature.AuditCompletion); if (isAudit) { operator.setHandleStatus(FlowNature.AuditCompletion); flowMethod.setType(RecordEnum.audit.getCode()); flowModel.setEventStatus(EventEnum.Approve.getStatus()); } else { operator.setHandleStatus(FlowNature.RejectCompletion); flowMethod.setType(RecordEnum.reject.getCode()); flowModel.setEventStatus(EventEnum.Reject.getStatus()); } // 同意、拒绝 operator.setHandleTime(new Date()); operator.setCompletion(FlowNature.Action); this.updateById(operator); if (StringUtil.isNotBlank(operator.getDraftData())) { // 清除草稿数据 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId()) .set(OperatorEntity::getDraftData, null); this.update(updateWrapper); } // 记录 flowMethod.setFlowModel(flowModel); flowMethod.setOperatorEntity(operator); recordUtil.createRecord(flowMethod); flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); flowMethod.setNodeEntityList(nodeEntityList); flowMethod.setDeploymentId(deploymentId); flowMethod.setFormData(formData); flowMethod.setNodes(nodes); flowMethod.setNodeCode(operator.getNodeCode()); flowMethod.setNodeModel(nodeModel); flowMethod.setHandleStatus(handleStatus); // 抄送 List circulateList = new ArrayList<>(); if (flowModel.getCopyMsgFlag()) { circulateList = circulateUtil.circulateList(flowMethod); } flowMethod.setCirculateList(circulateList); // 判断加签比例 if (!StringUtil.equals(operator.getParentId(), FlowNature.ParentId)) { operatorUtil.handleAddCounterSign(operator, flowModel); FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setCirculateList(circulateList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(nodeEntity.getNodeCode()); flowMsgModel.setWait(false); flowMsgModel.setCopy(true); flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); return; } // 选择分支 candidatesService.createBranch(flowModel.getBranchList(), operator); // 指派的经办无需计算比例,或系统审批 if (!ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Assigned.getCode()) || ObjectUtil.equals(operator.getHandleId(), FlowNature.SYSTEM_CODE)) { // 判断比例 boolean auditRes = operatorUtil.checkAudit(flowMethod); if (!auditRes) { return; } //逐级审批过 List launchUserList = launchUserService.getTaskList(operator.getTaskId()); LaunchUserEntity launchUser = launchUserList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null); if (launchUser != null) { if (isAudit || global.getHasContinueAfterReject()) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()) .eq(OperatorEntity::getNodeCode, operator.getNodeCode()) .eq(OperatorEntity::getParentId, FlowNature.ParentId) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()); List list = list(queryWrapper); boolean result = operatorUtil.checkStep(list, nodeModel, launchUser); if (!result) { String positionId = launchUser.getPositionId() != null ? launchUser.getPositionId() : ""; List positionList = Arrays.asList(positionId.split(",")); String organizeId = launchUser.getOrganizeId() != null ? launchUser.getOrganizeId() : ""; List organizeList = Arrays.asList(organizeId.split(",")); //获取逐级下个审批人 FlowMethod jsonToBean = new FlowMethod(); flowModel.setFlowableTaskId(operator.getNodeId()); jsonToBean.setTaskEntity(flowMethod.getTaskEntity()); jsonToBean.setFlowModel(flowModel); jsonToBean.setNodeEntityList(flowMethod.getNodeEntityList()); jsonToBean.setNodeEntity(flowMethod.getNodeEntity()); jsonToBean.setSubFormData(flowMethod.getSubFormData()); jsonToBean.setExtraRule(true); jsonToBean.setNodeModel(nodeModel); jsonToBean.setOperatorEntity(operator); UserEntity userEntity = new UserEntity(); userEntity.setPositionId(positionList.get(positionList.size() - 1)); userEntity.setOrganizeId(organizeList.get(organizeList.size() - 1)); String managerByLevel = taskUtil.getManagerByLevel(userEntity, list.size() + 1); UserEntity userInfo = serviceUtil.getUserInfo(managerByLevel); if (userInfo == null) { throw new WorkFlowException(MsgCode.WF153.get()); } jsonToBean.setUserIds(ImmutableList.of(managerByLevel)); List entityList = operatorUtil.createOperator(jsonToBean); for (OperatorEntity entity : entityList) { entity.setHandleAll(operator.getId()); } this.updateBatchById(entityList); operatorUtil.addOperatorList(entityList, flowModel); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setCirculateList(circulateList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(nodeEntity.getNodeCode()); flowMsgModel.setOperatorList(entityList); if (flowModel.getCopyMsgFlag()) { flowMsgModel.setCopy(true); } if (isAudit) { flowMsgModel.setApprove(true); } else { flowMsgModel.setReject(true); } flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); return; } } } } //审批事件 operatorUtil.addEvent(flowModel); Integer tempStatus = flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus; // 判断拒绝后是否继续流转 if (FlowNature.RejectCompletion.equals(tempStatus) && !global.getHasContinueAfterReject()) { flowMethod.setOperatorEntity(operator); flowMethod.setFlowModel(flowModel); taskUtil.handleEndTask(flowMethod); launchUserService.deleteStepUser(taskEntity.getId()); return; } flowModel.setOperatorEntity(operator); boolean isRejectDataId = taskEntity.getRejectDataId() != null; if (isRejectDataId) { operatorUtil.handleRejectData(flowModel); } else { List branchList = candidatesService.getBranch(operator.getTaskId(), operator.getNodeCode()); Map resMap; if (branchList.isEmpty()) { resMap = conditionService.handleCondition(flowMethod); conditionService.checkCondition(resMap, nodes); } else { resMap = conditionService.getForBranch(flowMethod, branchList); } taskLineService.create(taskEntity.getId(), resMap); // 完成 CompleteFo fo = new CompleteFo(); fo.setTaskId(operator.getNodeId()); fo.setVariables(new HashMap<>(resMap)); flowAbleUrl.complete(fo); } // 节点记录 NodeRecordModel nodeRecordModel = new NodeRecordModel(); nodeRecordModel.setTaskId(operator.getTaskId()); nodeRecordModel.setNodeId(operator.getNodeId()); nodeRecordModel.setNodeCode(operator.getNodeCode()); nodeRecordModel.setNodeName(operator.getNodeName()); nodeRecordModel.setNodeStatus(isAudit ? NodeStateEnum.pass.getCode() : NodeStateEnum.reject.getCode()); nodeRecordService.create(nodeRecordModel); // 生成下一节点 List entityList = this.handleOperator(flowModel); // 删除选择分支 candidatesService.deleteBranch(operator.getTaskId(), operator.getNodeCode()); //删除逐级数据 launchUserService.delete(operator.getTaskId(), ImmutableList.of(operator.getNodeCode())); if (!isRejectDataId) { boolean isProcessing = ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.processing.getType()); flowModel.setAction(ObjectUtil.equals(handleStatus, FlowNature.RejectCompletion) ? 2 : isProcessing ? 4 : 1); operatorUtil.handleTrigger(operator, flowModel); } // 判断任务是否结束 flowModel.setHandleStatus(flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus); taskUtil.isFinished(flowModel); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setCirculateList(circulateList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(nodeEntity.getNodeCode()); flowMsgModel.setOperatorList(entityList); if (flowModel.getCopyMsgFlag()) { flowMsgModel.setCopy(true); } if (isAudit) { flowMsgModel.setApprove(true); } else { flowMsgModel.setReject(true); } flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); // 系统审批 operatorUtil.systemAudit(); } @Override public void sign(FlowModel flowModel) throws WorkFlowException { UpdateWrapper updateWrapper = new UpdateWrapper<>(); if (CollectionUtil.isNotEmpty(flowModel.getIds())) { List ids = new ArrayList<>(); if (flowModel.getType().equals(0)) { operatorUtil.checkBatch(flowModel.getIds(), ids, false); List list = new ArrayList<>(); operatorUtil.checkCancel(ids, list); // 签收 updateWrapper.lambda().in(OperatorEntity::getId, list) .set(OperatorEntity::getSignTime, new Date()); } else { operatorUtil.checkBatch(flowModel.getIds(), ids, true); List list = new ArrayList<>(); operatorUtil.checkCancel(ids, list); // 退签 updateWrapper.lambda().in(OperatorEntity::getId, list) .set(OperatorEntity::getSignTime, null); } this.update(updateWrapper); } } @Override public void startHandle(FlowModel flowModel) throws WorkFlowException { List ids = new ArrayList<>(); operatorUtil.checkBatch(flowModel.getIds(), ids, false); List list = new ArrayList<>(); operatorUtil.checkCancel(ids, list); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().in(OperatorEntity::getId, list) .set(OperatorEntity::getStartHandleTime, new Date()); this.update(updateWrapper); } @Override public void saveAudit(String id, FlowModel flowModel) throws WorkFlowException { OperatorEntity entity = this.getById(id); if (null == entity) { throw new WorkFlowException(MsgCode.FA001.get()); } TaskEntity taskEntity = taskService.getInfo(entity.getTaskId()); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); entity.setDraftData(JsonUtil.getObjectToString(flowModel.getFormData())); this.updateById(entity); } @DSTransactional @Override public void addSign(String id, FlowModel flowModel) throws Exception { OperatorEntity operator = operatorUtil.checkOperator(id); List childList = operatorUtil.getChildList(operator.getId()); childList = childList.stream().filter(e -> ObjectUtil.equals(e.getCompletion(), FlowNature.Normal) && !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.Futility.getCode())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(childList)) { throw new WorkFlowException(MsgCode.WF081.get()); } AddSignModel parameter = flowModel.getAddSignParameter(); List idList = parameter.getAddSignUserIdList(); buttonUtil.checkAddSign(operator, parameter); // 保存选择分支 List branchList = flowModel.getBranchList(); if (CollectionUtil.isNotEmpty(branchList)) { candidatesService.createBranch(branchList, operator); } if (idList.isEmpty() || operator.getStatus().equals(OperatorStateEnum.Transfer.getCode()) || operator.getStatus().equals(OperatorStateEnum.Assist.getCode())) { throw new WorkFlowException(MsgCode.WF081.get()); } String userId = UserProvider.getLoginUserId(); if (idList.contains(userId)) { throw new WorkFlowException(MsgCode.WF106.get()); } if (!ObjectUtil.equals(operator.getHandleId(), userId)) { List delegateList = delegateService.getByToUserId(userId); List userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList()); List filterList = userIds.stream().filter(idList::contains).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(filterList)) { throw new WorkFlowException(MsgCode.WF116.get()); } } // 将之前的加签经办作废 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, id) .and(i -> i.eq(OperatorEntity::getStatus, OperatorStateEnum.AddSign.getCode()) .or().eq(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode())); List list = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(list)) { list.forEach(e -> e.setStatus(OperatorStateEnum.Futility.getCode())); this.updateBatchById(list); } taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); List nodeEntityList = flowModel.getNodeEntityList(); Map formData = flowModel.getFormData(); // 表单 if (CollectionUtil.isNotEmpty(formData)) { TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null); if (null != nodeEntity) { NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); // 保存表单到线程 FlowContextHolder.addChildData(taskEntity.getId(), nodeEntity.getFormId(), formData, nodeModel.getFormOperates(), true); } } // 保存候选人、异常人 candidatesService.create(flowModel, operator.getTaskId(), nodeEntityList, operator); // 更新经办信息 operator.setHandleParameter(JsonUtil.getObjectToString(parameter)); if (parameter.getAddSignType().equals(FlowNature.Later)) { operator.setHandleStatus(FlowNature.AuditCompletion); } operator.setCompletion(FlowNature.Action); if (this.updateById(operator)) { TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null); if (null == nodeEntity) { throw new WorkFlowException(MsgCode.WF076.get()); } NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); // 全局节点 TemplateNodeEntity globalEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity()); NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class); Date date = new Date(); // 后加签默认同意的记录 if (parameter.getAddSignType().equals(FlowNature.Later)) { FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(RecordEnum.audit.getCode()); flowMethod.setFlowModel(flowModel); operator.setHandleTime(date); flowMethod.setOperatorEntity(operator); recordUtil.createRecord(flowMethod); } // 生成加签的经办 List entityList = new ArrayList<>(); for (String handleId : idList) { FlowMethod flowMethod = new FlowMethod(); flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); flowMethod.setNodeModel(nodeModel); flowMethod.setSignFor(global.getHasSignFor()); flowMethod.setFlowableTaskId(operator.getNodeId()); OperatorEntity entity = operatorUtil.createOperatorEntity(flowMethod); entity.setHandleId(handleId); entity.setParentId(operator.getId()); entity.setStatus(OperatorStateEnum.AddSign.getCode()); entityList.add(entity); if (ObjectUtil.equals(parameter.getCounterSign(), FlowNature.ImproperApprover)) { break; } } // 加签记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setFlowModel(flowModel); operator.setHandleTime(date); flowMethod.setOperatorEntity(operator); Integer type = RecordEnum.addSign.getCode(); flowMethod.setType(type); flowMethod.setUserId(String.join(",", idList)); recordUtil.createRecord(flowMethod); if (CollectionUtil.isNotEmpty(entityList)) { this.saveBatch(entityList); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setOperatorList(entityList); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(operator.getNodeCode()); flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); operatorUtil.addOperatorList(entityList, flowModel); } } serviceUtil.handleFormData(taskEntity.getFlowId(), false); } @Override public List getReduceList(String id, Pagination pagination) throws WorkFlowException { RecordEntity record = recordService.getInfo(id); if (null == record) { throw new WorkFlowException(MsgCode.FA001.get()); } OperatorEntity operator = this.getById(record.getOperatorId()); if (null == operator) { throw new WorkFlowException(MsgCode.FA001.get()); } if (null == operator.getHandleParameter()) { throw new WorkFlowException(MsgCode.WF082.get()); } AddSignModel model = JsonUtil.getJsonToBean(operator.getHandleParameter(), AddSignModel.class); List list = new ArrayList<>(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, operator.getId()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()); List entityList = this.list(queryWrapper); if (CollectionUtil.isEmpty(entityList)) { return list; } // 获取未审批的加签经办 List todoList = entityList.stream().filter(e -> null == e.getHandleStatus() && ObjectUtil.equals(e.getCompletion(), FlowNature.Normal)).collect(Collectors.toList()); // 依次审批,获取未创建经办的人员 if (ObjectUtil.equals(model.getCounterSign(), FlowNature.ImproperApprover) && CollectionUtil.isNotEmpty(todoList)) { List idList = model.getAddSignUserIdList(); OperatorEntity operatorEntity = todoList.get(0); int index = idList.indexOf(operatorEntity.getHandleId()); if (index < idList.size() - 1) { for (int i = index + 1; i < idList.size(); i++) { OperatorEntity op = new OperatorEntity(); op.setHandleId(idList.get(i)); todoList.add(op); } } } return operatorUtil.getReduceUsers(todoList, pagination); } // 减签 @Override @DSTransactional public void reduce(String id, FlowModel flowModel) throws WorkFlowException { List ids = flowModel.getIds(); RecordEntity record = recordService.getInfo(id); if (null == record) { throw new WorkFlowException(MsgCode.FA001.get()); } OperatorEntity operator = this.getById(record.getOperatorId()); if (null == operator) { throw new WorkFlowException(MsgCode.FA001.get()); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, operator.getId()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()); List list = this.list(queryWrapper); if (CollectionUtil.isEmpty(list)) { throw new WorkFlowException(MsgCode.FA001.get()); } if (CollectionUtil.isNotEmpty(ids)) { String userId = ids.get(0); OperatorEntity operatorEntity = list.stream() .filter(e -> ObjectUtil.equals(e.getHandleId(), userId) && e.getHandleTime() != null).findFirst().orElse(null); if (null != operatorEntity && null != operatorEntity.getHandleStatus()) { throw new WorkFlowException(MsgCode.WF128.get()); } } AddSignModel model = JsonUtil.getJsonToBean(operator.getHandleParameter(), AddSignModel.class); boolean inTurn = ObjectUtil.equals(model.getCounterSign(), FlowNature.ImproperApprover); List unApproved = list.stream() .filter(e -> ObjectUtil.equals(e.getCompletion(), FlowNature.Normal) && e.getHandleTime() == null).collect(Collectors.toList()); if (inTurn) { // 依次审批的处理 List idList = model.getAddSignUserIdList(); OperatorEntity entity = unApproved.stream().filter(e -> ids.contains(e.getHandleId())).findFirst().orElse(null); if (null != entity) { taskUtil.setFlowModel(operator.getTaskId(), flowModel); Map nodes = flowModel.getNodes(); NodeModel global = nodes.get(NodeEnum.global.getType()); int index = idList.indexOf(entity.getHandleId()); if (index == idList.size() - 1) { throw new WorkFlowException(MsgCode.WF109.get()); } String handleId = idList.get(index + 1); // 创建下一个经办 OperatorEntity newOperator = operatorUtil.createOperator(entity, OperatorStateEnum.AddSign.getCode(), handleId, global); this.save(newOperator); FlowMethod flowMethod = new FlowMethod(); flowMethod.setFlowModel(flowModel); flowMethod.setAddSignModel(model); flowMethod.setOperatorEntity(operator); flowMethod.setTaskEntity(flowModel.getTaskEntity()); List nodeEntityList = flowModel.getNodeEntityList(); flowMethod.setNodeEntityList(nodeEntityList); TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), operator.getNodeCode())) .findFirst().orElse(null); flowMethod.setNodeEntity(nodeEntity); operatorUtil.improperApproverMessage(flowMethod, newOperator); // 删除需要减签的经办 this.removeById(entity); } // 更新handleParameter idList.removeAll(ids); model.setAddSignUserIdList(idList); operator.setHandleParameter(JsonUtil.getObjectToString(model)); this.updateById(operator); } else { if (unApproved.size() == 1) { throw new WorkFlowException(MsgCode.WF109.get()); } } // 记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setFlowModel(flowModel); flowMethod.setOperatorEntity(operator); Integer type = RecordEnum.subtractSign.getCode(); flowMethod.setType(type); flowMethod.setUserId(String.join(",", ids)); recordUtil.createRecord(flowMethod); if (inTurn) { return; } List handleIds = list.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList()); handleIds.removeAll(ids); if (handleIds.isEmpty()) { // 全部减签 this.removeByIds(list); // 还原经办 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId()) .set(OperatorEntity::getCompletion, FlowNature.Normal) .set(OperatorEntity::getHandleParameter, null); this.update(updateWrapper); } else { List collect = list.stream().filter(t -> ids.contains(t.getHandleId())).collect(Collectors.toList()); this.removeByIds(collect); } } // 获取可退回的节点 @Override public List getFallbacks(String id) throws WorkFlowException { OperatorEntity operator = this.getInfo(id); if (null == operator) { throw new WorkFlowException(MsgCode.FA001.get()); } TaskEntity taskEntity = taskService.getInfo(operator.getTaskId()); if (null == taskEntity) { throw new WorkFlowException(MsgCode.FA001.get()); } TemplateJsonEntity jsonEntity = templateJsonService.getInfo(taskEntity.getFlowId()); List nodeEntityList = templateNodeService.getList(taskEntity.getFlowId()); Map nodes = new HashMap<>(); for (TemplateNodeEntity nodeEntity : nodeEntityList) { nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class)); } NodeModel nodeModel = nodes.get(operator.getNodeCode()); List list = new ArrayList<>(); // 获取经办过滤 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()); List operatorEntityList = this.list(queryWrapper); List nodeList = operatorEntityList.stream().map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList()); TemplateNodeEntity start = nodeEntityList.stream().filter(e -> e.getNodeType().equals(NodeEnum.start.getType())).findFirst().orElse(null); if (null == start) { throw new WorkFlowException(MsgCode.WF076.get()); } NodeModel startModel = JsonUtil.getJsonToBean(start.getNodeJson(), NodeModel.class); if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Start)) { BackNodeModel model = new BackNodeModel(); model.setNodeName(startModel.getNodeName()); model.setNodeCode(startModel.getNodeId()); list.add(model); } else if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Up)) { List resList = new ArrayList<>(); List nodeCodeList = new ArrayList<>(); taskUtil.prevNode(jsonEntity.getFlowableId(), operator.getNodeCode(), nodeEntityList, nodeCodeList); List nodeCodes = operatorUtil.getList(taskEntity.getId()).stream() .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode())) .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList()); nodeCodes.add(start.getNodeCode()); for (String nodeCode : nodeCodeList) { NodeModel node = nodes.get(nodeCode); // 退回节点包含子流程 if (null != node) { if (NodeEnum.subFlow.getType().equals(node.getType())) { throw new WorkFlowException(MsgCode.WF046.get()); } if (NodeEnum.outside.getType().equals(node.getType())) { throw new WorkFlowException(MsgCode.WF154.get()); } } if (!nodeCodes.contains(nodeCode)) { continue; } resList.add(nodeCode); } if (resList.isEmpty()) { resList.addAll(nodeCodeList); } BackNodeModel model = new BackNodeModel(); model.setNodeName("上级审批节点"); model.setNodeCode(String.join(",", resList)); list.add(model); } else if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Reject)) { List fallbacks = flowAbleUrl.getFallbacks(operator.getNodeId()); nodeList.add(start.getNodeCode()); fallbacks = fallbacks.stream().filter(nodeList::contains).collect(Collectors.toList()); // 获取经办进行过滤 List nodeCodeList = operatorUtil.getList(taskEntity.getId()).stream() .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode())) .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList()); nodeCodeList.add(start.getNodeCode()); for (String nodeCode : fallbacks) { // 过滤没有走过的点 if (!nodeCodeList.contains(nodeCode) || ObjectUtil.equals(nodeCode, operator.getNodeCode())) { continue; } NodeModel node = nodes.get(nodeCode); BackNodeModel model = new BackNodeModel(); model.setNodeName(node.getNodeName()); model.setNodeCode(node.getNodeId()); list.add(model); } } else { NodeModel optional = nodes.get(nodeModel.getBackNodeCode()); if (null != optional) { BackNodeModel model = new BackNodeModel(); model.setNodeName(optional.getNodeName()); model.setNodeCode(nodeModel.getBackNodeCode()); list.add(model); } } return list; } // 退回 @DSTransactional @Override public void back(String id, FlowModel flowModel) throws Exception { OperatorEntity operator = operatorUtil.checkOperator(id); taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); if (null != taskEntity.getRejectDataId()) { throw new WorkFlowException(MsgCode.WF083.get()); } Map nodes = flowModel.getNodes(); List nodeEntityList = flowModel.getNodeEntityList(); String deploymentId = flowModel.getDeploymentId(); NodeModel nodeModel = nodes.get(operator.getNodeCode()); TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> ObjectUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null); flowModel.setNodeEntity(nodeEntity); TemplateNodeEntity start = nodeEntityList.stream().filter(e -> e.getNodeType().equals(NodeEnum.start.getType())).findFirst().orElse(null); if (null == start) { throw new WorkFlowException(MsgCode.WF076.get()); } Integer backType = flowModel.getBackType(); String backStep = flowModel.getBackNodeCode(); List stepList = new ArrayList<>(); if (FlowNature.Start.equals(backStep)) { stepList.add(start.getNodeCode()); } else { stepList = StringUtil.isNotEmpty(backStep) ? Arrays.stream(backStep.split(",")).collect(Collectors.toList()) : new ArrayList<>(); // 判断没有经过的节点,不能退回 List nodeCodeList = operatorUtil.getList(taskEntity.getId()).stream() .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode())) .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList()); nodeCodeList.add(start.getNodeCode()); for (String step : stepList) { if (!nodeCodeList.contains(step)) { throw new WorkFlowException(MsgCode.WF047.get()); } } } operatorUtil.addTask(ImmutableList.of(taskEntity.getId())); AfterFo afterFo = new AfterFo(); afterFo.setDeploymentId(deploymentId); afterFo.setTaskKeys(stepList); // 获取目标节点之后的所有节点,将这些节点的经办全部保存、更新状态 List afterListAll = flowAbleUrl.getAfter(afterFo); List afterList = new ArrayList<>(); List deleteAfterList = new ArrayList<>(afterListAll); afterList.addAll(stepList); afterList.addAll(afterListAll); afterList = afterList.stream().distinct().collect(Collectors.toList()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()) .in(OperatorEntity::getNodeCode, afterList); List list = this.list(wrapper); // 当前审批时 保存 任务、经办、外部 转json QueryWrapper logWrapper = new QueryWrapper<>(); logWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId()) .in(EventLogEntity::getNodeCode, afterList); logWrapper.lambda().select(EventLogEntity::getId, EventLogEntity::getNodeCode); List logList = eventLogService.list(logWrapper); RejectDataEntity rejectDataEntity = null; if (FlowNature.PresentType.equals(backType)) { rejectDataEntity = rejectDataService.create(taskEntity, list, logList, stepList.get(0)); //更新外部节点 UpdateWrapper updateLogWrapper = new UpdateWrapper<>(); updateLogWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId()); updateLogWrapper.lambda().in(EventLogEntity::getNodeCode, afterList); updateLogWrapper.lambda().set(EventLogEntity::getNodeCode, null); eventLogService.update(updateLogWrapper); } else { // 子流程处理,重新审批:子流程需删除,当前审批:无需终止 taskUtil.deleteSubflow(taskEntity.getId(), afterList); } // 更改状态 state 转 -1 for (OperatorEntity operatorEntity : list) { operatorEntity.setStatus(OperatorStateEnum.Futility.getCode()); // 删除超时相关 FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil); } this.updateBatchById(list); // 记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(RecordEnum.back.getCode()); flowMethod.setFlowModel(flowModel); flowMethod.setOperatorEntity(operator); recordUtil.createRecord(flowMethod); // 记录作废 if (ObjectUtil.equals(backType, FlowNature.RestartType)) { recordService.updateStatusToInvalid(taskEntity.getId(), afterList); } // 节点记录 NodeRecordModel nodeRecordModel = new NodeRecordModel(); nodeRecordModel.setTaskId(operator.getTaskId()); nodeRecordModel.setNodeId(operator.getNodeId()); nodeRecordModel.setNodeCode(operator.getNodeCode()); nodeRecordModel.setNodeName(operator.getNodeName()); nodeRecordModel.setNodeStatus(NodeStateEnum.back.getCode()); nodeRecordService.create(nodeRecordModel); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(TaskEntity::getId, operator.getTaskId()); if (null != rejectDataEntity) { updateWrapper.lambda().set(TaskEntity::getRejectDataId, rejectDataEntity.getId()); } FlowMsgModel flowMsgModel = new FlowMsgModel(); flowModel.setAction(3); flowModel.setOperatorEntity(operator); if (null != nodeEntity) { Map map = serviceUtil.infoData(nodeEntity.getFormId(), operator.getTaskId()); FlowContextHolder.addChildData(operator.getTaskId(), nodeEntity.getFormId(), map, nodeModel.getFormOperates(), false); flowModel.setFormData(map); } if (!FlowNature.PresentType.equals(backType)) { operatorUtil.handleTrigger(operator, flowModel); } // 开始节点 if (stepList.size() == 1 && stepList.get(0).equals(start.getNodeCode())) { // 更新任务 updateWrapper.lambda() .set(TaskEntity::getCurrentNodeName, FlowNature.START_NAME) .set(TaskEntity::getCurrentNodeCode, FlowNature.START_CODE) .set(TaskEntity::getStatus, TaskStatusEnum.BACKED.getCode()); if (rejectDataEntity == null) { updateWrapper.lambda().set(TaskEntity::getInstanceId, null); } taskService.update(updateWrapper); List entityList = new ArrayList<>(); OperatorEntity operatorEntity = new OperatorEntity(); operatorEntity.setNodeCode(start.getNodeCode()); operatorEntity.setHandleId(taskEntity.getCreatorUserId()); entityList.add(operatorEntity); flowMsgModel.setOperatorList(entityList); flowMsgModel.setWait(false); if (!FlowNature.PresentType.equals(backType)) { // 删除发起用户 launchUserService.delete(taskEntity.getId()); } // 删除引擎实例 if (rejectDataEntity == null) { String instanceId = taskEntity.getInstanceId(); flowAbleUrl.deleteInstance(instanceId, "back"); } } else { String sourceId = StringUtil.isNotEmpty(flowModel.getBackId()) ? flowModel.getBackId() : operator.getNodeId(); BackFo fo = new BackFo(); fo.setTaskId(sourceId); fo.setTargetKey(backStep); flowAbleUrl.back(fo); List entityList = this.handleOperator(flowModel); // 更新状态为退回状态 for (OperatorEntity entity : entityList) { entity.setStatus(OperatorStateEnum.Back.getCode()); } this.updateBatchById(entityList); flowMsgModel.setOperatorList(entityList); operatorUtil.addOperatorList(entityList, flowModel); if (null != rejectDataEntity) { taskService.update(updateWrapper); } } if (!FlowNature.PresentType.equals(backType)) { // 重新审批,删除候选人、逐级、外部 if (CollectionUtil.isNotEmpty(deleteAfterList)) { candidatesService.deleteByCodes(taskEntity.getId(), deleteAfterList); launchUserService.delete(taskEntity.getId(), deleteAfterList); eventLogService.delete(taskEntity.getId(), deleteAfterList); } } // 消息 flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(nodeModel.getNodeId()); flowMsgModel.setBack(true); flowMsgModel.setFormData(FlowContextHolder.getAllData()); msgUtil.message(flowMsgModel); //退回事件 flowModel.setEventStatus(EventEnum.Back.getStatus()); operatorUtil.addEvent(flowModel); } // 撤回 @DSTransactional @Override public void recall(String id, FlowModel flowModel) throws WorkFlowException { RecordEntity record = flowModel.getRecordEntity(); OperatorEntity operator = flowModel.getOperatorEntity(); taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); List nodeEntityList = flowModel.getNodeEntityList(); if (CollectionUtil.isEmpty(nodeEntityList)) { throw new WorkFlowException(MsgCode.WF076.get()); } TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null); if (null == nodeEntity) { throw new WorkFlowException(MsgCode.WF076.get()); } flowModel.setNodeEntity(nodeEntity); flowModel.setRecordEntity(record); flowModel.setFlag(FlowNature.ApprovalFlag); flowModel.setIsException(true); if (!buttonUtil.checkRecall(flowModel)) { throw new WorkFlowException(MsgCode.WF077.get()); } operatorUtil.addTask(ImmutableList.of(taskEntity.getId())); List nextCodes = flowModel.getNextCodes(); if (CollectionUtil.isNotEmpty(nextCodes)) { // 删除外部节点 eventLogService.delete(taskEntity.getId(), nextCodes); // 删除子流程 taskUtil.deleteSubflow(taskEntity.getId(), nextCodes); } // 更新记录状态 record.setStatus(FlowNature.Invalid); recordService.updateById(record); // 记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(RecordEnum.recall.getCode()); flowMethod.setFlowModel(flowModel); operator.setHandleTime(null); flowMethod.setOperatorEntity(operator); recordUtil.createRecord(flowMethod); List currentNodes = new ArrayList<>(); String currentNodeCode = taskEntity.getCurrentNodeCode(); if (StringUtil.isNotBlank(currentNodeCode)) { currentNodes = Arrays.stream(currentNodeCode.split(",")).collect(Collectors.toList()); } if (currentNodes.contains(operator.getNodeCode())) { // 加签 撤回的处理 if (!ObjectUtil.equals(operator.getParentId(), FlowNature.ParentId)) { OperatorEntity parentEntity = this.getById(operator.getParentId()); if (null != parentEntity) { if (ObjectUtil.equals(parentEntity.getCompletion(), FlowNature.Normal)) { parentEntity.setCompletion(FlowNature.Action); this.updateById(parentEntity); } } } // 当前节点已审批的人 撤回无需跳转 UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(OperatorEntity::getId, operator.getId()) .set(OperatorEntity::getCompletion, FlowNature.Normal) .set(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode()) .set(OperatorEntity::getHandleStatus, null) .set(OperatorEntity::getCreatorTime, new Date()) .set(OperatorEntity::getHandleTime, null); this.update(wrapper); //删除其他经办 if (ObjectUtil.equals(operator.getParentId(), FlowNature.ParentId)) { // 依次审批 if (StringUtil.isNotBlank(operator.getHandleAll())) { operatorUtil.deleteInTurnOperator(operator, operator.getHandleId()); } //逐级审批 operatorUtil.deleteStepOperator(operator); } return; } // 节点记录 NodeRecordModel nodeRecordModel = new NodeRecordModel(); nodeRecordModel.setTaskId(operator.getTaskId()); nodeRecordModel.setNodeId(operator.getNodeId()); nodeRecordModel.setNodeCode(operator.getNodeCode()); nodeRecordModel.setNodeName(operator.getNodeName()); nodeRecordModel.setNodeStatus(NodeStateEnum.recall.getCode()); nodeRecordService.update(nodeRecordModel); // 删除该节点下一级的经办 if (CollectionUtil.isNotEmpty(nextCodes)) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId()) .in(OperatorEntity::getNodeCode, nextCodes); List list = this.list(wrapper); if (CollectionUtil.isNotEmpty(list)) { this.remove(wrapper); // 删除超时相关 FlowJobUtil.deleteByOperatorId(operator.getId(), redisUtil); for (OperatorEntity operatorEntity : list) { FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil); } } //逐级信息删除 QueryWrapper launchWrapper = new QueryWrapper<>(); launchWrapper.lambda().eq(LaunchUserEntity::getType, FlowNature.StepInitiation) .eq(LaunchUserEntity::getTaskId, taskEntity.getId()) .in(LaunchUserEntity::getNodeCode, nextCodes); launchUserService.remove(launchWrapper); } // 撤回跳转 JumpFo fo = new JumpFo(); fo.setInstanceId(taskEntity.getInstanceId()); List executeNodes = this.getNodeCodeByGroupId(nextCodes, flowModel.getNodes()); if (CollectionUtil.isNotEmpty(executeNodes)) { nextCodes.addAll(executeNodes); } fo.setSource(nextCodes); List targetList = new ArrayList<>(); targetList.add(nodeEntity.getNodeCode()); fo.setTarget(targetList); flowAbleUrl.jump(fo); List taskModelList = flowAbleUrl.getCurrentTask(taskEntity.getInstanceId()); FlowableTaskModel model = taskModelList.stream().filter(e -> e.getTaskKey().equals(operator.getNodeCode())).findFirst().orElse(null); String nodeId = null; if (null != model) { nodeId = model.getTaskId(); } // 还原经办(其它已审批、作废的经办无需还原) UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(OperatorEntity::getId, operator.getId()) .set(OperatorEntity::getCompletion, FlowNature.Normal) .set(OperatorEntity::getNodeId, nodeId) .set(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode()) .set(OperatorEntity::getHandleStatus, null) .set(OperatorEntity::getCreatorTime, new Date()) .set(OperatorEntity::getHandleTime, null); this.update(wrapper); // 更新节点经办的nodeId wrapper.clear(); wrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()) .eq(OperatorEntity::getNodeCode, operator.getNodeCode()).eq(OperatorEntity::getParentId, operator.getParentId()) .set(OperatorEntity::getNodeId, nodeId); this.update(wrapper); List userIds = new ArrayList<>(); userIds.add(operator.getHandleId()); // 获取未审批过的复原 operatorUtil.recallRestore(operator, nodeId, userIds); // 删除该节点下一级的候选人,有修改操作的 // candidatesService.deleteByCodes(taskEntity.getId(), nextCodes); candidatesService.delete(taskEntity.getId(), nextCodes, userIds); // 超时 List entityList = new ArrayList<>(); OperatorEntity entity = this.getById(operator.getId()); entityList.add(entity); operatorUtil.addOperatorList(entityList, flowModel); // 获取当前节点信息 taskUtil.updateCurrentNode(taskModelList, flowModel.getNodes(), taskEntity); } // 根据组ID获取同组的执行节点 public List getNodeCodeByGroupId(List nextCodes, Map nodes) { List list = new ArrayList<>(); if (CollectionUtil.isEmpty(nextCodes) || CollectionUtil.isEmpty(nodes)) { return list; } for (String nextCode : nextCodes) { NodeModel nodeModel = nodes.get(nextCode); if (null != nodeModel && ObjectUtil.equals(nodeModel.getType(), NodeEnum.trigger.getType())) { String groupId = nodeModel.getGroupId(); for (String key : nodes.keySet()) { NodeModel model = nodes.get(key); if (null != model && ObjectUtil.equals(model.getGroupId(), groupId)) { list.add(key); } } } } return list; } // 转审 @Override public void transfer(String id, FlowModel flowModel) throws Exception { String transferUserId = flowModel.getHandleIds(); OperatorEntity operator = operatorUtil.checkOperator(id); boolean isProcessing = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.Processing); if (StringUtil.isBlank(transferUserId) || operator.getStatus().equals(OperatorStateEnum.Transfer.getCode()) || operator.getStatus().equals(OperatorStateEnum.AddSign.getCode())) { throw new WorkFlowException(isProcessing ? MsgCode.WF151.get() : MsgCode.WF084.get()); } String userId = flowModel.getUserInfo() == null ? UserProvider.getLoginUserId() : flowModel.getUserInfo().getUserId(); if (StringUtil.equals(transferUserId, userId)) { throw new WorkFlowException(isProcessing ? MsgCode.WF149.get() : MsgCode.WF107.get()); } if (!ObjectUtil.equals(operator.getHandleId(), userId)) { List delegateList = delegateService.getByToUserId(userId); List userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList()); if (userIds.contains(transferUserId)) { throw new WorkFlowException(isProcessing ? MsgCode.WF150.get() : MsgCode.WF117.get()); } } taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity globalEntity = nodeEntityList.stream() .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity()); NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class); // 记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NotProcessing) ? RecordEnum.transfer.getCode() : RecordEnum.transferProcessing.getCode()); flowMethod.setFlowModel(flowModel); flowMethod.setOperatorEntity(operator); List userIds = new ArrayList<>(); userIds.add(transferUserId); flowMethod.setUserId(String.join(",", userIds)); recordUtil.createRecord(flowMethod); // 更新经办 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId()) .set(OperatorEntity::getHandleId, transferUserId) .set(OperatorEntity::getCreatorTime, new Date()) .set(OperatorEntity::getDraftData, null) .set(OperatorEntity::getStatus, OperatorStateEnum.Transfer.getCode()); Boolean flowTodo = serviceUtil.getFlowTodo(); if (!flowTodo) { updateWrapper.lambda().set(OperatorEntity::getStartHandleTime, null); Boolean flowSign = serviceUtil.getFlowSign(); if (!flowSign) { if (global != null && global.getHasSignFor()) { updateWrapper.lambda().set(OperatorEntity::getSignTime, null); } } } this.update(updateWrapper); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); List list = new ArrayList<>(); operator = this.getById(operator.getId()); list.add(operator); flowMsgModel.setOperatorList(list); flowMsgModel.setNodeList(nodeEntityList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(operator.getNodeCode()); flowMsgModel.setFormData(FlowContextHolder.getAllData()); flowMsgModel.setTransfer(true); msgUtil.message(flowMsgModel); // 删除超时相关 FlowJobUtil.deleteByOperatorId(operator.getId(), redisUtil); operatorUtil.addOperatorList(list, flowModel); } // 协办, 新增经办,节点通过后,删除协办 @Override public void assist(String id, FlowModel flowModel) throws WorkFlowException { String handleIds = flowModel.getHandleIds(); List ids = Arrays.stream(handleIds.split(",")).collect(Collectors.toList()); String userId = UserProvider.getLoginUserId(); if (ids.contains(userId)) { throw new WorkFlowException(MsgCode.WF108.get()); } OperatorEntity operator = operatorUtil.checkOperator(id); if (!ObjectUtil.equals(operator.getHandleId(), userId)) { List delegateList = delegateService.getByToUserId(userId); List userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList()); List filterList = userIds.stream().filter(ids::contains).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(filterList)) { throw new WorkFlowException(MsgCode.WF118.get()); } } // QueryWrapper wrapper = new QueryWrapper<>(); // wrapper.lambda().eq(OperatorEntity::getParentId, id).eq(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()); // long count = this.count(wrapper); // if (count > 0) { // throw new WorkFlowException(MsgCode.WF085.get()); // } taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); Map nodes = flowModel.getNodes(); NodeModel global = nodes.get(NodeEnum.global.getType()); boolean signFor = false; if (null != global) { signFor = global.getHasSignFor(); } List userList = serviceUtil.getUserName(ids); if (CollectionUtil.isNotEmpty(userList)) { Boolean flowTodo = serviceUtil.getFlowTodo(); Boolean flowSign = serviceUtil.getFlowSign(); List list = new ArrayList<>(); NodeModel nodeModel = nodes.get(operator.getNodeCode()); int processing = ObjectUtil.isNotEmpty(nodeModel) && ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ? FlowNature.Processing : FlowNature.NotProcessing; for (UserEntity user : userList) { OperatorEntity operatorEntity = new OperatorEntity(); operatorEntity.setParentId(operator.getId()); operatorEntity.setNodeName(operator.getNodeName()); operatorEntity.setNodeCode(operator.getNodeCode()); operatorEntity.setTaskId(operator.getTaskId()); operatorEntity.setNodeId(operator.getNodeId()); operatorEntity.setEngineType(operator.getEngineType()); operatorEntity.setHandleId(user.getId()); operatorEntity.setStatus(OperatorStateEnum.Assist.getCode()); operatorEntity.setIsProcessing(processing); operatorEntity.setCompletion(FlowNature.Normal); if (flowTodo) { operatorEntity.setSignTime(new Date()); operatorEntity.setStartHandleTime(new Date()); } else { if (flowSign) { operatorEntity.setSignTime(new Date()); } else { if (!signFor) { operatorEntity.setSignTime(new Date()); } } } list.add(operatorEntity); } this.saveBatch(list); // 记录 FlowMethod flowMethod = new FlowMethod(); flowMethod.setType(RecordEnum.assist.getCode()); flowMethod.setFlowModel(flowModel); flowMethod.setOperatorEntity(operator); List userIds = userList.stream().map(UserEntity::getId).collect(Collectors.toList()); flowMethod.setUserId(String.join(",", userIds)); recordUtil.createRecord(flowMethod); // 消息 FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setOperatorList(list); flowMsgModel.setNodeList(flowModel.getNodeEntityList()); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setNodeCode(operator.getNodeCode()); msgUtil.message(flowMsgModel); } } // 协办保存,仅保存表单数据 @DSTransactional @Override public void assistSave(String id, FlowModel flowModel) throws WorkFlowException { OperatorEntity operator = operatorUtil.checkOperator(id); taskUtil.setFlowModel(operator.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); taskUtil.checkTemplateHide(taskEntity.getTemplateId()); taskUtil.isSuspend(taskEntity); taskUtil.isCancel(taskEntity); Map formData = flowModel.getFormData(); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null); if (null == nodeEntity) { throw new WorkFlowException(MsgCode.WF076.get()); } NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); FlowContextHolder.addChildData(operator.getTaskId(), nodeEntity.getFormId(), formData, nodeModel.getFormOperates(), true); serviceUtil.handleFormData(taskEntity.getFlowId(), false); } @Override public List batchFlowSelector() { List batchList = this.getBatchList(); List taskIdList = batchList.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList()); List taskList = taskUtil.getOrderStaList(taskIdList); Map> flowList = taskList.stream() .collect(Collectors.groupingBy(TaskEntity::getTemplateId)); List batchFlowList = new ArrayList<>(); for (String key : flowList.keySet()) { List flowTaskList = flowList.get(key); if (CollectionUtil.isNotEmpty(flowTaskList)) { List taskIds = flowTaskList.stream().map(TaskEntity::getId).collect(Collectors.toList()); List flowIds = flowTaskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList()); List jsonList = templateJsonService.listByIds(flowIds); String fullName = flowTaskList.stream().map(TaskEntity::getFlowName).distinct().collect(Collectors.joining(",")); String flowId = jsonList.stream().map(TemplateJsonEntity::getTemplateId).distinct().collect(Collectors.joining(",")); long count = batchList.stream().filter(e -> taskIds.contains(e.getTaskId())).count(); FlowBatchModel model = new FlowBatchModel(); model.setNum(count); model.setId(flowId); model.setFullName(fullName + "(" + count + ")"); batchFlowList.add(model); } } batchFlowList = batchFlowList.stream().sorted(Comparator.comparing(FlowBatchModel::getNum).reversed()).collect(Collectors.toList()); return batchFlowList; } public List getBatchList() { String userId = UserProvider.getLoginUserId(); List userList = delegateService.getByToUserId(userId).stream() .map(DelegateEntity::getCreatorUserId).collect(Collectors.toList()); userList.add(userId); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(OperatorEntity::getHandleId, userList) .eq(OperatorEntity::getCompletion, FlowNature.Normal) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()) .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()) .isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime) .isNull(OperatorEntity::getHandleStatus) .select(OperatorEntity::getTaskId); return this.list(queryWrapper); } @Override public List batchVersionSelector(String templateId) { List taskIdList = this.getBatchList().stream().map(OperatorEntity::getTaskId).collect(Collectors.toList()); List taskList = taskUtil.getOrderStaList(taskIdList); List flowIdList = taskList.stream().filter(e -> e.getTemplateId().equals(templateId)) .map(TaskEntity::getFlowId).collect(Collectors.toList()); List batchFlowList = new ArrayList<>(); if (CollectionUtil.isEmpty(flowIdList)) { return batchFlowList; } List jsonList = templateJsonService.listByIds(flowIdList); List templateList = templateService.listByIds(jsonList.stream().map(TemplateJsonEntity::getTemplateId).distinct().collect(Collectors.toList())); for (TemplateJsonEntity jsonEntity : jsonList) { FlowBatchModel model = JsonUtil.getJsonToBean(jsonEntity, FlowBatchModel.class); TemplateEntity template = templateList.stream().filter(e -> e.getId().equals(jsonEntity.getTemplateId())).findFirst().orElse(null); if (null != template) { model.setFullName(template.getFullName() + "(v" + jsonEntity.getVersion() + ")"); batchFlowList.add(model); } } return batchFlowList; } @Override public List batchNodeSelector(String flowId) { List nodeList = templateNodeService.getList(flowId); List list = new ArrayList<>(); for (TemplateNodeEntity nodeEntity : nodeList) { if (NodeEnum.approver.getType().equals(nodeEntity.getNodeType())) { NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); FlowBatchModel model = new FlowBatchModel(); model.setId(nodeModel.getNodeId()); model.setFullName(nodeModel.getNodeName()); list.add(model); } } return list; } @Override public Map batchNode(FlowModel flowModel) throws WorkFlowException { String flowId = flowModel.getFlowId(); String nodeCode = flowModel.getNodeCode(); TemplateJsonInfoVO jsonInfoVO = templateJsonService.getInfoVo(flowId); Map> flowNodes = jsonInfoVO.getFlowNodes(); return flowNodes.get(nodeCode); } // 批量获取候选人,不允许条件 1.线上存在条件 2.下一级节点存在候选人(20240711 第二项去除) @Override public CandidateCheckVo batchCandidates(String flowId, String operatorId, Integer batchType) throws WorkFlowException { TemplateJsonEntity jsonEntity = templateJsonService.getInfo(flowId); OperatorEntity operator = this.getById(operatorId); if (null == operator) { throw new WorkFlowException(MsgCode.FA001.get()); } List nodeEntityList = templateNodeService.getList(flowId); Map nodes = new HashMap<>(); for (TemplateNodeEntity nodeEntity : nodeEntityList) { nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class)); } NodeModel nodeModel = nodes.get(operator.getNodeCode()); if (taskUtil.checkBranch(nodeModel)) { throw new WorkFlowException("下一节点为选择分支无法批量审批"); } NodeModel global = nodes.get(NodeEnum.global.getType()); if (ObjectUtil.equals(batchType, 1) && !global.getHasContinueAfterReject()) { return new CandidateCheckVo(); } // 获取节点的出线 OutgoingFlowsFo flowsFo = new OutgoingFlowsFo(); flowsFo.setDeploymentId(jsonEntity.getFlowableId()); flowsFo.setTaskKey(operator.getNodeCode()); List outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo); // 线上存在条件 for (String outgoingFlow : outgoingFlows) { NodeModel flowNode = nodes.get(outgoingFlow); if (flowNode != null && CollectionUtil.isNotEmpty(flowNode.getConditions())) { throw new WorkFlowException(MsgCode.WF119.get()); } } CandidateCheckFo fo = new CandidateCheckFo(); fo.setFlowId(flowId); fo.setHandleStatus(ObjectUtil.equals(batchType, 1) ? FlowNature.RejectCompletion : FlowNature.AuditCompletion); return taskService.checkCandidates(operatorId, fo); } @DSTransactional @Override public void batch(FlowModel flowModel) throws Exception { Integer batchType = flowModel.getBatchType(); List ids = new ArrayList<>(); List idList = new ArrayList<>(); operatorUtil.checkBatch(flowModel.getIds(), idList, false); operatorUtil.checkBatchRevoke(idList, ids, batchType); int count = 0; List taskList = new ArrayList<>(); for (String id : ids) { operatorUtil.checkOperatorPermission(id); OperatorEntity operator = operatorUtil.checkOperator(id); TaskEntity taskEntity = taskService.getInfo(operator.getTaskId()); taskList.add(taskEntity); FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class); model.setId(id); switch (batchType) { case 0: case 1: model.setHandleStatus(Objects.equals(1, batchType) ? FlowNature.RejectCompletion : FlowNature.AuditCompletion); try { this.audit(id, model); } catch (Exception e) { if (e instanceof WorkFlowException) { // 当选择多条数据且下个审批节点出现异常时,跳过异常节点能通过的即审批通过,异常的不处理 WorkFlowException workFlowException = (WorkFlowException) e; if (ObjectUtil.equals(workFlowException.getCode(), 200)) { count++; break; } } operatorUtil.compensate(taskEntity); throw e; } break; case 2: this.transfer(id, model); break; case 3: try { this.back(id, model); } catch (Exception e) { operatorUtil.compensate(taskEntity); throw e; } } } // 当选择的数据都是异常时,提示:“下一节点审批异常,无法批量审批” if (ids.size() == count) { flowModel.setTaskList(taskList); throw new WorkFlowException(MsgCode.WF120.get()); } } @Override public FlowWorkListVO flowWork(String fromId) { FlowWorkListVO vo = new FlowWorkListVO(); List waitList = new ArrayList<>(); // 经办 QueryWrapper operatorWrapper = new QueryWrapper<>(); operatorWrapper.lambda().eq(OperatorEntity::getHandleId, fromId).eq(OperatorEntity::getCompletion, FlowNature.Normal) .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode()); List operatorList = this.list(operatorWrapper); if (CollectionUtil.isNotEmpty(operatorList)) { List taskIds = operatorList.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList()); List taskList = taskUtil.getOrderStaList(taskIds); List templateList = templateService.getListOfHidden(taskList.stream().map(TaskEntity::getTemplateId).collect(Collectors.toList())); for (OperatorEntity operator : operatorList) { FlowWorkModel workModel = JsonUtil.getJsonToBean(operator, FlowWorkModel.class); TaskEntity taskEntity = taskList.stream().filter(e -> e.getId().equals(operator.getTaskId())).findFirst().orElse(null); if (null != taskEntity) { workModel.setFullName(taskEntity.getFullName()); TemplateEntity template = templateList.stream() .filter(e -> e.getId().equals(taskEntity.getTemplateId())).findFirst().orElse(null); if (null != template) { workModel.setIcon(template.getIcon()); waitList.add(workModel); } } } } vo.setFlowTask(waitList); // 流程 List flowList = new ArrayList<>(); List nodeList = templateNodeService.getListLikeUserId(fromId); if (CollectionUtil.isNotEmpty(nodeList)) { List flowIds = nodeList.stream().map(TemplateNodeEntity::getFlowId).collect(Collectors.toList()); List versionList = templateJsonService.listByIds(flowIds); List templateList = templateService.getListByFlowIds(flowIds); for (TemplateJsonEntity jsonEntity : versionList) { if (!ObjectUtil.equals(jsonEntity.getState(), 1)) { continue; } FlowWorkModel workModel = JsonUtil.getJsonToBean(jsonEntity, FlowWorkModel.class); for (TemplateNodeEntity nodeEntity : nodeList) { if (nodeEntity.getNodeJson().contains(fromId)) { TemplateEntity template = templateList.stream() .filter(e -> e.getId().equals(jsonEntity.getTemplateId())).findFirst().orElse(null); if (null != template) { workModel.setIcon(template.getIcon()); workModel.setFullName(template.getFullName() + "(V" + jsonEntity.getVersion() + ")"); flowList.add(workModel); break; } } } } } vo.setFlow(flowList); return vo; } @Override public boolean flowWork(WorkHandoverModel workHandoverModel) { String fromId = workHandoverModel.getFromId(); String toId = workHandoverModel.getHandoverUser(); List waitList = workHandoverModel.getFlowTaskList(); if (!waitList.isEmpty()) { // 更新经办 QueryWrapper operator = new QueryWrapper<>(); operator.lambda().in(OperatorEntity::getId, waitList) .eq(OperatorEntity::getHandleId, fromId); List operatorList = this.list(operator); if (CollectionUtil.isNotEmpty(operatorList)) { for (OperatorEntity entity : operatorList) { entity.setHandleId(toId); String handleAll = entity.getHandleAll(); if (StringUtil.isNotBlank(handleAll)) { String str = handleAll.replaceAll(fromId, toId); entity.setHandleAll(str); } } this.updateBatchById(operatorList); } // 更新候选人 UpdateWrapper candidate = new UpdateWrapper<>(); candidate.lambda().in(CandidatesEntity::getOperatorId, waitList) .eq(CandidatesEntity::getHandleId, fromId) .set(CandidatesEntity::getHandleId, toId); candidatesService.update(candidate); } // 流程 List flowList = workHandoverModel.getFlowList(); if (!flowList.isEmpty()) { UserEntity toUser = serviceUtil.getUserInfo(toId); String toUserName = toUser != null ? toUser.getRealName() + "/" + toUser.getAccount() : ""; UserEntity fromUser = serviceUtil.getUserInfo(fromId); String fromUserName = fromUser != null ? fromUser.getRealName() + "/" + fromUser.getAccount() : ""; List versionList = templateJsonService.listByIds(flowList); if (CollectionUtil.isNotEmpty(versionList)) { List updateList = new ArrayList<>(); for (TemplateJsonEntity jsonEntity : versionList) { List nodeList = templateNodeService.getList(jsonEntity.getId()); for (TemplateNodeEntity nodeEntity : nodeList) { if (nodeEntity.getNodeJson().contains(fromId)) { String str = nodeEntity.getNodeJson().replaceAll(fromId, toId).replaceAll(fromUserName, toUserName); nodeEntity.setNodeJson(str); updateList.add(nodeEntity); } } } if (CollectionUtil.isNotEmpty(updateList)) { templateNodeService.updateBatchById(updateList); } } } return true; } }