gaoluyang
8 天以前 d5452f48951a5540d2df44c55e494e75560b3866
fix(bpm): 审批结果事件带上流程分类,修复历史自定义 Key 流程状态不回写

采购申请分类 purchase_request_approve 下存在多个可发起的历史流程模型,
其流程定义 Key 不是标准值(如 C000_abc.、D200_abc.、E000_abc.)。
BPM 流程结束后发出的状态事件只带流程定义 Key,业务模块监听器按标准
Key 匹配不到,导致审批已通过但业务单据状态仍停留在「审批中」,
后续生成采购订单时被「采购申请单未审核通过」拦截。

- BpmProcessInstanceStatusEvent 增加 processDefinitionCategory,
取值 bpm_process_definition_info.category(业务分类,非 Flowable 的
targetNamespace 分类);
- 监听器基类匹配条件改为「流程定义 Key 或流程分类任一命中」,
这样同一业务分类下的历史/自定义 Key 也能正确回写业务状态;
- 流程完成时顺带复用已查询的流程定义信息,避免重复查询。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改3个文件
24 ■■■■■ 文件已修改
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/event/BpmProcessInstanceStatusEvent.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/event/BpmProcessInstanceStatusEvent.java
@@ -24,6 +24,12 @@
    @NotNull(message = "流程实例的 key 不能为空")
    private String processDefinitionKey;
    /**
     * 流程所属分类。
     * 业务模块监听审批结果时,优先按分类匹配:同一个业务分类下可能存在多个流程定义 Key,
     * 例如采购申请分类 purchase_request_approve 下既有标准 Key,也有历史遗留的自定义 Key。
     */
    private String processDefinitionCategory;
    /**
     * 流程实例的结果
     */
    @NotNull(message = "流程实例的状态不能为空")
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/event/BpmProcessInstanceStatusEventListener.java
@@ -13,7 +13,9 @@
    @Override
    public final void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) {
        // 优先按流程定义 Key 匹配;同时兼容同一业务分类下的历史自定义 Key(此时按分类匹配)
        if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())
                && !StrUtil.equals(event.getProcessDefinitionCategory(), getProcessDefinitionKey())) {
            return;
        }
        onEvent(event);
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -12,6 +12,7 @@
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
@@ -1025,13 +1026,18 @@
        }
        // 3. 发送流程实例的状态事件
        processInstanceEventPublisher.sendProcessInstanceResultEvent(
                BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status, reason));
        BpmProcessInstanceStatusEvent statusEvent = BpmProcessInstanceConvert.INSTANCE
                .buildProcessInstanceStatusEvent(this, instance, status, reason);
        // 带上流程分类(bpm_process_definition_info.category),便于业务模块兼容同一分类下的历史自定义 Key
        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService
                .getProcessDefinitionInfo(instance.getProcessDefinitionId());
        if (processDefinitionInfo != null) {
            statusEvent.setProcessDefinitionCategory(processDefinitionInfo.getCategory());
        }
        processInstanceEventPublisher.sendProcessInstanceResultEvent(statusEvent);
        // 4. 流程后置通知
        if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) {
            BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.
                    getProcessDefinitionInfo(instance.getProcessDefinitionId());
            if (ObjUtil.isNotNull(processDefinitionInfo) &&
                    ObjUtil.isNotNull(processDefinitionInfo.getProcessAfterTriggerSetting())) {
                BpmModelMetaInfoVO.HttpRequestSetting setting = processDefinitionInfo.getProcessAfterTriggerSetting();