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("错误类型");
}
}
}