|  |  | 
 |  |  | package com.zy.asrs.controller; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.core.annotations.ManagerAuth; | 
 |  |  | import com.core.common.R; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | 
 |  |  | import com.zy.asrs.domain.vo.CrnMsgTableVo; | 
 |  |  | import com.zy.asrs.domain.vo.CrnStateTableVo; | 
 |  |  | import com.zy.asrs.entity.BasCrnError; | 
 |  |  | import com.zy.asrs.entity.BasCrnp; | 
 |  |  | import com.zy.asrs.entity.WrkMast; | 
 |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
 |  |  | import com.zy.asrs.service.BasCrnpService; | 
 |  |  | import com.zy.asrs.service.WrkMastService; | 
 |  |  | import com.zy.core.cache.MessageQueue; | 
 |  |  | import com.zy.core.cache.OutputQueue; | 
 |  |  | import com.zy.core.cache.SlaveConnection; | 
 |  |  | import com.zy.core.enums.CrnLiftPosType; | 
 |  |  | import com.zy.core.enums.CrnModeType; | 
 |  |  | import com.zy.core.enums.CrnTaskModeType; | 
 |  |  | import com.zy.core.enums.SlaveType; | 
 |  |  | 
 |  |  | import com.zy.core.model.command.CrnCommand; | 
 |  |  | import com.zy.core.model.protocol.CrnProtocol; | 
 |  |  | import com.zy.core.properties.SlaveProperties; | 
 |  |  | import com.zy.core.thread.CrnThread; | 
 |  |  | import com.zy.core.CrnThread; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.PostMapping; | 
 |  |  | 
 |  |  |     private WrkMastService wrkMastService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasCrnErrorMapper basCrnErrorMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private BasCrnpService basCrnpService; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @ManagerAuth(memo = "进行中的命令") | 
 |  |  | 
 |  |  |     @ManagerAuth(memo = "堆垛机信息表") | 
 |  |  |     public R crnStateTable(){ | 
 |  |  |         List<CrnStateTableVo> list = new ArrayList<>(); | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |         List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no")); | 
 |  |  |         for (BasCrnp basCrnp : crnps) { | 
 |  |  |             // 表格行 | 
 |  |  |             CrnStateTableVo vo = new CrnStateTableVo(); | 
 |  |  |             vo.setCrnNo(basCrnp.getCrnNo());   //  堆垛机号 | 
 |  |  |             list.add(vo); | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); | 
 |  |  |             if (crnThread == null) { | 
 |  |  |                 log.error("{}号堆垛机连接失败", crn.getId()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 log.error("{}号堆垛机连接失败", crn.getId()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 表格行 | 
 |  |  |             CrnStateTableVo vo = new CrnStateTableVo(); | 
 |  |  |             vo.setCrnNo(crn.getId());   //  堆垛机号 | 
 |  |  |             vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号 | 
 |  |  |             if (crnProtocol.getTaskNo()>0) { | 
 |  |  |                 WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); | 
 |  |  | 
 |  |  |                 vo.setStatusType(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态 | 
 |  |  |             } | 
 |  |  |             vo.setStatus(crnProtocol.getStatusType().desc);     //  状态 | 
 |  |  |             vo.setWarn(""); //  报警 todo | 
 |  |  |             vo.setLoading(crnProtocol.getLoaded()==1?"Y":"N");  //  有物 | 
 |  |  |             vo.setLoading(crnProtocol.getLoaded()==1?"有物":"无物");  //  有物 | 
 |  |  |             vo.setBay(crnProtocol.getBay());    //  列 | 
 |  |  |             vo.setLev(crnProtocol.getLevel());  //  层 | 
 |  |  |             vo.setForkOffset(crnProtocol.getForkPosType().desc);    //  货叉位置 | 
 |  |  |             vo.setLiftPos(crnProtocol.getLiftPosType().desc);   //  载货台位置 | 
 |  |  |             vo.setWorkNo(crnProtocol.getAlarm1());  //  异常码 | 
 |  |  |             list.add(vo); | 
 |  |  |             vo.setXOrigin(crnProtocol.getBay()==1?"是":"否");     //  走行原点 | 
 |  |  |             vo.setYOrigin(crnProtocol.getLevel()==1?"是":"否");     // 升降原点 | 
 |  |  |             vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置 | 
 |  |  |             vo.setXLocation(crnProtocol.getWalkPos() == 1?"是":"否");      // 走行定位 | 
 |  |  |             vo.setYLocation(crnProtocol.getLiftPosType().equals(CrnLiftPosType.NONE)?"否":"是");      // 升降定位 | 
 |  |  |             vo.setStop(crnProtocol.getCrnError1().controlStop||crnProtocol.getCrnError1().mainStop||crnProtocol.getCrnError1().remoteStop?"是":"否");       //  急停 | 
 |  |  |             vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1()));  //  异常码 | 
 |  |  |         } | 
 |  |  |         return R.ok().add(list); | 
 |  |  |     } | 
 |  |  | 
 |  |  |     @ManagerAuth(memo = "堆垛机数据表") | 
 |  |  |     public R crnMsgTable(){ | 
 |  |  |         List<CrnMsgTableVo> list = new ArrayList<>(); | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |         List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no")); | 
 |  |  |         for (BasCrnp basCrnp : crnps) { | 
 |  |  |             // 表格行 | 
 |  |  |             CrnMsgTableVo vo = new CrnMsgTableVo(); | 
 |  |  |             vo.setCrnNo(basCrnp.getCrnNo());   //  堆垛机号 | 
 |  |  |             list.add(vo); | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); | 
 |  |  |             if (crnThread == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 表格行 | 
 |  |  |             CrnMsgTableVo vo = new CrnMsgTableVo(); | 
 |  |  |             vo.setCrnNo(crn.getId());   //  堆垛机号 | 
 |  |  |  | 
 |  |  |             vo.setWorkNo(crnProtocol.getTaskNo());  //  任务号 | 
 |  |  |             BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1()); | 
 |  |  |             if (null != crnError) { | 
 |  |  |                 vo.setError(crnError.getErrorCode() + crnError.getErrName()); | 
 |  |  |                 vo.setError(crnError.getErrName()); | 
 |  |  |             } | 
 |  |  |             if (crnProtocol.getTaskNo()>0) { | 
 |  |  |                 WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); | 
 |  |  | 
 |  |  |             } else { | 
 |  |  |                 vo.setStatus(crnProtocol.modeType.equals(CrnModeType.AUTO)? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc());   //  模式状态 | 
 |  |  |             } | 
 |  |  |             list.add(vo); | 
 |  |  |  | 
 |  |  |             vo.setXspeed(crnProtocol.getXSpeed());  //  走行速度(m/min) | 
 |  |  |             vo.setYspeed(crnProtocol.getYSpeed());  //  升降速度(m/min) | 
 |  |  |             vo.setZspeed(crnProtocol.getZSpeed());  //  叉牙速度(m/min) | 
 |  |  |             vo.setXdistance(crnProtocol.getXDistance());  //  走行距离(Km) | 
 |  |  |             vo.setYdistance(crnProtocol.getYDistance());  //  升降距离(Km) | 
 |  |  |             vo.setXduration(crnProtocol.getXDuration());    //  走行时长(H) | 
 |  |  |             vo.setYduration(crnProtocol.getYDuration());    //  升降时长(H) | 
 |  |  |         } | 
 |  |  |         return R.ok().add(list); | 
 |  |  |     } | 
 |  |  | 
 |  |  |         command.setDestinationPosX(param.getRow());     // 目标库位排 | 
 |  |  |         command.setDestinationPosY(param.getBay());     // 目标库位列 | 
 |  |  |         command.setDestinationPosZ(param.getLev());     // 目标库位层 | 
 |  |  |         staNoProcess(param, command); | 
 |  |  |         return crnControl(command)?R.ok():R.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         command.setDestinationPosX(param.getRow());     // 目标库位排 | 
 |  |  |         command.setDestinationPosY(param.getBay());     // 目标库位列 | 
 |  |  |         command.setDestinationPosZ(param.getLev());     // 目标库位层 | 
 |  |  |         staNoProcess(param, command); | 
 |  |  |         return crnControl(command)?R.ok():R.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         command.setDestinationPosX(param.getRow());     // 目标库位排 | 
 |  |  |         command.setDestinationPosY(param.getBay());     // 目标库位列 | 
 |  |  |         command.setDestinationPosZ(param.getLev());     // 目标库位层 | 
 |  |  |         staNoProcess(param, command); | 
 |  |  |         return crnControl(command)?R.ok():R.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         command.setDestinationPosX(param.getStaNo());     // 目标库位排 | 
 |  |  |         command.setDestinationPosY((short) 0);     // 目标库位列 | 
 |  |  |         command.setDestinationPosZ((short) 1);     // 目标库位层 | 
 |  |  |         staNoProcess(param, command); | 
 |  |  |         return crnControl(command)?R.ok():R.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         command.setDestinationPosX(param.getRow());     // 目标库位排 | 
 |  |  |         command.setDestinationPosY(param.getBay());     // 目标库位列 | 
 |  |  |         command.setDestinationPosZ(param.getLev());     // 目标库位层 | 
 |  |  |         staNoProcess(param, command); | 
 |  |  |         return crnControl(command)?R.ok():R.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                     throw new CoolException("堆垛机不在线"); | 
 |  |  |                 } | 
 |  |  |                 // 空闲判断 | 
 |  |  |                 if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) { | 
 |  |  | //                if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) { | 
 |  |  |                     if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))) { | 
 |  |  |                         return true; | 
 |  |  |                     } else { | 
 |  |  |                         throw new CoolException("命令下发失败"); | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     throw new CoolException("堆垛机不在空闲状态"); | 
 |  |  |                 } | 
 |  |  | //                } else { | 
 |  |  | //                    throw new CoolException("堆垛机不在空闲状态"); | 
 |  |  | //                } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void staNoProcess(CrnOperatorParam param, CrnCommand command){ | 
 |  |  |         if (param.getSourceStaNo()!=null) { | 
 |  |  |             if (param.getSourceStaNo() == 5) { | 
 |  |  |                 command.setSourcePosX((short) 2);     // 源库位排 | 
 |  |  |                 command.setSourcePosY((short) 0);     // 源库位列 | 
 |  |  |                 command.setSourcePosZ((short) 1);     // 源库位层 | 
 |  |  |             } else if (param.getSourceStaNo() == 6) { | 
 |  |  |                 command.setSourcePosX((short) 1);     // 源库位排 | 
 |  |  |                 command.setSourcePosY((short) 0);     // 源库位列 | 
 |  |  |                 command.setSourcePosZ((short) 1);     // 源库位层 | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (param.getStaNo()!=null) { | 
 |  |  |             if (param.getStaNo() == 5) { | 
 |  |  |                 command.setDestinationPosX((short) 2);     // 目标库位排 | 
 |  |  |                 command.setDestinationPosY((short) 0);     // 目标库位列 | 
 |  |  |                 command.setDestinationPosZ((short) 1);     // 目标库位层 | 
 |  |  |             } else if (param.getStaNo() == 6) { | 
 |  |  |                 command.setDestinationPosX((short) 1);     // 目标库位排 | 
 |  |  |                 command.setDestinationPosY((short) 0);     // 目标库位列 | 
 |  |  |                 command.setDestinationPosZ((short) 1);     // 目标库位层 | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |