| | |
| | | import com.zy.core.model.protocol.StationProtocol; |
| | | import com.zy.core.thread.CrnThread; |
| | | import com.zy.core.thread.StationThread; |
| | | import lombok.Synchronized; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | @Component |
| | | public class CrnOperateProcessUtils { |
| | |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("crn_no", basCrnp.getCrnNo()) |
| | | .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts) |
| | | .in("wrk_sts", |
| | | WrkStsType.INBOUND_RUN.sts |
| | | , WrkStsType.OUTBOUND_RUN.sts |
| | | , WrkStsType.LOC_MOVE_RUN.sts |
| | | ) |
| | | ); |
| | | if(!wrkMasts.isEmpty()){ |
| | | continue; |
| | |
| | | // 如果最近一次是入库模式 |
| | | if (crnProtocol.getLastIo().equals("I")) { |
| | | if (basCrnp.getInEnable().equals("Y")) { |
| | | this.crnExecuteIn(basCrnp, crnThread); // 入库 |
| | | boolean result = this.crnExecuteIn(basCrnp, crnThread);// 入库 |
| | | crnProtocol.setLastIo("O"); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } else if (basCrnp.getOutEnable().equals("Y")) { |
| | | this.crnExecuteOut(basCrnp, crnThread); // 出库 |
| | | boolean result = this.crnExecuteOut(basCrnp, crnThread);// 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | if(result) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | // 如果最近一次是出库模式 |
| | | else if (crnProtocol.getLastIo().equals("O")) { |
| | | if (basCrnp.getOutEnable().equals("Y")) { |
| | | this.crnExecuteOut(basCrnp, crnThread); // 出库 |
| | | boolean result = this.crnExecuteOut(basCrnp, crnThread);// 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } else if (basCrnp.getInEnable().equals("Y")) { |
| | | this.crnExecuteIn(basCrnp, crnThread); // 入库 |
| | | boolean result = this.crnExecuteIn(basCrnp, crnThread);// 入库 |
| | | crnProtocol.setLastIo("O"); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //库位移转 |
| | | this.crnExecuteLocTransfer(basCrnp, crnThread); |
| | | boolean result = this.crnExecuteLocTransfer(basCrnp, crnThread); |
| | | if(result) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private synchronized void crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) { |
| | | @Synchronized |
| | | private boolean crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) { |
| | | CrnProtocol crnProtocol = crnThread.getStatus(); |
| | | if(crnProtocol == null){ |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | if(!basCrnp.getInEnable().equals("Y")){ |
| | | News.info("堆垛机:{} 可入信号不满足", basCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | List<StationObjModel> inStationList = basCrnp.getInStationList$(); |
| | | if(inStationList.isEmpty()){ |
| | | News.info("堆垛机:{} 入库站点未设置", basCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basCrnp.getCrnNo(); |
| | |
| | | String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev()); |
| | | |
| | | CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo); |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts); |
| | | wrkMast.setCrnNo(crnNo); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | //给库位白色指示灯亮灯 |
| | | String[] split = basCrnp.getArr().split(","); |
| | | int i = Arrays.asList(split).indexOf(wrkMast.getLocNo()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | if (i>-1){ |
| | | command.setLocNo(wrkMast.getLocNo()); |
| | | command.setIndex(i); |
| | | command.setValue((short)1); |
| | | } |
| | | MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command)); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_RUN, null); |
| | | News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command)); |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private synchronized void crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) { |
| | | private synchronized boolean crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) { |
| | | CrnProtocol crnProtocol = crnThread.getStatus(); |
| | | if(crnProtocol == null){ |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | if(!basCrnp.getOutEnable().equals("Y")){ |
| | | News.info("堆垛机:{} 可出信号不满足", basCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | List<StationObjModel> outStationList = basCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("堆垛机:{} 出库站点未设置", basCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basCrnp.getCrnNo(); |
| | |
| | | wrkMast.setCrnNo(crnNo); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | //给库位白色指示灯亮灯 |
| | | String[] split = basCrnp.getArr().split(","); |
| | | int i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | if (i>-1){ |
| | | command.setLocNo(wrkMast.getSourceLocNo()); |
| | | command.setIndex(i); |
| | | command.setValue((short)1); |
| | | } |
| | | MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command)); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_RUN, null); |
| | | News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command)); |
| | | return; |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private synchronized boolean crnExecuteInPlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) { |
| | |
| | | return false; |
| | | } |
| | | |
| | | private synchronized void crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) { |
| | | private synchronized boolean crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) { |
| | | CrnProtocol crnProtocol = crnThread.getStatus(); |
| | | if(crnProtocol == null){ |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basCrnp.getCrnNo(); |
| | |
| | | wrkMast.setCrnNo(crnNo); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | //给库位白色指示灯亮灯 |
| | | String[] split = basCrnp.getArr().split(","); |
| | | int i = Arrays.asList(split).indexOf(wrkMast.getLocNo()); |
| | | String locNo = wrkMast.getLocNo(); |
| | | if (i == -1) { |
| | | i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo()); |
| | | locNo = wrkMast.getSourceLocNo(); |
| | | } |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | if (i>-1){ |
| | | command.setLocNo(locNo); |
| | | command.setIndex(i); |
| | | command.setValue((short)1); |
| | | } |
| | | MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command)); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_RUN, null); |
| | | News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command)); |
| | | return; |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | //堆垛机任务执行完成 |
| | |
| | | News.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | | //给库位白色指示灯亮灯 |
| | | String[] split = basCrnp.getArr().split(","); |
| | | int i = -1; |
| | | String locNo = ""; |
| | | Long updateWrkSts = null; |
| | | if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){ |
| | | updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts; |
| | | i = Arrays.asList(split).indexOf(wrkMast.getLocNo()); |
| | | locNo = wrkMast.getLocNo(); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null); |
| | | }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){ |
| | | updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts; |
| | | i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo()); |
| | | locNo = wrkMast.getSourceLocNo(); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null); |
| | | }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){ |
| | | updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts; |
| | | i = Arrays.asList(split).indexOf(wrkMast.getLocNo()); |
| | | locNo = wrkMast.getLocNo(); |
| | | if(i==-1){ |
| | | i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo()); |
| | | locNo = wrkMast.getSourceLocNo(); |
| | | } |
| | | notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null); |
| | | }else{ |
| | | News.error("堆垛机处于等待确认且任务完成状态,但工作状态异常。堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo()); |
| | |
| | | wrkMast.setWrkSts(updateWrkSts); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMast.setWeight(crnProtocol.getWeight()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getCrnNo()); |
| | | MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand)); |
| | | if (i>-1){ |
| | | resetCommand.setLocNo(locNo); |
| | | resetCommand.setIndex(i); |
| | | resetCommand.setValue((short)0); |
| | | } |
| | | MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(3, resetCommand)); |
| | | News.info("堆垛机任务状态更新成功,堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo()); |
| | | } |
| | | |
| | |
| | | String moveLocNo = dto.getLocNo(); |
| | | |
| | | CreateLocMoveTaskParam moveTaskParam = new CreateLocMoveTaskParam(); |
| | | moveTaskParam.setTaskNo(dto.getTaskNo()); |
| | | moveTaskParam.setTaskNo(String.valueOf(dto.getTaskNo())); |
| | | moveTaskParam.setSourceLocNo(shallowLocNo); |
| | | moveTaskParam.setLocNo(moveLocNo); |
| | | try { |