|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.core.properties.SlaveProperties; | 
|---|
|  |  |  | import com.zy.core.thread.BarcodeThread; | 
|---|
|  |  |  | import com.zy.core.thread.LedThread; | 
|---|
|  |  |  | import com.zy.core.thread.SiemensDevpThread; | 
|---|
|  |  |  | import com.zy.core.thread.SteThread; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | 
|---|
|  |  |  | private BasCrnErrorMapper basCrnErrorMapper; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasSteService basSteService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WrkChargeService wrkChargeService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private CommonService commonService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 组托 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void letCarBeWaiting(WrkCharge wrkCharge, Integer steNo) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { return; } | 
|---|
|  |  |  | if (steProtocol.isIdle()) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
|---|
|  |  |  | steCommand.setTaskMode(SteTaskModeType.findWaiting(steProtocol.getRow().intValue())); // 任务模式:  去近点 等待堆垛机叉取 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | // 修改工作档状态 绑定穿梭车 | 
|---|
|  |  |  | wrkCharge.setSteNo(steNo); | 
|---|
|  |  |  | wrkCharge.setModiTime(new Date()); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改工作档状态 绑定穿梭车 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 让小车从 远点 ====>> 移动到近点 | 
|---|
|  |  |  | *  等待堆垛机搬运 | 
|---|
|  |  |  | 
|---|
|  |  |  | // 获取入库待确认工作档 | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectCrnWaiting(crnProtocol.getTaskNo().intValue()); | 
|---|
|  |  |  | if (wrkMast == null) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 充电任务 | 
|---|
|  |  |  | WrkCharge wrkCharge = wrkChargeService.selectById(crnProtocol.getTaskNo()); | 
|---|
|  |  |  | if (wrkCharge == null) { | 
|---|
|  |  |  | log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 小车搬至指定库位完成 | 
|---|
|  |  |  | if (wrkCharge.getWrkSts() == 4) { | 
|---|
|  |  |  | // 4.迁入小车 ===>> 6.小车待入 | 
|---|
|  |  |  | wrkCharge.setWrkSts(6L); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改充电任务状态 4.迁入小车 ===>> 6.小车待入 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 堆垛机复位 | 
|---|
|  |  |  | crnThread.setResetFlag(true); | 
|---|
|  |  |  | // 穿梭车重新定位排列层 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo()); | 
|---|
|  |  |  | if (!steThread.confirmPos()) { | 
|---|
|  |  |  | log.error("{}号穿梭车重新定位失败!作业充电任务号:{}", wrkCharge.getSteNo(), wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (wrkMast == null) { continue; } | 
|---|
|  |  |  | if (wrkMast.getIoType() != 11) { | 
|---|
|  |  |  | // 入库 ==>> 货物搬入库 | 
|---|
|  |  |  | if (wrkMast.getWrkSts() == 7){ | 
|---|
|  |  |  | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 查询是否有待入库的任务 | 
|---|
|  |  |  | WrkMast wrkMast = wrkMastMapper.selectCarWaiting(steProtocol.getTaskNo().intValue()); | 
|---|
|  |  |  | if (wrkMast == null) { continue; } | 
|---|
|  |  |  | if (wrkMast == null) { | 
|---|
|  |  |  | // 充电任务 | 
|---|
|  |  |  | WrkCharge wrkCharge = wrkChargeService.selectById(steProtocol.getTaskNo()); | 
|---|
|  |  |  | if (wrkCharge == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if (wrkCharge.getWrkSts() == 11) { | 
|---|
|  |  |  | // 11.生成出库ID ===>> 12.小车待搬 | 
|---|
|  |  |  | wrkCharge.setWrkSts(12L); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改充电任务状态 11.生成出库ID ===>> 12.小车待搬 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | steThread.setResetFlag(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (wrkCharge.getWrkSts() == 8) { | 
|---|
|  |  |  | // 8.小车搬入库 ===>> 9.入库完成 | 
|---|
|  |  |  | wrkCharge.setWrkSts(9L); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改充电任务状态 8.小车搬入库 ===>> 9.入库完成 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | steThread.setResetFlag(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (wrkMast == null) { continue; } | 
|---|
|  |  |  | switch (wrkMast.getWrkSts().intValue()) { | 
|---|
|  |  |  | case 2: | 
|---|
|  |  |  | // 修改工作档状态 2.设备上走 => 3.小车待搬 | 
|---|
|  |  |  | 
|---|
|  |  |  | BasSte basSte = basSteService.selectById(ste.getId()); | 
|---|
|  |  |  | if (Cools.isEmpty(steProtocol, basSte)) { continue; } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (!steProtocol.statusType.equals(SteStatusType.IDLE)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (steProtocol.getCharge() > Float.parseFloat(basSte.getChargeLine())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | WrkCharge wrkCharge = wrkChargeService.selectById(steProtocol.getTaskNo()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (wrkCharge == null) { | 
|---|
|  |  |  | wrkCharge = new WrkCharge(); | 
|---|
|  |  |  | wrkCharge.setSteNo(ste.getId()); | 
|---|
|  |  |  | wrkCharge.setWrkNo(commonService.getChargeWorkNo(4)); | 
|---|
|  |  |  | wrkCharge.setWrkSts(11L); | 
|---|
|  |  |  | wrkCharge.setCrnNo(basSte.getCrnNo()); | 
|---|
|  |  |  | wrkCharge.setIoPri((double) 10); | 
|---|
|  |  |  | wrkCharge.setLocNo(basSte.getIdleLoc()); | 
|---|
|  |  |  | if (wrkChargeService.insert(wrkCharge)) { | 
|---|
|  |  |  | log.error("保存{}号穿梭车充电任务失败!!!", ste.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.letCarBeWaiting(wrkCharge, ste.getId()); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 12.小车待搬 | 
|---|
|  |  |  | if (wrkCharge.getWrkSts() == 12) { | 
|---|
|  |  |  | // 搬小车至充电库位 | 
|---|
|  |  |  | LocMast locMast = locMastService.selectById(basSte.getIdleLoc()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue());     // 源库位排 | 
|---|
|  |  |  | 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, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改穿梭车运行中排列层 | 
|---|
|  |  |  | steThread.modifyPos(Utils.getGroupRow(locMast.getLocNo()), locMast.getBay1(), locMast.getLev1()); | 
|---|
|  |  |  | // 修改工作档状态 12.小车待搬 => 4.迁入小车 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkCharge.setWrkSts(4L); | 
|---|
|  |  |  | wrkCharge.setCrnStrTime(now); | 
|---|
|  |  |  | wrkCharge.setModiTime(now); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改工作档状态 12.小车待搬 => 4.迁入小车 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } else if (wrkCharge.getWrkSts() == 6L) { | 
|---|
|  |  |  | // 小车行驶至充电位 | 
|---|
|  |  |  | if (steProtocol.isIdle()) { | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
|---|
|  |  |  | steCommand.setTaskMode(SteTaskModeType.findChargeByLoc(steProtocol.getRow().intValue())); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) { | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 6.小车待入 ===> 8.小车搬入库 | 
|---|
|  |  |  | wrkCharge.setWrkSts(8L); | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkCharge.setCrnEndTime(now); | 
|---|
|  |  |  | wrkCharge.setModiTime(now); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改工作档状态 6.小车待入 ===> 8.小车搬入库 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (wrkCharge.getWrkSts() == 9L) { | 
|---|
|  |  |  | // 给输送线下发充电任务 | 
|---|
|  |  |  | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
|---|
|  |  |  | SteChargeType steChargeType = SteChargeType.get(wrkCharge.getLocNo()); | 
|---|
|  |  |  | if (null != steChargeType) { | 
|---|
|  |  |  | if (devpThread.charge(steChargeType.ssbm - 1, true)) { | 
|---|
|  |  |  | // 修改工作档状态 9.入库完成 ===> 10.库存更新完成 | 
|---|
|  |  |  | wrkCharge.setWrkSts(10L); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改充电任务状态 9.入库完成 ===> 10.库存更新完成 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | log.error("获取充电桩号失败,解析库位:{}", wrkCharge.getLocNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("fail", e); | 
|---|
|  |  |  | } | 
|---|