|  |  |  | 
|---|
|  |  |  | import com.core.exception.CoolException; | 
|---|
|  |  |  | import com.zy.asrs.entity.*; | 
|---|
|  |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
|---|
|  |  |  | import com.zy.asrs.mapper.WaitPakinMapper; | 
|---|
|  |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
|---|
|  |  |  | import com.zy.asrs.service.*; | 
|---|
|  |  |  | import com.zy.asrs.utils.Utils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.common.model.MatDto; | 
|---|
|  |  |  | import com.zy.common.model.SearchLocParam; | 
|---|
|  |  |  | import com.zy.common.model.StartupDto; | 
|---|
|  |  |  | import com.zy.common.service.CommonService; | 
|---|
|  |  |  | import com.zy.common.utils.CollectionUtils; | 
|---|
|  |  |  | import com.zy.common.utils.HttpHandler; | 
|---|
|  |  |  | import com.zy.core.CrnThread; | 
|---|
|  |  |  | 
|---|
|  |  |  | @Transactional | 
|---|
|  |  |  | public class MainServiceImpl { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final long COMMAND_TIMEOUT = 5 * 1000; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private CommonService commonService; | 
|---|
|  |  |  | @Value("${wms.url}") | 
|---|
|  |  |  | private String wmsUrl; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SlaveProperties slaveProperties; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WrkMastMapper wrkMastMapper; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WrkDetlService wrkDetlService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WaitPakinMapper waitPakinMapper; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private LocMastService locMastService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasDevpService basDevpService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private LocDetlService locDetlService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasErrLogService basErrLogService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasCrnErrorMapper basCrnErrorMapper; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasSteService basSteService; | 
|---|
|  |  |  | @Value("${wms.url}") | 
|---|
|  |  |  | private String wmsUrl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 组托 | 
|---|
|  |  |  | 
|---|
|  |  |  | for (DevpSlave devp : slaveProperties.getDevp()) { | 
|---|
|  |  |  | // 遍历拣料入库口 | 
|---|
|  |  |  | for (DevpSlave.Sta pickSta : devp.getPickSta()) { | 
|---|
|  |  |  | // 获取条码扫描仪信息 | 
|---|
|  |  |  | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); | 
|---|
|  |  |  | if (barcodeThread == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String barcode = barcodeThread.getBarcode(); | 
|---|
|  |  |  | if(!Cools.isEmpty(barcode)) { | 
|---|
|  |  |  | log.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); | 
|---|
|  |  |  | if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取拣料入库站信息 | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
|---|
|  |  |  | 
|---|
|  |  |  | staProtocol = staProtocol.clone(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取条码扫描仪信息 | 
|---|
|  |  |  | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); | 
|---|
|  |  |  | if (barcodeThread == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String barcode = barcodeThread.getBarcode(); | 
|---|
|  |  |  | if(!Cools.isEmpty(barcode)) { | 
|---|
|  |  |  | log.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); | 
|---|
|  |  |  | if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); | 
|---|
|  |  |  | if (wrkMast == null) { | 
|---|
|  |  |  | // 无拣料数据 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 获取工作状态为 2,3,4,5,6 的入库工作档 | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectPakInStep23456(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo()); | 
|---|
|  |  |  | if(null == wrkMast) { | 
|---|
|  |  |  | //                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo()); | 
|---|
|  |  |  | log.error("{}站点查询无待入库数据 工作号={}", crnStn.getStaNo(), staProtocol.getWorkNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 获取库位信息 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 没有小车 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 已经存在吊车执行任务时,则过滤 | 
|---|
|  |  |  | if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | // 当前入库库位组没有小车 堆垛机则去站点取货入库 | 
|---|
|  |  |  | // case 1:从始至终库位组都没有小车,没有迁出小车动作,所以工作状态 = 2 | 
|---|
|  |  |  | // case 2:堆垛机已经搬出小车,有迁出小车动作,所以工作状态 = 6 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() == 2L || wrkMast.getWrkSts() == 6L) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 已经存在吊车执行任务时,则过滤 | 
|---|
|  |  |  | if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 堆垛机入库 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态  7.吊车入库中 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(7L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 {} => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 堆垛机入库 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态  7.吊车入库中 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(7L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 {} => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 目标库位 ===>> 非最外层库位 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 没有小车 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if (wrkMast.getWrkSts() == 2L && wrkMast.getStaNo() == null) { | 
|---|
|  |  |  | // 寻找最近的小车 | 
|---|
|  |  |  | // 寻找当前堆垛机对应的小车 | 
|---|
|  |  |  | SteThread steThread = queryIdleCar(wrkMast); | 
|---|
|  |  |  | if (steThread != null) { | 
|---|
|  |  |  | // 让小车等待搬运待续 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 当前库位组是否存在空闲小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Integer hasCarOfIdle(String locNo) { | 
|---|
|  |  |  | for (SteSlave ste : slaveProperties.getSte()) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { continue; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | if (Utils.getGroupRow(locNo) == Utils.getRow(locNo) && steProtocol.getBay() == Utils.getBay(locNo) && steProtocol.getLev() == Utils.getLev(locNo)) { | 
|---|
|  |  |  | return steProtocol.getSteNo().intValue(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 让小车从 远点 ====>> 移动到近点 | 
|---|
|  |  |  | *  等待堆垛机搬运 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void letCarBeReady(WrkMast wrkMast, Integer steNo) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 | 
|---|
|  |  |  | steCommand.setTaskMode(SteTaskModeType.TO_B); // 任务模式:  去近点 等待堆垛机叉取 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 绑定穿梭车 | 
|---|
|  |  |  | wrkMast.setSteNo(steNo); | 
|---|
|  |  |  | wrkMast.setModiTime(new Date()); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 绑定穿梭车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 入出库  ===>>  堆垛机搬入小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void carMoveIn(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | // 堆垛机空闲 | 
|---|
|  |  |  | if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) { | 
|---|
|  |  |  | LocMast locMast; | 
|---|
|  |  |  | // 入库搬 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() <= 10) { | 
|---|
|  |  |  | locMast = locMastService.selectById(wrkMast.getLocNo()); | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 3.小车待搬 => 4.迁入小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(4L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 3.小车待搬 => 4.迁入小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 出库搬 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | locMast = locMastService.selectById(wrkMast.getSourceLocNo()); | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 12.小车待搬 => 13.迁入小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(13L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 12.小车待搬 => 13.迁入小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 入库  ===>>  堆垛机搬出小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void carMoveOut(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | // 穿梭车空闲 | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | // 堆垛机空闲 | 
|---|
|  |  |  | if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BasSte basSte = basSteService.selectById(steNo); | 
|---|
|  |  |  | if (basSte == null) { | 
|---|
|  |  |  | log.error("{}号穿梭车在数据库不存在!!!", steNo); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String idleLocNo = basSte.getIdleLoc(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX((short) Utils.getRow(idleLocNo));     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY((short) Utils.getBay(idleLocNo));     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ((short) Utils.getLev(idleLocNo));     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 修改工作档状态 3.小车待搬 => 5.迁出小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(5L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 3.小车待搬 => 5.迁出小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 出库  ===>>  库位到堆垛机站 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 最外层库位,直接堆垛机出库 | 
|---|
|  |  |  | if (locMastService.isOutMost(wrkMast.getLocNo())) { | 
|---|
|  |  |  | if (locMastService.isOutMost(wrkMast.getSourceLocNo())) { | 
|---|
|  |  |  | // 已经存在吊车执行任务时,则过滤 | 
|---|
|  |  |  | if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 | 
|---|
|  |  |  | steCommand.setTaskMode(SteTaskModeType.TO_B); // 任务模式:  去近点 等待堆垛机叉取 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SteABType ab = Utils.selectAB(steProtocol.getRow().intValue()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // todo:luxiaotao | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 当前库位组是否存在空闲小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Integer hasCarOfIdle(String locNo) { | 
|---|
|  |  |  | for (SteSlave ste : slaveProperties.getSte()) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { continue; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | if (Utils.getGroupRow(locNo).equals(Utils.getGroupRow(steProtocol.getRow().intValue())) && steProtocol.getBay() == Utils.getBay(locNo) && steProtocol.getLev() == Utils.getLev(locNo)) { | 
|---|
|  |  |  | return steProtocol.getSteNo().intValue(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 查找当前库位最适合的穿梭车来作业 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public SteThread queryIdleCar(WrkMast wrkMast) { | 
|---|
|  |  |  | Integer crnNo = wrkMast.getCrnNo(); | 
|---|
|  |  |  | BasSte basSte = basSteService.findByCrnNo(crnNo); | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol != null) { | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | return steThread; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 让小车从 远点 ====>> 移动到近点 | 
|---|
|  |  |  | *  等待堆垛机搬运 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void letCarBeReady(WrkMast wrkMast, Integer steNo) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号 | 
|---|
|  |  |  | steCommand.setTaskMode(SteTaskModeType.TO_B); // 任务模式:  去近点 等待堆垛机叉取 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); | 
|---|
|  |  |  | steCommand.setBay(steProtocol.getBay()); | 
|---|
|  |  |  | steCommand.setLev(steProtocol.getLev()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 绑定穿梭车 | 
|---|
|  |  |  | wrkMast.setSteNo(steNo); | 
|---|
|  |  |  | wrkMast.setModiTime(new Date()); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 绑定穿梭车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 入出库  ===>>  堆垛机搬入小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void carMoveIn(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | // 堆垛机空闲 | 
|---|
|  |  |  | if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) { | 
|---|
|  |  |  | LocMast locMast; | 
|---|
|  |  |  | // 入库搬 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() <= 10) { | 
|---|
|  |  |  | locMast = locMastService.selectById(wrkMast.getLocNo()); | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改穿梭车运行中排列层 | 
|---|
|  |  |  | steThread.modifyPos(Utils.getGroupRow(locMast.getLocNo()), locMast.getBay1(), locMast.getLev1()); | 
|---|
|  |  |  | // 修改工作档状态 3.小车待搬 => 4.迁入小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(4L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 3.小车待搬 => 4.迁入小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 出库搬 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | locMast = locMastService.selectById(wrkMast.getSourceLocNo()); | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改穿梭车运行中排列层 | 
|---|
|  |  |  | steThread.modifyPos(Utils.getGroupRow(locMast.getLocNo()), locMast.getBay1(), locMast.getLev1()); | 
|---|
|  |  |  | // 修改工作档状态 12.小车待搬 => 13.迁入小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(13L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 12.小车待搬 => 13.迁入小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 入库  ===>>  堆垛机搬出小车 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void carMoveOut(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | // 穿梭车空闲 | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | // 堆垛机空闲 | 
|---|
|  |  |  | if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BasSte basSte = basSteService.selectById(steNo); | 
|---|
|  |  |  | if (basSte == null) { | 
|---|
|  |  |  | log.error("{}号穿梭车在数据库不存在!!!", steNo); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String idleLocNo = basSte.getIdleLoc(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(idleLocNo).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY((short) Utils.getBay(idleLocNo));     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ((short) Utils.getLev(idleLocNo));     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改穿梭车运行中排列层 | 
|---|
|  |  |  | steThread.modifyPos(Utils.getGroupRow(idleLocNo), Utils.getBay(idleLocNo), Utils.getLev(idleLocNo)); | 
|---|
|  |  |  | // 修改工作档状态 3.小车待搬 => 5.迁出小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(5L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) == 0) { | 
|---|
|  |  |  | log.error("修改工作档状态 3.小车待搬 => 5.迁出小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 执行对工作档的完成操作 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Async | 
|---|
|  |  |  | 
|---|
|  |  |  | //  状态:等待确认 并且  任务完成位 = 1 | 
|---|
|  |  |  | if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { | 
|---|
|  |  |  | // 获取入库待确认工作档 | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectPakInStep7(crnProtocol.getTaskNo().intValue()); | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectCrnWaiting(crnProtocol.getTaskNo().intValue()); | 
|---|
|  |  |  | if (wrkMast == null) { | 
|---|
|  |  |  | log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 入库 + 库位转移 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() == 7 || (wrkMast.getWrkSts() == 15 && wrkMast.getIoType() == 11)){ | 
|---|
|  |  |  | // 入库 ==>> 货物搬入库 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() == 7){ | 
|---|
|  |  |  | // 判断是否需要小车入库 | 
|---|
|  |  |  | if (locMastService.isOutMost(wrkMast.getLocNo())) { | 
|---|
|  |  |  | // ==> 9.入库完成 | 
|---|
|  |  |  | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 7.吊车入库中 => 8.小车搬入库 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setWrkSts(8L); | 
|---|
|  |  |  | wrkMast.setCrnStrTime(now); | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkMast.setCrnEndTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) > 0) { | 
|---|
|  |  |  | // 堆垛机复位 | 
|---|
|  |  |  | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) > 0) { | 
|---|
|  |  |  | // 堆垛机复位 | 
|---|
|  |  |  | crnThread.setResetFlag(true); | 
|---|
|  |  |  | // 穿梭车重新定位排列层 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkMast.getSteNo()); | 
|---|
|  |  |  | if (!steThread.confirmPos()) { | 
|---|
|  |  |  | log.error("{}号穿梭车重新定位失败!作业工作档任务号:{}", wrkMast.getSteNo(), wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | log.error("修改工作档状态 4.迁入小车 => 6.小车待入 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | if (wrkMastMapper.updateById(wrkMast) > 0) { | 
|---|
|  |  |  | // 堆垛机复位 | 
|---|
|  |  |  | crnThread.setResetFlag(true); | 
|---|
|  |  |  | // 穿梭车重新定位排列层 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkMast.getSteNo()); | 
|---|
|  |  |  | if (!steThread.confirmPos()) { | 
|---|
|  |  |  | log.error("{}号穿梭车重新定位失败!作业工作档任务号:{}", wrkMast.getSteNo(), wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | log.error("修改工作档状态 5.迁出小车 => 6.小车待入 失败!!,工作号={}", wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { continue; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | // 穿梭车重新定位排列层 | 
|---|
|  |  |  | if (!steThread.confirmPos()) { | 
|---|
|  |  |  | log.error("{}号穿梭车重新定位失败!作业工作档任务号:{}", wrkMast.getSteNo(), wrkMast.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { continue; } | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.WAITING) && steProtocol.getTaskNo() != 0) { | 
|---|
|  |  |  | if (steProtocol.getWaiting() && steProtocol.getTaskNo() != 0) { | 
|---|
|  |  |  | // 查询是否有待入库的任务 | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectCarWaiting(steProtocol.getTaskNo()); | 
|---|
|  |  |  | if (wrkMast == null) { continue; } | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 查找当前库位最适合的穿梭车来作业 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public SteThread queryIdleCar(WrkMast wrkMast) { | 
|---|
|  |  |  | Integer crnNo = wrkMast.getCrnNo(); | 
|---|
|  |  |  | BasSte basSte = basSteService.findByCrnNo(crnNo); | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol != null) { | 
|---|
|  |  |  | if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | return steThread; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | ledCommand.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (wrkMast.getIoType() != 110) { | 
|---|
|  |  |  | List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatNo(), wrkDetl.getMatName(), wrkDetl.getQty()))); | 
|---|
|  |  |  | wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme()))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | commands.add(ledCommand); | 
|---|
|  |  |  | } | 
|---|