| 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.core.utils.Utils; | 
| 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.model.protocol.StaProtocol; | 
| import com.zy.asrs.wcs.rcs.thread.DevpThread; | 
| 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; | 
|         } | 
|   | 
|         //检测提升机是否有任务绑定 | 
|         boolean liftResult = Utils.checkLiftHasBinding(liftProtocol.getLiftNo(), String.valueOf(motion.getTaskNo())); | 
|         if (liftResult) { | 
|             //存在任务,禁止执行 | 
|             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.setDeviceTaskNo(liftThread.generateDeviceTaskNo(motion.getTaskNo(), MotionCtgType.get(motion.getMotionCtgEl()))); | 
|         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(assignCommand.getDeviceTaskNo(), 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; | 
| //                } | 
|   | 
|                 //判断目标站是否有托盘 | 
|                 Integer conveyorDeviceId = Integer.parseInt(motion.getDockNo()); | 
|                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, conveyorDeviceId); | 
|                 if (devpThread == null) { | 
|                     return false; | 
|                 } | 
| //                //*************标准系统代码******************** | 
| //                StaProtocol staProtocol = devpThread.getStation().get(motion.getTarDrt()); | 
| //                if (staProtocol == null) { | 
| //                    return false; | 
| //                } | 
| //                if (!staProtocol.isAutoing()) { | 
| //                    return false; | 
| //                } | 
| //                if (staProtocol.isLoading()) { | 
| //                    return false; | 
| //                } | 
| //                if (staProtocol.getWorkNo().intValue() != 0) { | 
| //                    return false; | 
| //                } | 
| //                //************************************************* | 
|   | 
|   | 
|                 //*************此代码为光泰定制代码******************** | 
|                 Integer tarDrt = motion.getTarDrt(); | 
|                 if (tarDrt == 31001) { | 
|                     tarDrt = 31004; | 
|                 } | 
|   | 
|                 StaProtocol staProtocol = devpThread.getStation().get(tarDrt); | 
|                 if (staProtocol == null) { | 
|                     return false; | 
|                 } | 
|                 if (!staProtocol.isAutoing()) { | 
|                     return false; | 
|                 } | 
|                 if (staProtocol.isLoading()) { | 
|                     return false; | 
|                 } | 
|                 if (staProtocol.getWorkNo().intValue() != 0) { | 
|                     return false; | 
|                 } | 
|                 //************************************************* | 
|   | 
|                 command = liftThread.getPalletInOutCommand(assignCommand.getDeviceTaskNo(), Integer.parseInt(motion.getOrigin()), Integer.parseInt(motion.getTarget()), motion.getOriDrt(), motion.getTarDrt(), LiftCommandModeType.PALLET_INOUT); | 
|                 list.addAll(command); | 
|   | 
|                 motion.setTemp(String.valueOf(assignCommand.getDeviceTaskNo())); | 
|                 motion.setUpdateTime(new Date()); | 
|                 motionService.updateById(motion); | 
|   | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_WITH_SHUTTLE: | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getHasCar()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getMoveWithShuttleCommand(assignCommand.getDeviceTaskNo(), 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(assignCommand.getDeviceTaskNo(), true);//获取提升机锁定命令 | 
|                 list.addAll(command); | 
|                 return liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|             case LIFT_UNLOCK: | 
|                 //解锁提升机 | 
|                 //判断提升机是否自动 | 
|                 if (!liftThread.isIdle(MotionCtgType.LIFT_UNLOCK)) { | 
|                     return false; | 
|                 } | 
|   | 
|                 command = liftThread.getLockCommand(assignCommand.getDeviceTaskNo(), 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(assignCommand.getDeviceTaskNo(), 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; | 
|         } | 
|   | 
|         Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, motion.getTaskNo())); | 
|         if (task == null) { | 
|             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; | 
|                 } | 
|   | 
|                 if (motion.getReleaseLift() == 1) {//释放提升机 | 
|                     task.setLiftNo(0); | 
|                     task.setUpdateTime(new Date()); | 
|                     if (!taskService.updateById(task)) { | 
|                         return false; | 
|                     } | 
|                 } | 
|   | 
|                 break; | 
|             case LIFT_WITH_GOODS: | 
|                 // 判断提升机是否空闲 | 
|                 if (!liftThread.isIdle()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { | 
|                     return false; | 
|                 } | 
|   | 
|                 //判断提升机托盘是否存在 | 
|                 if (liftProtocol.getHasTray()) { | 
|                     return false; | 
|                 } | 
|   | 
|                 //判断目标站是否有托盘 | 
|                 Integer conveyorDeviceId = Integer.parseInt(motion.getDockNo()); | 
|                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, conveyorDeviceId); | 
|                 if (devpThread == null) { | 
|                     return false; | 
|                 } | 
|   | 
| //                //*************此代码为标准版本代码******************** | 
| //                StaProtocol staProtocol = devpThread.getStation().get(motion.getTarDrt()); | 
| //                if(staProtocol == null) { | 
| //                    return false; | 
| //                } | 
| //                if (!staProtocol.isAutoing()) { | 
| //                    return false; | 
| //                } | 
| //                if (!staProtocol.isLoading()) { | 
| //                    return false; | 
| //                } | 
| //                if (!motion.getTaskNo().equals(staProtocol.getWorkNo().intValue())) { | 
| //                    if (motion.getTemp() == null) { | 
| //                        return false; | 
| //                    } | 
| // | 
| //                    if (Integer.parseInt(motion.getTemp()) != staProtocol.getWorkNo().intValue()) { | 
| //                        return false; | 
| //                    } | 
| //                } | 
| //                //************************************************* | 
|   | 
|                 //*************此代码为光泰定制代码******************** | 
|                 ArrayList<Integer> staList = new ArrayList<>(); | 
|                 staList.add(motion.getTarDrt()); | 
|                 staList.add(31003); | 
|                 staList.add(31002); | 
|                 staList.add(31001); | 
|   | 
|                 boolean check = false; | 
|                 for (Integer sta : staList) { | 
|                     StaProtocol staProtocol = devpThread.getStation().get(sta); | 
|                     if (staProtocol == null) { | 
|                         continue; | 
|                     } | 
|                     if (!staProtocol.isAutoing()) { | 
|                         continue; | 
|                     } | 
|                     if (!staProtocol.isLoading()) { | 
|                         continue; | 
|                     } | 
|                     if (Integer.parseInt(motion.getTemp()) == staProtocol.getWorkNo().intValue()) { | 
|                         check = true; | 
|                         break; | 
|                     } | 
|                 } | 
|   | 
|                 if (!check) { | 
|                     return false; | 
|                 } | 
|                 //************************************************* | 
|   | 
|   | 
|                 if (motion.getReleaseLift() == 1) {//释放提升机 | 
|                     task.setLiftNo(0); | 
|                     task.setUpdateTime(new Date()); | 
|                     if (!taskService.updateById(task)) { | 
|                         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; | 
|                 } | 
|   | 
|                 if (motion.getReleaseLift() == 1) {//释放提升机 | 
|                     task.setLiftNo(0); | 
|                     task.setUpdateTime(new Date()); | 
|                     if (!taskService.updateById(task)) { | 
|                         return false; | 
|                     } | 
|                 } | 
|                 break; | 
|             case LIFT_SHUTTLE_ARRIVAL: | 
|   | 
|                 break; | 
|             default: | 
|                 return false; | 
|         } | 
|   | 
|         liftThread.setSyncTaskNo(0);//清零工作号 | 
|         liftThread.setProtocolStatus(LiftProtocolStatusType.IDLE); | 
|         return true; | 
|     } | 
|   | 
| } |