From bda52da89628d1587ab804510f9995c671a318ca Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期日, 07 四月 2024 14:49:19 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java | 373 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 343 insertions(+), 30 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java index 0fb820e..bee13fe 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java @@ -7,23 +7,31 @@ import com.zy.asrs.framework.common.DateUtils; import com.zy.asrs.framework.common.SpringUtils; import com.zy.asrs.framework.exception.CoolException; +import com.zy.asrs.wcs.core.entity.BasShuttle; import com.zy.asrs.wcs.core.entity.Loc; +import com.zy.asrs.wcs.core.model.NavigateNode; import com.zy.asrs.wcs.core.model.command.ShuttleCommand; import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType; +import com.zy.asrs.wcs.core.model.enums.ShuttleRunDirection; +import com.zy.asrs.wcs.core.service.BasShuttleService; import com.zy.asrs.wcs.core.service.LocService; +import com.zy.asrs.wcs.core.utils.NavigateUtils; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.cache.OutputQueue; +import com.zy.asrs.wcs.rcs.entity.DeviceDataLog; import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; +import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; +import com.zy.asrs.wcs.rcs.service.DeviceDataLogService; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; import com.zy.asrs.wcs.core.utils.RedisUtil; import com.zy.asrs.wcs.rcs.entity.Device; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; +import java.util.*; @Slf4j @SuppressWarnings("all") @@ -85,11 +93,18 @@ shuttleProtocol.setShuttleNo(Integer.valueOf(device.getDeviceNo())); shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); shuttleProtocol.setDevice(device); + + InnerSuhttleExtend extend = new InnerSuhttleExtend(); + shuttleProtocol.setExtend(extend); } //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�----------- //灏忚溅璁惧鐘舵�� Integer deviceStatus = data.getInteger("deviceStatus"); + if (deviceStatus == 255) { + //绂荤嚎 + shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); + } shuttleProtocol.setDeviceStatus(deviceStatus); //褰撳墠浜岀淮鐮� shuttleProtocol.setCurrentCode(data.getString("groundCode") == null ? "0" : data.getString("groundCode")); @@ -100,39 +115,70 @@ //鏄惁椤跺崌 shuttleProtocol.setHasLift(data.getInteger("palletStatus") == 1 ? true : false); //鏄惁鏈夋墭鐩� - shuttleProtocol.setHasPallet(data.getInteger("hasPallet") != 2 ? true : false); + shuttleProtocol.setHasPallet(data.getInteger("hasPallet") == null ? true : data.getInteger("hasPallet") != 2 ? true : false); //琛岄┒鏂瑰悜 shuttleProtocol.setRunDirection(data.getString("direction") == null ? "none" : data.getString("direction")); //鏄惁涓哄厖鐢电姸鎬� shuttleProtocol.setHasCharge((deviceStatus == 5 || deviceStatus == 13) ? true : false); + //*********璇诲彇鎵╁睍瀛楁********** + InnerSuhttleExtend extend = (InnerSuhttleExtend) shuttleProtocol.getExtend(); + extend.setMapVersion(data.getString("version"));//鍦板浘鐗堟湰 + extend.setStatusDescription(data.getString("statusDescription"));//鐘舵�佹弿杩� + shuttleProtocol.setExtend(extend);//鎵╁睍瀛楁 + ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-end -// //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue -// if (shuttleProtocol.getDeviceStatusType() == ShuttleDeviceStatusType.BUSY) { -// shuttleProtocol.setPakMk(true); -// } -// -// if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == ShuttleDeviceStatusType.IDLE.id) { -// //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽 -// shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); -// } + //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue + if (!shuttleProtocol.getIdle()) { + shuttleProtocol.setPakMk(true); + } -// if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { -// //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰� -// //淇濆瓨鏁版嵁璁板綍 -// DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); -// DeviceDataLog deviceDataLog = new DeviceDataLog(); -// deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result.Content)); -// deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); -// deviceDataLog.setType("shuttle"); -// deviceDataLog.setDeviceNo(shuttleProtocol.getShuttleNo().intValue()); -// deviceDataLog.setCreateTime(new Date()); -// deviceDataLogService.insert(deviceDataLog); -// -// //鏇存柊閲囬泦鏃堕棿 -// shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); -// } + if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 3) { + //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽 + 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); + + //鏇存柊閲囬泦鏃堕棿 + 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())); + } } else { OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆憑1}璇诲彇鍥涘悜绌挎杞︾姸鎬佷俊鎭け璐�", DateUtils.convert(new Date()), device.getDeviceNo())); throw new CoolException(MessageFormat.format("璇诲彇鍥涘悜绌挎杞︾姸鎬佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", device.getDeviceNo(), device.getIp(), device.getPort())); @@ -164,17 +210,237 @@ } @Override - public synchronized boolean movePath() { + public synchronized boolean movePath(List<NavigateNode> nodes, Integer taskNo) { + try { + String loginToken = requestLoginToken(); + if (loginToken == null) { + return false; + } + + HashMap<String, Object> headers = new HashMap<>(); + headers.put("Authorization", "Bearer " + loginToken); + + ArrayList<HashMap<String, Object>> modes = new ArrayList<>(); + //鑾峰彇鍒嗘璺緞 + ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes); + for (ArrayList<NavigateNode> sectionNodes : data) { + boolean flag = true; + int oper; + //寮�濮嬭矾寰� + NavigateNode startPath = nodes.get(0); + if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT + || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) { + //姣嶈建鏂瑰悜 + oper = 5; + }else { + //瀛愯建鏂瑰悜 + oper = 6; + } + + for (NavigateNode node : sectionNodes) { + HashMap<String, Object> map = new HashMap<>(); + map.put("nodexX", node.getX()); + map.put("nodexY", node.getY()); + map.put("nodexZ", node.getZ()); + if (flag) { + map.put("oper", oper); + flag = false; + } + modes.add(map); + } + } + + + HashMap<String, Object> param = new HashMap<>(); + param.put("messageName", "runRoute"); + param.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + param.put("deviceNo", device.getDeviceNo()); + param.put("taskId", taskNo); + param.put("nodeNum", nodes.size()); + param.put("modes", modes); + String response = new HttpHandler.Builder() + .setUri(API_URL) + .setPath("/RDS/runRoute") + .setHeaders(headers) + .setJson(JSON.toJSONString(param)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } return false; } @Override - public synchronized boolean move() { + public synchronized boolean move(ShuttleCommand command) { + try { + String loginToken = requestLoginToken(); + if (loginToken == null) { + return false; + } + + HashMap<String, Object> headers = new HashMap<>(); + headers.put("Authorization", "Bearer " + loginToken); + + String response = new HttpHandler.Builder() + .setUri(API_URL) + .setPath("/RDS/runOrder") + .setHeaders(headers) + .setJson(command.getBody()) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } return false; } @Override - public synchronized boolean lift() { + public synchronized boolean lift(ShuttleCommand command) { + try { + String loginToken = requestLoginToken(); + if (loginToken == null) { + return false; + } + + HashMap<String, Object> headers = new HashMap<>(); + headers.put("Authorization", "Bearer " + loginToken); + + String response = new HttpHandler.Builder() + .setUri(API_URL) + .setPath("/RDS/actionOrder") + .setHeaders(headers) + .setJson(command.getBody()) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + @Override + public synchronized boolean charge(ShuttleCommand command) { + try { + String loginToken = requestLoginToken(); + if (loginToken == null) { + return false; + } + + HashMap<String, Object> headers = new HashMap<>(); + headers.put("Authorization", "Bearer " + loginToken); + + String response = new HttpHandler.Builder() + .setUri(API_URL) + .setPath("/RDS/actionOrder") + .setHeaders(headers) + .setJson(command.getBody()) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + @Override + public synchronized boolean reset(ShuttleCommand command) { + return false; + } + + @Override + public boolean isIdle() { + if (this.shuttleProtocol.getIdle() == null + || this.shuttleProtocol.getPakMk() == null + || this.shuttleProtocol.getErrorCode() == null + || this.shuttleProtocol.getProtocolStatus() == null + ) { + return false; + } + + boolean res = this.shuttleProtocol.getIdle() + && this.shuttleProtocol.getPakMk() + && this.shuttleProtocol.getErrorCode().equals("0") + && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id + ; + return res; + } + + @Override + public boolean isRequireCharge() { + if (this.shuttleProtocol.getIdle() == null + || this.shuttleProtocol.getPakMk() == null + || this.shuttleProtocol.getErrorCode() == null + || this.shuttleProtocol.getProtocolStatus() == null + ) { + return false; + } + + boolean res = this.shuttleProtocol.getIdle() + && this.shuttleProtocol.getPakMk() + && this.shuttleProtocol.getErrorCode().equals("0") + && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id + ; + if (!res) { + return res; + } else { + // 鐢甸噺灏忎簬闃堝�奸渶瑕佽繘琛屽厖鐢� + try { + BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); + if (shuttleService == null) { + return false; + } + BasShuttle basShuttle = shuttleService.getById(this.device.getDeviceNo()); + if (basShuttle == null) { + return false; + } + Integer chargeLine = basShuttle.getChargeLine(); + if (chargeLine == null) { + return false; + } + return Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine; + } catch (Exception e) { + News.error("fail", e); + return false; + } + } + } + + @Override + public boolean isCharging() { + if (this.shuttleProtocol.getDeviceStatus() == null) { + return false; + } + + if (this.shuttleProtocol.getDeviceStatus() == 5 || this.shuttleProtocol.getDeviceStatus() == 13) { + //鍏呯數涓拰鐢垫睜鍧囪 =銆� 鍏呯數 + return true; + } + return false; + } + + @Override + public boolean isChargingCompleted() { return false; } @@ -205,6 +471,37 @@ return command; } + @Override + public ShuttleCommand getLiftCommand(Integer taskNo, Boolean lift) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "actionOrder"); + body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo())); + body.put("taskId", taskNo); + body.put("action", lift ? 1 : 2); + + ShuttleCommand command = new ShuttleCommand(); + command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id); + return command; + } + + @Override + public ShuttleCommand getChargeCommand(Integer taskNo, Boolean charge) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "runOrder"); + body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo())); + body.put("taskId", taskNo); + body.put("action", charge ? 3 : 4); + + ShuttleCommand command = new ShuttleCommand(); + command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id); + return command; + } //***************璁惧灞傞�氳-涓嶅悓鍘傚晢璁惧閫氳鏂规涓嶄竴鑷�*************** @@ -264,4 +561,20 @@ } return null; } + + @Data + private class InnerSuhttleExtend { + + /** + * 鍦板浘鐗堟湰 + */ + private String mapVersion; + + /** + * 鐘舵�佹弿杩� + */ + private String statusDescription; + + } + } -- Gitblit v1.9.1