New file |
| | |
| | | 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; |
| | | |
| | | |
| | | /** |
| | | * 工作流程全局任务监听 同步方式 只监听流程完成、流程中断类型,修改拒绝状态 |
| | | * <p> |
| | | * 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<FlwTask> 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<NodeAssignee> nodeAssigneeList = null; |
| | | if (NodeSetType.specifyMembers.eq(nodeModel.getSetType())) { |
| | | nodeAssigneeList = nodeModel.getNodeAssigneeList(); |
| | | if (ObjectUtil.isEmpty(nodeAssigneeList)) { |
| | | return true; |
| | | } |
| | | //查询发起人 |
| | | LambdaQueryWrapper<FlwHisTask> 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> 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<String> roleIds = nodeAssigneeList.stream().map(NodeAssignee::getId).collect(Collectors.toList()); |
| | | List<SysRole> actorList = sysRoleService.selectRoleByUserIds(roleIds); |
| | | List<FlwTaskActor> 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<FlwHisTask> 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> 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<FlwTask>().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<FlwTask>().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); |
| | | break; |
| | | } |
| | | case CATEGORY2: { |
| | | // 合同签订审批 |
| | | break; |
| | | } |
| | | case CATEGORY3: { |
| | | // 合同提前终止审批 |
| | | break; |
| | | } |
| | | default: |
| | | throw new ServiceException("错误类型"); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |