refactor(bpm): 优化流程实例创建后的抄送人处理逻辑
- 移除了原有的 handleProcessInstanceCC 方法 - 新增 processCCToUsers 方法,在流程实例创建后处理抄送人信息- 优化了抄送人信息的获取和保存逻辑 - 删除了不必要的异步处理和事务同步代码
This commit is contained in:
parent
6225a8804d
commit
34a6b6d4cd
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user