refactor(bpm): 优化流程实例创建后的抄送人处理逻辑

- 移除了原有的 handleProcessInstanceCC 方法
- 新增 processCCToUsers 方法,在流程实例创建后处理抄送人信息- 优化了抄送人信息的获取和保存逻辑
- 删除了不必要的异步处理和事务同步代码
This commit is contained in:
aikai 2025-07-08 17:57:00 +08:00
parent 6225a8804d
commit 34a6b6d4cd

View File

@ -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 实现类
* <p>
@ -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<String, Object> variables = runtimeService.getVariables(instance.getId());
// 根据流程名称流程发起人 查询流程配置的抄送人信息
List<BpmProcessCcDO> processCcList = processCcService.getCCListByName(instance.getName(), Long.valueOf(instance.getStartUserId()));
// 提取抄送信息用中对应的用户组编号
Set<Long> userGroupIds = processCcList.stream()
.flatMap(data -> data.getUserGroupId().stream())
.collect(Collectors.toSet());
if (CollectionUtil.isNotEmpty(userGroupIds)) {
// 获取用户组信息
List<BpmUserGroupDO> userGroups = userGroupService.getUserGroupList(userGroupIds);
// 提取用户组中对应的用户ID
Set<Long> 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<BpmProcessInstanceExtDO>()
.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<String, Object> 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<BpmProcessCcDO> processCcList = processCcService.getCCListByName(instance.getName(), Long.valueOf(instance.getStartUserId()));
// 提取抄送信息用中对应的用户组编号
Set<Long> 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<BpmUserGroupDO> userGroups = userGroupService.getUserGroupList(userGroupIds);
// 提取用户组中对应的用户ID
Set<Long> 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