package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.aizuda.bpm.engine.FlowLongEngine; import com.aizuda.bpm.engine.core.FlowCreator; import com.aizuda.bpm.engine.core.enums.TaskType; import com.aizuda.bpm.engine.entity.*; import com.aizuda.bpm.engine.model.NodeModel; import com.aizuda.bpm.mybatisplus.mapper.*; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONWriter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.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.enums.StateProcessActionEnum; import com.ruoyi.common.exception.GlobalException; import com.ruoyi.common.exception.state.StateErrorCode; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.bo.*; import com.ruoyi.system.mapper.StateProcessTemplateMapper; import com.ruoyi.system.model.*; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.ProcessDetailVO; import com.ruoyi.system.vo.ProcessTaskListVO; import lombok.AllArgsConstructor; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Service public class StateProcessTemplateServiceImpl extends ServiceImpl implements StateProcessTemplateService { @Autowired private FlowLongEngine flowLongEngine; @Autowired private StateProcessInstanceActionService stateProcessInstanceActionService; @Autowired private StateProcessExtInstanceService stateProcessExtInstanceService; @Autowired private FlwHisInstanceMapper flwHisInstanceMapper; @Autowired private FlwTaskActorMapper flwTaskActorMapper; @Autowired private FlwTaskMapper flwTaskMapper; @Autowired private StateTaskCenterService stateTaskCenterService; @Autowired private StateProcessModuleService stateProcessModuleService; @Autowired private FlwHisTaskMapper flwHisTaskMapper; @Autowired private FlwHisTaskActorMapper flwHisTaskActorMapper; @Autowired private ISysUserService sysUserService; @Autowired private TContractService contractService; /** * 流程模版分页 * @param request * @return */ @Override public Page page(ProcessTemplatePageBO request) { //查询流程模板列表 Page templatePage = this.baseMapper.page(new Page<>(request.getCurrentPage(), request.getPageSize()), request); //更新人id列表 List updateUserNameList = templatePage.getRecords().stream().map(BaseModel::getUpdateBy).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(updateUserNameList)) { //根据用户id列表查询用户信息 List sysUsers = sysUserService.selectUserByUserNameList(updateUserNameList); Map sysUserMap; if (!CollectionUtils.isEmpty(sysUsers)) { sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserName, Function.identity())); } else { sysUserMap = new HashMap<>(); } //遍历列表,设置更新人名称 templatePage.getRecords().forEach(e -> { SysUser sysUser = sysUserMap.get(e.getUpdateBy()); if (Objects.nonNull(sysUser)) { e.setUpdateBy(sysUser.getNickName()); } }); } return templatePage; } /** * 修改并部署模版 * @param processUpdateBO * @return */ @Transactional(rollbackFor = Exception.class) @Override public Boolean update(ProcessUpdateBO processUpdateBO) { //查询流程模板 StateProcessTemplate temp = this.getById(processUpdateBO.getId()); //根据template_key查询最新版本的模板 StateProcessTemplate template = this.getOne(Wrappers.lambdaQuery() .eq(StateProcessTemplate::getTemplateKey, temp.getTemplateKey()) .apply("(template_key, template_version) in(" + "SELECT template_key, MAX(template_version) " + "FROM state_process_template " + "GROUP BY template_key)")); if (Objects.isNull(template)) { throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue()); } // 部署流程 LoginUser loginUser = SecurityUtils.getLoginUser(); FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName()); DeployBO deployBO = new DeployBO(); deployBO.setKey(template.getTemplateKey()); deployBO.setName(processUpdateBO.getTemplateName()); deployBO.setNodeConfig(JSONObject.parseObject(processUpdateBO.getProcess(), NodeModel.class)); String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue); InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name()); Long deployId = flowLongEngine.processService().deploy(inputStream, creator, true, null); FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId); // 更新模板, version+1 StateProcessTemplate processTemplate = new StateProcessTemplate(); processTemplate.setId(processUpdateBO.getId()); processTemplate.setWorkFlowId(deployId); processTemplate.setWorkflowVersion(flwProcess.getProcessVersion()); processTemplate.setTemplateName(processUpdateBO.getTemplateName()); processTemplate.setTemplateKey(template.getTemplateKey()); processTemplate.setProcess(processUpdateBO.getProcess()); processTemplate.setRemark(processUpdateBO.getRemark()); processTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUsername()); processTemplate.setUpdateTime(LocalDateTime.now()); processTemplate.setTemplateVersion(temp.getTemplateVersion() + 1); return this.updateById(processTemplate); //查询版本是否绑定流程,更新 // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // queryWrapper.eq(StateProcessModule::getTemplateId, processUpdateBO.getId()); // List stateProcessModules = stateProcessModuleService.list(queryWrapper); // if (Objects.isNull(stateProcessModules) || stateProcessModules.isEmpty()) { // return true; // } // for (StateProcessModule stateProcessModule : stateProcessModules) { // stateProcessModule.setTemplateId(processTemplate.getId()); // stateProcessModule.setTemplateName(processTemplate.getTemplateName()); // } // return stateProcessModuleService.updateBatchById(stateProcessModules); } /** * 创建并部署模版 * @param processCreateBO * @return */ @Transactional(rollbackFor = Exception.class) @Override public Boolean create(ProcessCreateBO processCreateBO) { //查询模版是否存在 List keys = this.list(Wrappers.lambdaQuery(). eq(StateProcessTemplate::getTemplateName, processCreateBO.getTemplateName())); if (!CollectionUtils.isEmpty(keys)) { throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_KEY_EXISTS.getValue()); } LoginUser loginUser = SecurityUtils.getLoginUser(); FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName()); DeployBO deployBO = new DeployBO(); deployBO.setKey(IdUtil.simpleUUID()); deployBO.setName(processCreateBO.getTemplateName()); deployBO.setNodeConfig(JSONObject.parseObject(processCreateBO.getProcess(), NodeModel.class)); String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue); InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name()); Long deployId = flowLongEngine.processService().deploy(inputStream, creator, false); FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId); StateProcessTemplate processTemplate = new StateProcessTemplate(); processTemplate.setId(IdUtils.simpleUUID()); processTemplate.setWorkFlowId(deployId); processTemplate.setWorkflowVersion(flwProcess.getProcessVersion()); processTemplate.setTemplateName(deployBO.getName()); processTemplate.setTemplateKey(deployBO.getKey()); processTemplate.setProcess(processCreateBO.getProcess()); processTemplate.setRemark(processCreateBO.getRemark()); processTemplate.setUpdateBy(loginUser.getUser().getUserName()); processTemplate.setUpdateTime(LocalDateTime.now()); return this.save(processTemplate); } /** * 启动流程 * @param processStartBO * @return */ @Transactional(rollbackFor = Exception.class) @Override public Boolean start(ProcessStartBO processStartBO) { LoginUser loginUser = SecurityUtils.getLoginUser(); FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName()); //查询流程绑定 StateProcessModule stateProcessModule = stateProcessModuleService.getOne(Wrappers.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.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 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(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 processTaskListBO * @return */ @Override public PageInfo waitTaskPage(ProcessTaskListBO processTaskListBO) { //获取当前登录用户信息 Long userId = SecurityUtils.getLoginUser().getUserId(); //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime); //待审核 lambdaQueryWrapper.eq(FlwHisInstance::getInstanceState, 0); List flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream() .map(FlwHisInstance::getId).collect(Collectors.toList()); if (ObjectUtil.isEmpty(flwHisInstances)) { return new PageInfo<>(); } //查询任务参与者 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId) //0指定用户 .eq(FlwTaskActor::getActorType, 0) .or().in(FlwTaskActor::getActorId, userId) //1指定角色 .eq(FlwTaskActor::getActorType, 1)); if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) { // 添加条件 query = query.in(FlwTaskActor::getInstanceId, flwHisInstances); } List flwTaskActorPage = flwTaskActorMapper.selectList(query); if (ObjectUtil.isEmpty(flwTaskActorPage)) { return new PageInfo<>(); } //查询任务信息 List flwTasks = flwTaskMapper.selectList(Wrappers.lambdaQuery() .orderByDesc(FlwTask::getCreateTime) .in(FlwTask::getId, flwTaskActorPage.stream() .map(FlwTaskActor::getTaskId).collect(Collectors.toList()))); if (ObjectUtil.isNull(flwTasks)) { return new PageInfo<>(); } List instanceIds = flwTasks.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 LambdaQueryWrapper 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()); } stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds); stateTaskQuery.orderByDesc(BaseModel::getCreateTime); PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); PageInfo taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); //转换类 List processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class); // 查询合同信息 for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { // 查询合同信息 TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); processTaskListVO.setContract(contract); } pageInfo.setRecords(processTaskListVOS); List updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); Map sysUserMap; if (!CollectionUtils.isEmpty(updateUserId)) { //根据用户id查询更新人信息 List sysUsers = sysUserService.selectUserByUserNameList(updateUserId); if (!CollectionUtils.isEmpty(sysUsers)) { sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); } else { sysUserMap = new HashMap<>(); } } else { sysUserMap = new HashMap<>(); } Map> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId)); for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { List flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId())); if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) { //待审核 processTaskListVO.setStatus("0"); processTaskListVO.setNodeName(flwTask.get(0).getTaskName()); processTaskListVO.setTaskId(flwTask.get(0).getId().toString()); processTaskListVO.setVariable(flwTask.get(0).getVariable()); } SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy()); if (Objects.nonNull(sysUser)) { processTaskListVO.setCreateBy(sysUser.getNickName()); } } return pageInfo; } @Override public PageInfo dealTaskPage(ProcessTaskListBO processTaskListBO) { //获取当前登录用户信息 Long userId = SecurityUtils.getLoginUser().getUserId(); LambdaQueryWrapper query = Wrappers.lambdaQuery() .and(qy -> qy.eq(FlwTaskActor::getActorId, userId) //0指定用户 .eq(FlwTaskActor::getActorType, 0) //指定角色 .or().in(FlwTaskActor::getActorId, userId) .eq(FlwTaskActor::getActorType, 1)); List flwHisTaskActors = flwHisTaskActorMapper.selectList(query); List hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList()); if (hisTaskIds.isEmpty()) { return new PageInfo<>(); } List flwHisTaskList = flwHisTaskMapper.selectList( Wrappers.lambdaQuery() .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue()) .orderByDesc(FlwHisTask::getCreateTime) .in(FlwHisTask::getId, hisTaskIds)); if (ObjectUtil.isEmpty(flwHisTaskList)) { new PageInfo<>(); } List instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 LambdaQueryWrapper 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 taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); //转换类 List processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class); // 查询合同信息 for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { // 查询合同信息 TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); processTaskListVO.setContract(contract); } pageInfo.setRecords(processTaskListVOS); if (ObjectUtil.isEmpty(processTaskListVOS)) { return pageInfo; } Map> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId)); //查询原因 List taskIds = flwHisTaskList.stream().map(FlowEntity::getId).map(String::valueOf).collect(Collectors.toList()); List actions = stateProcessInstanceActionService.list( Wrappers.lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds)); Map actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity())); List updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); Map sysUserMap; if (!CollectionUtils.isEmpty(updateUserId)) { List sysUsers = sysUserService.selectUserByUserNameList(updateUserId); if (!CollectionUtils.isEmpty(sysUsers)) { sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); } else { sysUserMap = new HashMap<>(); } } else { sysUserMap = new HashMap<>(); } for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { List flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId())); if (ObjectUtil.isNotEmpty(flwHisTaskMap)) { //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错 for (FlwHisTask flwHisTask : flwHisTasks) { if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) { //10等于发起人与审批人一致自动审核完成 processTaskListVO.setStatus(flwHisTask.getTaskState() == 10 ? "2" : flwHisTask.getTaskState().toString()); processTaskListVO.setNodeName(flwHisTask.getTaskName()); processTaskListVO.setTaskId(flwHisTask.getId().toString()); processTaskListVO.setVariable(flwHisTask.getVariable()); } } } 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; } @Override public PageInfo copyTaskPage(ProcessTaskListBO processTaskListBO) { Long userId = SecurityUtils.getUserId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.orderByDesc("create_time"); List flwHisInstances = flwHisInstanceMapper.selectList(queryWrapper).stream() .map(FlwHisInstance::getId).collect(Collectors.toList()); LambdaQueryWrapper query = Wrappers.lambdaQuery() .and(qy -> qy.eq(FlwTaskActor::getActorId, userId) .eq(FlwTaskActor::getActorType, 0) .or().in(FlwTaskActor::getActorId, userId) .eq(FlwTaskActor::getActorType, 1)); query = query.in(FlwHisTaskActor::getInstanceId, flwHisInstances); List flwHisTaskActors = flwHisTaskActorMapper.selectList(query); List hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList()); if (hisTaskIds.isEmpty()) { return new PageInfo<>(); } List flwHisTaskList = flwHisTaskMapper.selectList( Wrappers.lambdaQuery() //2=抄送 .eq(FlwHisTask::getTaskType, 2) .in(FlwHisTask::getId, hisTaskIds)); if(ObjectUtil.isEmpty(flwHisTaskList)){ return new PageInfo<>(); } List instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 LambdaQueryWrapper 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 taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); //转换类 List processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class); pageInfo.setRecords(processTaskListVOS); if (ObjectUtil.isEmpty(processTaskListVOS)) { return pageInfo; } Map> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId)); List updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); Map sysUserMap; if (!CollectionUtils.isEmpty(updateUserId)) { List sysUsers = sysUserService.selectUserByUserNameList(updateUserId); if (!CollectionUtils.isEmpty(sysUsers)) { sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); } else { sysUserMap = new HashMap<>(); } } else { sysUserMap = new HashMap<>(); } //查询原因 List taskIds = flwHisTaskList.stream().map(FlwTask::getParentTaskId).filter(ObjectUtil::isNotEmpty).map(String::valueOf).collect(Collectors.toList()); List actions = stateProcessInstanceActionService.list( Wrappers.lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds)); Map actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity())); for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { List flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId())); if (ObjectUtil.isNotEmpty(flwHisTaskMap)) { //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错 for (FlwHisTask flwHisTask : flwHisTasks) { if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) { processTaskListVO.setStatus(flwHisTask.getTaskState().toString()); processTaskListVO.setNodeName(flwHisTask.getTaskName()); processTaskListVO.setParentTaskId(flwHisTask.getParentTaskId().toString()); processTaskListVO.setTaskId(flwHisTask.getId().toString()); processTaskListVO.setVariable(flwHisTask.getVariable()); } } } StateProcessInstanceAction action = actionMap.get(processTaskListVO.getParentTaskId()); if (ObjectUtil.isNotEmpty(action)) { processTaskListVO.setReason(action.getRemark()); } SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy()); if (Objects.nonNull(sysUser)) { processTaskListVO.setCreateBy(sysUser.getNickName()); } } return pageInfo; } @Override public void agree(ProcessAgreeBO processAgreeBO) { Long taskId = Long.valueOf(processAgreeBO.getTaskId()); FlwTask flwTask = flwTaskMapper.selectById(taskId); if (ObjectUtil.isNull(flwTask)) { throw new GlobalException("任务已处理或者不存在"); } flowLongEngine.executeTask(taskId, currentFlowCreator()); // 动作执行记录 StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction(); 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()); stateProcessInstanceActionService.save(stateProcessInstanceAction); } @Override public void refuse(ProcessRefuseBO processRefuseBO) { Long taskId = Long.valueOf(processRefuseBO.getTaskId()); FlwTask flwTask = flwTaskMapper.selectById(taskId); // 直接拒绝当前流程 flowLongEngine.runtimeService().reject(flwTask.getInstanceId(), currentFlowCreator()); // 动作执行记录 StateProcessInstanceAction record = new StateProcessInstanceAction(); record.setId(IdUtils.simpleUUID()); record.setInstanceId(flwTask.getInstanceId().toString()); record.setAuditorId(String.valueOf(SecurityUtils.getUserId())); record.setActionType(StateProcessActionEnum.REJECTED.getValue()); record.setNodeId(processRefuseBO.getTaskId()); record.setRemark(processRefuseBO.getRemark()); stateProcessInstanceActionService.save(record); } @Override public PageInfo dealAndWaitTaskPage(ProcessTaskListBO processTaskListBO) { //获取当前登录用户信息 Long userId = SecurityUtils.getLoginUser().getUserId(); //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime); //待审核,通过,拒绝 lambdaQueryWrapper.in(FlwHisInstance::getInstanceState, 0,1,2); List flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream() .map(FlwHisInstance::getId).collect(Collectors.toList()); if (ObjectUtil.isEmpty(flwHisInstances)) { return new PageInfo<>(); } //查询任务参与者 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId) //0指定用户 .eq(FlwTaskActor::getActorType, 0) .or().in(FlwTaskActor::getActorId, userId) //1指定角色 .eq(FlwTaskActor::getActorType, 1)); if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) { // 添加条件 query = query.in(FlwTaskActor::getInstanceId, flwHisInstances); } List flwTaskActorPage = flwTaskActorMapper.selectList(query); if (ObjectUtil.isEmpty(flwTaskActorPage)) { return new PageInfo<>(); } //查询任务信息 List flwTasks = flwTaskMapper.selectList(Wrappers.lambdaQuery() .orderByDesc(FlwTask::getCreateTime) .in(FlwTask::getId, flwTaskActorPage.stream() .map(FlwTaskActor::getTaskId).collect(Collectors.toList()))); if (ObjectUtil.isNull(flwTasks)) { return new PageInfo<>(); } List instanceIds = flwTasks.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 // LambdaQueryWrapper 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()); // } // stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds); // stateTaskQuery.orderByDesc(BaseModel::getCreateTime); processTaskListBO.setInstanceIds(instanceIds); // PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); // PageInfo taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); // //转换类 // List processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class); // // 查询合同信息 // for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { // // 查询合同信息 // TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); // processTaskListVO.setContract(contract); // } // pageInfo.setRecords(processTaskListVOS); PageInfo processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO); List updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); Map sysUserMap; if (!CollectionUtils.isEmpty(updateUserId)) { //根据用户id查询更新人信息 List sysUsers = sysUserService.selectUserByUserNameList(updateUserId); if (!CollectionUtils.isEmpty(sysUsers)) { sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); } else { sysUserMap = new HashMap<>(); } } else { sysUserMap = new HashMap<>(); } Map> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId)); for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) { List flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId())); if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) { //待审核 processTaskListVO.setStatus("0"); processTaskListVO.setNodeName(flwTask.get(0).getTaskName()); processTaskListVO.setTaskId(flwTask.get(0).getId().toString()); processTaskListVO.setVariable(flwTask.get(0).getVariable()); } SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy()); if (Objects.nonNull(sysUser)) { processTaskListVO.setCreateBy(sysUser.getNickName()); } } return processTaskListVOS; } @Override public ProcessDetailVO detail(String taskId) { ProcessDetailVO processDetailVO = new ProcessDetailVO(); FlwTask flwTask = flwTaskMapper.selectById(Long.valueOf(taskId)); // 查询合同信息 TContract contract = contractService.getById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId")); BeanUtil.copyProperties(contract, processDetailVO); List list = stateProcessInstanceActionService.list(Wrappers.lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId()) .orderByDesc(StateProcessInstanceAction::getCreateTime)); processDetailVO.setInstanceActions(list); return processDetailVO; } private FlowCreator currentFlowCreator() { LoginUser loginUser = SecurityUtils.getLoginUser(); if (null == loginUser || null == loginUser.getUser().getUserId()) { throw new GlobalException("非法用户"); } return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName()); } }