From 225f8abb319ed527b90f50c678c38f6e7af68bdd Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期二, 18 六月 2024 16:34:00 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java | 374 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 360 insertions(+), 14 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java index 79077ae..6fc6529 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java @@ -2,16 +2,27 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.utils.HttpHandler; 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.BasLift; +import com.zy.asrs.wcs.core.model.command.LiftCommand; +import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType; +import com.zy.asrs.wcs.core.service.BasLiftService; 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.LiftProtocolStatusType; import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; +import com.zy.asrs.wcs.rcs.service.DeviceDataLogService; import com.zy.asrs.wcs.rcs.thread.LiftThread; 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; @@ -52,18 +63,10 @@ try { readStatus(); -// //鎻愬崌鏈哄浜庤繍琛岀姸鎬侊紝灏嗘爣璁扮疆涓篺alse -// if (liftProtocol.getBusy()) { -// liftProtocol.setPakMk(false); -// } -// -// //鎻愬崌鏈哄浜庢湭杩愯銆佸氨缁�佹爣璁皌rue銆佹湁浠诲姟鍙� -// if (!liftProtocol.getBusy() -// && !liftProtocol.getPakMk() -// && liftProtocol.getTaskNo() != 0) { -// //杩樻湁鏈畬鎴愮殑鍛戒护 -// executeWork(liftProtocol.getTaskNo()); -// } + //鎻愬崌鏈哄浜庤繍琛岀姸鎬侊紝灏嗘爣璁扮疆涓篺alse + if (liftProtocol.getRun()) { + liftProtocol.setPakMk(false); + } } catch (Exception e) { OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆戣鍙栨彁鍗囨満鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort())); } @@ -76,9 +79,13 @@ if (data != null) { if (null == liftProtocol) { liftProtocol = new LiftProtocol(); - liftProtocol.setLiftNo(device.getDeviceNo()); + liftProtocol.setLiftNo(Integer.valueOf(device.getDeviceNo())); liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); liftProtocol.setDevice(device); + + InnerLiftExtend innerLiftExtend = new InnerLiftExtend(); + innerLiftExtend.setLock(false);//榛樿鏈攣瀹� + liftProtocol.setExtend(innerLiftExtend); } //----------璇诲彇鎻愬崌鏈虹姸鎬�----------- @@ -96,6 +103,13 @@ liftProtocol.setErrorCode(""); //灞� liftProtocol.setLev(data.getInteger("curFloor")); + + + //************琛ュ厖鎵╁睍瀛楁************* + InnerLiftExtend liftExtend = JSON.parseObject(JSON.toJSONString(liftProtocol.getExtend(), SerializerFeature.DisableCircularReferenceDetect), InnerLiftExtend.class); + liftExtend.setLock(data.getInteger("lockStatus") == 1 ? true : false); + liftProtocol.setExtend(liftExtend); + // //鍓嶈秴闄� // liftProtocol.setFrontOverrun(status1[4]); // //鍚庤秴闄� @@ -121,6 +135,49 @@ // //宸插畬鎴愪换鍔″彿 // liftProtocol.setCompleteTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 6)); // liftProtocol.setLev(lev); + + if (System.currentTimeMillis() - liftProtocol.getDeviceDataLog() > 1000 * 5) { + //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰� + //淇濆瓨鏁版嵁璁板綍 + DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); + DeviceDataLog deviceDataLog = new DeviceDataLog(); + deviceDataLog.setOriginData(JSON.toJSONString(data)); + deviceDataLog.setWcsData(JSON.toJSONString(liftProtocol)); + deviceDataLog.setType("lift"); + deviceDataLog.setDeviceNo(String.valueOf(liftProtocol.getLiftNo())); + deviceDataLog.setCreateTime(new Date()); + deviceDataLog.setHostId(device.getHostId()); + deviceDataLogService.save(deviceDataLog); + + //鏇存柊閲囬泦鏃堕棿 + liftProtocol.setDeviceDataLog(System.currentTimeMillis()); + } + + //灏嗘彁鍗囨満鐘舵�佷繚瀛樿嚦鏁版嵁搴� + BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class); + BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>() + .eq(BasLift::getLiftNo, device.getDeviceNo()) + .eq(BasLift::getHostId, device.getHostId())); + if (basLift == null) { + basLift = new BasLift(); + //鎻愬崌鏈哄彿 + basLift.setLiftNo(Integer.valueOf(device.getDeviceNo())); + basLift.setStatus(1); + basLift.setDeleted(0); + basLift.setHostId(device.getHostId()); + basLift.setDeviceId(device.getId()); + basLiftService.save(basLift); + } + //浠诲姟鍙� + basLift.setTaskNo(liftProtocol.getTaskNo().intValue()); + //淇敼鏃堕棿 + basLift.setUpdateTime(new Date()); + //璁惧鐘舵�� + basLift.setProtocol(JSON.toJSONString(liftProtocol)); + if (basLiftService.updateById(basLift)) { + OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo())); + } + }else { OutputQueue.LIFT.offer(MessageFormat.format("銆恵0}銆憑1}璇诲彇鎻愬崌鏈虹姸鎬佷俊鎭け璐�", DateUtils.convert(new Date()), device.getId())); throw new CoolException(MessageFormat.format( "璇诲彇鎻愬崌鏈虹姸鎬佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", device.getId(), device.getIp(), device.getPort())); @@ -143,7 +200,178 @@ @Override public LiftProtocol getStatus() { - return this.liftProtocol; + return this.liftProtocol.clone(); + } + + @Override + public Device getDevice() { + return this.device; + } + + @Override + public synchronized boolean move(LiftCommand 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/lifterTask") + .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 palletInOut(LiftCommand 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/lifterTask") + .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 lock(LiftCommand 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/lifterOperation") + .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 unlock(LiftCommand 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/lifterOperation") + .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(LiftCommand command) { + return false; + } + + @Override + public boolean isIdle() { + return isIdle(null); + } + + @Override + public boolean isIdle(ExecuteSupport support) { + if (null != support) { + if (!support.judgement()) { + return false; + } + } + InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();//鑾峰彇鎵╁睍瀛楁 + // 鍒ゆ柇鎻愬崌鏈烘槸鍚﹁嚜鍔ㄣ�佸氨缁�佺┖闂层�佹湭閿佸畾 + if (this.liftProtocol.getModel() + && !this.liftProtocol.getRun() + && this.liftProtocol.getReady() + && this.liftProtocol.getPakMk() + && this.liftProtocol.getErrorCode().equals("0") + && this.liftProtocol.getProtocolStatus().equals(LiftProtocolStatusType.IDLE) + && !extend.getLock() + ) { + return true; + } + return false; + } + + @Override + public boolean setProtocolStatus(LiftProtocolStatusType status) { + this.liftProtocol.setProtocolStatus(status); + return true; + } + + @Override + public boolean setSyncTaskNo(Integer taskNo) { + this.liftProtocol.setTaskNo(taskNo); + return true; + } + + @Override + public boolean isLock(ExecuteSupport support) { + InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend(); + return extend.getLock(); } //***************璁惧灞傞�氳-涓嶅悓鍘傚晢璁惧閫氳鏂规涓嶄竴鑷�*************** @@ -207,4 +435,122 @@ // } // return null; } + + //绌鸿浇绉诲姩 + @Override + public LiftCommand getMoveCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { + int taskMode = 3;//绌鸿浇绉诲姩 + + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "lifterTask"); + 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("startLayer", 0); + body.put("endLayer", targetLev); + body.put("model", taskMode); + + LiftCommand command = new LiftCommand(); + command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(LiftCommandModeType.MOVE.id); + command.setOriginLev(0); + command.setTargetLev(targetLev); + return command; + } + + //杞借溅绉诲姩 + @Override + public LiftCommand getMoveWithShuttleCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "lifterTask"); + 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("startLayer", sourceLev); + body.put("endLayer", targetLev); + body.put("model", 2);//杞借溅绉诲姩 + + LiftCommand command = new LiftCommand(); + command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(LiftCommandModeType.MOVE.id); + command.setOriginLev(sourceLev); + command.setTargetLev(targetLev); + return command; + } + + //鎵樼洏鍑哄叆 + @Override + public LiftCommand getPalletInOutCommand(Integer taskNo, Integer sourceLev, Integer targetLev, Integer originSta, Integer targetSta, LiftCommandModeType mode) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "lifterTask"); + 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("startLayer", sourceLev); + body.put("endLayer", targetLev); + body.put("startLocation", originSta); + body.put("endLocation", targetSta); + body.put("model", 1);//鎵樼洏鍑哄叆 + + LiftCommand command = new LiftCommand(); + command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(LiftCommandModeType.PALLET_INOUT.id); + command.setOriginLev(sourceLev); + command.setTargetLev(targetLev); + command.setOriginSta(originSta); + command.setTargetSta(targetSta); + return command; + } + + //閿佸畾/瑙i攣鎻愬崌鏈� + @Override + public LiftCommand getLockCommand(Integer taskNo, Boolean lock) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "lifterOperation"); + 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("operation", lock ? 6 : 7); + body.put("remark", taskNo); + + LiftCommand command = new LiftCommand(); + command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(lock ? LiftCommandModeType.LOCK.id : LiftCommandModeType.UNLOCK.id); + return command; + } + + //灏忚溅宸插埌浣�/宸查┒绂讳俊鍙� + @Override + public LiftCommand getShuttleSignalCommand(Integer taskNo, Boolean signal) { + HashMap<String, Object> body = new HashMap<>(); + body.put("messageName", "lifterOperation"); + 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("operation", signal ? 4 : 5); + + LiftCommand command = new LiftCommand(); + command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); + command.setBody(JSON.toJSONString(body)); + command.setMode(signal ? LiftCommandModeType.LOCK.id : LiftCommandModeType.UNLOCK.id); + return command; + } + + /** + * 鎵╁睍瀛楁 + */ + @Data + private class InnerLiftExtend { + + /** + * 鎻愬崌鏈洪攣瀹� + */ + private Boolean lock = false; + + } + } -- Gitblit v1.9.1