适配DeptApproveDetailMap类修改
This commit is contained in:
+9
-31
@@ -8,6 +8,7 @@ import org.flowable.engine.runtime.Execution;
|
|||||||
import org.flowable.task.service.delegate.DelegateTask;
|
import org.flowable.task.service.delegate.DelegateTask;
|
||||||
import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak;
|
import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak;
|
||||||
import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetail;
|
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.bg.xispeak.service.IBgXiSpeakService;
|
||||||
import org.jeecg.modules.extbpm.process.common.expression.FlowNodeExpression;
|
import org.jeecg.modules.extbpm.process.common.expression.FlowNodeExpression;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -35,9 +36,6 @@ public class AfterImplWorkerApproveListener implements TaskListener {
|
|||||||
private final IBgXiSpeakService bgXiSpeakService;
|
private final IBgXiSpeakService bgXiSpeakService;
|
||||||
private final RuntimeService runtimeService;
|
private final RuntimeService runtimeService;
|
||||||
|
|
||||||
// 引入 Jackson 的 ObjectMapper 用于处理类型转换失败的情况
|
|
||||||
private final com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void notify(DelegateTask delegateTask) {
|
public void notify(DelegateTask delegateTask) {
|
||||||
@@ -78,38 +76,20 @@ public class AfterImplWorkerApproveListener implements TaskListener {
|
|||||||
|
|
||||||
String cleanDeptId = rawDeptVar.toString().replace("[", "").replace("]", "").trim();
|
String cleanDeptId = rawDeptVar.toString().replace("[", "").replace("]", "").trim();
|
||||||
|
|
||||||
// --- 修改开始:处理复杂的 Map 转换问题 ---
|
DeptApproveDetailMap approveMap = xiSpeak.getApproveInfo();
|
||||||
|
if (approveMap == null) {
|
||||||
// 1. 获取原始 Map (这里使用通配符,避免直接强转报错)
|
approveMap = new DeptApproveDetailMap();
|
||||||
Map<String, Object> rawApproveMap = (Map) xiSpeak.getApproveInfo();
|
|
||||||
if (rawApproveMap == null) {
|
|
||||||
rawApproveMap = new HashMap<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 获取该部门对应的详情,并进行安全类型检查
|
DeptApproveDetail detail = approveMap.get(cleanDeptId);
|
||||||
Object rawDetail = rawApproveMap.get(cleanDeptId);
|
if (detail == null) {
|
||||||
DeptApproveDetail detail;
|
|
||||||
|
|
||||||
if (rawDetail == null) {
|
|
||||||
// 情况 A: 部门记录不存在,新建
|
|
||||||
detail = new DeptApproveDetail();
|
detail = new DeptApproveDetail();
|
||||||
detail.setDeptId(cleanDeptId);
|
detail.setDeptId(cleanDeptId);
|
||||||
detail.setImplUserNameList(new ArrayList<>());
|
detail.setImplUserNameList(new ArrayList<>());
|
||||||
rawApproveMap.put(cleanDeptId, detail);
|
approveMap.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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- 修改结束 ---
|
// 更新落实人列表
|
||||||
|
|
||||||
// 5. 更新落实人列表
|
|
||||||
List<String> workerList = detail.getImplUserNameList();
|
List<String> workerList = detail.getImplUserNameList();
|
||||||
if (workerList == null) {
|
if (workerList == null) {
|
||||||
workerList = new ArrayList<>();
|
workerList = new ArrayList<>();
|
||||||
@@ -119,9 +99,7 @@ public class AfterImplWorkerApproveListener implements TaskListener {
|
|||||||
workerList.add(currentWorkerName);
|
workerList.add(currentWorkerName);
|
||||||
detail.setImplUserNameList(workerList);
|
detail.setImplUserNameList(workerList);
|
||||||
|
|
||||||
// 重新写回 Map 并保存
|
xiSpeak.setApproveInfo(approveMap);
|
||||||
// 声明:虽然 rawApproveMap 里的 Value 是 Object,但写回数据库时 TypeHandler 会处理它
|
|
||||||
xiSpeak.setApproveInfo((Map) rawApproveMap);
|
|
||||||
bgXiSpeakService.updateById(xiSpeak);
|
bgXiSpeakService.updateById(xiSpeak);
|
||||||
log.info("部门 {} 经办人审批记录更新成功: {}", cleanDeptId, currentWorkerName);
|
log.info("部门 {} 经办人审批记录更新成功: {}", cleanDeptId, currentWorkerName);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+3
-22
@@ -2,7 +2,6 @@ package org.jeecg.xispeakfb;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.common.system.api.ISysBaseAPI;
|
||||||
import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak;
|
import org.jeecg.modules.bg.xispeak.entity.BgXiSpeak;
|
||||||
import org.jeecg.modules.bg.xispeak.entity.DeptApproveDetail;
|
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.bg.xispeak.service.IBgXiSpeakService;
|
||||||
import org.jeecg.modules.tasktask.entity.TaskTask;
|
import org.jeecg.modules.tasktask.entity.TaskTask;
|
||||||
import org.jeecg.modules.tasktask.service.ITaskTaskService;
|
import org.jeecg.modules.tasktask.service.ITaskTaskService;
|
||||||
@@ -53,7 +53,7 @@ public class XiSpeakFeedbackFlow {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, DeptApproveDetail> approveInfoMap = xiSpeak.getApproveInfo();
|
DeptApproveDetailMap approveInfoMap = xiSpeak.getApproveInfo();
|
||||||
if (approveInfoMap == null || approveInfoMap.isEmpty()) {
|
if (approveInfoMap == null || approveInfoMap.isEmpty()) {
|
||||||
log.warn("根据查询到的业务表单数据无法获取对应的审批信息![BgXiSpeak: {}]", xiSpeak);
|
log.warn("根据查询到的业务表单数据无法获取对应的审批信息![BgXiSpeak: {}]", xiSpeak);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
@@ -106,28 +106,9 @@ public class XiSpeakFeedbackFlow {
|
|||||||
return StringUtils.EMPTY;
|
return StringUtils.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- 核心修复部分 ---
|
DeptApproveDetailMap approveInfoMap = xiSpeak.getApproveInfo();
|
||||||
// 从 DB 或缓存取出的 Map,其 Value 在运行时往往是 LinkedHashMap
|
|
||||||
Map<String, ?> approveInfoMap = xiSpeak.getApproveInfo();
|
|
||||||
|
|
||||||
// 建议将 ObjectMapper 定义为静态常量或通过 Spring 注入,此处为演示保持局部定义
|
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
|
||||||
|
|
||||||
return approveInfoMap.values().stream()
|
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))
|
.filter(detail -> detail.getImplUserNameList() != null && detail.getImplUserNameList().contains(handlerName))
|
||||||
.map(DeptApproveDetail::getApproverName)
|
.map(DeptApproveDetail::getApproverName)
|
||||||
.findFirst()
|
.findFirst()
|
||||||
|
|||||||
Reference in New Issue
Block a user