From 89e6e823e4eeed9c08ac612d8089678ad24b4ef2 Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期五, 12 四月 2024 22:18:54 +0800 Subject: [PATCH] #取放货动作 --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java | 186 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 169 insertions(+), 17 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 75dd1fd..9dedf44 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,15 +7,20 @@ 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.common.ExecuteSupport; +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.command.ShuttleRedisCommand; 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.constant.DeviceRedisConstant; 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; @@ -30,6 +35,7 @@ import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.TimeUnit; @Slf4j @SuppressWarnings("all") @@ -99,12 +105,17 @@ //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�----------- //灏忚溅璁惧鐘舵�� 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")); //鐢垫睜鐢甸噺 shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0%" : data.getString("battery")); - + //鏁呴殰 + shuttleProtocol.setErrorCode(deviceStatus == 6 ? "1" : "0"); //鏄惁椤跺崌 shuttleProtocol.setHasLift(data.getInteger("palletStatus") == 1 ? true : false); @@ -124,14 +135,14 @@ ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-end //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue - if (!shuttleProtocol.getIdle()) { + if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) { shuttleProtocol.setPakMk(true); } -// if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == ShuttleDeviceStatusType.IDLE.id) { -// //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽 -// shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); -// } + if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 3) { + //灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽 + shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); + } if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰� @@ -148,6 +159,30 @@ //鏇存柊閲囬泦鏃堕棿 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())); @@ -193,25 +228,37 @@ ArrayList<HashMap<String, Object>> modes = new ArrayList<>(); //鑾峰彇鍒嗘璺緞 ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes); - for (ArrayList<NavigateNode> sectionNodes : data) { + for (int idx = 0; idx < data.size(); idx++) { + ArrayList<NavigateNode> sectionNodes = data.get(idx); + boolean isRemoveFooterNode = false;//鏄惁鍓旈櫎灏捐妭鐐� + if (idx != data.size() - 1) { + isRemoveFooterNode = true;//鍓旈櫎灏捐妭鐐� + } + boolean flag = true; int oper; //寮�濮嬭矾寰� - NavigateNode startPath = nodes.get(0); + NavigateNode startPath = sectionNodes.get(0); + //缁撴潫璺緞 + NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1); if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) { //姣嶈建鏂瑰悜 oper = 5; - }else { + } else { //瀛愯建鏂瑰悜 oper = 6; } - for (NavigateNode node : sectionNodes) { + for (int i = 0; i < sectionNodes.size(); i++) { + if (isRemoveFooterNode && i == sectionNodes.size() - 1) { + continue; + } + NavigateNode node = sectionNodes.get(i); HashMap<String, Object> map = new HashMap<>(); - map.put("nodexX", node.getX()); - map.put("nodexY", node.getY()); - map.put("nodexZ", node.getZ()); + map.put("nodeX", node.getX()); + map.put("nodeY", node.getY()); + map.put("nodeZ", node.getZ()); if (flag) { map.put("oper", oper); flag = false; @@ -225,7 +272,7 @@ 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("taskId", generateDeviceTaskNo(taskNo)); param.put("nodeNum", nodes.size()); param.put("modes", modes); String response = new HttpHandler.Builder() @@ -233,6 +280,7 @@ .setPath("/RDS/runRoute") .setHeaders(headers) .setJson(JSON.toJSONString(param)) + .setTimeout(60, TimeUnit.SECONDS) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); @@ -262,6 +310,7 @@ .setPath("/RDS/runOrder") .setHeaders(headers) .setJson(command.getBody()) + .setTimeout(60, TimeUnit.SECONDS) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); @@ -291,6 +340,7 @@ .setPath("/RDS/actionOrder") .setHeaders(headers) .setJson(command.getBody()) + .setTimeout(60, TimeUnit.SECONDS) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); @@ -320,6 +370,7 @@ .setPath("/RDS/actionOrder") .setHeaders(headers) .setJson(command.getBody()) + .setTimeout(60, TimeUnit.SECONDS) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); @@ -340,7 +391,17 @@ @Override public boolean isIdle() { - if (this.shuttleProtocol.getIdle() == null + return this.isIdle(null); + } + + @Override + public boolean isIdle(ExecuteSupport support) { + if (null != support) { + if (!support.judgement()) { + return false; + } + } + if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getPakMk() == null || this.shuttleProtocol.getErrorCode() == null || this.shuttleProtocol.getProtocolStatus() == null @@ -348,7 +409,7 @@ return false; } - boolean res = this.shuttleProtocol.getIdle() + boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11) && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id @@ -357,12 +418,103 @@ } @Override + public boolean isRequireCharge() { + if (this.shuttleProtocol.getDeviceStatus() == null + || this.shuttleProtocol.getPakMk() == null + || this.shuttleProtocol.getErrorCode() == null + || this.shuttleProtocol.getProtocolStatus() == null + ) { + return false; + } + + boolean res = (this.shuttleProtocol.getDeviceStatus() == 3) + && 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() { + if (this.shuttleProtocol.getBatteryPower() == null) { + return false; + } + + if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= 100) { + return true; + } + return false; + } + + @Override + public List<NavigateNode> getMoveAdvancePath() { + ArrayList<NavigateNode> path = new ArrayList<>(); + if (shuttleProtocol.getTaskNo() != 0) { + //瀛樺湪浠诲姟锛岃幏鍙栨寚浠� + Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + shuttleProtocol.getTaskNo()); + if (object != null) { + ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class); + List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//绌挎杞﹂璁¤矾寰� + if (!nodes.isEmpty()) { + path.addAll(nodes); + } + } + } + return path; + } + + @Override + public int generateDeviceTaskNo(int taskNo) { + int no = taskNo % 255; + if (no <= 1) { + no = 2; + } + return no; + } + + @Override public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed) { 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("taskId", generateDeviceTaskNo(taskNo)); LocService locService = SpringUtils.getBean(LocService.class); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>() -- Gitblit v1.9.1