From 8ef2bb5e46d84594e6ed632c07ea0b47a1bf6c4d Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期三, 11 十二月 2024 16:15:17 +0800 Subject: [PATCH] #path similarity --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java | 588 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 445 insertions(+), 143 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java index 2edd07e..ee3af41 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java @@ -9,6 +9,8 @@ import com.zy.asrs.framework.common.SpringUtils; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.common.ExecuteSupport; +import com.zy.asrs.wcs.core.action.ShuttleAction; +import com.zy.asrs.wcs.core.domain.param.ShuttleMoveLocParam; import com.zy.asrs.wcs.core.entity.BasShuttle; import com.zy.asrs.wcs.core.entity.Loc; import com.zy.asrs.wcs.core.model.MapNode; @@ -23,11 +25,13 @@ import com.zy.asrs.wcs.core.utils.NavigateMapData; import com.zy.asrs.wcs.core.utils.NavigatePositionConvert; import com.zy.asrs.wcs.core.utils.RedisUtil; +import com.zy.asrs.wcs.core.utils.Utils; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.cache.OutputQueue; import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.entity.DeviceDataLog; +import com.zy.asrs.wcs.rcs.model.CommandResponse; import com.zy.asrs.wcs.rcs.model.command.NyShuttleHttpCommand; import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; @@ -56,9 +60,12 @@ private ShuttleProtocol shuttleProtocol; private Socket socket; - private static final boolean DEBUG = true;//璋冭瘯妯″紡 + private static final boolean DEBUG = false;//璋冭瘯妯″紡 private List<JSONObject> socketResults = new ArrayList<>(); + + //鍘熷璁惧鏁版嵁 + private Object originDeviceData; public NyShuttleThread(Device device, RedisUtil redisUtil) { this.device = device; @@ -73,18 +80,125 @@ //鐩戝惉娑堟伅骞跺瓨鍌� Thread innerThread = new Thread(() -> { while (true) { - listenSocketMessage(); + try { + listenSocketMessage(); + } catch (Exception e) { + e.printStackTrace(); + } } }); innerThread.start(); - while (true) { - try { - read(); - Thread.sleep(500); - } catch (Exception e) { - log.error("ShuttleThread Fail", e); + //璁惧璇诲彇 + Thread readThread = new Thread(() -> { + while (true) { + try { + read(); + Thread.sleep(50); + } catch (Exception e) { + log.error("ShuttleThread Fail", e); + } } + }); + readThread.start(); + + //璁惧鎵ц + Thread executeThread = new Thread(() -> { + while (true) { + try { + ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class); + if (shuttleAction == null) { + continue; + } + + Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + device.getDeviceNo()); + if (object == null) { + continue; + } + + Integer taskNo = Integer.valueOf(String.valueOf(object)); + if (taskNo != 0) { + //瀛樺湪浠诲姟闇�瑕佹墽琛� + boolean result = shuttleAction.executeWork(device, taskNo); + } + + //灏忚溅绌洪棽涓旀湁璺戝簱绋嬪簭 + shuttleAction.moveLoc(device); + + Thread.sleep(200); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + executeThread.start(); + + //鍏朵粬浠诲姟 + Thread otherThread = new Thread(() -> { + while (true) { + try { + listenInit();//鐩戝惉鍒濆鍖栦簨浠� + saveLog();//淇濆瓨鏁版嵁 + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + otherThread.start(); + } + + private void saveLog() { + if (shuttleProtocol == null) { + return; + } + + if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { + if (this.originDeviceData != null) { + //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰� + //淇濆瓨鏁版嵁璁板綍 + DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); + DeviceDataLog deviceDataLog = new DeviceDataLog(); + deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData)); + deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); + deviceDataLog.setType(String.valueOf(SlaveType.Shuttle)); + deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo())); + deviceDataLog.setCreateTime(new Date()); + deviceDataLog.setHostId(device.getHostId()); + deviceDataLogService.save(deviceDataLog); + + //鏇存柊閲囬泦鏃堕棿 + shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); + } + } + + //灏嗗洓鍚戠┛姊溅鐘舵�佷繚瀛樿嚦鏁版嵁搴� + BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); + BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>() + .eq(BasShuttle::getShuttleNo, device.getDeviceNo()) + .eq(BasShuttle::getHostId, device.getHostId())); + + if (basShuttle == null) { + basShuttle = new BasShuttle(); + //鍥涘悜绌挎杞﹀彿 + basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo())); + basShuttle.setStatus(1); + basShuttle.setDeleted(0); + basShuttle.setHostId(device.getHostId()); + basShuttle.setDeviceId(device.getId().intValue()); + shuttleService.save(basShuttle); + }else { + Integer shuttleId = basShuttle.getId(); + basShuttle = new BasShuttle(); + basShuttle.setId(shuttleId); + } + //浠诲姟鍙� + basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue()); + //淇敼鏃堕棿 + basShuttle.setUpdateTime(new Date()); + //璁惧鐘舵�� + basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol)); + if (shuttleService.updateById(basShuttle)) { + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo())); } } @@ -98,17 +212,15 @@ BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); // 璇诲彇鏈嶅姟鍣ㄧ殑鍝嶅簲 StringBuffer sb = new StringBuffer(); - String response = null; char[] chars = new char[2048];//缂撳啿鍖� - do { + while (true) { reader.read(chars); - String trim = new String(chars).trim(); + String trim = new String(chars); sb.append(trim); - if (sb.lastIndexOf("\r\n") != -1) { + if (trim.lastIndexOf("\r\n") != -1) { break; } - } while (response != null); -// System.out.println("Received response from server: " + sb); + } JSONObject result = JSON.parseObject(sb.toString());//寰楀埌鍝嶅簲缁撴灉闆� if (!socketResults.isEmpty() && socketResults.size() >= 5) { @@ -120,31 +232,44 @@ } } - public JSONObject getRequestBody(Integer requestId) { - // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� - JSONObject result = null; - for (int i = 0; i < socketResults.size(); i++) { - JSONObject socketResult = socketResults.get(i); - if (!socketResult.get("msgType").equals("responseMsg")) {//涓嶆槸鍝嶅簲鍐呭 - continue; + public JSONObject getRequestBody(String type) { + try { + // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� + JSONObject result = null; + if (type.equals("readState")) { + type = "state"; } - JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString()); - JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString()); - int responseId = Integer.parseInt(resultHeader.get("responseId").toString()); - if (!DEBUG && responseId != requestId) { - continue;//鍝嶅簲ID涓庤姹侷D涓嶄竴鑷达紝涓嶅湪璋冭瘯妯″紡涓� + for (int i = 0; i < socketResults.size(); i++) { + JSONObject socketResult = socketResults.get(i); + if (!socketResult.get("msgType").equals("responseMsg")) {//涓嶆槸鍝嶅簲鍐呭 + continue; + } + + JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString()); + JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); + String responseType = resultBody.get("responseType").toString(); + if (DEBUG) { + result = socketResult; + break; + } + + if (!responseType.equals(type)) { + continue;//鍝嶅簲ID涓庤姹侷D涓嶄竴鑷达紝涓嶅湪璋冭瘯妯″紡涓� + } + + result = socketResult; + break; } - result = socketResult; - break; - } + if (result == null) { + return null;//鏃犲搷搴旂粨鏋� + } - if (result == null) { - return null;//鏃犲搷搴旂粨鏋� + return filterBodyData(result);//杩斿洖Body缁撴灉闆� + } catch (Exception e) { + return null; } - - return filterBodyData(result);//杩斿洖Body缁撴灉闆� } private void read() { @@ -154,7 +279,6 @@ this.connect(); } readStatus(); - listenInit();//鐩戝惉鍒濆鍖栦簨浠� } catch (Exception e) { e.printStackTrace(); OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戣鍙栧洓鍚戠┛姊溅鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort())); @@ -163,22 +287,26 @@ private void readStatus() { try { + if (null == shuttleProtocol) { + shuttleProtocol = new ShuttleProtocol(); + shuttleProtocol.setShuttleNo(Integer.valueOf(device.getDeviceNo())); + shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); + shuttleProtocol.setDevice(device); + + InnerSuhttleExtend extend = new InnerSuhttleExtend(); + shuttleProtocol.setExtend(extend); + } + //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�----------- NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(Integer.parseInt(device.getDeviceNo())); JSONObject data = requestCommand(readStatusCommand); if (data == null) { - shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); + if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) { + //鏈�鍚庝竴娆′笂绾挎椂闂磋秴杩�60s锛岃瀹氱绾� + shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); + } OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort())); }else { - if (null == shuttleProtocol) { - shuttleProtocol = new ShuttleProtocol(); - shuttleProtocol.setShuttleNo(Integer.valueOf(device.getDeviceNo())); - shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); - shuttleProtocol.setDevice(device); - - InnerSuhttleExtend extend = new InnerSuhttleExtend(); - shuttleProtocol.setExtend(extend); - } //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�----------- //灏忚溅璁惧鐘舵�� @@ -186,20 +314,20 @@ //灏忚溅妯″紡 shuttleProtocol.setMode(data.getInteger("workingMode")); //褰撳墠浜岀淮鐮� - shuttleProtocol.setCurrentCode(data.getString("coord")); + shuttleProtocol.setCurrentCode(data.getString("point")); //鐢垫睜鐢甸噺 shuttleProtocol.setBatteryPower(data.getString("powerPercent")); //鐢垫睜鐢靛帇 shuttleProtocol.setBatteryVoltage(data.getInteger("voltage")); //鏁呴殰 - shuttleProtocol.setErrorCode(data.getString("errState")); + shuttleProtocol.setErrorCode(data.getJSONArray("errCode").getString(0)); //鏄惁椤跺崌 - shuttleProtocol.setHasLift(data.getInteger("liftPosition") == 1 ? true : false); + shuttleProtocol.setHasLift(data.getInteger("liftPosition") == 2 ? true : false); //鏄惁鏈夋墭鐩� shuttleProtocol.setHasPallet(data.getInteger("loadState") == 1 ? true : false); //琛岄┒鏂瑰悜 - shuttleProtocol.setRunDirection(data.getString("runDir") == null ? "none" : data.getString("direction")); + shuttleProtocol.setRunDirection(data.getString("runDir") == null ? "none" : data.getString("runDir")); //鏄惁涓哄厖鐢电姸鎬� shuttleProtocol.setHasCharge(data.getInteger("chargState") == 1 ? true : false); @@ -219,9 +347,9 @@ shuttleProtocol.setLastOnlineTime(System.currentTimeMillis()); ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-end - //灏忚溅澶勪簬杩愯涓紝灏嗘爣璁扮疆涓篺alse + //灏忚溅澶勪簬杩愯涓紝灏嗘爣璁扮疆涓簍rue if (shuttleProtocol.getDeviceStatus() == 1) { - shuttleProtocol.setPakMk(false); + shuttleProtocol.setPakMk(true); } if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 0) { @@ -229,46 +357,9 @@ shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); } - if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { - //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰� - //淇濆瓨鏁版嵁璁板綍 - DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); - DeviceDataLog deviceDataLog = new DeviceDataLog(); - deviceDataLog.setOriginData(JSON.toJSONString(data)); - deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); - deviceDataLog.setType(String.valueOf(SlaveType.Shuttle)); - deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo())); - deviceDataLog.setCreateTime(new Date()); - deviceDataLog.setHostId(device.getHostId()); - deviceDataLogService.save(deviceDataLog); + this.originDeviceData = data; - //鏇存柊閲囬泦鏃堕棿 - shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); - } - - //灏嗗洓鍚戠┛姊溅鐘舵�佷繚瀛樿嚦鏁版嵁搴� - BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); - BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>() - .eq(BasShuttle::getShuttleNo, device.getDeviceNo()) - .eq(BasShuttle::getHostId, device.getHostId())); - if (basShuttle == null) { - basShuttle = new BasShuttle(); - //鍥涘悜绌挎杞﹀彿 - basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo())); - basShuttle.setStatus(1); - basShuttle.setDeleted(0); - basShuttle.setHostId(device.getHostId()); - shuttleService.save(basShuttle); - } - //浠诲姟鍙� - basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue()); - //淇敼鏃堕棿 - basShuttle.setUpdateTime(new Date()); - //璁惧鐘舵�� - basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol)); - if (shuttleService.updateById(basShuttle)) { - OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo())); - } + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo())); } } catch (Exception e) { e.printStackTrace(); @@ -304,13 +395,17 @@ String requestType = resultBody.getString("requestType"); Integer requestId = resultHeader.getInteger("requestId"); if (requestType.equals("init")) { + Integer code = resultBody.getInteger("code"); //灏忚溅澶嶄綅璇锋眰 - ShuttleCommand initCommand = getInitCommand(requestId); + ShuttleCommand initCommand = getInitCommand(requestId, code); //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class); JSONObject requestResult = requestCommand(httpCommand); removeIdx = i;//姝ゆ暟鎹凡缁忓鐞嗭紝浠庣粨鏋滈泦涓墧闄� + + log.info(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort())); + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort())); break; } } @@ -325,10 +420,15 @@ @Override public ShuttleProtocol getStatus() { + return getStatus(true); + } + + @Override + public ShuttleProtocol getStatus(boolean clone) { if (this.shuttleProtocol == null) { return null; } - return this.shuttleProtocol.clone(); + return clone ? this.shuttleProtocol.clone() : this.shuttleProtocol; } @Override @@ -337,63 +437,133 @@ } @Override - public boolean movePath(List<NavigateNode> nodes, Integer taskNo) { - return true; + public CommandResponse movePath(List<NavigateNode> nodes, Integer taskNo) { + CommandResponse response = new CommandResponse(true); + return response; } @Override - public boolean move(ShuttleCommand command) { + public CommandResponse move(ShuttleCommand command) { + CommandResponse response = new CommandResponse(false); + try { + //鍙戝嚭璇锋眰 + NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); + Map<String, Object> body = httpCommand.getRequest().getBody(); + Object pathObj = body.get("path"); + int taskId = Integer.parseInt(body.get("taskId").toString()); + List<JSONObject> path = JSON.parseArray(JSON.toJSONString(pathObj), JSONObject.class); + ArrayList<NyShuttleHttpCommand> commandList = new ArrayList<>(); + while (!path.isEmpty()) { + ArrayList<Map<String, Object>> list = new ArrayList<>(); + if (path.size() > 10) { + List<JSONObject> subList = path.subList(0, 10); + list.addAll(subList); + + List<JSONObject> tmp = new ArrayList<>(); + for (int i = 10; i < path.size(); i++) { + tmp.add(path.get(i)); + } + path = tmp; + }else { + list.addAll(path); + path.clear(); + } + + NyShuttleHttpCommand httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class); + JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body)); + + NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); + bodyCopy.put("path", list); + bodyCopy.put("taskId", taskId++); + request.setBody(bodyCopy); + httpCommandCopy.setRequest(request); + + commandList.add(httpCommandCopy);//add copy + } + + for (NyShuttleHttpCommand requestCommand : commandList) { + JSONObject result = requestCommand(requestCommand); + if (result == null) { + return response;//璇锋眰澶辫触 + } + this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 + response.setMessage(JSON.toJSONString(result)); + response.setResult(true); + } + return response; + } catch (Exception e) { + e.printStackTrace(); + response.setMessage(e.getMessage()); + return response; + } + } + + @Override + public CommandResponse lift(ShuttleCommand command) { + CommandResponse response = new CommandResponse(false); try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); JSONObject result = requestCommand(httpCommand); if (result == null) { - return false;//璇锋眰澶辫触 + return response;//璇锋眰澶辫触 } this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 - return true; - } catch (IOException e) { - return false; + response.setMessage(JSON.toJSONString(result)); + response.setResult(true); + return response; + } catch (Exception e) { + e.printStackTrace(); + return response; } } @Override - public boolean lift(ShuttleCommand command) { + public CommandResponse charge(ShuttleCommand command) { + CommandResponse response = new CommandResponse(false); try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); JSONObject result = requestCommand(httpCommand); if (result == null) { - return false;//璇锋眰澶辫触 + return response;//璇锋眰澶辫触 } this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 - return true; - } catch (IOException e) { - return false; + response.setMessage(JSON.toJSONString(result)); + response.setResult(true); + return response; + } catch (Exception e) { + e.printStackTrace(); + return response; } } @Override - public boolean charge(ShuttleCommand command) { + public CommandResponse reset(ShuttleCommand command) { + setSyncTaskNo(0); + setProtocolStatus(ShuttleProtocolStatusType.IDLE); + enableMoveLoc(null, false); + return new CommandResponse(true, JSON.toJSONString(command)); + } + + @Override + public CommandResponse updateLocation(ShuttleCommand command) { + CommandResponse response = new CommandResponse(false); try { //鍙戝嚭璇锋眰 NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); JSONObject result = requestCommand(httpCommand); if (result == null) { - return false;//璇锋眰澶辫触 + return response;//璇锋眰澶辫触 } this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿 - return true; - } catch (IOException e) { - return false; + response.setMessage(JSON.toJSONString(result)); + response.setResult(true); + return response; + } catch (Exception e) { + e.printStackTrace(); + return response; } - } - - @Override - public boolean reset(ShuttleCommand command) { - this.shuttleProtocol.setTaskNo(0); - this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); - return true; } @Override @@ -404,10 +574,12 @@ @Override public boolean isIdle(ExecuteSupport support) { if (null != support) { - if (!support.judgement()) { - return false; + Boolean judgement = support.judgement(); + if (judgement != null && !judgement) { + return true; } } + if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getPakMk() == null || this.shuttleProtocol.getErrorCode() == null @@ -420,18 +592,31 @@ InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); - boolean res = this.shuttleProtocol.getDeviceStatus() == 0 + boolean res = this.shuttleProtocol.getDeviceStatus() == 1 && this.shuttleProtocol.getMode() == 1 && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") - && (this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id) - && extend.getSuspendState() == 0 - ; + && (this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id + || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id + || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id) + && extend.getSuspendState() == 0; return res; } @Override public boolean isDeviceIdle() { + return isDeviceIdle(null); + } + + @Override + public boolean isDeviceIdle(ExecuteSupport support) { + if (null != support) { + Boolean judgement = support.judgement(); + if (judgement != null && !judgement) { + return true; + } + } + if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getPakMk() == null || this.shuttleProtocol.getErrorCode() == null @@ -443,7 +628,7 @@ InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); - boolean res = this.shuttleProtocol.getDeviceStatus() == 0 + boolean res = this.shuttleProtocol.getDeviceStatus() == 1 && this.shuttleProtocol.getMode() == 1 && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") @@ -466,7 +651,7 @@ InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); - boolean res = this.shuttleProtocol.getDeviceStatus() == 0 + boolean res = this.shuttleProtocol.getDeviceStatus() == 1 && this.shuttleProtocol.getMode() == 1 && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") @@ -482,7 +667,7 @@ if (shuttleService == null) { return false; } - BasShuttle basShuttle = shuttleService.getById(this.device.getDeviceNo()); + BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getDeviceId, this.device.getId())); if (basShuttle == null) { return false; } @@ -503,7 +688,7 @@ return false; } - if (this.shuttleProtocol.getDeviceStatus() == 1 && this.shuttleProtocol.getHasCharge()) { + if (this.shuttleProtocol.getDeviceStatus() == 0 && this.shuttleProtocol.getHasCharge()) { //杩愯涓� && 鍏呯數涓� return true; } @@ -544,6 +729,7 @@ @Override public List<NavigateNode> getMoveAdvancePath() { ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); + NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); ArrayList<NavigateNode> path = new ArrayList<>(); if (shuttleProtocol.getTaskNo() != 0) { //瀛樺湪浠诲姟锛岃幏鍙栨寚浠� @@ -562,6 +748,18 @@ if (!nodes.isEmpty()) { path.addAll(nodes); } + + //灏嗚矾寰勯攣涓庡皬杞﹁矾寰勮繘琛屽尮閰� + ArrayList<NavigateNode> tmp = new ArrayList<>(); + //妫�娴嬭矾寰勬槸鍚﹁閿佸畾 + int[][] map = navigateMapData.getDataFromRedis(NavigationMapType.DFX.id, null, null); + for (NavigateNode node : path) { + if(map[node.getX()][node.getY()] == -999) { + tmp.add(node); + } + } + + path = tmp; } } return path; @@ -591,6 +789,39 @@ } @Override + public boolean enableMoveLoc(ShuttleMoveLocParam param, boolean enable) { + if (enable) { + shuttleProtocol.setMoveLoc(true);//寮�鍚窇搴� + shuttleProtocol.setMoveType(param.getMoveType()); + shuttleProtocol.setXStart(param.getStartX()); + shuttleProtocol.setXTarget(param.getTargetX()); + shuttleProtocol.setXCurrent(param.getStartX()); + shuttleProtocol.setYStart(param.getStartY()); + shuttleProtocol.setYTarget(param.getTargetY()); + shuttleProtocol.setYCurrent(param.getStartY()); + }else { + shuttleProtocol.setMoveLoc(false); + shuttleProtocol.setMoveType(0); + shuttleProtocol.setXStart(0); + shuttleProtocol.setXTarget(0); + shuttleProtocol.setXCurrent(0); + shuttleProtocol.setYStart(0); + shuttleProtocol.setYTarget(0); + shuttleProtocol.setYCurrent(0); + } + return true; + } + + @Override + public boolean requestWaiting() { + if (this.shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)) { + this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); + return true; + } + return false; + } + + @Override public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) { NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); @@ -598,9 +829,10 @@ ArrayList<HashMap<String, Object>> path = new ArrayList<>(); + Integer taskId = getTaskId(); HashMap<String, Object> body = new HashMap<>(); body.put("requestType", "move");//绉诲姩鍛戒护 - body.put("taskId", getTaskId());//TaskID闇�瑕侀殢鏈� + body.put("taskId", taskId);//TaskID闇�瑕侀殢鏈� // body.put("start", navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(startCodeNum, device.getHostId())));//璧风偣 // body.put("target", navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(distCodeNum, device.getHostId())));//缁堢偣 body.put("path", path); @@ -612,8 +844,8 @@ HashMap<String, Object> data = new HashMap<>(); String codeNum = NavigatePositionConvert.xyToPosition(node.getX(), node.getY(), node.getZ(), device.getHostId()); Map<String, Object> nyNode = navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(codeNum, device.getHostId())); - int xp = Integer.parseInt(String.valueOf(nyNode.get("x"))); - int yp = Integer.parseInt(String.valueOf(nyNode.get("y"))); + int xp = Integer.parseInt(String.valueOf(nyNode.get("y"))); + int yp = Integer.parseInt(String.valueOf(nyNode.get("x"))); int z = Integer.parseInt(String.valueOf(nyNode.get("z"))); List<List<MapNode>> mapData = navigateMapData.getJsonData(NavigationMapType.NONE.id, null, null); @@ -623,10 +855,10 @@ data.put("xp", xp); data.put("yp", yp); data.put("z", z); - data.put("x", mapNode.getXBase()); - data.put("y", mapNode.getYBase()); + data.put("x", mapNode.getYBase()); + data.put("y", mapNode.getXBase()); + path.add(data); } - httpStandard.setRequest(request); @@ -643,6 +875,7 @@ command.setBody(JSON.toJSONString(httpStandard)); command.setMode(ShuttleCommandModeType.MOVE.id); command.setTargetLocNo(loc.getLocNo()); + command.setTaskNo(taskId); return command; } @@ -651,17 +884,19 @@ NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); + Integer taskId = getTaskId();//TaskID闇�瑕侀殢鏈� HashMap<String, Object> body = new HashMap<>(); body.put("requestType", lift ? "liftUp" : "liftDown");//椤跺崌鎴栦笅闄嶅懡浠� - body.put("taskId", getTaskId());//TaskID闇�瑕侀殢鏈� + body.put("taskId", taskId); request.setBody(body); httpStandard.setRequest(request); ShuttleCommand command = new ShuttleCommand(); command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); - command.setBody(JSON.toJSONString(body)); + command.setBody(JSON.toJSONString(httpStandard)); command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id); + command.setTaskNo(taskId); return command; } @@ -670,9 +905,10 @@ NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); + Integer taskId = getTaskId();//TaskID闇�瑕侀殢鏈� HashMap<String, Object> body = new HashMap<>(); body.put("requestType", charge ? "charge" : "stopCharge");//鍏呯數鎴栧仠姝㈠厖鐢� - body.put("taskId", getTaskId());//TaskID闇�瑕侀殢鏈� + body.put("taskId", taskId); request.setBody(body); httpStandard.setRequest(request); @@ -681,17 +917,71 @@ command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); command.setBody(JSON.toJSONString(httpStandard)); command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id); + command.setTaskNo(taskId); return command; } - //鑾峰彇灏忚溅澶嶄綅鍝嶅簲鍛戒护 - public ShuttleCommand getInitCommand(Integer taskNo) { + @Override + public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) { NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); HashMap<String, Object> body = new HashMap<>(); + body.put("requestType", "updateFloor");//鏇存柊灞俍 + body.put("z", Utils.getLev(locNo));//鍧愭爣Z + request.setBody(body); + + httpStandard.setRequest(request); + + ShuttleCommand command = new ShuttleCommand(); + command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(httpStandard)); + command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id); + command.setTaskNo(taskNo); + return command; + } + + //鑾峰彇灏忚溅澶嶄綅鍝嶅簲鍛戒护 + public ShuttleCommand getInitCommand(Integer taskNo, Integer code) { + LocService locService = SpringUtils.getBean(LocService.class); + NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); + NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); + NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); + + //code -> {Integer@13781} 1101101 + int lev = code % 100; + int bay = code / 100 % 1000; + int row = code / 100000; + + HashMap<String, Object> map = new HashMap<>(); + map.put("x", row); + map.put("y", bay); + map.put("z", lev); + + String mapStr = JSON.toJSONString(map); + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, mapStr) + .eq(Loc::getStatus, 1) + .eq(Loc::getHostId, this.device.getHostId())); + if (loc == null) { + throw new CoolException("鍦板潃鐮佷笉瀛樺湪"); + } + + navigateMapData.setLev(lev); + List<List<MapNode>> mapData = navigateMapData.getJsonData(NavigationMapType.NONE.id, null, null); + List<MapNode> mapNodes = mapData.get(loc.getRow()); + MapNode mapNode = mapNodes.get(loc.getBay()); + + HashMap<String, Object> location = new HashMap<>(); + location.put("xp", row); + location.put("yp", bay); + location.put("z", lev); + location.put("x", mapNode.getYBase()); + location.put("y", mapNode.getXBase()); + + HashMap<String, Object> body = new HashMap<>(); body.put("responseType", "init");//澶嶄綅 - body.put("location", new ArrayList<>());//鍒濆鍖栧潗鏍� + body.put("location", location);//鍒濆鍖栧潗鏍� body.put("devicePoints", new ArrayList<>());//鎻愬崌鏈虹偣浣� body.put("specialPoints", new ArrayList<>());//鐗规畩鏉$爜鍧愭爣 request.setBody(body); @@ -702,6 +992,7 @@ command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); command.setBody(JSON.toJSONString(httpStandard)); command.setMode(ShuttleCommandModeType.RESET.id); + command.setTaskNo(taskNo); return command; } @@ -784,17 +1075,26 @@ writer.flush(); // System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand)); + String requestType = null; + try { + requestType = httpCommand.getRequest().getBody().get("requestType").toString(); + } catch (Exception e) { + return null; + } + // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� // 灏濊瘯10娆� JSONObject result = null; for (int i = 0; i < 10; i++) { - result = getRequestBody(httpCommand.getRequest().getHeader().getRequestId()); + result = getRequestBody(requestType); if (result == null) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } + }else { + break; } } return result;//杩斿洖Body缁撴灉闆� @@ -827,11 +1127,13 @@ //WCS绯荤粺鍧愭爣杞墰鐪煎潗鏍� private static int[] WCSXyzToNyXyz(int x, int y, int z) { - //WCS绯荤粺Y杞� => 鐗涚溂X杞磋浆鎹㈠叕寮� - int x1 = Math.abs(y - 61) + 11; - //WCS绯荤粺X杞� => 鐗涚溂Y杞磋浆鎹㈠叕寮� - int y1 = x + 10; - return new int[]{x1, y1, z}; +// //WCS绯荤粺Y杞� => 鐗涚溂X杞磋浆鎹㈠叕寮� +// int x1 = Math.abs(y - 61) + 11; +// //WCS绯荤粺X杞� => 鐗涚溂Y杞磋浆鎹㈠叕寮� +// int y1 = x + 10; + int x1 = x + 10; + int y1 = y + 10; + return new int[]{y1, x1, z}; } @Data -- Gitblit v1.9.1