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 +6,8 @@ import com.zteits.urbanops.framework.common.pojo.PageParam; | ||
| 6 | import com.zteits.urbanops.framework.common.pojo.PageResult; | 6 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; | 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 8 | import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; | 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 | import com.zteits.urbanops.module.system.api.user.AdminUserApi; | 11 | import com.zteits.urbanops.module.system.api.user.AdminUserApi; |
| 10 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; | 12 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; |
| 11 | import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; | 13 | import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; |
| @@ -54,8 +56,8 @@ public class MainInfoController { | @@ -54,8 +56,8 @@ public class MainInfoController { | ||
| 54 | private DeptService deptService; | 56 | private DeptService deptService; |
| 55 | @Resource | 57 | @Resource |
| 56 | private AdminUserApi adminUserApi; | 58 | private AdminUserApi adminUserApi; |
| 57 | - //@Resource | ||
| 58 | - //private BpmTaskApi bpmTaskApi; | 59 | + @Resource |
| 60 | + private BpmTaskApi bpmTaskApi; | ||
| 59 | 61 | ||
| 60 | @PostMapping("/create") | 62 | @PostMapping("/create") |
| 61 | @Operation(summary = "创建工单信息") | 63 | @Operation(summary = "创建工单信息") |
| @@ -162,18 +164,15 @@ public class MainInfoController { | @@ -162,18 +164,15 @@ public class MainInfoController { | ||
| 162 | } | 164 | } |
| 163 | } | 165 | } |
| 164 | //4. 查询处理人 | 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 | // 5. 转换并返回结果 | 174 | // 5. 转换并返回结果 |
| 176 | - return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap)); | 175 | + return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap, bpmTaskRespVOS)); |
| 177 | } | 176 | } |
| 178 | 177 | ||
| 179 | @GetMapping("/export-excel") | 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,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,11 +3,11 @@ package com.zteits.urbanops.module.workorder.convert.maininfo; | ||
| 3 | import com.zteits.urbanops.framework.common.pojo.PageResult; | 3 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 4 | import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; | 4 | import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; |
| 5 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; | 5 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 6 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; | ||
| 6 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; | 7 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; |
| 7 | import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.AdminMainInfoRespVO; | 8 | import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.AdminMainInfoRespVO; |
| 8 | import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; | 9 | import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; |
| 9 | import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; | 10 | import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; |
| 10 | -import com.zteits.urbanops.module.workorder.dto.MainInfoRespVO; | ||
| 11 | import org.mapstruct.Mapper; | 11 | import org.mapstruct.Mapper; |
| 12 | import org.mapstruct.factory.Mappers; | 12 | import org.mapstruct.factory.Mappers; |
| 13 | 13 | ||
| @@ -25,7 +25,7 @@ public interface MainInfoConvert { | @@ -25,7 +25,7 @@ public interface MainInfoConvert { | ||
| 25 | 25 | ||
| 26 | MainInfoConvert INSTANCE = Mappers.getMapper(MainInfoConvert.class); | 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 | List<AdminMainInfoRespVO> mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { | 29 | List<AdminMainInfoRespVO> mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { |
| 30 | AdminMainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, AdminMainInfoRespVO.class); | 30 | AdminMainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, AdminMainInfoRespVO.class); |
| 31 | if (attachmentMap != null && !attachmentMap.isEmpty()) { | 31 | if (attachmentMap != null && !attachmentMap.isEmpty()) { |
| @@ -39,6 +39,13 @@ public interface MainInfoConvert { | @@ -39,6 +39,13 @@ public interface MainInfoConvert { | ||
| 39 | .collect(Collectors.toList()); | 39 | .collect(Collectors.toList()); |
| 40 | mainInfoVo.setFileNames(fileNameList); | 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 | return mainInfoVo; | 50 | return mainInfoVo; |
| 44 | }); | 51 | }); |