From 34a6b6d4cdb20c606a4d777cdb4fccd2e8bd2421 Mon Sep 17 00:00:00 2001 From: aikai Date: Tue, 8 Jul 2025 17:57:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(bpm):=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9E=E4=BE=8B=E5=88=9B=E5=BB=BA=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E6=8A=84=E9=80=81=E4=BA=BA=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了原有的 handleProcessInstanceCC 方法 - 新增 processCCToUsers 方法,在流程实例创建后处理抄送人信息- 优化了抄送人信息的获取和保存逻辑 - 删除了不必要的异步处理和事务同步代码 --- .../task/BpmProcessInstanceServiceImpl.java | 126 +++++++----------- 1 file changed, 50 insertions(+), 76 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 70a137c4..4aa439de 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -90,8 +90,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; -import java.util.concurrent.CompletableFuture; - /** * 流程实例 Service 实现类 *

@@ -361,50 +359,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); - // 在记录创建后立即处理抄送人信息 - handleProcessInstanceCC(instance); - } - - /** - * 在事件监听器中处理抄送人信息 - */ - private void handleProcessInstanceCC(ProcessInstance instance) { - try { - // 获取流程变量 - Map variables = runtimeService.getVariables(instance.getId()); - - // 根据流程名称、流程发起人 查询流程配置的抄送人信息 - List processCcList = processCcService.getCCListByName(instance.getName(), Long.valueOf(instance.getStartUserId())); - // 提取抄送信息用中对应的用户组编号 - Set userGroupIds = processCcList.stream() - .flatMap(data -> data.getUserGroupId().stream()) - .collect(Collectors.toSet()); - - if (CollectionUtil.isNotEmpty(userGroupIds)) { - // 获取用户组信息 - List userGroups = userGroupService.getUserGroupList(userGroupIds); - // 提取用户组中对应的用户ID - Set userIds = userGroups.stream() - .flatMap(data -> data.getMemberUserIds().stream()) - .collect(Collectors.toSet()); - - // 将用户ID列表转换为字符串 - String ccIds = userIds.stream() - .map(id -> "[" + id + "]") // 每个值用方括号包裹 - .collect(Collectors.joining()); - - // 直接更新刚创建的记录 - BpmProcessInstanceExtDO updateDO = new BpmProcessInstanceExtDO() - .setProcessInstanceId(instance.getId()) - .setFormVariables(variables) - .setCcids(ccIds); - - processInstanceExtMapper.updateByProcessInstanceId(updateDO); - log.debug("事件监听器中抄送人信息设置成功,processInstanceId: {}", updateDO); - } - } catch (Exception e) { - log.error("事件监听器中处理抄送人信息失败,processInstanceId: {}", instance.getId(), e); - } } @Override @@ -496,8 +450,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService public void updateProcessInstanceResult(String id, Integer result) { processInstanceExtMapper.update(null, new LambdaUpdateWrapper() - .set(BpmProcessInstanceExtDO::getResult, result) - .eq(BpmProcessInstanceExtDO::getProcessInstanceId, id)); + .set(BpmProcessInstanceExtDO::getResult, result) + .eq(BpmProcessInstanceExtDO::getProcessInstanceId, id)); } /** @@ -564,8 +518,21 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 设置流程审批部门缓存 stringRedisTemplate.opsForValue().set("assignee_dept_" + instance.getId(), startUser.getDeptId().toString()); - // 这边不再更新流程实例拓展,直接从创建的监听类中更新 - 避免事物执行顺序导致插入失败 - //再测试下推送 + +// // 在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。 +// TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { +// +// @Override +// public void afterCommit() { +// +// // 创建流程后,添加抄送人 +// processCCToUsers(instance, variables); +// } +// }); + + // 创建流程后,添加抄送人 + processCCToUsers(instance, variables); + return instance.getId(); } @@ -723,35 +690,42 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } /** - * 带重试机制的更新操作,确保幂等性 + * 创建流程后,添加抄送人 + * @param instance 流程实例 */ - private void updateProcessInstanceExtWithRetry(BpmProcessInstanceExtDO instanceExtDO) { - try { - // 先检查记录是否存在 - BpmProcessInstanceExtDO existingRecord = processInstanceExtMapper.selectByProcessInstanceId(instanceExtDO.getProcessInstanceId()); - if (existingRecord != null) { - // 记录存在,直接更新 - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - log.debug("异步处理抄送人信息更新成功,processInstanceId: {}", instanceExtDO.getProcessInstanceId()); - return; - } + private void processCCToUsers(ProcessInstance instance, Map variables) { - // 记录不存在,等待一下再重试 - Thread.sleep(50); - existingRecord = processInstanceExtMapper.selectByProcessInstanceId(instanceExtDO.getProcessInstanceId()); - if (existingRecord != null) { - // 记录存在,执行更新 - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - log.debug("异步处理抄送人信息重试更新成功,processInstanceId: {}", instanceExtDO.getProcessInstanceId()); - } else { - log.warn("异步处理抄送人信息更新失败,记录不存在,processInstanceId: {}", instanceExtDO.getProcessInstanceId()); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - log.error("异步处理抄送人信息被中断,processInstanceId: {}", instanceExtDO.getProcessInstanceId(), e); - } catch (Exception e) { - log.error("异步处理抄送人信息失败,processInstanceId: {}", instanceExtDO.getProcessInstanceId(), e); + // 根据流程名称、流程发起人 查询流程配置的抄送人信息 + List processCcList = processCcService.getCCListByName(instance.getName(), Long.valueOf(instance.getStartUserId())); + // 提取抄送信息用中对应的用户组编号 + Set userGroupIds = processCcList.stream() + .flatMap(data -> data.getUserGroupId().stream()) + .collect(Collectors.toSet()); + + //根据processDefinitionId 将ccIds保存到bpm_process_instance_ext中的ccIds字段 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() + .setProcessDefinitionId(instance.getProcessDefinitionId()) + .setFormVariables(variables) + .setProcessInstanceId(instance.getProcessInstanceId()); + if (CollectionUtil.isNotEmpty(userGroupIds)) { + + // 获取用户组信息 + List userGroups = userGroupService.getUserGroupList(userGroupIds); + // 提取用户组中对应的用户ID + Set userIds = userGroups.stream() + .flatMap(data -> data.getMemberUserIds().stream()) + .collect(Collectors.toSet()); + + // 将用户ID列表转换为字符串 + String ccIds = userIds.stream() + .map(id -> "[" + id + "]") // 每个值用方括号包裹 + .collect(Collectors.joining()); + + //根据processDefinitionId 将ccIds保存到bpm_process_instance_ext中的ccIds字段 + instanceExtDO.setCcids(ccIds); } + + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); } @Override