diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java index 1fd0356c5..aee504085 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -41,367 +42,366 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class ProcessInstanceServiceImpl implements IProcessInstanceService { - private final RemoteFlowEngineService flowEngineService; - - private final RemoteUserService userService; - - private final IProcessInstanceRecordService processInstanceRecordService; - - private final IProcessCopyService processCopyService; - - private final IProcessService processService; - - private final IProcessNodeRecordService processNodeRecordService; - - private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; - - private final ObjectMapper objectMapper; - - /** - * 启动流程 - * - * @param processInstanceParamDto - * @return - */ - @Override - public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { - - PigxUser user = SecurityUtils.getUser(); - - processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); - Map paramMap = processInstanceParamDto.getParamMap(); - Dict rootUser = Dict.create() - .set("id", user.getId()) - .set("name", user.getUsername()) - .set("type", NodeUserTypeEnum.USER.getKey()); - paramMap.put("root", CollUtil.newArrayList(rootUser)); - return flowEngineService.startProcess(processInstanceParamDto); - } - - /** - * 查询当前登录用户的待办任务 - * - * @param taskQueryParamDto 查询参数 - * @return R - */ - @Override - public R queryMineTask(TaskQueryParamDto taskQueryParamDto) { - taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); - R> r = flowEngineService.queryAssignTask(taskQueryParamDto); - - if (CollUtil.isEmpty(r.getData().getRecords())) { - return r; - } - - Set processInstanceIdSet = r.getData() - .getRecords() - .stream() - .map(TaskDto::getProcessInstanceId) - .collect(Collectors.toSet()); - - // 流程实例记录 - List processInstanceRecordList = processInstanceRecordService.lambdaQuery() - .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) - .list(); - - // 发起人 - // 发起人 - List collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList(); - List startUserList = userService.getUserById(collect).getData(); - - Page pageResultDto = r.getData(); - List taskDtoList = new ArrayList<>(); - for (TaskDto record : r.getData().getRecords()) { - ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() - .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) - .findAny() - .orElse(null); - - if (processInstanceRecord != null) { - record.setProcessName(processInstanceRecord.getName()); - SysUser startUser = startUserList.stream() - .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) - .findAny() - .orElse(null); - - record.setRootUserId(processInstanceRecord.getUserId()); - record.setGroupName(processInstanceRecord.getGroupName()); - record.setRootUserName(startUser.getUsername()); - record.setRootUserAvatarUrl(startUser.getAvatar()); - record.setStartTime(processInstanceRecord.getCreateTime()); - - taskDtoList.add(record); - } - } - - pageResultDto.setRecords(taskDtoList); - - return R.ok(pageResultDto); - } - - /** - * 查询已办任务 - * - * @param taskQueryParamDto 查询参数 - * @return R - */ - @Override - public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) { - taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); - R> r = flowEngineService.queryCompletedTask(taskQueryParamDto); - - Page pageResultDto = r.getData(); - List records = pageResultDto.getRecords(); - if (CollUtil.isEmpty(records)) { - return R.ok(pageResultDto); - - } - - Set processInstanceIdSet = records.stream() - .map(TaskDto::getProcessInstanceId) - .collect(Collectors.toSet()); - - // 流程实例记录 - List processInstanceRecordList = processInstanceRecordService.lambdaQuery() - .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) - .list(); - - // 发起人 - List collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList(); - List startUserList = userService.getUserById(collect).getData(); - - List taskDtoList = new ArrayList<>(); - for (TaskDto record : records) { - - ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() - .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) - .findAny() - .orElse(null); - - if (processInstanceRecord != null) { - - record.setProcessName(processInstanceRecord.getName()); - - SysUser startUser = startUserList.stream() - .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) - .findAny() - .orElse(null); - - record.setRootUserId(processInstanceRecord.getUserId()); - record.setGroupName(processInstanceRecord.getGroupName()); - record.setRootUserName(startUser.getName()); - record.setRootUserAvatarUrl(startUser.getAvatar()); - record.setTaskId(record.getTaskId()); - record.setStartTime(processInstanceRecord.getCreateTime()); - taskDtoList.add(record); - } - } - - pageResultDto.setRecords(taskDtoList); - - return R.ok(pageResultDto); - } - - /** - * 结束流程实例 - * - * @param processInstanceParamDto 流程实例参数数据传输对象 - * @return 返回处理结果 - */ - @Override - public R end(ProcessInstanceParamDto processInstanceParamDto) { - - Optional objectOptional = processInstanceParamDto.getParamMap().keySet().stream() - .filter(key -> key.contains("approve_condition")) - .reduce((first, second) -> second) - .map(key -> MapUtil.getBool(processInstanceParamDto.getParamMap(), key, true)); - - processInstanceRecordService.lambdaUpdate() - .set(ProcessInstanceRecord::getEndTime, new Date()) - .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()) - .set(objectOptional.isPresent(), ProcessInstanceRecord::getFinishReason, objectOptional.get()) - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceParamDto.getProcessInstanceId()) - .update(new ProcessInstanceRecord()); - return R.ok(); - } - - /** - * 查询我发起的 - * - * @param taskQueryParamDto 查询条件 - * @return - */ - @Override - public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) { - - long userId = SecurityUtils.getUser().getId(); - - Page instanceRecordPage = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getUserId, userId) - .eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus()) - .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime, - ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, - ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) - .orderByDesc(ProcessInstanceRecord::getCreateTime) - .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); - - return R.ok(instanceRecordPage); - } - - /** - * 查询抄送给我的 - * - * @param taskQueryParamDto 查询参数 - * @return - */ - @Override - public R queryMineCC(TaskQueryParamDto taskQueryParamDto) { - - long userId = SecurityUtils.getUser().getId(); - - Page page = processCopyService.lambdaQuery() - .eq(ProcessCopy::getUserId, userId) - .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime, - ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, - ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) - .orderByDesc(ProcessCopy::getNodeTime) - .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); - - List records = page.getRecords(); - - List processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class); - - if (CollUtil.isNotEmpty(records)) { - // 发起人 - List userIdList = records.stream().map(ProcessCopy::getStartUserId).toList(); - List startUserList = userService.getUserById(userIdList).getData(); - - for (ProcessCopyVo record : processCopyVoList) { - SysUser startUser = startUserList.stream() - .filter(w -> w.getUserId().longValue() == record.getStartUserId()) - .findAny() - .orElse(null); - record.setStartUserName(startUser.getUsername()); - } - } - - Page p = BeanUtil.copyProperties(page, Page.class); - - p.setRecords(processCopyVoList); - - return R.ok(p); - } - - /** - * 格式化流程显示 - * - * @param nodeFormatParamVo - * @return - */ - @SneakyThrows - @Override - public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) { - String flowId = nodeFormatParamVo.getFlowId(); - String processInstanceId = nodeFormatParamVo.getProcessInstanceId(); - if (StrUtil.isAllBlank(flowId, processInstanceId)) { - return R.ok(new ArrayList<>()); - } - - if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) { - ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) - .one(); - flowId = processInstanceRecord.getFlowId(); - - } - Map paramMap = nodeFormatParamVo.getParamMap(); - if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) { - VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto(); - variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId()); - R> r = flowEngineService.queryTaskVariables(variableQueryParamDto); - if (!r.isOk()) { - ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService - .lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId()) - .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) - .last("limit 1") - .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) - .one(); - - String data = processNodeRecordAssignUser.getData(); - - Map variableMap = objectMapper.readValue(data, new TypeReference<>() { - }); - variableMap.putAll(paramMap); - paramMap.putAll(variableMap); - } else { - Map variableMap = r.getData(); - variableMap.putAll(paramMap); - paramMap.putAll(variableMap); - } - - } - - Set completeNodeSet = new HashSet<>(); - - if (StrUtil.isNotBlank(processInstanceId)) { - List processNodeRecordList = processNodeRecordService.lambdaQuery() - .eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId) - .eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) - .list(); - Set collect = processNodeRecordList.stream() - .map(ProcessNodeRecord::getNodeId) - .collect(Collectors.toSet()); - completeNodeSet.addAll(collect); - } - - Process oaForms = processService.getByFlowId(flowId); - String process = oaForms.getProcess(); - Node nodeDto = objectMapper.readValue(process, new TypeReference<>() { - }); - - List processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet, - new HashSet<>(), processInstanceId, paramMap); - - return R.ok(processNodeShowDtos); - } - - /** - * 流程详情 - * - * @param processInstanceId - * @return - */ - @SneakyThrows - @Override - public R detail(String processInstanceId) { - ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) - .one(); - - Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId()); - if (oaForms == null) { - return R.failed("流程不存在"); - } - - // 发起人变量数据 - String formData = processInstanceRecord.getFormData(); - String process = oaForms.getProcess(); - - Node nodeDto = objectMapper.readValue(process, Node.class); - Map formPerms1 = nodeDto.getFormPerms(); - - - Dict set = Dict.create() - .set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId) - .set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus()) - .set("process", oaForms.getProcess()) - .set("formItems", oaForms.getFormItems()) - .set("formData", formData) - .set("formData", formData) - .set("formPerms", formPerms1); - - return R.ok(set); - } + private final RemoteFlowEngineService flowEngineService; + + private final RemoteUserService userService; + + private final IProcessInstanceRecordService processInstanceRecordService; + + private final IProcessCopyService processCopyService; + + private final IProcessService processService; + + private final IProcessNodeRecordService processNodeRecordService; + + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + + private final ObjectMapper objectMapper; + + /** + * 启动流程 + * @param processInstanceParamDto + * @return + */ + @Override + public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { + + PigxUser user = SecurityUtils.getUser(); + + processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); + Map paramMap = processInstanceParamDto.getParamMap(); + Dict rootUser = Dict.create() + .set("id", user.getId()) + .set("name", user.getUsername()) + .set("type", NodeUserTypeEnum.USER.getKey()); + paramMap.put("root", CollUtil.newArrayList(rootUser)); + return flowEngineService.startProcess(processInstanceParamDto); + } + + /** + * 查询当前登录用户的待办任务 + * @param taskQueryParamDto 查询参数 + * @return R + */ + @Override + public R queryMineTask(TaskQueryParamDto taskQueryParamDto) { + taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); + R> r = flowEngineService.queryAssignTask(taskQueryParamDto); + + if (CollUtil.isEmpty(r.getData().getRecords())) { + return r; + } + + Set processInstanceIdSet = r.getData() + .getRecords() + .stream() + .map(TaskDto::getProcessInstanceId) + .collect(Collectors.toSet()); + + // 流程实例记录 + List processInstanceRecordList = processInstanceRecordService.lambdaQuery() + .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) + .list(); + + // 发起人 + // 发起人 + List collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList(); + List startUserList = userService.getUserById(collect).getData(); + + Page pageResultDto = r.getData(); + List taskDtoList = new ArrayList<>(); + for (TaskDto record : r.getData().getRecords()) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() + .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) + .findAny() + .orElse(null); + + if (processInstanceRecord != null) { + record.setProcessName(processInstanceRecord.getName()); + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) + .findAny() + .orElse(null); + + record.setRootUserId(processInstanceRecord.getUserId()); + record.setGroupName(processInstanceRecord.getGroupName()); + record.setRootUserName(startUser.getUsername()); + record.setRootUserAvatarUrl(startUser.getAvatar()); + record.setStartTime(processInstanceRecord.getCreateTime()); + + taskDtoList.add(record); + } + } + + pageResultDto.setRecords(taskDtoList); + + return R.ok(pageResultDto); + } + + /** + * 查询已办任务 + * @param taskQueryParamDto 查询参数 + * @return R + */ + @Override + public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) { + taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); + R> r = flowEngineService.queryCompletedTask(taskQueryParamDto); + + Page pageResultDto = r.getData(); + List records = pageResultDto.getRecords(); + if (CollUtil.isEmpty(records)) { + return R.ok(pageResultDto); + + } + + Set processInstanceIdSet = records.stream() + .map(TaskDto::getProcessInstanceId) + .collect(Collectors.toSet()); + + // 流程实例记录 + List processInstanceRecordList = processInstanceRecordService.lambdaQuery() + .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) + .list(); + + // 发起人 + List collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList(); + List startUserList = userService.getUserById(collect).getData(); + + List taskDtoList = new ArrayList<>(); + for (TaskDto record : records) { + + ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() + .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) + .findAny() + .orElse(null); + + if (processInstanceRecord != null) { + + record.setProcessName(processInstanceRecord.getName()); + + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) + .findAny() + .orElse(null); + + record.setRootUserId(processInstanceRecord.getUserId()); + record.setGroupName(processInstanceRecord.getGroupName()); + record.setRootUserName(startUser.getName()); + record.setRootUserAvatarUrl(startUser.getAvatar()); + record.setTaskId(record.getTaskId()); + record.setStartTime(processInstanceRecord.getCreateTime()); + taskDtoList.add(record); + } + } + + pageResultDto.setRecords(taskDtoList); + + return R.ok(pageResultDto); + } + + /** + * 结束流程实例 + * @param processInstanceParamDto 流程实例参数数据传输对象 + * @return 返回处理结果 + */ + @Override + public R end(ProcessInstanceParamDto processInstanceParamDto) { + + Optional objectOptional = processInstanceParamDto.getParamMap() + .keySet() + .stream() + .filter(key -> key.contains("approve_condition")) + .reduce((first, second) -> second) + .map(key -> MapUtil.getBool(processInstanceParamDto.getParamMap(), key, true)); + + LambdaUpdateChainWrapper lambdaUpdateChainWrapper = processInstanceRecordService + .lambdaUpdate() + .set(ProcessInstanceRecord::getEndTime, new Date()) + .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()); + + objectOptional + .ifPresent(aBoolean -> lambdaUpdateChainWrapper.set(ProcessInstanceRecord::getFinishReason, aBoolean)); + + lambdaUpdateChainWrapper + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceParamDto.getProcessInstanceId()) + .update(new ProcessInstanceRecord()); + return R.ok(); + } + + /** + * 查询我发起的 + * @param taskQueryParamDto 查询条件 + * @return + */ + @Override + public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) { + + long userId = SecurityUtils.getUser().getId(); + + Page instanceRecordPage = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getUserId, userId) + .eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus()) + .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) + .orderByDesc(ProcessInstanceRecord::getCreateTime) + .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); + + return R.ok(instanceRecordPage); + } + + /** + * 查询抄送给我的 + * @param taskQueryParamDto 查询参数 + * @return + */ + @Override + public R queryMineCC(TaskQueryParamDto taskQueryParamDto) { + + long userId = SecurityUtils.getUser().getId(); + + Page page = processCopyService.lambdaQuery() + .eq(ProcessCopy::getUserId, userId) + .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, + ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) + .orderByDesc(ProcessCopy::getNodeTime) + .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); + + List records = page.getRecords(); + + List processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class); + + if (CollUtil.isNotEmpty(records)) { + // 发起人 + List userIdList = records.stream().map(ProcessCopy::getStartUserId).toList(); + List startUserList = userService.getUserById(userIdList).getData(); + + for (ProcessCopyVo record : processCopyVoList) { + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == record.getStartUserId()) + .findAny() + .orElse(null); + record.setStartUserName(startUser.getUsername()); + } + } + + Page p = BeanUtil.copyProperties(page, Page.class); + + p.setRecords(processCopyVoList); + + return R.ok(p); + } + + /** + * 格式化流程显示 + * @param nodeFormatParamVo + * @return + */ + @SneakyThrows + @Override + public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) { + String flowId = nodeFormatParamVo.getFlowId(); + String processInstanceId = nodeFormatParamVo.getProcessInstanceId(); + if (StrUtil.isAllBlank(flowId, processInstanceId)) { + return R.ok(new ArrayList<>()); + } + + if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) + .one(); + flowId = processInstanceRecord.getFlowId(); + + } + Map paramMap = nodeFormatParamVo.getParamMap(); + if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) { + VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto(); + variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId()); + R> r = flowEngineService.queryTaskVariables(variableQueryParamDto); + if (!r.isOk()) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService + .lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId()) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) + .last("limit 1") + .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) + .one(); + + String data = processNodeRecordAssignUser.getData(); + + Map variableMap = objectMapper.readValue(data, new TypeReference<>() { + }); + variableMap.putAll(paramMap); + paramMap.putAll(variableMap); + } + else { + Map variableMap = r.getData(); + variableMap.putAll(paramMap); + paramMap.putAll(variableMap); + } + + } + + Set completeNodeSet = new HashSet<>(); + + if (StrUtil.isNotBlank(processInstanceId)) { + List processNodeRecordList = processNodeRecordService.lambdaQuery() + .eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId) + .eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) + .list(); + Set collect = processNodeRecordList.stream() + .map(ProcessNodeRecord::getNodeId) + .collect(Collectors.toSet()); + completeNodeSet.addAll(collect); + } + + Process oaForms = processService.getByFlowId(flowId); + String process = oaForms.getProcess(); + Node nodeDto = objectMapper.readValue(process, new TypeReference<>() { + }); + + List processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet, + new HashSet<>(), processInstanceId, paramMap); + + return R.ok(processNodeShowDtos); + } + + /** + * 流程详情 + * @param processInstanceId + * @return + */ + @SneakyThrows + @Override + public R detail(String processInstanceId) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) + .one(); + + Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId()); + if (oaForms == null) { + return R.failed("流程不存在"); + } + + // 发起人变量数据 + String formData = processInstanceRecord.getFormData(); + String process = oaForms.getProcess(); + + Node nodeDto = objectMapper.readValue(process, Node.class); + Map formPerms1 = nodeDto.getFormPerms(); + + Dict set = Dict.create() + .set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId) + .set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus()) + .set("process", oaForms.getProcess()) + .set("formItems", oaForms.getFormItems()) + .set("formData", formData) + .set("formData", formData) + .set("formPerms", formPerms1); + + return R.ok(set); + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java index 50f9a5d5e..25649c1e3 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/TaskServiceImpl.java @@ -24,6 +24,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; @@ -32,229 +34,236 @@ import java.util.Map; @RequiredArgsConstructor public class TaskServiceImpl implements ITaskService { - private final RemoteFlowEngineService flowEngineService; + private final RemoteFlowEngineService flowEngineService; - private final IProcessService processService; + private final IProcessService processService; - private final IProcessCopyService processCopyService; + private final IProcessCopyService processCopyService; - private final IProcessNodeDataService nodeDataService; + private final IProcessNodeDataService nodeDataService; - private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; + private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; - private final IProcessInstanceRecordService processInstanceRecordService; + private final IProcessInstanceRecordService processInstanceRecordService; - private final ObjectMapper objectMapper; + private final ObjectMapper objectMapper; - /** - * 查询首页数据看板 - * @return - */ - @Override - public R queryTaskData() { - R indexPageStatisticsR = flowEngineService - .querySimpleData(SecurityUtils.getUser().getId()); + /** + * 查询首页数据看板 + * @return + */ + @Override + public R queryTaskData() { + R indexPageStatisticsR = flowEngineService + .querySimpleData(SecurityUtils.getUser().getId()); - // 获取抄送任务 - Long copyCount = processCopyService.lambdaQuery() - .eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) - .count(); - indexPageStatisticsR.getData().setCopyNum(copyCount); - return indexPageStatisticsR; - } + // 获取抄送任务 + Long copyCount = processCopyService.lambdaQuery() + .eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId()) + .count(); + indexPageStatisticsR.getData().setCopyNum(copyCount); + return indexPageStatisticsR; + } - /** - * 查询任务 - * @param taskId - * @param view - * @return - */ - @SneakyThrows - @Override - public R queryTask(String taskId, boolean view) { + /** + * 查询任务 + * @param taskId + * @param view + * @return + */ + @SneakyThrows + @Override + public R queryTask(String taskId, boolean view) { - long userId = SecurityUtils.getUser().getId(); + long userId = SecurityUtils.getUser().getId(); - R r = flowEngineService.queryTask(taskId, userId); + R r = flowEngineService.queryTask(taskId, userId); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - TaskResultDto taskResultDto = r.getData(); + TaskResultDto taskResultDto = r.getData(); - // 变量 - Map paramMap = taskResultDto.getVariableAll(); - // 是否是当前活动任务 - Boolean currentTask = taskResultDto.getCurrentTask(); - if (!currentTask) { - ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() - .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) - .eq(ProcessNodeRecordAssignUser::getUserId, userId) - .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) - .last("limit 1") - .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) - .one(); + // 变量 + Map paramMap = taskResultDto.getVariableAll(); + // 是否是当前活动任务 + Boolean currentTask = taskResultDto.getCurrentTask(); + if (!currentTask) { + ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery() + .eq(ProcessNodeRecordAssignUser::getTaskId, taskId) + .eq(ProcessNodeRecordAssignUser::getUserId, userId) + .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) + .last("limit 1") + .orderByDesc(ProcessNodeRecordAssignUser::getEndTime) + .one(); - if (processNodeRecordAssignUser != null) { - String data = processNodeRecordAssignUser.getData(); - if (StrUtil.isNotBlank(data)) { - Map collect = objectMapper.readValue(data, new TypeReference<>() { - }); - paramMap.putAll(collect); + if (processNodeRecordAssignUser != null) { + String data = processNodeRecordAssignUser.getData(); + if (StrUtil.isNotBlank(data)) { + Map collect = objectMapper.readValue(data, new TypeReference<>() { + }); + paramMap.putAll(collect); - } - } + } + } - } + } - // 当前节点数据 - Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); - Map formPerms = node.getFormPerms(); + // 当前节点数据 + Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData(); + Map formPerms = node.getFormPerms(); - Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); - if (oaForms == null) { - return R.failed("流程不存在"); - } + Process oaForms = processService.getByFlowId(taskResultDto.getFlowId()); + if (oaForms == null) { + return R.failed("流程不存在"); + } - Dict set = Dict.create() - .set("processInstanceId", taskResultDto.getProcessInstanceId()) - .set("node", taskResultDto.getTaskNode()) - .set("process", oaForms.getProcess()) - .set("delegateAgain", taskResultDto.getDelegate()) - .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) - .set("formItems", oaForms.getFormItems()) - .set("formData", paramMap) - .set("formPerms", formPerms); + Dict set = Dict.create() + .set("processInstanceId", taskResultDto.getProcessInstanceId()) + .set("node", taskResultDto.getTaskNode()) + .set("process", oaForms.getProcess()) + .set("delegateAgain", taskResultDto.getDelegate()) + .set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING")) + .set("formItems", oaForms.getFormItems()) + .set("formData", paramMap) + .set("formPerms", formPerms); - return R.ok(set); - } + return R.ok(set); + } - /** - * 完成任务 - * @param taskParamDto - * @return - */ - @Override - public R completeTask(TaskParamDto taskParamDto) { - long userId = SecurityUtils.getUser().getId(); - taskParamDto.setUserId(String.valueOf(userId)); + /** + * 完成任务 + * @param taskParamDto + * @return + */ + @Override + public R completeTask(TaskParamDto taskParamDto) { + long userId = SecurityUtils.getUser().getId(); + taskParamDto.setUserId(String.valueOf(userId)); - R r = flowEngineService.completeTask(taskParamDto); + R r = flowEngineService.completeTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + return R.ok(); + } - /** - * 前加签 - * @param taskParamDto - * @return - */ - @Transactional - @Override - public R delegateTask(TaskParamDto taskParamDto) { + /** + * 前加签 + * @param taskParamDto + * @return + */ + @Transactional + @Override + public R delegateTask(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.delegateTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + R r = flowEngineService.delegateTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + return R.ok(); + } - /** - * 加签完成任务 - * @param taskParamDto - * @return - */ - @Override - public R resolveTask(TaskParamDto taskParamDto) { - R r = flowEngineService.resolveTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + /** + * 加签完成任务 + * @param taskParamDto + * @return + */ + @Override + public R resolveTask(TaskParamDto taskParamDto) { + R r = flowEngineService.resolveTask(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + return R.ok(); + } - /** - * 设置执行人 - * @param taskParamDto - * @return - */ - @Override - public R setAssignee(TaskParamDto taskParamDto) { + /** + * 设置执行人 + * @param taskParamDto + * @return + */ + @Override + public R setAssignee(TaskParamDto taskParamDto) { taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); R r = flowEngineService.transferTask(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + return R.ok(); + } - /** - * 结束流程 - * @param taskParamDto - * @return - */ - @Override - public R stopProcessInstance(TaskParamDto taskParamDto) { + /** + * 结束流程 + * @param taskParamDto + * @return + */ + @Override + public R stopProcessInstance(TaskParamDto taskParamDto) { - String processInstanceId = taskParamDto.getProcessInstanceId(); + String processInstanceId = taskParamDto.getProcessInstanceId(); - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); - CollUtil.reverse(allStopProcessInstanceIdList); - allStopProcessInstanceIdList.add(processInstanceId); + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId); + CollUtil.reverse(allStopProcessInstanceIdList); + allStopProcessInstanceIdList.add(processInstanceId); - taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.stopProcessInstance(taskParamDto); + taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList); + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.stopProcessInstance(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + // 停止流程实例后,更新流程实例记录状态 + processInstanceRecordService.lambdaUpdate() + .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()) + .set(ProcessInstanceRecord::getFinishReason, "9") + .set(ProcessInstanceRecord::getEndTime, new Date()) + .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) + .update(new ProcessInstanceRecord()); + return R.ok(); + } - /** - * 退回 - * @param taskParamDto - * @return - */ - @Override - public R back(TaskParamDto taskParamDto) { - taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); - R r = flowEngineService.back(taskParamDto); - if (!r.isOk()) { - return R.failed(r.getMsg()); - } + /** + * 退回 + * @param taskParamDto + * @return + */ + @Override + public R back(TaskParamDto taskParamDto) { + taskParamDto.setUserId(SecurityUtils.getUser().getId().toString()); + R r = flowEngineService.back(taskParamDto); + if (!r.isOk()) { + return R.failed(r.getMsg()); + } - return R.ok(); - } + return R.ok(); + } - private List getAllStopProcessInstanceIdList(String processInstanceId) { - List list = processInstanceRecordService.lambdaQuery() - .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId) - .list(); + private List getAllStopProcessInstanceIdList(String processInstanceId) { + List list = processInstanceRecordService.lambdaQuery() + .eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId) + .list(); - List collect = list.stream().map(w -> w.getProcessInstanceId()).toList(); + List collect = new ArrayList<>(list.stream().map(ProcessInstanceRecord::getProcessInstanceId).toList()); - for (ProcessInstanceRecord processInstanceRecord : list) { - List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( - processInstanceRecord.getProcessInstanceId()); + for (ProcessInstanceRecord processInstanceRecord : list) { + List allStopProcessInstanceIdList = getAllStopProcessInstanceIdList( + processInstanceRecord.getProcessInstanceId()); - collect.addAll(allStopProcessInstanceIdList); + collect.addAll(allStopProcessInstanceIdList); - } - return collect; - } + } + return collect; + } }