package com.ruoyi.system.service.impl; import cn.hutool.core.util.ObjectUtil; import com.aizuda.bpm.engine.FlowLongEngine; import com.aizuda.bpm.engine.assist.ObjectUtils; import com.aizuda.bpm.engine.core.FlowCreator; import com.aizuda.bpm.engine.core.FlowLongContext; import com.aizuda.bpm.engine.core.enums.EventType; import com.aizuda.bpm.engine.core.enums.NodeApproveSelf; import com.aizuda.bpm.engine.core.enums.NodeSetType; import com.aizuda.bpm.engine.core.enums.TaskType; import com.aizuda.bpm.engine.entity.FlwExtInstance; import com.aizuda.bpm.engine.entity.FlwHisTask; import com.aizuda.bpm.engine.entity.FlwTask; import com.aizuda.bpm.engine.entity.FlwTaskActor; import com.aizuda.bpm.engine.listener.TaskListener; import com.aizuda.bpm.engine.model.NodeAssignee; import com.aizuda.bpm.engine.model.NodeModel; import com.aizuda.bpm.engine.model.ProcessModel; import com.aizuda.bpm.mybatisplus.mapper.FlwExtInstanceMapper; import com.aizuda.bpm.mybatisplus.mapper.FlwHisTaskMapper; import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper; import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.enums.ProcessCategoryEnum; import com.ruoyi.common.enums.SubmitStatusEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.TContractService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.function.Supplier; import java.util.stream.Collectors; /** * 工作流程全局任务监听 同步方式 只监听流程完成、流程中断类型,修改拒绝状态 *

* 1. 入户调查 * 2. 价格评估 * 3. 协议签订 * 4. 资金管理-预算资金 * 5. 住宅临时安置补助费 * 6. 停产停业经济损失补助费 * 7. 安置情况(流程图中叫做录入货币补偿金额信息) * 固定对应表 state_process_module */ @Slf4j @Component @RequiredArgsConstructor public class FlowListenerService implements TaskListener { private final FlwExtInstanceMapper flwExtInstanceMapper; private final FlowLongEngine flowLongEngine; private final FlwTaskActorMapper flwTaskActorMapper; private final FlwHisTaskMapper flwHisTaskMapper; private final ISysRoleService sysRoleService; private final FlwTaskMapper flwTaskMapper; private final TContractService contractService; @Override public boolean notify(EventType eventType, Supplier supplier, NodeModel nodeModel, FlowCreator flowCreator) { FlwTask flwTask = supplier.get(); if (ObjectUtil.isNull(flwTask)) { return true; } // 创建任务时候,判断是否自动审批通过 if (EventType.create.eq(eventType)) { Integer approveSelf = nodeModel.getApproveSelf(); if (NodeApproveSelf.AutoSkip.eq(approveSelf)) { // 普通成员情况 List nodeAssigneeList = null; if (NodeSetType.specifyMembers.eq(nodeModel.getSetType())) { nodeAssigneeList = nodeModel.getNodeAssigneeList(); if (ObjectUtil.isEmpty(nodeAssigneeList)) { return true; } //查询发起人 LambdaQueryWrapper flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>(); flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue()); flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId()); FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper); if (ObjectUtil.isEmpty(flwHisTask)) { return true; } //对比发起人和节点审批人 if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) { return true; } //查询当前节点审核人是否与创建人一致 List flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId()); if (ObjectUtil.isNotEmpty(flwTaskActor)) { for (FlwTaskActor flwTaskActor1 : flwTaskActor) { if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) { return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator); } } } } else if (NodeSetType.role.eq(nodeModel.getSetType())) { //角色任务跳过 nodeAssigneeList = nodeModel.getNodeAssigneeList(); //获取角色下的用户 List roleIds = nodeAssigneeList.stream().map(NodeAssignee::getId).collect(Collectors.toList()); List actorList = sysRoleService.selectRoleByUserIds(roleIds); List flwTaskActors = new ArrayList<>(); if(ObjectUtils.isNotEmpty(actorList)) { for (SysRole sysRole : actorList) { if(ObjectUtil.isEmpty(sysRole.getRoleName())) { continue; } NodeAssignee nodeAssignee = new NodeAssignee(); nodeAssignee.setId(String.valueOf(sysRole.getRoleId())); nodeAssignee.setName(sysRole.getRoleName()); flwTaskActors.add(FlwTaskActor.of(nodeAssignee, 0)); } } if (ObjectUtil.isEmpty(flwTaskActors)) { return true; } //查询发起人 LambdaQueryWrapper flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>(); flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue()); flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId()); FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper); if (ObjectUtil.isEmpty(flwHisTask)) { return true; } //对比发起人和节点审批人 if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) { return true; } //查询当前节点审核人是否与创建人一致 List flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId()); if (ObjectUtil.isNotEmpty(flwTaskActor)) { for (FlwTaskActor flwTaskActor1 : flwTaskActor) { if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) { return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator); } } } } } } if (eventType.equals(EventType.reject) || eventType.equals(EventType.autoReject)) { System.out.println("流程失败:" + flwTask.getVariable()); handlerBusiness(flwTask.getVariable(), 2); } else if (eventType.equals(EventType.complete)) { // 查询流程模型 FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId()); String modelContent = flwExtInstance.getModelContent(); ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false); NodeModel node = processModel.getNode(flwTask.getTaskKey()); if (ObjectUtil.isEmpty(node)) { log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId()); return true; } long count = flwTaskMapper.selectCount(new LambdaQueryWrapper().eq(FlwTask::getInstanceId,flwTask.getInstanceId())); if(count > 0){ return true; } //最后一个节点 if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) { System.out.println("流程完成:" + flwTask.getVariable()); handlerBusiness(flwTask.getVariable(), 1); } } else if (eventType.eq(EventType.cc)) { // 查询流程模型//抄送 FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId()); String modelContent = flwExtInstance.getModelContent(); ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false); NodeModel node = processModel.getNode(flwTask.getTaskKey()); if (ObjectUtil.isEmpty(node)) { log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId()); return true; } //抄送是最后一个节点 if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) { System.out.println("流程完成:" + flwTask.getVariable()); handlerBusiness(flwTask.getVariable(), 1); } } else if(eventType.eq(EventType.autoJump)){ // 查询流程模型 自动跳转 FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId()); String modelContent = flwExtInstance.getModelContent(); ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false); NodeModel node = processModel.getNode(flwTask.getTaskKey()); if (ObjectUtil.isEmpty(node)) { log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId()); return true; } long count = flwTaskMapper.selectCount(new LambdaQueryWrapper().eq(FlwTask::getInstanceId,flwTask.getInstanceId())); if(count > 0){ return true; } //最后一个节点 if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) { System.out.println("流程完成:" + flwTask.getVariable()); handlerBusiness(flwTask.getVariable(), 1); } } return true; } /** * 业务状态变更 */ private void handlerBusiness(String variable, Integer status) { JSONObject processParameter = JSON.parseObject(variable); //必须参数,肯定有不判断null Integer category = processParameter.getInteger("category"); //状态 暂定:0待审核 1审核通过 2审核拒绝 ProcessCategoryEnum categoryEnum = ProcessCategoryEnum.getEnumByKey(category); switch (categoryEnum) { case CATEGORY1: { // 合同新增审批 int submitStatus = status==0?2:(status==1?3:5); contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus); // TODO 发短信 break; } case CATEGORY2: { // 合同签订审批 break; } case CATEGORY3: { // 合同提前终止审批 break; } default: throw new ServiceException("错误类型"); } } }