Commit 7694ac514290d619fd9c694abf4acd34b769ec08
1 parent
6a9697c9
工单修改
Showing
6 changed files
with
177 additions
and
16 deletions
urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApi.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.bpm.api.task; | |
| 2 | + | |
| 3 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; | |
| 4 | + | |
| 5 | +import java.util.List; | |
| 6 | +import java.util.Map; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * @Classname BpmTaskApi | |
| 10 | + * @Description bpm对外api | |
| 11 | + * @Date 2025/12/23 22:20 | |
| 12 | + * @Created by wangqian | |
| 13 | + */ | |
| 14 | +public interface BpmTaskApi { | |
| 15 | + | |
| 16 | + /** | |
| 17 | + * @Author wangqian | |
| 18 | + * @Description 获得指定流程实例的任务列表 | |
| 19 | + * @Date 2025/12/23 22:23 | |
| 20 | + * @Param processInstanceId | |
| 21 | + * @Return | |
| 22 | + */ | |
| 23 | + Map<String, BpmUserSimpleReqDTO> getLastTaskMapByProcessInstanceId(List<String> processInstanceId); | |
| 24 | +} | ... | ... |
urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.bpm.api.task; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import com.zteits.urbanops.framework.common.util.number.NumberUtils; | |
| 5 | +import com.zteits.urbanops.framework.common.util.object.BeanUtils; | |
| 6 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; | |
| 7 | +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; | |
| 8 | +import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; | |
| 9 | +import com.zteits.urbanops.module.system.api.user.AdminUserApi; | |
| 10 | +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; | |
| 11 | +import jakarta.annotation.Resource; | |
| 12 | +import lombok.extern.slf4j.Slf4j; | |
| 13 | +import org.flowable.task.api.history.HistoricTaskInstance; | |
| 14 | +import org.springframework.stereotype.Service; | |
| 15 | +import org.springframework.util.StringUtils; | |
| 16 | +import org.springframework.validation.annotation.Validated; | |
| 17 | + | |
| 18 | +import java.util.*; | |
| 19 | +import java.util.stream.Stream; | |
| 20 | + | |
| 21 | +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; | |
| 22 | + | |
| 23 | +/** | |
| 24 | + * @Classname BpmTaskApiImpl | |
| 25 | + * @Description bpm对外api | |
| 26 | + * @Date 2025/12/23 22:21 | |
| 27 | + * @Created by wangqian | |
| 28 | + */ | |
| 29 | +@Service | |
| 30 | +@Validated | |
| 31 | +@Slf4j | |
| 32 | +public class BpmTaskApiImpl implements BpmTaskApi{ | |
| 33 | + @Resource | |
| 34 | + private BpmTaskService taskService; | |
| 35 | + @Resource | |
| 36 | + private AdminUserApi adminUserApi; | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * 批量根据流程实例ID获取最后一个(最新)任务的处理人ID(Long类型) | |
| 40 | + * | |
| 41 | + * @param processInstanceIds 流程实例ID列表(支持空/Null) | |
| 42 | + * @return Map<流程实例ID, 处理人ID>:无任务/转换失败则value为null | |
| 43 | + */ | |
| 44 | + public Map<String, BpmUserSimpleReqDTO> getLastTaskMapByProcessInstanceId(List<String> processInstanceIds) { | |
| 45 | + Map<String, BpmUserSimpleReqDTO> resultMap = new HashMap<>(); | |
| 46 | + if (CollUtil.isEmpty(processInstanceIds)) { | |
| 47 | + return resultMap; | |
| 48 | + } | |
| 49 | + // 临时存储:流程实例ID → 最后一个任务(用于后续封装VO) | |
| 50 | + Map<String, HistoricTaskInstance> process2LastTaskMap = new HashMap<>(); | |
| 51 | + // 收集所有需要查询的用户ID(批量查询用户,提升性能) | |
| 52 | + Set<Long> allUserIds = new HashSet<>(); | |
| 53 | + // 2. 批量遍历流程实例ID(增强for更易读) | |
| 54 | + for (String processId : processInstanceIds) { | |
| 55 | + if (!StringUtils.hasText(processId)) { | |
| 56 | + resultMap.put(processId, null); | |
| 57 | + continue; | |
| 58 | + } | |
| 59 | + // 3. 查询该流程实例的历史任务列表 | |
| 60 | + List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(processId, true); | |
| 61 | + log.info("[getLastTaskMapByProcessInstanceId] 流程实例ID={},查询到历史任务数={}", processId, CollUtil.size(taskList)); | |
| 62 | + | |
| 63 | + // 4. 无任务:Map中该key赋值null,继续下一个 | |
| 64 | + if (CollUtil.isEmpty(taskList)) { | |
| 65 | + resultMap.put(processId, null); | |
| 66 | + log.warn("[getLastTaskMapByProcessInstanceId] 流程实例ID={},无历史任务", processId); | |
| 67 | + continue; | |
| 68 | + } | |
| 69 | + // 拼接数据 | |
| 70 | + Set<Long> userIds = convertSetByFlatMap(taskList, task -> | |
| 71 | + Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); | |
| 72 | + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | |
| 73 | + // 5. 按任务结束时间倒序→创建时间倒序排序,确保取到最新任务 | |
| 74 | + HistoricTaskInstance lastTask = taskList.stream() | |
| 75 | + .reduce((first, last) -> last) // 遍历到最后一个元素 | |
| 76 | + .orElse(null); // 空列表返回null | |
| 77 | + // 存储最后一个任务,后续封装VO | |
| 78 | + process2LastTaskMap.put(processId, lastTask); | |
| 79 | + // 收集该任务的处理人/拥有人ID(安全转换) | |
| 80 | + Long assigneeId = NumberUtils.parseLong(lastTask.getAssignee()); | |
| 81 | + if (assigneeId != null) { | |
| 82 | + allUserIds.add(assigneeId); | |
| 83 | + } | |
| 84 | + | |
| 85 | + } | |
| 86 | + // ========== 第二步:批量查询用户信息(仅一次调用,提升性能) ========== | |
| 87 | + Map<Long, AdminUserRespDTO> userMap = new HashMap<>(); | |
| 88 | + if (CollUtil.isNotEmpty(allUserIds)) { | |
| 89 | + userMap = adminUserApi.getUserMap(allUserIds); | |
| 90 | + } | |
| 91 | + | |
| 92 | + for (Map.Entry<String, HistoricTaskInstance> entry : process2LastTaskMap.entrySet()) { | |
| 93 | + String processId = entry.getKey(); | |
| 94 | + HistoricTaskInstance lastTask = entry.getValue(); | |
| 95 | + | |
| 96 | + BpmUserSimpleReqDTO taskVO = new BpmUserSimpleReqDTO(); | |
| 97 | + Long assigneeId = NumberUtils.parseLong(lastTask.getAssignee()); | |
| 98 | + taskVO.setAssignee(assigneeId); | |
| 99 | + taskVO.setName(lastTask.getName()); | |
| 100 | + if (assigneeId != null) { | |
| 101 | + AdminUserRespDTO assignUser = userMap.get(assigneeId); | |
| 102 | + if (assignUser != null) { | |
| 103 | + taskVO.setAssigneeName(assignUser.getNickname()); | |
| 104 | + } | |
| 105 | + } | |
| 106 | + resultMap.put(processId, taskVO); | |
| 107 | + } | |
| 108 | + return resultMap; | |
| 109 | + } | |
| 110 | +} | ... | ... |
urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/dto/BpmUserSimpleReqDTO.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.bpm.api.task.dto; | |
| 2 | + | |
| 3 | +import lombok.Data; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * @Classname UserSimpleDto | |
| 7 | + * @Description 处理人信息 | |
| 8 | + * @Date 2025/12/23 23:30 | |
| 9 | + * @Created by wangqian | |
| 10 | + */ | |
| 11 | +@Data | |
| 12 | +public class BpmUserSimpleReqDTO { | |
| 13 | + /*节点名称*/ | |
| 14 | + private String name; | |
| 15 | + /* 处理人id*/ | |
| 16 | + private Long assignee; | |
| 17 | + /*处理人名称*/ | |
| 18 | + private String assigneeName; | |
| 19 | +} | ... | ... |
urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java
| ... | ... | @@ -6,6 +6,8 @@ import com.zteits.urbanops.framework.common.pojo.PageParam; |
| 6 | 6 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 7 | 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 8 | 8 | import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; |
| 9 | +import com.zteits.urbanops.module.bpm.api.task.BpmTaskApi; | |
| 10 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; | |
| 9 | 11 | import com.zteits.urbanops.module.system.api.user.AdminUserApi; |
| 10 | 12 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; |
| 11 | 13 | import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; |
| ... | ... | @@ -54,8 +56,8 @@ public class MainInfoController { |
| 54 | 56 | private DeptService deptService; |
| 55 | 57 | @Resource |
| 56 | 58 | private AdminUserApi adminUserApi; |
| 57 | - //@Resource | |
| 58 | - //private BpmTaskApi bpmTaskApi; | |
| 59 | + @Resource | |
| 60 | + private BpmTaskApi bpmTaskApi; | |
| 59 | 61 | |
| 60 | 62 | @PostMapping("/create") |
| 61 | 63 | @Operation(summary = "创建工单信息") |
| ... | ... | @@ -162,18 +164,15 @@ public class MainInfoController { |
| 162 | 164 | } |
| 163 | 165 | } |
| 164 | 166 | //4. 查询处理人 |
| 165 | -// List<String> processInstanceIdList = pageResult.getList().stream() | |
| 166 | -// .map(MainInfoDO::getProcessInstanceId) | |
| 167 | -// .filter(orderNo -> orderNo != null && !orderNo.isBlank()) | |
| 168 | -// .collect(Collectors.toList()); | |
| 169 | -// for (String s : processInstanceIdList) { | |
| 170 | -// List<BpmTaskRespVO> bpmTaskRespVOS = bpmTaskApi.getTaskListByProcessInstanceId(s); | |
| 171 | -// if (bpmTaskRespVOS != null) { | |
| 172 | -// | |
| 173 | -// } | |
| 174 | -// } | |
| 167 | + List<String> processInstanceIdList = pageResult.getList().stream() | |
| 168 | + .map(MainInfoDO::getProcessInstanceId) | |
| 169 | + .filter(orderNo -> orderNo != null && !orderNo.isBlank()) | |
| 170 | + .collect(Collectors.toList()); | |
| 171 | + | |
| 172 | + Map<String, BpmUserSimpleReqDTO> bpmTaskRespVOS = bpmTaskApi.getLastTaskMapByProcessInstanceId(processInstanceIdList); | |
| 173 | + | |
| 175 | 174 | // 5. 转换并返回结果 |
| 176 | - return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap)); | |
| 175 | + return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap, bpmTaskRespVOS)); | |
| 177 | 176 | } |
| 178 | 177 | |
| 179 | 178 | @GetMapping("/export-excel") | ... | ... |
urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/AdminMainInfoRespVO.java
urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java
| ... | ... | @@ -3,11 +3,11 @@ package com.zteits.urbanops.module.workorder.convert.maininfo; |
| 3 | 3 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 4 | 4 | import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; |
| 5 | 5 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 6 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; | |
| 6 | 7 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; |
| 7 | 8 | import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.AdminMainInfoRespVO; |
| 8 | 9 | import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; |
| 9 | 10 | import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; |
| 10 | -import com.zteits.urbanops.module.workorder.dto.MainInfoRespVO; | |
| 11 | 11 | import org.mapstruct.Mapper; |
| 12 | 12 | import org.mapstruct.factory.Mappers; |
| 13 | 13 | |
| ... | ... | @@ -25,7 +25,7 @@ public interface MainInfoConvert { |
| 25 | 25 | |
| 26 | 26 | MainInfoConvert INSTANCE = Mappers.getMapper(MainInfoConvert.class); |
| 27 | 27 | |
| 28 | - default PageResult<AdminMainInfoRespVO> buildMainInfoPage(PageResult<MainInfoDO> pageResult, Map<String, AttachmentDO> attachmentMap) { | |
| 28 | + default PageResult<AdminMainInfoRespVO> buildMainInfoPage(PageResult<MainInfoDO> pageResult, Map<String, AttachmentDO> attachmentMap, Map<String, BpmUserSimpleReqDTO> bpmTaskRespVOS ) { | |
| 29 | 29 | List<AdminMainInfoRespVO> mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { |
| 30 | 30 | AdminMainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, AdminMainInfoRespVO.class); |
| 31 | 31 | if (attachmentMap != null && !attachmentMap.isEmpty()) { |
| ... | ... | @@ -39,6 +39,13 @@ public interface MainInfoConvert { |
| 39 | 39 | .collect(Collectors.toList()); |
| 40 | 40 | mainInfoVo.setFileNames(fileNameList); |
| 41 | 41 | } |
| 42 | + if (bpmTaskRespVOS != null && !bpmTaskRespVOS.isEmpty()) { | |
| 43 | + BpmUserSimpleReqDTO bpmUserSimpleReqDTO = bpmTaskRespVOS.get(mainInfoDO.getProcessInstanceId()); | |
| 44 | + if (bpmUserSimpleReqDTO != null) { | |
| 45 | + mainInfoVo.setAssigneeName(bpmUserSimpleReqDTO.getAssigneeName()); | |
| 46 | + mainInfoVo.setApprovalNode(bpmUserSimpleReqDTO.getName()); | |
| 47 | + } | |
| 48 | + } | |
| 42 | 49 | } |
| 43 | 50 | return mainInfoVo; |
| 44 | 51 | }); | ... | ... |