package com.gaotao.modules.automatedWarehouse.task; import com.gaotao.modules.automatedWarehouse.entity.WcsCallbackTask; import com.gaotao.modules.automatedWarehouse.entity.WmsOrderTask; import com.gaotao.modules.automatedWarehouse.entity.WcsCallbackPalletScan; import com.gaotao.modules.automatedWarehouse.service.WcsTaskService; import com.gaotao.modules.automatedWarehouse.service.InventoryDiscrepancyService; import com.gaotao.modules.automatedWarehouse.service.AutoSortService; import com.gaotao.modules.automatedWarehouse.service.KitTransportService; import com.gaotao.modules.automatedWarehouse.mapper.WcsCallbackPalletScanMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; /** * WCS任务定时处理器 * 每分钟执行一次,处理WCS入库/出库任务 */ @Slf4j @Component public class WcsTaskScheduler { @Autowired private WcsTaskService wcsTaskService; @Autowired private InventoryDiscrepancyService inventoryDiscrepancyService; @Autowired private AutoSortService autoSortService; @Autowired private WcsCallbackPalletScanMapper wcsCallbackPalletScanMapper; @Autowired private KitTransportService kitTransportService; @Value("${scheduler.wcs.enabled:true}") private boolean enabled; /** * 定时任务:每分钟执行一次WCS任务处理 * cron表达式:0 * * * * ? 表示每分钟的第0秒执行 * 配置说明:通过 scheduler.wcs.enabled 控制是否启用 */ @Scheduled(fixedDelay = 2684) public void scheduleWcsTaskProcessing() { // 检查定时任务开关 // if (!enabled) { // return; // } log.info("=== 开始处理WCS入库/出库相关业务 ==="); try { // 获取待处理的WCS回调任务 List list = wcsTaskService.getPendingWcsCallbackTasks("55"); if (list.isEmpty()) { log.info("无待处理的WCS回调任务"); return; } // 统计信息 long normalTaskCount = list.stream().filter(t -> !"处理中".equals(t.getStatus())).count(); long timeoutTaskCount = list.stream().filter(t -> "处理中".equals(t.getStatus())).count(); log.info("获取到 {} 个待处理任务(正常: {}, 超时恢复: {})", list.size(), normalTaskCount, timeoutTaskCount); int successCount = 0; int failCount = 0; for (WcsCallbackTask callbackTask : list) { try { // 委托给业务服务处理 wcsTaskService.processWcsCallbackTask(callbackTask); successCount++; } catch (Exception e) { log.error("处理WCS回调任务失败:palletId={}, error={}", callbackTask.getPalletId(), e.getMessage()); failCount++; // 继续处理下一个数据 } } log.info("=== WCS入库/出库任务处理完成:总数={}, 成功={}, 失败={} ===", list.size(), successCount, failCount); } catch (Exception e) { log.error("=== WCS入库/出库定时任务执行失败 ===", e); } } // /** // * 定时任务:每分钟执行一次立库调栈板出库处理 // * cron表达式:0 * * * * ? 表示每分钟的第0秒执行 // * 配置说明:通过 scheduler.wcs.enabled 控制是否启用 // */ // @Scheduled(cron = "0 * * * * ?") // public void scheduleWcsPalletOutTask() { // // 检查定时任务开关 // if (!enabled) { // return; // } // // log.info("=== 开始处理立库调栈板出库任务 ==="); // // try { // // 获取待处理的立库调栈板出库任务 // List list = wcsTaskService.getPendingWcsPalletOutTasks("55"); // // for (WmsOrderTask orderTask : list) { // try { // // 委托给业务服务处理 // wcsTaskService.processWcsPalletOutTask(orderTask); // } catch (Exception e) { // log.error("处理立库调栈板任务失败:taskNo={}, error={}", orderTask.getTaskNo(), e.getMessage()); // // 继续处理下一个数据 // } // } // } catch (Exception e) { // log.error("=== 立库调栈板出库定时任务执行失败 ===", e); // } // // log.info("=== 立库调栈板出库任务处理完成 ==="); // } /** * @Description 定时任务:每分钟处理WCS栈板RFID扫描对账(只处理人工分拣sore_type=0的记录)- rqrq * @Title scheduleInventoryDiscrepancyProcessing * @author rqrq * @date 2025/10/07 * * cron表达式:0 * * * * ? 表示每分钟的第0秒执行 * 配置说明:通过 scheduler.wcs.enabled 控制是否启用 */ @Scheduled(fixedDelay = 7745) public void scheduleInventoryDiscrepancyProcessing() { // 检查定时任务开关 - rqrq if (!enabled) { return; } log.info("=== 开始处理WCS栈板RFID扫描对账任务(只处理action_type=N'被分拣回传')- rqrq ==="); try { // 获取待处理的回调记录(只查询立库内的,重试次数<3)- rqrq List list = wcsCallbackPalletScanMapper.getPendingCallbacks("55", 3); if (list.isEmpty()) { log.info("无待处理的WCS栈板RFID扫描对账任务(sore_type=0)- rqrq"); return; } log.info("获取到 {} 个待处理的分拣任务- rqrq", list.size()); int successCount = 0; int failCount = 0; for (WcsCallbackPalletScan callback : list) { try { if("被分拣回传".equals(callback.getActionType())){ inventoryDiscrepancyService.processCallbackScan(callback); } if("自动分拣".equals(callback.getActionType())){ autoSortService.processAutoSortCallback(callback); } successCount++; } catch (Exception e) { log.error("处理WCS栈板分拣失败 - rqrq:palletId={}, error={}", callback.getPalletId(), e.getMessage()); failCount++; // 继续处理下一个数据 - rqrq } } log.info("=== WCS栈板RFID扫描对账任务处理完成 - rqrq:总数={}, 成功={}, 失败={} ===", list.size(), successCount, failCount); } catch (Exception e) { log.error("=== WCS栈板RFID扫描分拣任务执行失败 - rqrq ===", e); } } /** * @Description 定时任务:每100秒执行一次齐套运输检查 - rqrq * @Title scheduleKitTransportCheck * @author rqrq * @date 2025/10/21 * * fixedDelay = 100000 表示上次执行完成后间隔60秒再执行(确保串行执行,不会并发) * 优化:从3.6秒调整为60秒,减少pallet表锁竞争,避免死锁 - rqrq * 配置说明:通过 scheduler.wcs.enabled 控制是否启用 */ @Scheduled(fixedDelay = 60000) public void scheduleKitTransportCheck() { // 检查定时任务开关 - rqrq if (!enabled) { return; } log.info("=== 开始齐套运输检查定时任务 - rqrq ==="); try { // 调用齐套运输服务处理 - rqrq kitTransportService.processKitTransport(); } catch (Exception e) { log.error("=== 齐套运输检查定时任务执行失败 - rqrq ===", e); } log.info("=== 齐套运输检查定时任务执行完成 - rqrq ==="); } }