diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApi.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApi.java new file mode 100644 index 0000000..4b463b7 --- /dev/null +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApi.java @@ -0,0 +1,24 @@ +package com.zteits.urbanops.module.bpm.api.task; + +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; + +import java.util.List; +import java.util.Map; + +/** + * @Classname BpmTaskApi + * @Description bpm对外api + * @Date 2025/12/23 22:20 + * @Created by wangqian + */ +public interface BpmTaskApi { + + /** + * @Author wangqian + * @Description 获得指定流程实例的任务列表 + * @Date 2025/12/23 22:23 + * @Param processInstanceId + * @Return + */ + Map getLastTaskMapByProcessInstanceId(List processInstanceId); +} diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java new file mode 100644 index 0000000..ce7bbc1 --- /dev/null +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmTaskApiImpl.java @@ -0,0 +1,110 @@ +package com.zteits.urbanops.module.bpm.api.task; + +import cn.hutool.core.collection.CollUtil; +import com.zteits.urbanops.framework.common.util.number.NumberUtils; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; +import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; +import com.zteits.urbanops.module.system.api.user.AdminUserApi; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import java.util.stream.Stream; + +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; + +/** + * @Classname BpmTaskApiImpl + * @Description bpm对外api + * @Date 2025/12/23 22:21 + * @Created by wangqian + */ +@Service +@Validated +@Slf4j +public class BpmTaskApiImpl implements BpmTaskApi{ + @Resource + private BpmTaskService taskService; + @Resource + private AdminUserApi adminUserApi; + + /** + * 批量根据流程实例ID获取最后一个(最新)任务的处理人ID(Long类型) + * + * @param processInstanceIds 流程实例ID列表(支持空/Null) + * @return Map<流程实例ID, 处理人ID>:无任务/转换失败则value为null + */ + public Map getLastTaskMapByProcessInstanceId(List processInstanceIds) { + Map resultMap = new HashMap<>(); + if (CollUtil.isEmpty(processInstanceIds)) { + return resultMap; + } + // 临时存储:流程实例ID → 最后一个任务(用于后续封装VO) + Map process2LastTaskMap = new HashMap<>(); + // 收集所有需要查询的用户ID(批量查询用户,提升性能) + Set allUserIds = new HashSet<>(); + // 2. 批量遍历流程实例ID(增强for更易读) + for (String processId : processInstanceIds) { + if (!StringUtils.hasText(processId)) { + resultMap.put(processId, null); + continue; + } + // 3. 查询该流程实例的历史任务列表 + List taskList = taskService.getTaskListByProcessInstanceId(processId, true); + log.info("[getLastTaskMapByProcessInstanceId] 流程实例ID={},查询到历史任务数={}", processId, CollUtil.size(taskList)); + + // 4. 无任务:Map中该key赋值null,继续下一个 + if (CollUtil.isEmpty(taskList)) { + resultMap.put(processId, null); + log.warn("[getLastTaskMapByProcessInstanceId] 流程实例ID={},无历史任务", processId); + continue; + } + // 拼接数据 + Set userIds = convertSetByFlatMap(taskList, task -> + Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner()))); + Map userMap = adminUserApi.getUserMap(userIds); + // 5. 按任务结束时间倒序→创建时间倒序排序,确保取到最新任务 + HistoricTaskInstance lastTask = taskList.stream() + .reduce((first, last) -> last) // 遍历到最后一个元素 + .orElse(null); // 空列表返回null + // 存储最后一个任务,后续封装VO + process2LastTaskMap.put(processId, lastTask); + // 收集该任务的处理人/拥有人ID(安全转换) + Long assigneeId = NumberUtils.parseLong(lastTask.getAssignee()); + if (assigneeId != null) { + allUserIds.add(assigneeId); + } + + } + // ========== 第二步:批量查询用户信息(仅一次调用,提升性能) ========== + Map userMap = new HashMap<>(); + if (CollUtil.isNotEmpty(allUserIds)) { + userMap = adminUserApi.getUserMap(allUserIds); + } + + for (Map.Entry entry : process2LastTaskMap.entrySet()) { + String processId = entry.getKey(); + HistoricTaskInstance lastTask = entry.getValue(); + + BpmUserSimpleReqDTO taskVO = new BpmUserSimpleReqDTO(); + Long assigneeId = NumberUtils.parseLong(lastTask.getAssignee()); + taskVO.setAssignee(assigneeId); + taskVO.setName(lastTask.getName()); + if (assigneeId != null) { + AdminUserRespDTO assignUser = userMap.get(assigneeId); + if (assignUser != null) { + taskVO.setAssigneeName(assignUser.getNickname()); + } + } + resultMap.put(processId, taskVO); + } + return resultMap; + } +} diff --git a/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/dto/BpmUserSimpleReqDTO.java b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/dto/BpmUserSimpleReqDTO.java new file mode 100644 index 0000000..75d0ad2 --- /dev/null +++ b/urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/dto/BpmUserSimpleReqDTO.java @@ -0,0 +1,19 @@ +package com.zteits.urbanops.module.bpm.api.task.dto; + +import lombok.Data; + +/** + * @Classname UserSimpleDto + * @Description 处理人信息 + * @Date 2025/12/23 23:30 + * @Created by wangqian + */ +@Data +public class BpmUserSimpleReqDTO { + /*节点名称*/ + private String name; + /* 处理人id*/ + private Long assignee; + /*处理人名称*/ + private String assigneeName; +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java index 33c2b9d..fbeac35 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java +++ b/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; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; +import com.zteits.urbanops.module.bpm.api.task.BpmTaskApi; +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; import com.zteits.urbanops.module.system.api.user.AdminUserApi; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; @@ -54,8 +56,8 @@ public class MainInfoController { private DeptService deptService; @Resource private AdminUserApi adminUserApi; - //@Resource - //private BpmTaskApi bpmTaskApi; + @Resource + private BpmTaskApi bpmTaskApi; @PostMapping("/create") @Operation(summary = "创建工单信息") @@ -162,18 +164,15 @@ public class MainInfoController { } } //4. 查询处理人 -// List processInstanceIdList = pageResult.getList().stream() -// .map(MainInfoDO::getProcessInstanceId) -// .filter(orderNo -> orderNo != null && !orderNo.isBlank()) -// .collect(Collectors.toList()); -// for (String s : processInstanceIdList) { -// List bpmTaskRespVOS = bpmTaskApi.getTaskListByProcessInstanceId(s); -// if (bpmTaskRespVOS != null) { -// -// } -// } + List processInstanceIdList = pageResult.getList().stream() + .map(MainInfoDO::getProcessInstanceId) + .filter(orderNo -> orderNo != null && !orderNo.isBlank()) + .collect(Collectors.toList()); + + Map bpmTaskRespVOS = bpmTaskApi.getLastTaskMapByProcessInstanceId(processInstanceIdList); + // 5. 转换并返回结果 - return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap)); + return success(MainInfoConvert.INSTANCE.buildMainInfoPage(pageResult, attachmentMap, bpmTaskRespVOS)); } @GetMapping("/export-excel") diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/AdminMainInfoRespVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/AdminMainInfoRespVO.java index 64874b5..9f901d9 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/AdminMainInfoRespVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/AdminMainInfoRespVO.java @@ -170,7 +170,9 @@ public class AdminMainInfoRespVO { /** * 处理人 */ - private String handlerName; + private String assigneeName; + /*审批节点*/ + private String approvalNode; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java index c0494b4..e9594b2 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java +++ b/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; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.bpm.api.task.dto.BpmUserSimpleReqDTO; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.AdminMainInfoRespVO; import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; -import com.zteits.urbanops.module.workorder.dto.MainInfoRespVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -25,7 +25,7 @@ public interface MainInfoConvert { MainInfoConvert INSTANCE = Mappers.getMapper(MainInfoConvert.class); - default PageResult buildMainInfoPage(PageResult pageResult, Map attachmentMap) { + default PageResult buildMainInfoPage(PageResult pageResult, Map attachmentMap, Map bpmTaskRespVOS ) { List mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { AdminMainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, AdminMainInfoRespVO.class); if (attachmentMap != null && !attachmentMap.isEmpty()) { @@ -39,6 +39,13 @@ public interface MainInfoConvert { .collect(Collectors.toList()); mainInfoVo.setFileNames(fileNameList); } + if (bpmTaskRespVOS != null && !bpmTaskRespVOS.isEmpty()) { + BpmUserSimpleReqDTO bpmUserSimpleReqDTO = bpmTaskRespVOS.get(mainInfoDO.getProcessInstanceId()); + if (bpmUserSimpleReqDTO != null) { + mainInfoVo.setAssigneeName(bpmUserSimpleReqDTO.getAssigneeName()); + mainInfoVo.setApprovalNode(bpmUserSimpleReqDTO.getName()); + } + } } return mainInfoVo; });