package com.zy.asrs.wcs.core.timer; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.core.domain.param.CreateWcsTaskParam; import com.zy.asrs.wcs.core.entity.BasConveyorSta; import com.zy.asrs.wcs.core.entity.Task; import com.zy.asrs.wcs.core.entity.TaskCache; import com.zy.asrs.wcs.core.model.enums.TaskStsType; import com.zy.asrs.wcs.core.service.BasConveyorStaService; import com.zy.asrs.wcs.core.service.OpenService; import com.zy.asrs.wcs.core.service.TaskCacheService; import com.zy.asrs.wcs.core.service.TaskService; import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; @Slf4j @Component public class TaskCacheTimer { @Autowired private TaskService taskService; @Autowired private TaskCacheService taskCacheService; @Autowired private BasConveyorStaService basConveyorStaService; @Autowired private OpenService openService; @Scheduled(cron = "0/1 * * * * ? ") @Transactional public synchronized void executeTaskCache() { //判断出入库模式 BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper() .eq(BasConveyorSta::getSiteNo, 101)); if (basConveyorSta == null) { return; } int count = taskService.count(new LambdaQueryWrapper() .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts, TaskStsType.ANALYZE_INBOUND.sts, TaskStsType.EXECUTE_INBOUND.sts, TaskStsType.COMPLETE_INBOUND.sts , TaskStsType.NEW_OUTBOUND.sts, TaskStsType.ANALYZE_OUTBOUND.sts, TaskStsType.EXECUTE_OUTBOUND.sts, TaskStsType.COMPLETE_OUTBOUND.sts)); if (count > 0) { return;//存在任务正在执行,等待执行完成后再解析队列 } List taskInCaches = taskCacheService.list(new LambdaQueryWrapper().eq(TaskCache::getTaskType, 1));//入库缓存 List taskOutCaches = taskCacheService.list(new LambdaQueryWrapper().eq(TaskCache::getTaskType, 2));//出库缓存 if (basConveyorSta.getWorkMode().equals((int) WorkModeType.PAKIN_MODE.id)) { //入库模式 if (!taskInCaches.isEmpty()) { //存在入库缓存 executeTaskCache(taskInCaches); }else { //不存在入库缓存,且处于入库模式,尝试执行出库缓存 executeTaskCache(taskOutCaches); } }else { //出库模式 if (!taskOutCaches.isEmpty()) { //存在出库缓存 executeTaskCache(taskOutCaches); }else { //不存在出库缓存,且处于出库模式,尝试执行入库缓存 executeTaskCache(taskInCaches); } } } private synchronized void executeTaskCache(List taskCaches) { if(taskCaches.isEmpty()){ return; } for (TaskCache taskCache : taskCaches) { CreateWcsTaskParam param = JSON.parseObject(taskCache.getTaskParam(), CreateWcsTaskParam.class); HashMap result = openService.executeWcsTaskCache(param); log.info("缓存执行结果:{}", JSON.toJSONString(result)); if (result.get("success").toString().equals("1")) { //执行成功,删除缓存 if (!taskCacheService.removeById(taskCache.getId())) { throw new CoolException("缓存删除失败"); } } try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } }