From e555250e7028dacfbb0b64f410731ea21a35d99f Mon Sep 17 00:00:00 2001 From: wsm <2746563060@侵权。> Date: Fri, 22 May 2026 16:29:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8DDeptApproveDetailMap=E7=B1=BB?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AfterImplWorkerApproveListener.java | 40 +++++-------------- .../jeecg/xispeakfb/XiSpeakFeedbackFlow.java | 25 ++---------- 2 files changed, 12 insertions(+), 53 deletions(-) diff --git a/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeak/listener/AfterImplWorkerApproveListener.java b/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeak/listener/AfterImplWorkerApproveListener.java index e89cfa7..286d84b 100644 --- a/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeak/listener/AfterImplWorkerApproveListener.java +++ b/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeak/listener/AfterImplWorkerApproveListener.java @@ -8,6 +8,7 @@ import org.flowable.engine.runtime.Execution; import org.flowable.task.service.delegate.DelegateTask; import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak; import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetail; +import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetailMap; import org.jeecg.modules.bg.xispeak.service.IBgXiSpeakService; import org.jeecg.modules.extbpm.process.common.expression.FlowNodeExpression; import lombok.RequiredArgsConstructor; @@ -35,9 +36,6 @@ public class AfterImplWorkerApproveListener implements TaskListener { private final IBgXiSpeakService bgXiSpeakService; private final RuntimeService runtimeService; - // 引入 Jackson 的 ObjectMapper 用于处理类型转换失败的情况 - private final com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper(); - @Override @Transactional(rollbackFor = Exception.class) public void notify(DelegateTask delegateTask) { @@ -78,38 +76,20 @@ public class AfterImplWorkerApproveListener implements TaskListener { String cleanDeptId = rawDeptVar.toString().replace("[", "").replace("]", "").trim(); - // --- 修改开始:处理复杂的 Map 转换问题 --- - - // 1. 获取原始 Map (这里使用通配符,避免直接强转报错) - Map rawApproveMap = (Map) xiSpeak.getApproveInfo(); - if (rawApproveMap == null) { - rawApproveMap = new HashMap<>(); + DeptApproveDetailMap approveMap = xiSpeak.getApproveInfo(); + if (approveMap == null) { + approveMap = new DeptApproveDetailMap(); } - // 2. 获取该部门对应的详情,并进行安全类型检查 - Object rawDetail = rawApproveMap.get(cleanDeptId); - DeptApproveDetail detail; - - if (rawDetail == null) { - // 情况 A: 部门记录不存在,新建 + DeptApproveDetail detail = approveMap.get(cleanDeptId); + if (detail == null) { detail = new DeptApproveDetail(); detail.setDeptId(cleanDeptId); detail.setImplUserNameList(new ArrayList<>()); - rawApproveMap.put(cleanDeptId, detail); - } else if (rawDetail instanceof DeptApproveDetail) { - // 情况 B: 类型正确,直接使用 - detail = (DeptApproveDetail) rawDetail; - } else { - // 情况 C: 就是你遇到的报错点!类型是 LinkedHashMap,需要转换 - log.debug("检测到 LinkedHashMap 类型,执行手动转换..."); - detail = objectMapper.convertValue(rawDetail, DeptApproveDetail.class); - // 转换后放回 Map,防止后续逻辑再次触发转换 - rawApproveMap.put(cleanDeptId, detail); + approveMap.put(cleanDeptId, detail); } - // --- 修改结束 --- - - // 5. 更新落实人列表 + // 更新落实人列表 List workerList = detail.getImplUserNameList(); if (workerList == null) { workerList = new ArrayList<>(); @@ -119,9 +99,7 @@ public class AfterImplWorkerApproveListener implements TaskListener { workerList.add(currentWorkerName); detail.setImplUserNameList(workerList); - // 重新写回 Map 并保存 - // 声明:虽然 rawApproveMap 里的 Value 是 Object,但写回数据库时 TypeHandler 会处理它 - xiSpeak.setApproveInfo((Map) rawApproveMap); + xiSpeak.setApproveInfo(approveMap); bgXiSpeakService.updateById(xiSpeak); log.info("部门 {} 经办人审批记录更新成功: {}", cleanDeptId, currentWorkerName); } else { diff --git a/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeakfb/XiSpeakFeedbackFlow.java b/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeakfb/XiSpeakFeedbackFlow.java index 1d137cd..75c6673 100644 --- a/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeakfb/XiSpeakFeedbackFlow.java +++ b/jeecg-boot-module/jeecg-module-flow/src/main/java/org/jeecg/xispeakfb/XiSpeakFeedbackFlow.java @@ -2,7 +2,6 @@ package org.jeecg.xispeakfb; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,6 +12,7 @@ import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak; import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetail; +import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetailMap; import org.jeecg.modules.bg.xispeak.service.IBgXiSpeakService; import org.jeecg.modules.tasktask.entity.TaskTask; import org.jeecg.modules.tasktask.service.ITaskTaskService; @@ -53,7 +53,7 @@ public class XiSpeakFeedbackFlow { return Collections.emptyList(); } - Map approveInfoMap = xiSpeak.getApproveInfo(); + DeptApproveDetailMap approveInfoMap = xiSpeak.getApproveInfo(); if (approveInfoMap == null || approveInfoMap.isEmpty()) { log.warn("根据查询到的业务表单数据无法获取对应的审批信息![BgXiSpeak: {}]", xiSpeak); return Collections.emptyList(); @@ -106,28 +106,9 @@ public class XiSpeakFeedbackFlow { return StringUtils.EMPTY; } - // --- 核心修复部分 --- - // 从 DB 或缓存取出的 Map,其 Value 在运行时往往是 LinkedHashMap - Map approveInfoMap = xiSpeak.getApproveInfo(); - - // 建议将 ObjectMapper 定义为静态常量或通过 Spring 注入,此处为演示保持局部定义 - ObjectMapper mapper = new ObjectMapper(); + DeptApproveDetailMap approveInfoMap = xiSpeak.getApproveInfo(); return approveInfoMap.values().stream() - // 重点 1: 强制声明为 Object 接收,跳过隐式的 (DeptApproveDetail) 强转 - .map((Object obj) -> { - try { - // 重点 2: 如果已经是对象则直接转,否则进行 Jackson 转换 - if (obj instanceof DeptApproveDetail) { - return (DeptApproveDetail) obj; - } - return mapper.convertValue(obj, DeptApproveDetail.class); - } catch (Exception e) { - log.error("审批明细类型转换失败: {}", obj, e); - return null; - } - }) - .filter(Objects::nonNull) // 过滤掉转换失败的元素 .filter(detail -> detail.getImplUserNameList() != null && detail.getImplUserNameList().contains(handlerName)) .map(DeptApproveDetail::getApproverName) .findFirst()