From 4788c0abe7193191b3ca024b0f5f8fed196294bd Mon Sep 17 00:00:00 2001 From: yupeng <roc__yu@163.com> Date: 星期三, 05 三月 2025 14:29:26 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' into xizang-changyun --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java | 630 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 619 insertions(+), 11 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java index 3597645..cbefcad 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java @@ -1,13 +1,17 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; 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.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.*; @@ -18,17 +22,21 @@ 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; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.bo.*; import com.ruoyi.system.mapper.StateProcessTemplateMapper; +import com.ruoyi.system.mapper.TContractMapper; import com.ruoyi.system.model.*; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.ProcessDetailVO; @@ -45,6 +53,7 @@ import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; @Service @@ -63,6 +72,8 @@ @Autowired private FlwTaskMapper flwTaskMapper; @Autowired + private TaskService taskService; + @Autowired private StateTaskCenterService stateTaskCenterService; @Autowired private StateProcessModuleService stateProcessModuleService; @@ -73,7 +84,7 @@ @Autowired private ISysUserService sysUserService; @Autowired - private TContractService contractService; + private TContractMapper contractMapper; /** * 流程模版分页 @@ -290,6 +301,83 @@ } /** + * 启动流程 + * @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); + + // 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 @@ -360,7 +448,149 @@ // 查询合同信息 for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { // 查询合同信息 - TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); + TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); + processTaskListVO.setContract(contract); + } + + pageInfo.setRecords(processTaskListVOS); + + List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); + Map<Long, SysUser> sysUserMap; + if (!CollectionUtils.isEmpty(updateUserId)) { + //根据用户id查询更新人信息 + List<SysUser> 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<Long, List<FlwTask>> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId)); + + for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { + List<FlwTask> 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; + } + /** + * 待办 + * @param processTaskListBO + * @return + */ + @Override + public PageInfo<ProcessTaskListVO> waitTaskPageApplet(ProcessTaskListBO processTaskListBO) { + + String startTime = null; + String endTime = null; + if(Objects.nonNull(processTaskListBO.getTimeType())){ + switch (processTaskListBO.getTimeType()){ + case 1: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 2: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 3: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + } + } + + //获取当前登录用户信息 + Long userId = SecurityUtils.getLoginUser().getUserId(); + + //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录 + LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime); + //待审核 + lambdaQueryWrapper.eq(FlwHisInstance::getInstanceState, 0); + + List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream() + .map(FlwHisInstance::getId).collect(Collectors.toList()); + if (ObjectUtil.isEmpty(flwHisInstances)) { + return new PageInfo<>(); + } + + //查询任务参与者 + LambdaQueryWrapper<FlwTaskActor> 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<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query); + if (ObjectUtil.isEmpty(flwTaskActorPage)) { + return new PageInfo<>(); + } + //查询任务信息 + List<FlwTask> flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery() + .orderByDesc(FlwTask::getCreateTime) + .in(FlwTask::getId, flwTaskActorPage.stream() + .map(FlwTaskActor::getTaskId).collect(Collectors.toList()))); + + if (ObjectUtil.isNull(flwTasks)) { + return new PageInfo<>(); + } + List<String> instanceIds = flwTasks.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.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) { + stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime); + } + if(Objects.isNull(processTaskListBO.getSortBy())){ + processTaskListBO.setSortBy(2); + } + if (processTaskListBO.getSortBy() == 1) { + stateTaskQuery.orderByAsc(BaseModel::getCreateTime); + } + if (processTaskListBO.getSortBy() == 2) { + stateTaskQuery.orderByDesc(BaseModel::getCreateTime); + } + stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds); + 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); } @@ -429,6 +659,122 @@ new PageInfo<>(); } + 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); + processTaskListBO.setInstanceIds(instanceIds); + PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO); + + if (ObjectUtil.isEmpty(processTaskListVOS)) { + 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())); + + 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); + + 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.getRecords()) { + List<FlwHisTask> 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 processTaskListVOS; + } + @Override + public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) { + String startTime = null; + String endTime = null; + if(Objects.nonNull(processTaskListBO.getTimeType())){ + switch (processTaskListBO.getTimeType()){ + case 1: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 2: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 3: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + } + } + //获取当前登录用户信息 + Long userId = SecurityUtils.getLoginUser().getUserId(); + LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery() + .and(qy -> qy.eq(FlwTaskActor::getActorId, userId) + //0指定用户 + .eq(FlwTaskActor::getActorType, 0) + //指定角色 + .or().in(FlwTaskActor::getActorId, userId) + .eq(FlwTaskActor::getActorType, 1)); + List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(query); + + List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList()); + + if (hisTaskIds.isEmpty()) { + return new PageInfo<>(); + } + + List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList( + Wrappers.<FlwHisTask>lambdaQuery() + .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue()) + .orderByDesc(FlwHisTask::getCreateTime) + .in(FlwHisTask::getId, hisTaskIds)); + if (ObjectUtil.isEmpty(flwHisTaskList)) { + new PageInfo<>(); + } + List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 @@ -445,8 +791,19 @@ if (ObjectUtil.isEmpty(instanceId)) { return new PageInfo<>(); } + if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) { + stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime); + } + if(Objects.isNull(processTaskListBO.getSortBy())){ + processTaskListBO.setSortBy(2); + } + if (processTaskListBO.getSortBy() == 1) { + stateTaskQuery.orderByAsc(BaseModel::getCreateTime); + } + if (processTaskListBO.getSortBy() == 2) { + stateTaskQuery.orderByDesc(BaseModel::getCreateTime); + } stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId); - stateTaskQuery.orderByDesc(BaseModel::getCreateTime); PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); //转换类 @@ -455,7 +812,7 @@ // 查询合同信息 for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { // 查询合同信息 - TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); + TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); processTaskListVO.setContract(contract); } @@ -623,15 +980,21 @@ 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()); + stateProcessInstanceAction.setPictures(processAgreeBO.getPictures()); stateProcessInstanceActionService.save(stateProcessInstanceAction); } @@ -649,7 +1012,13 @@ record.setActionType(StateProcessActionEnum.REJECTED.getValue()); record.setNodeId(processRefuseBO.getTaskId()); 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 @@ -759,19 +1128,251 @@ return processTaskListVOS; } +// @Override +// public PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTaskListBO) { +// //获取当前登录用户信息 +// Long userId = SecurityUtils.getLoginUser().getUserId(); +// +// //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录 +// LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime); +// //待审核,通过,拒绝 +// lambdaQueryWrapper.in(FlwHisInstance::getInstanceState, 0,1,2); +// +// List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream() +// .map(FlwHisInstance::getId).collect(Collectors.toList()); +// +// //查询任务参与者 +// LambdaQueryWrapper<FlwTaskActor> 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<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query); +// List<String> instanceIds = new ArrayList<>(); +// List<FlwTask> flwTasks = new ArrayList<>(); +// if (ObjectUtil.isNotEmpty(flwTaskActorPage)) { +// //查询任务信息 +// flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery() +// .orderByDesc(FlwTask::getCreateTime) +// .in(FlwTask::getId, flwTaskActorPage.stream() +// .map(FlwTaskActor::getTaskId).collect(Collectors.toList()))); +// if (ObjectUtil.isNotNull(flwTasks)) { +// instanceIds = flwTasks.stream().map(FlwTask::getInstanceId) +// .map(String::valueOf).collect(Collectors.toList()); +// } +// } +// +// LambdaQueryWrapper<FlwHisTaskActor> hisQuery= Wrappers.<FlwHisTaskActor>lambdaQuery() +// .and(qy -> qy.eq(FlwTaskActor::getActorId, userId) +// //0指定用户 +// .eq(FlwTaskActor::getActorType, 0) +// //指定角色 +// .or().in(FlwTaskActor::getActorId, userId) +// .eq(FlwTaskActor::getActorType, 1)); +// List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(hisQuery); +// List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList()); +// +// if (!CollectionUtils.isEmpty(hisTaskIds)) { +// List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList( +// Wrappers.<FlwHisTask>lambdaQuery() +// .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue()) +// .orderByDesc(FlwHisTask::getCreateTime) +// .in(FlwHisTask::getId, hisTaskIds)); +// if (ObjectUtil.isNotEmpty(flwHisTaskList)) { +// instanceIds.addAll(flwHisTaskList.stream().map(FlwHisTask::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()); +//// } +//// stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds); +//// stateTaskQuery.orderByDesc(BaseModel::getCreateTime); +// processTaskListBO.setInstanceIds(instanceIds); +//// 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 = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); +//// processTaskListVO.setContract(contract); +//// } +//// pageInfo.setRecords(processTaskListVOS); +// +// PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO); +// +// List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); +// Map<Long, SysUser> sysUserMap; +// if (!CollectionUtils.isEmpty(updateUserId)) { +// //根据用户id查询更新人信息 +// List<SysUser> 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<Long, List<FlwTask>> flwHisTaskMap = new HashMap<>(); +// if(!CollectionUtils.isEmpty(flwTasks)){ +// flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId)); +// } +// +// for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) { +// if(!CollectionUtils.isEmpty(flwHisTaskMap)){ +// List<FlwTask> 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")); + TContract contract; + Long instanceId; + if(Objects.nonNull(flwTask)){ + instanceId = flwTask.getInstanceId(); + // 查询合同信息 + contract = contractMapper.selectById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId")); + }else { + FlwHisTask flwHisTask = flwHisTaskMapper.selectById(Long.valueOf(taskId)); + if(Objects.isNull(flwHisTask)){ + throw new GlobalException("流程不存在"); + } + instanceId = flwHisTask.getInstanceId(); + contract = contractMapper.selectById(Objects.requireNonNull(JSONObject.parseObject(flwHisTask.getVariable())).getString("projectId")); + } BeanUtil.copyProperties(contract, processDetailVO); - List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId()) - .orderByDesc(StateProcessInstanceAction::getCreateTime)); + // 查询历史任务 + List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId)); + + processDetailVO.setFlwHisTasks(flwHisTasks); + + List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId) + .orderByAsc(StateProcessInstanceAction::getCreateTime)); + for (StateProcessInstanceAction stateProcessInstanceAction : list) { + SysUser sysUser = sysUserService.selectUserById(Long.valueOf(stateProcessInstanceAction.getAuditorId())); + if(Objects.nonNull(sysUser)){ + stateProcessInstanceAction.setNickName(sysUser.getNickName()); + } + } processDetailVO.setInstanceActions(list); return processDetailVO; + } + + @Override + public PageInfo<ProcessTaskListVO> initiateTaskPage(ProcessTaskListBO processTaskListBO) { + String startTime = null; + String endTime = null; + if(Objects.nonNull(processTaskListBO.getTimeType())){ + switch (processTaskListBO.getTimeType()){ + case 1: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 2: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + case 3: + startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00"; + endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59"; + break; + } + } + //获取当前登录用户信息 + Long userId = SecurityUtils.getLoginUser().getUserId(); + + //分页查询任务中心任务 + LambdaQueryWrapper<FlwHisTask> stateTaskQuery = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) { + stateTaskQuery.between(FlwHisTask::getCreateTime, startTime, endTime); + } + if(Objects.isNull(processTaskListBO.getSortBy())){ + processTaskListBO.setSortBy(2); + } + if (processTaskListBO.getSortBy() == 1) { + stateTaskQuery.orderByAsc(FlwHisTask::getCreateTime); + } + if (processTaskListBO.getSortBy() == 2) { + stateTaskQuery.orderByDesc(FlwHisTask::getCreateTime); + } + stateTaskQuery.eq(FlwHisTask::getParentTaskId, 0L); + stateTaskQuery.like(FlwHisTask::getCreateId, userId); + PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); + PageInfo<FlwHisTask> taskCenters = flwHisTaskMapper.selectPage(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); + } + + if (ObjectUtil.isEmpty(processTaskListVOS)) { + return pageInfo; + } + List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); + Map<Long, SysUser> sysUserMap; + if (!CollectionUtils.isEmpty(updateUserId)) { + List<SysUser> 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) { + processTaskListVO.setTaskId(processTaskListVO.getId()); + SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy()); + if (Objects.nonNull(sysUser)) { + processTaskListVO.setCreateBy(sysUser.getNickName()); + } + } + pageInfo.setRecords(processTaskListVOS); + return pageInfo; } private FlowCreator currentFlowCreator() { @@ -781,5 +1382,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()); + } } -- Gitblit v1.7.1