xuhy
2025-04-27 5fa6e6f8410ef9d057174bcff2a3c5038c54a551
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -7,8 +7,11 @@
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.aizuda.bpm.engine.FlowLongEngine;
import com.aizuda.bpm.engine.TaskService;
import com.aizuda.bpm.engine.core.FlowCreator;
import com.aizuda.bpm.engine.core.enums.InstanceState;
import com.aizuda.bpm.engine.core.enums.TaskType;
import com.aizuda.bpm.engine.dao.FlwInstanceDao;
import com.aizuda.bpm.engine.entity.*;
import com.aizuda.bpm.engine.model.NodeModel;
import com.aizuda.bpm.mybatisplus.mapper.*;
@@ -19,11 +22,14 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ImmutableMap;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.enums.StateProcessActionEnum;
import com.ruoyi.common.enums.TaskEventType;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.exception.state.StateErrorCode;
import com.ruoyi.common.utils.SecurityUtils;
@@ -31,6 +37,7 @@
import com.ruoyi.system.bo.*;
import com.ruoyi.system.mapper.StateProcessTemplateMapper;
import com.ruoyi.system.mapper.TContractMapper;
import com.ruoyi.system.mapper.TContractRentTypeMapper;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.ProcessDetailVO;
@@ -47,6 +54,7 @@
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@Service
@@ -65,6 +73,8 @@
    @Autowired
    private FlwTaskMapper flwTaskMapper;
    @Autowired
    private TaskService taskService;
    @Autowired
    private StateTaskCenterService stateTaskCenterService;
    @Autowired
    private StateProcessModuleService stateProcessModuleService;
@@ -76,6 +86,8 @@
    private ISysUserService sysUserService;
    @Autowired
    private TContractMapper contractMapper;
    @Autowired
    private TContractRentTypeMapper contractRentTypeMapper;
    /**
     * 流程模版分页
@@ -266,6 +278,83 @@
            stateTaskCenter.setFlowId(instance.getId().toString());
            stateTaskCenter.setRemark(processStartBO.getRemark());
            stateTaskCenter.setCreateBy(loginUser.getUser().getNickName());
            stateTaskCenter.setVariable(JSONUtil.toJsonStr(processStartBO.getVariable()));
            stateTaskCenter.setProjectId(JSONObject.parseObject(JSONUtil.toJsonStr(processStartBO.getVariable())).getString("projectId"));
            stateTaskCenterService.save(stateTaskCenter);
            // action记录
            StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
            stateProcessInstanceAction.setId(IdUtils.simpleUUID());
            stateProcessInstanceAction.setInstanceId(instance.getId().toString());
            stateProcessInstanceAction.setActionType(StateProcessActionEnum.START.getValue());
            stateProcessInstanceAction.setAuditorId(creator.getCreateId());
            stateProcessInstanceActionService.save(stateProcessInstanceAction);
            // 添加拓展信息
            StateProcessExtInstance stateProcessExtInstance = new StateProcessExtInstance();
            stateProcessExtInstance.setId(instance.getId().toString());
            stateProcessExtInstance.setTemplateId(lastTemplate.getId());
            stateProcessExtInstance.setProcessId(flwProcess.getId().toString());
            //保存version
            stateProcessExtInstance.setProcessVersion(flwProcess.getProcessVersion());
            stateProcessExtInstanceService.save(stateProcessExtInstance);
        }
        return true;
    }
    /**
     * 启动流程
     * @param processStartBO
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean startApplet(ProcessStartBO processStartBO) {
        String userId = "1";
        String nickName = "admin";
        FlowCreator creator = FlowCreator.of(userId, nickName);
        //查询流程绑定
        StateProcessModule stateProcessModule = stateProcessModuleService.getOne(Wrappers.<StateProcessModule>lambdaQuery()
                .eq(StateProcessModule::getCategory, processStartBO.getCategory()));
        if (ObjectUtil.isNull(stateProcessModule) || ObjectUtil.isEmpty(stateProcessModule.getTemplateId())) {
            throw new GlobalException("请先配置流程引擎模版!");
        }
        //查询模版,准备启动
        StateProcessTemplate template = this.getById(stateProcessModule.getTemplateId());
        StateProcessTemplate lastTemplate = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey())
                .apply("(template_key, template_version) in(" +
                        "SELECT template_key, MAX(template_version) " +
                        "FROM state_process_template " +
                        "GROUP BY template_key)")
        );
        if (ObjectUtil.isNull(lastTemplate)) {
            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
        }
        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(lastTemplate.getWorkFlowId());
        if (ObjectUtil.isNull(flwProcess)) {
            throw new GlobalException(StateErrorCode.PROCESS_NOT_DEPLOY.getValue());
        }
        if (!Objects.equals(lastTemplate.getWorkflowVersion(), flwProcess.getProcessVersion())) {
            throw new GlobalException(StateErrorCode.PROCESS_VERSION_ERROR.getValue());
        }
        //监听器参数补全
        processStartBO.getVariable().put("category", processStartBO.getCategory());
        // 开启流程
        Optional<FlwInstance> flwInstanceOptional = flowLongEngine.startInstanceById(flwProcess.getId(), creator, processStartBO.getVariable());
        if(flwInstanceOptional.isPresent()){
            FlwInstance instance = flwInstanceOptional.get();
            //存储任务中心信息
            StateTaskCenter stateTaskCenter = new StateTaskCenter();
            stateTaskCenter.setId(IdUtils.simpleUUID());
            stateTaskCenter.setName(processStartBO.getName());
            stateTaskCenter.setModuleName(processStartBO.getModuleName());
            stateTaskCenter.setCategory(processStartBO.getCategory());
            stateTaskCenter.setFlowId(instance.getId().toString());
            stateTaskCenter.setRemark(processStartBO.getRemark());
            stateTaskCenter.setCreateBy(nickName);
            stateTaskCenter.setVariable(JSONUtil.toJsonStr(processStartBO.getVariable()));
            stateTaskCenter.setProjectId(JSONObject.parseObject(JSONUtil.toJsonStr(processStartBO.getVariable())).getString("projectId"));
            stateTaskCenterService.save(stateTaskCenter);
@@ -494,6 +583,14 @@
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        }
        // 查询合同信息
        List<TContract> tContracts = contractMapper.selectList(Wrappers.<TContract>lambdaQuery()
                .in(TContract::getStatus, 2,3,4,9));
        List<String> contractIds = tContracts.stream().map(TContract::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(contractIds)){
            return new PageInfo<>();
        }
        stateTaskQuery.in(StateTaskCenter::getProjectId, contractIds);
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
        PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
@@ -573,49 +670,41 @@
            new PageInfo<>();
        }
        List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId)
        List<String> instanceIds = flwHisTaskList.stream().map(FlwTask::getInstanceId)
                .map(String::valueOf).collect(Collectors.toList());
        //分页查询任务中心任务
        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
        }
        if (ObjectUtil.isEmpty(instanceId)) {
            return new PageInfo<>();
        }
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
        //转换类
        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
        // 查询合同信息
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            // 查询合同信息
            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
            processTaskListVO.setContract(contract);
        }
        pageInfo.setRecords(processTaskListVOS);
//        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
//        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
//            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
//        }
//        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
//            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
//        }
//        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
//            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
//        }
//        if (ObjectUtil.isEmpty(instanceId)) {
//            return new PageInfo<>();
//        }
//        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
//        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        processTaskListBO.setInstanceIds(instanceIds);
        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
        if (ObjectUtil.isEmpty(processTaskListVOS)) {
            return pageInfo;
            return new PageInfo<>();
        }
        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
        //查询原因
        List<String> taskIds = flwHisTaskList.stream().map(FlowEntity::getId).map(String::valueOf).collect(Collectors.toList());
        List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
                Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
        Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
        Map<String, StateProcessInstanceAction> actionMap = new HashMap<>();
        if(!CollectionUtils.isEmpty(taskIds)){
            List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
                    Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
            actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
        }
        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
        Map<Long, SysUser> sysUserMap;
        if (!CollectionUtils.isEmpty(updateUserId)) {
            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
@@ -629,7 +718,7 @@
            sysUserMap = new HashMap<>();
        }
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
@@ -643,16 +732,18 @@
                    }
                }
            }
            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getTaskId());
            if (ObjectUtil.isNotEmpty(action)) {
                processTaskListVO.setReason(action.getRemark());
            if(!CollectionUtils.isEmpty(actionMap)){
                StateProcessInstanceAction action = actionMap.get(processTaskListVO.getTaskId());
                if (ObjectUtil.isNotEmpty(action)) {
                    processTaskListVO.setReason(action.getRemark());
                }
            }
            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
            if (Objects.nonNull(sysUser)) {
                processTaskListVO.setCreateBy(sysUser.getNickName());
            }
        }
        return pageInfo;
        return processTaskListVOS;
    }
    @Override
    public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) {
@@ -728,6 +819,14 @@
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        }
        // 查询合同信息
        List<TContract> tContracts = contractMapper.selectList(Wrappers.<TContract>lambdaQuery()
                .in(TContract::getStatus, 2,3,4,9));
        List<String> contractIds = tContracts.stream().map(TContract::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(contractIds)){
            return new PageInfo<>();
        }
        stateTaskQuery.in(StateTaskCenter::getProjectId, contractIds);
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
@@ -905,12 +1004,17 @@
        if (ObjectUtil.isNull(flwTask)) {
            throw new GlobalException("任务已处理或者不存在");
        }
        flowLongEngine.executeTask(taskId, currentFlowCreator());
        // 动作执行记录
        StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
        if(Objects.nonNull(processAgreeBO.getUserId())){
            flowLongEngine.executeTask(taskId, currentFlowCreator(processAgreeBO.getUserId()));
            stateProcessInstanceAction.setAuditorId(String.valueOf(processAgreeBO.getUserId()));
        }else {
            stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
            flowLongEngine.executeTask(taskId, currentFlowCreator());
        }
        // 动作执行记录
        stateProcessInstanceAction.setId(IdUtils.simpleUUID());
        stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString());
        stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
        stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue());
        stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId());
        stateProcessInstanceAction.setRemark(processAgreeBO.getRemark());
@@ -924,6 +1028,7 @@
        FlwTask flwTask = flwTaskMapper.selectById(taskId);
        // 直接拒绝当前流程
        flowLongEngine.runtimeService().reject(flwTask.getInstanceId(), currentFlowCreator());
        flwTaskMapper.deleteById(taskId);
        // 动作执行记录
        StateProcessInstanceAction record = new StateProcessInstanceAction();
        record.setId(IdUtils.simpleUUID());
@@ -934,6 +1039,11 @@
        record.setRemark(processRefuseBO.getRemark());
        record.setPictures(processRefuseBO.getPictures());
        stateProcessInstanceActionService.save(record);
    }
    @Override
    public void revoke(Long instanceId) {
        FlowCreator flowCreator = FlowCreator.of(String.valueOf(SecurityUtils.getUserId()), SecurityUtils.getLoginUser().getUser().getNickName());
        flowLongEngine.runtimeService().revoke(instanceId, flowCreator);
    }
    @Override
@@ -1194,8 +1304,15 @@
        }
        BeanUtil.copyProperties(contract, processDetailVO);
        // 查询递增递减
        TContractRentType tContractRentType = contractRentTypeMapper.selectOne(Wrappers.lambdaQuery(TContractRentType.class)
                .eq(TContractRentType::getContractId, contract.getId())
                .last("LIMIT 1"));
        processDetailVO.setContractRentType(tContractRentType);
        // 查询历史任务
        List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId));
        processDetailVO.setInstanceId(String.valueOf(instanceId));
        processDetailVO.setFlwHisTasks(flwHisTasks);
        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId)
@@ -1248,6 +1365,17 @@
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(FlwHisTask::getCreateTime);
        }
        List<TContract> tContracts = contractMapper.selectList(Wrappers.<TContract>lambdaQuery()
                .in(TContract::getStatus, 2,3,4,9));
        List<String> contractIds = tContracts.stream().map(TContract::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(contractIds)){
            return new PageInfo<>();
        }
        List<StateTaskCenter> list = stateTaskCenterService.list(Wrappers.<StateTaskCenter>lambdaQuery().in(StateTaskCenter::getProjectId, contractIds));
        if(!CollectionUtils.isEmpty(list)){
            List<String> flowIds = list.stream().map(StateTaskCenter::getFlowId).collect(Collectors.toList());
            stateTaskQuery.in(FlwHisTask::getInstanceId, flowIds);
        }
        stateTaskQuery.eq(FlwHisTask::getParentTaskId, 0L);
        stateTaskQuery.like(FlwHisTask::getCreateId, userId);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
@@ -1261,8 +1389,6 @@
            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
            processTaskListVO.setContract(contract);
        }
        pageInfo.setRecords(processTaskListVOS);
        if (ObjectUtil.isEmpty(processTaskListVOS)) {
            return pageInfo;
@@ -1280,13 +1406,15 @@
        } else {
            sysUserMap = new HashMap<>();
        }
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            processTaskListVO.setStatus(processTaskListVO.getTaskState() == 10 ? "2" : processTaskListVO.getTaskState().toString());
            processTaskListVO.setTaskId(processTaskListVO.getId());
            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
            if (Objects.nonNull(sysUser)) {
                processTaskListVO.setCreateBy(sysUser.getNickName());
            }
        }
        pageInfo.setRecords(processTaskListVOS);
        return pageInfo;
    }
@@ -1297,5 +1425,12 @@
        }
        return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
    }
    private FlowCreator currentFlowCreator(Long userId) {
        if (null == userId) {
            throw new GlobalException("非法用户");
        }
        SysUser sysUser = sysUserService.selectUserById(userId);
        return FlowCreator.of(String.valueOf(sysUser.getUserId()), sysUser.getNickName());
    }
}