From 6f97a42dccaedb7a8950feac205080e63d8be439 Mon Sep 17 00:00:00 2001 From: yupeng <roc__yu@163.com> Date: 星期三, 26 二月 2025 14:27:01 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' into xizang-changyun --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java | 246 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 246 insertions(+), 0 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java new file mode 100644 index 0000000..d8efb13 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java @@ -0,0 +1,246 @@ +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); + // TODO 发短信 + break; + } + case CATEGORY2: { + // 合同签订审批 + break; + } + case CATEGORY3: { + // 合同提前终止审批 + break; + } + default: + throw new ServiceException("错误类型"); + } + + } + +} \ No newline at end of file -- Gitblit v1.7.1