You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

219 lines
8.3 KiB

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<WcsCallbackTask> 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<WmsOrderTask> 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<WcsCallbackPalletScan> 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 ===");
}
}