Commit 7694ac514290d619fd9c694abf4acd34b769ec08

Authored by wangqian
1 parent 6a9697c9

工单修改

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
... ... @@ -170,7 +170,9 @@ public class AdminMainInfoRespVO {
170 170 /**
171 171 * 处理人
172 172 */
173   - private String handlerName;
  173 + private String assigneeName;
  174 + /*审批节点*/
  175 + private String approvalNode;
174 176  
175 177  
176 178 }
... ...
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 });
... ...