|  |  | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.entity.*; | 
 |  |  | import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; | 
 |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
 |  |  | import com.zy.asrs.mapper.TaskWrkMapper; | 
 |  |  | import com.zy.asrs.mapper.WaitPakinMapper; | 
 |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
 |  |  | import com.zy.asrs.mapper.*; | 
 |  |  | import com.zy.asrs.service.*; | 
 |  |  | import com.zy.asrs.utils.CommandUtils; | 
 |  |  | import com.zy.asrs.utils.PostMesDataUtils; | 
 |  |  | 
 |  |  |     private TaskWrkService taskWrkService; | 
 |  |  |     @Autowired | 
 |  |  |     private ConfigService configService; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescMapper staDescMapper; | 
 |  |  |  | 
 |  |  |     @Value("${wms.url}") | 
 |  |  |     private String wmsUrl; | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  |             // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  |             List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), crnStn.getStaNo().toString()); | 
 |  |  |             for (TaskWrk taskWrk : taskWrks){ | 
 |  |  |                 if (taskWrk == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 工作档状态判断 | 
 |  |  |                 if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null) { | 
 |  |  |                     log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 获取堆垛机出库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     break; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |             List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); | 
 |  |  |             for (StaDesc staDesc : staDescs){ | 
 |  |  |                 // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  |                 List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), staDesc.getStnNo().toString()); | 
 |  |  |                 for (TaskWrk taskWrk : taskWrks){ | 
 |  |  |                     if (taskWrk == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 工作档状态判断 | 
 |  |  |                     if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) { | 
 |  |  |                         log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType()); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 获取堆垛机出库站信息 | 
 |  |  |                     SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                     if (staProtocol == null) { | 
 |  |  |                         break; | 
 |  |  |                     } else { | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 // 查询站点详细信息 | 
 |  |  |                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                 if (staDetl == null) { | 
 |  |  |                     log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 判断堆垛机出库站状态 | 
 |  |  |                 if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") | 
 |  |  |                         && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                     // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                     // 堆垛机控制过滤 | 
 |  |  |                     if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     // 查询站点详细信息 | 
 |  |  |                     BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                     if (staDetl == null) { | 
 |  |  |                         log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                     if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |                     // 判断堆垛机出库站状态 | 
 |  |  |                     if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") | 
 |  |  |                             && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                     // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |                     if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) { | 
 |  |  |  | 
 |  |  |                         taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); | 
 |  |  |  | 
 |  |  |                         List<TaskWrk> taskWrks1 = taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); | 
 |  |  |                         if (Cools.isEmpty(taskWrks1) && taskWrks1.size()!=0){ | 
 |  |  |                             continue; | 
 |  |  |                         // 堆垛机控制过滤 | 
 |  |  |                         if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |                         String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint()); | 
 |  |  |                         TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo); | 
 |  |  |                         if (!Cools.isEmpty(hallowLocNoTask)){ | 
 |  |  |                             if (!Cools.isEmpty(hallowLocNoTask.getTargetPoint())){ | 
 |  |  |  | 
 |  |  |                         // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                         if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |                         if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) { | 
 |  |  |  | 
 |  |  |                             taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); | 
 |  |  |  | 
 |  |  |                             List<TaskWrk> taskWrks1 = taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); | 
 |  |  |                             if (Cools.isEmpty(taskWrks1) && taskWrks1.size()!=0){ | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  | //                            new PostMesDataUtils().postMesData("移库任务分配库位",wmsUrl,movePath,hallowLocNoTask); | 
 |  |  |                             try { | 
 |  |  |                                 String response = new HttpHandler.Builder() | 
 |  |  |                                         .setUri(wmsUrl) | 
 |  |  |                                         .setPath(movePath) | 
 |  |  |                                         .setJson(JSON.toJSONString(hallowLocNoTask)) | 
 |  |  |                                         .build() | 
 |  |  |                                         .doPost(); | 
 |  |  |                                 System.out.println("response:"+response); | 
 |  |  |                                 JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                                 if (jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                                     //解析 | 
 |  |  |                             String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint()); | 
 |  |  |                             TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo); | 
 |  |  |                             if (!Cools.isEmpty(hallowLocNoTask)){ | 
 |  |  |                                 if (!Cools.isEmpty(hallowLocNoTask.getTargetPoint())){ | 
 |  |  |                                     continue; | 
 |  |  |                                 } | 
 |  |  |                             }catch (Exception e){ | 
 |  |  |                                 log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/"+movePath, JSON.toJSONString(hallowLocNoTask), "请求移库任务分配库位"); | 
 |  |  | //                            new PostMesDataUtils().postMesData("移库任务分配库位",wmsUrl,movePath,hallowLocNoTask); | 
 |  |  |                                 try { | 
 |  |  |                                     String response = new HttpHandler.Builder() | 
 |  |  |                                             .setUri(wmsUrl) | 
 |  |  |                                             .setPath(movePath) | 
 |  |  |                                             .setJson(JSON.toJSONString(hallowLocNoTask)) | 
 |  |  |                                             .build() | 
 |  |  |                                             .doPost(); | 
 |  |  |                                     System.out.println("response:"+response); | 
 |  |  |                                     JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                                     if (jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                                         //解析 | 
 |  |  |                                     } | 
 |  |  |                                 }catch (Exception e){ | 
 |  |  |                                     log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/"+movePath, JSON.toJSONString(hallowLocNoTask), "请求移库任务分配库位"); | 
 |  |  |                                 } | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 1.堆垛机开始移动 | 
 |  |  |                     CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                     crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                     crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                     crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                     crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                     crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                     crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位列 | 
 |  |  |                     crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位层 | 
 |  |  |                     crnCommand.setDestinationPosX(crnStn.getBay().shortValue());     // 目标库位排 | 
 |  |  |                     crnCommand.setDestinationPosY(crnStn.getLev().shortValue());     // 目标库位列 | 
 |  |  |                     crnCommand.setDestinationPosZ(crnStn.getRow().shortValue());     // 目标库位层 | 
 |  |  |                     crnCommand.setCommand((short)1); | 
 |  |  |                     if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                         log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                     } else { | 
 |  |  |                         // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         taskWrk.setWrkSts(12); | 
 |  |  |                         taskWrk.setModiTime(now); | 
 |  |  |                         if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                             log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                         // 1.堆垛机开始移动 | 
 |  |  |                         CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                         crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                         crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                         crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                         crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                         crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                         crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位列 | 
 |  |  |                         crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位层 | 
 |  |  |                         crnCommand.setDestinationPosX(crnStn.getBay().shortValue());     // 目标库位排 | 
 |  |  |                         crnCommand.setDestinationPosY(crnStn.getLev().shortValue());     // 目标库位列 | 
 |  |  |                         crnCommand.setDestinationPosZ(crnStn.getRow().shortValue());     // 目标库位层 | 
 |  |  |                         crnCommand.setCommand((short)1); | 
 |  |  |                         if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                             log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                         } else { | 
 |  |  |                             // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                             Date now = new Date(); | 
 |  |  |                             taskWrk.setWrkSts(12); | 
 |  |  |                             taskWrk.setModiTime(now); | 
 |  |  |                             if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                                 log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         break; | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } |