wlzboy
2025-12-26 4fdde57a837b47b0a04aa17a7627c21b7425eda2
ruoyi-system/src/main/java/com/ruoyi/system/listener/DispatchOrdRunningListener.java
@@ -6,7 +6,9 @@
import com.ruoyi.system.domain.SysTaskEmergency;
import com.ruoyi.system.domain.enums.TaskStatus;
import com.ruoyi.system.event.TaskStatusChangedEvent;
import com.ruoyi.system.mapper.DispatchOrdMapper;
import com.ruoyi.system.mapper.LegacyTransferSyncMapper;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
import com.ruoyi.system.mapper.SysTaskMapper;
import com.ruoyi.system.mapper.SysUserMapper;
@@ -46,6 +48,12 @@
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private DispatchOrdMapper dispatchOrdMapper;
    @Autowired
    private SysDictDataMapper sysDictDataMapper;
    
    /**
     * 监听任务状态变更事件
@@ -111,6 +119,11 @@
                log.debug("任务状态不需要同步到旧系统,任务ID: {}, 状态: {}",
                    event.getTaskId(), newTaskStatus.getInfo());
                return;
            }
            // 如果是取消状态,同步取消原因到DispatchOrd表
            if (TaskStatus.CANCELLED.equals(newTaskStatus) && emergency.getCancelReason() != null) {
                syncCancelReasonToDispatchOrd(emergency.getLegacyDispatchOrdId(), emergency.getCancelReason());
            }
            
            // 插入状态变更记录到DispatchOrd_Running表
@@ -192,4 +205,53 @@
            // 不抛出异常,避免影响主流程
        }
    }
    /**
     * 同步取消原因到DispatchOrd表
     *
     * @param dispatchOrdId 调度单ID
     * @param cancelReason 取消原因(字典value)
     */
    private void syncCancelReasonToDispatchOrd(Long dispatchOrdId, String cancelReason) {
        try {
            if (cancelReason == null || cancelReason.isEmpty()) {
                log.debug("取消原因为空,跳过同步,DispatchOrdID: {}", dispatchOrdId);
                return;
            }
            // 将cancelReason(字典value)转换为Integer
            Integer cancelReasonId = null;
            try {
                cancelReasonId = Integer.valueOf(cancelReason);
            } catch (NumberFormatException e) {
                log.error("取消原因格式错误,无法转换为数字,cancelReason: {}, DispatchOrdID: {}", cancelReason, dispatchOrdId);
                return;
            }
            // 从数据字典中查询取消原因文本
            String cancelReasonText = sysDictDataMapper.selectDictLabel("task_cancel_reason", cancelReason);
            if (cancelReasonText == null || cancelReasonText.isEmpty()) {
                log.warn("未找到取消原因对应的文本,cancelReason: {}, DispatchOrdID: {}", cancelReason, dispatchOrdId);
                cancelReasonText = cancelReason; // 使用原值作为预备
            }
            log.info("开始同步取消原因到DispatchOrd,DispatchOrdID: {}, 取消原因ID: {}, 取消原因文本: {}",
                dispatchOrdId, cancelReasonId, cancelReasonText);
            // 调用Mapper更新DispatchOrd表
            int rows = dispatchOrdMapper.updateDispatchOrdCancelReason(dispatchOrdId, cancelReasonId, cancelReasonText);
            if (rows > 0) {
                log.info("成功同步取消原因到DispatchOrd,DispatchOrdID: {}, 取消原因: {} ({})",
                    dispatchOrdId, cancelReasonText, cancelReasonId);
            } else {
                log.warn("同步取消原因失败,未找到对应的调度单,DispatchOrdID: {}", dispatchOrdId);
            }
        } catch (Exception e) {
            log.error("同步取消原因到DispatchOrd异常,DispatchOrdID: {}, 取消原因: {}",
                dispatchOrdId, cancelReason, e);
            // 不抛出异常,避免影响主流程
        }
    }
}