liyong
5 天以前 274dd8b724dd4485658e1d2a3f825a007f625bd7
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/listener/ErpPurchaseRequestStatusListener.java
@@ -1,56 +1,51 @@
package cn.iocoder.yudao.module.erp.service.purchase.listener;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestMapper;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * 采购申请审批的结果监听器实现类
 * 采购申请审批状态监听器
 *
 * 通过 businessKey(采购申请ID)匹配,而不是固定的流程定义 Key,
 * 这样可以支持分类下任意 Key 的流程模型。
 *
 * @author 芋道源码
 * 监听 BPM 流程实例状态变更事件,更新采购申请的审批状态
 */
@Component
@Slf4j
public class ErpPurchaseRequestStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> {
public class ErpPurchaseRequestStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener {
    /**
     * 采购申请审批流程定义 Key
     */
    private static final String PROCESS_DEFINITION_KEY = "purchase_request_approve";
    @Resource
    private ErpPurchaseRequestService purchaseRequestService;
    @Resource
    private ErpPurchaseRequestMapper purchaseRequestMapper;
    @Override
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 通过 businessKey 查询采购申请单
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long requestId;
        try {
            requestId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            return; // businessKey 不是数字,忽略
        }
        ErpPurchaseRequestDO request = purchaseRequestMapper.selectById(requestId);
        if (request == null) {
            return; // 不是采购申请,忽略
        }
        // 只有审批中状态的申请单才处理
        if (!ErpPurchaseRequestStatusEnum.PROCESS.getStatus().equals(request.getStatus())) {
            log.warn("[onApplicationEvent] 采购申请单({}) 不处于审批中状态,当前状态: {}", requestId, request.getStatus());
            log.warn("[onEvent] businessKey({}) 不是有效的采购申请编号", event.getBusinessKey());
            return;
        }
        log.info("[onApplicationEvent] 采购申请单({}) 审批状态更新: {}", requestId, event.getStatus());
        // 更新审批状态
        purchaseRequestService.updatePurchaseRequestAuditStatus(requestId, event.getStatus());
        log.info("[onEvent] 收到BPM审批事件,requestId={}, status={}", requestId, event.getStatus());
        try {
            purchaseRequestService.updatePurchaseRequestAuditStatus(requestId, event.getStatus());
            log.info("[onEvent] 采购申请({}) 审批状态更新完成", requestId);
        } catch (Exception e) {
            log.error("[onEvent] 更新采购申请审批状态失败,requestId={}", requestId, e);
        }
    }
}
}