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 cbedd2ef..4f4d1d19 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 @@ -361,8 +361,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); - - // 在记录创建后立即处理抄送人信息(双重保险) + + // 在记录创建后立即处理抄送人信息 handleProcessInstanceCC(instance); } @@ -373,14 +373,14 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService 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); @@ -388,18 +388,18 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService 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: {}", instance.getId()); } @@ -565,28 +565,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 设置流程审批部门缓存 stringRedisTemplate.opsForValue().set("assignee_dept_" + instance.getId(), startUser.getDeptId().toString()); - - // 延迟处理抄送人信息,避免与事件监听器的并发问题 - processInstanceCCDeferred(instance, variables); - return instance.getId(); } - /** - * 延迟处理抄送人信息,避免与事件监听器的并发问题 - */ - private void processInstanceCCDeferred(ProcessInstance instance, Map variables) { - // 使用异步处理,确保主流程不被阻塞 - CompletableFuture.runAsync(() -> { - try { - Thread.sleep(100); // 短暂延迟,让事件监听器先执行 - processCCToUsers(instance, variables); - } catch (Exception e) { - log.error("异步处理抄送人信息失败,processInstanceId: {}", instance.getProcessInstanceId(), e); - } - }); - } - private void approveSelfTask(String processInstanceId) { List tasks = engineTaskService.createTaskQuery().processInstanceId(processInstanceId).list(); if (tasks != null && tasks.size() > 0) { @@ -740,112 +721,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } } - /** - * /创建流程后,添加抄送人 Begin add by yj 2024.1.4 - * 在设计流程的时候,需要添加一个任务块 名字必须叫Activity_cc 分配权限的时候,需要选择用户组。 - * - * @param definition - * @param instance - */ - private void processCCToUsers(ProcessDefinition definition, ProcessInstance instance) { - //获取bpm_task_assign_reule (Bpm 任务规则表)的流程中有没有配置抄送节点 固定抄送名称为:Activity_cc - String processDefinitionId = definition.getId(); - List rules = taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, null); - - String BpmConstantsName = BpmConstants.CC_NAME; - // 获取发起人信息 - AdminUserRespDTO userRespDTO = adminUserApi.getUser(Long.valueOf(instance.getStartUserId())).getCheckedData(); - DeptRespDTO deptRespDTO = deptApi.getDept(userRespDTO.getDeptId()).getCheckedData(); - - //发起人是深圳分公司 - if (deptRespDTO.getFlag().contains("136")) { - - BpmConstantsName = BpmConstants.CCSZ_NAME; - } - - for (BpmTaskAssignRuleDO rule : rules) { - String key = rule.getTaskDefinitionKey(); //任务名称 - Integer type = rule.getType(); - if (!key.isEmpty() && key.equals(BpmConstantsName) && type == 40) { - StringBuffer str = new StringBuffer(); - Set options = rule.getOptions(); - List list = new ArrayList(options); - for (Long groupId : list) { - //需要根据这个groupId,查询这个组中的用户id - BpmUserGroupDO userGroup = userGroupService.getUserGroup(groupId); - Set userIds = userGroup.getMemberUserIds(); - List userIdList = new ArrayList(userIds); - for (Long user_id : userIdList) { - str.append("[").append(user_id).append("]"); - } - } - - //流程是采购计划时 - if (definition.getKey().equals(BpmOAProcureServiceImpl.PROCESS_KEY)) { - - //发起人部门为 生产部及以下时 - if (deptRespDTO.getFlag().contains("130")) { - - //添加 供应部抄送 - BpmUserGroupDO userGroup = userGroupService.getUserGroup(121L); - Set userIds = userGroup.getMemberUserIds(); - List userIdList = new ArrayList(userIds); - for (Long user_id : userIdList) { - str.append("[").append(user_id).append("]"); - } - } - } - - String ccids = str.toString(); - //根据processDefinitionId 将ccids保存到bpm_process_instance_ext中的ccids字段 - BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessDefinitionId(processDefinitionId) - .setCcids(ccids).setProcessInstanceId(instance.getProcessInstanceId()); - processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); - break; - } - } - } - - /** - * 创建流程后,添加抄送人 - * @param instance 流程实例 - */ - private void processCCToUsers(ProcessInstance instance, Map variables) { - - // 根据流程名称、流程发起人 查询流程配置的抄送人信息 - 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); - } - - // 增加幂等性处理,确保更新操作能正常命中 - updateProcessInstanceExtWithRetry(instanceExtDO); - } - /** * 带重试机制的更新操作,确保幂等性 */ @@ -859,7 +734,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService log.debug("异步处理抄送人信息更新成功,processInstanceId: {}", instanceExtDO.getProcessInstanceId()); return; } - + // 记录不存在,等待一下再重试 Thread.sleep(50); existingRecord = processInstanceExtMapper.selectByProcessInstanceId(instanceExtDO.getProcessInstanceId());