| package com.zy.asrs.wcs.core.kernel.command; | 
|   | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.zy.asrs.wcs.core.action.LiftAction; | 
| import com.zy.asrs.wcs.core.entity.Motion; | 
| import com.zy.asrs.wcs.core.entity.Task; | 
| import com.zy.asrs.wcs.core.model.command.LiftAssignCommand; | 
| import com.zy.asrs.wcs.core.model.command.LiftCommand; | 
| import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; | 
| import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType; | 
| import com.zy.asrs.wcs.core.model.enums.MotionCtgType; | 
| import com.zy.asrs.wcs.core.model.enums.MotionStsType; | 
| import com.zy.asrs.wcs.core.service.MotionService; | 
| import com.zy.asrs.wcs.core.service.TaskService; | 
| import com.zy.asrs.wcs.rcs.cache.SlaveConnection; | 
| import com.zy.asrs.wcs.rcs.model.enums.LiftProtocolStatusType; | 
| import com.zy.asrs.wcs.rcs.model.enums.SlaveType; | 
| import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; | 
| import com.zy.asrs.wcs.rcs.thread.LiftThread; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.Objects; | 
|   | 
| /** | 
|  * Created by vincent on 2023/10/23 | 
|  */ | 
| @Slf4j | 
| @Service | 
| public class LiftCommandService { | 
|   | 
|     @Autowired | 
|     private MotionService motionService; | 
|     @Autowired | 
|     private TaskService taskService; | 
|     @Autowired | 
|     private LiftAction liftAction; | 
|   | 
|     public Boolean accept(Motion motion) { | 
|         Integer deviceNo = Integer.parseInt(motion.getDevice()); | 
|         LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, deviceNo); | 
|         if (liftThread == null) { | 
|             return false; | 
|         } | 
|   | 
|         LiftProtocol liftProtocol = liftThread.getStatus(); | 
|         if (liftProtocol == null) { | 
|             return false; | 
|         } | 
|   | 
|         if (motionService.count(new LambdaQueryWrapper<Motion>() | 
|                 .eq(Motion::getDeviceCtg, DeviceCtgType.LIFT.val()) | 
|                 .eq(Motion::getDevice, motion.getDevice()) | 
|                 .eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) { | 
|             return false; | 
|         } | 
|   | 
|         Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, motion.getTaskNo())); | 
|         if (task == null) { | 
|             return false; | 
|         } | 
|         task.setLiftNo(liftProtocol.getLiftNo()); | 
|         task.setUpdateTime(new Date()); | 
|         if (!taskService.updateById(task)) { | 
|             return false; | 
|         } | 
|   | 
|         ArrayList<LiftCommand> list = new ArrayList<>(); | 
|         LiftAssignCommand assignCommand = new LiftAssignCommand(); | 
|         assignCommand.setLiftNo(liftProtocol.getLiftNo()); | 
|         assignCommand.setTaskNo(motion.getTaskNo()); | 
|         assignCommand.setCommands(list); | 
|   | 
|         List<LiftCommand> command = new ArrayList<>(); | 
|         switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){ | 
|             case LIFT_MOVE: | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 // 如果已经在目标层,那边层过滤 | 
|                 if (liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     liftThread.setSyncTaskNo(motion.getTaskNo()); | 
|                     break; | 
|                 } | 
|   | 
|                 command = liftThread.getMoveCommand(motion.getTaskNo(), 0, Integer.parseInt(motion.getTarget()), LiftCommandModeType.MOVE); | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_WITH_GOODS: | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
| //                if (liftProtocol.getHasTray()) { | 
| //                    return false; | 
| //                } | 
|   | 
|                 command = liftThread.getPalletInOutCommand(motion.getTaskNo(), Integer.parseInt(motion.getOrigin()), Integer.parseInt(motion.getTarget()), motion.getOriDrt(), motion.getTarDrt(), LiftCommandModeType.PALLET_INOUT); | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_WITH_SHUTTLE: | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getHasCar()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getMoveWithShuttleCommand(motion.getTaskNo(), Integer.parseInt(motion.getOrigin()), Integer.parseInt(motion.getTarget()), LiftCommandModeType.MOVE_CAR); | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_WITH_GOODS_AND_SHUTTLE: | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 return false; | 
|             case LIFT_TRANSPORT_TO_CONVEYOR: | 
|                 return false; | 
|             case LIFT_LOCK: | 
|                 //锁定提升机 | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle(MotionCtgType.LIFT_LOCK)) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getLockCommand(motion.getTaskNo(), true);//获取提升机锁定命令 | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_UNLOCK: | 
|                 //解锁提升机 | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle(MotionCtgType.LIFT_UNLOCK)) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getLockCommand(motion.getTaskNo(), false);//获取提升机解定命令 | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_SHUTTLE_ARRIVAL: | 
|                 //提升机-小车已到位 | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle(MotionCtgType.LIFT_SHUTTLE_ARRIVAL)) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getShuttleSignalCommand(motion.getTaskNo(), true);//获取小车已到位命令 | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             default: | 
|                 break; | 
|         } | 
|   | 
|         return Boolean.TRUE; | 
|     } | 
|   | 
|     public Boolean finish(Motion motion) { | 
|         Integer deviceNo = Integer.parseInt(motion.getDevice()); | 
|         LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, deviceNo); | 
|         if (liftThread == null) { | 
|             return false; | 
|         } | 
|         LiftProtocol liftProtocol = liftThread.getStatus(); | 
|         if (liftProtocol == null) { | 
|             return false; | 
|         } | 
|   | 
|         if (liftProtocol.getRun() || liftProtocol.getTaskNo() != motion.getTaskNo().shortValue()) { | 
|             return false; | 
|         } | 
|   | 
|         switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){ | 
|             case LIFT_MOVE: | 
|                 // 判断提升机是否空闲 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     return false; | 
|                 } | 
|   | 
|                 break; | 
|             case LIFT_WITH_GOODS: | 
|                 // 判断提升机是否空闲 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     return false; | 
|                 } | 
|   | 
|                 break; | 
|             case LIFT_WITH_SHUTTLE: | 
|                 // 判断提升机是否空闲 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     return false; | 
|                 } | 
|   | 
|                 //检测是否有小车 | 
|                 if (!liftProtocol.getHasCar()) { | 
|                     return false; | 
|                 } | 
|                 break; | 
|             case LIFT_WITH_GOODS_AND_SHUTTLE: | 
|                 // 判断提升机是否空闲 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getHasCar()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getHasTray()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     return false; | 
|                 } | 
|   | 
|                 break; | 
|             case LIFT_TRANSPORT_TO_CONVEYOR: | 
|   | 
|                 break; | 
|             case LIFT_LOCK: | 
|                 if (!liftThread.isLock(null)) { | 
|                     return false; | 
|                 } | 
|                 break; | 
|             case LIFT_UNLOCK: | 
|                 if (liftThread.isLock(null)) { | 
|                     return false; | 
|                 } | 
|                 break; | 
|             case LIFT_SHUTTLE_ARRIVAL: | 
|   | 
|                 break; | 
|             default: | 
|                 return false; | 
|         } | 
|   | 
|         liftThread.setSyncTaskNo(0);//清零工作号 | 
|         liftThread.setProtocolStatus(LiftProtocolStatusType.IDLE); | 
|         return true; | 
|     } | 
|   | 
| } |