gaoluyang
6 天以前 6e98da8a58b29ca550f2b5f45564f9ecf7740b5b
fix(bpm): 修正业务监听器的流程 key 匹配与空单号防护

- 报工监听器流程 key 由 mes-pro-feedback-audit 改为实际的 mes_pro_feedback_audit
- 请假/调岗/离职/采购入库/发货监听器增加流程 key 或分类过滤,避免其它模块相同 businessKey 误触发状态回写
- 加班/废料销售监听器增加 businessKey 空值保护,避免空单号触发 NumberFormatException

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改8个文件
41 ■■■■■ 文件已修改
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmLeaveApplicationStatusListener.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmOvertimeApplicationStatusListener.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmResignationApplicationStatusListener.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmTransferApplicationStatusListener.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/listener/MesWmSalesNoticeStatusListener.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/scrap/MesWmScrapSaleApprovalListener.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmLeaveApplicationStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmLeaveApplicationMapper;
@@ -27,6 +28,12 @@
    @Override
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 只处理请假审批分类/流程 key 的事件,避免其它模块相同 businessKey 误触发
        String approveCode = HrmLeaveApplicationService.APPROVE_CATEGORY_CODE;
        if (!StrUtil.equals(event.getProcessDefinitionKey(), approveCode)
                && !StrUtil.equals(event.getProcessDefinitionCategory(), approveCode)) {
            return;
        }
        // 通过 businessKey 查询请假申请
        Long applicationId;
        try {
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmOvertimeApplicationStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
@@ -13,6 +14,9 @@
    @Resource private HrmOvertimeApplicationService service;
    @Override protected String getProcessDefinitionKey() { return HrmOvertimeApplicationService.BPM_PROCESS_DEFINITION_KEY; }
    @Override protected void onEvent(BpmProcessInstanceStatusEvent event) {
        if (StrUtil.isBlank(event.getBusinessKey())) {
            return;
        }
        Integer status = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus());
        if (status == null) status = HrmAuditStatusEnum.PROCESS.getStatus();
        service.updateAuditStatus(Long.valueOf(event.getBusinessKey()), status);
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmResignationApplicationStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmResignationApplicationDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmResignationApplicationMapper;
@@ -27,6 +28,11 @@
    @Override
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 只处理离职审批流程/分类的事件,避免其它模块相同 businessKey 误触发
        if (!StrUtil.equals(event.getProcessDefinitionKey(), HrmResignationApplicationService.BPM_PROCESS_DEFINITION_KEY)
                && !StrUtil.equals(event.getProcessDefinitionCategory(), HrmResignationApplicationService.APPROVE_CATEGORY_CODE)) {
            return;
        }
        // 通过 businessKey 查询离职申请
        Long applicationId;
        try {
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/listener/HrmTransferApplicationStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.hrm.service.approval.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmTransferApplicationMapper;
@@ -27,6 +28,12 @@
    @Override
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 只处理调岗审批分类/流程 key 的事件,避免其它模块相同 businessKey 误触发
        String approveCode = HrmTransferApplicationService.APPROVE_CATEGORY_CODE;
        if (!StrUtil.equals(event.getProcessDefinitionKey(), approveCode)
                && !StrUtil.equals(event.getProcessDefinitionCategory(), approveCode)) {
            return;
        }
        // 通过 businessKey 查询调岗申请
        Long applicationId;
        try {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/listener/MesProFeedbackStatusListener.java
@@ -29,7 +29,7 @@
    /**
     * BPM 生产报工审批流程定义 key
     */
    private static final String BPM_PROCESS_DEFINITION_KEY = "mes-pro-feedback-audit";
    private static final String BPM_PROCESS_DEFINITION_KEY = "mes_pro_feedback_audit";
    @Resource
    private MesProFeedbackService feedbackService;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.wm.itemreceipt.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper;
@@ -32,6 +33,11 @@
    @EventListener
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 只处理采购入库审批分类/流程 key 的事件,避免其它模块相同 businessKey 误触发
        if (!StrUtil.equals(event.getProcessDefinitionKey(), ITEM_RECEIPT_APPROVE_CATEGORY_CODE)
                && !StrUtil.equals(event.getProcessDefinitionCategory(), ITEM_RECEIPT_APPROVE_CATEGORY_CODE)) {
            return;
        }
        // 1. 解析业务主键
        Long receiptId;
        try {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/listener/MesWmSalesNoticeStatusListener.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.wm.salesnotice.listener;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeMapper;
@@ -24,6 +25,11 @@
    @Override
    public void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
        // 只处理发货审批分类/流程 key 的事件,避免其它模块相同 businessKey 误触发
        if (!StrUtil.equals(event.getProcessDefinitionKey(), "sales_delivery_approve")
                && !StrUtil.equals(event.getProcessDefinitionCategory(), "sales_delivery_approve")) {
            return;
        }
        Long noticeId;
        try {
            noticeId = Long.parseLong(event.getBusinessKey());
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/scrap/MesWmScrapSaleApprovalListener.java
@@ -10,6 +10,9 @@
    @Resource private MesWmScrapSaleService service;
    @Override protected String getProcessDefinitionKey() { return MesWmScrapSaleService.PROCESS_KEY; }
    @Override protected void onEvent(BpmProcessInstanceStatusEvent event) {
        if (cn.hutool.core.util.StrUtil.isBlank(event.getBusinessKey())) {
            return;
        }
        service.onApproval(Long.valueOf(event.getBusinessKey()), event.getId(), event.getStatus());
    }
}