package com.zy.asrs.wcs.rcs.thread.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; 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.core.entity.Loc; import com.zy.asrs.wcs.core.model.command.LiftCommand; import com.zy.asrs.wcs.core.model.command.ShuttleCommand; import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType; import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType; import com.zy.asrs.wcs.core.service.LocService; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.cache.OutputQueue; import com.zy.asrs.wcs.rcs.model.enums.LiftProtocolStatusType; import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; 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; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @Slf4j @SuppressWarnings("all") public class SurayLiftThread implements LiftThread { private static final String API_URL = "http://127.0.0.1:8082"; private Device device; private RedisUtil redisUtil; private LiftProtocol liftProtocol; public SurayLiftThread(Device device,RedisUtil redisUtil) { this.device = device; this.redisUtil = redisUtil; } @Override public void run() { News.info("{}号提升机线程启动", device.getDeviceNo()); this.connect(); while (true) { try { read(); Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } } } private void read() { try { readStatus(); // //提升机处于运行状态,将标记置为false // if (liftProtocol.getBusy()) { // liftProtocol.setPakMk(false); // } // // //提升机处于未运行、就绪、标记true、有任务号 // if (!liftProtocol.getBusy() // && !liftProtocol.getPakMk() // && liftProtocol.getTaskNo() != 0) { // //还有未完成的命令 // executeWork(liftProtocol.getTaskNo()); // } } 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())); } } private void readStatus() { try { //获取提升机数据 JSONObject data = requestDeviceStatus(); if (data != null) { if (null == liftProtocol) { liftProtocol = new LiftProtocol(); liftProtocol.setLiftNo(Integer.valueOf(device.getDeviceNo())); liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); liftProtocol.setDevice(device); InnerLiftExtend innerLiftExtend = new InnerLiftExtend(); innerLiftExtend.setLock(false);//默认未锁定 liftProtocol.setExtend(innerLiftExtend); } //----------读取提升机状态----------- //模式 liftProtocol.setModel(true); //运行状态 liftProtocol.setRun(data.getInteger("runningstate") == 1); //就绪状态 liftProtocol.setReady(data.getInteger("readyState") == 1); //有托盘 liftProtocol.setHasTray(data.getString("haveCargo").equals("Y")); //有小车 liftProtocol.setHasCar(data.getString("haveCar").equals("Y")); //故障码 liftProtocol.setErrorCode(""); //层 liftProtocol.setLev(data.getInteger("curFloor")); //************补充扩展字段************* InnerLiftExtend liftExtend = JSON.parseObject(JSON.toJSONString(liftProtocol.getExtend()), InnerLiftExtend.class); liftExtend.setLock(data.getInteger("lockStatus") == 1 ? true : false); liftProtocol.setExtend(liftExtend); // //前超限 // liftProtocol.setFrontOverrun(status1[4]); // //后超限 // liftProtocol.setBackOverrun(status1[5]); // //左超限 // liftProtocol.setLeftOverrun(status1[6]); // //右超限 // liftProtocol.setRightOverrun(status1[7]); // //超高 // liftProtocol.setOverHeight(status2[0]); // //超重 // liftProtocol.setOverWeight(status2[1]); // //有托盘 // liftProtocol.setHasTray(status2[5]); // //有小车 // liftProtocol.setHasCar(status2[6]); // //设备故障 // liftProtocol.setDeviceError(status2[7]); // //任务号 // liftProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 2)); // //目的地址 // liftProtocol.setDistAddress(siemensS7Net.getByteTransform().TransInt16(result1.Content, 4)); // //已完成任务号 // liftProtocol.setCompleteTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 6)); // liftProtocol.setLev(lev); }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())); } Thread.sleep(200); } 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())); } } @Override public boolean connect() { return false; } @Override public void close() { } @Override public LiftProtocol getStatus() { return this.liftProtocol; } @Override public Device getDevice() { return this.device; } @Override public synchronized boolean move(LiftCommand command) { try { String loginToken = requestLoginToken(); if (loginToken == null) { return false; } HashMap 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 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 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 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() { InnerLiftExtend extend = (InnerLiftExtend) liftProtocol.getExtend();//获取扩展字段 // 判断提升机是否自动、就绪、空闲、未锁定 if (liftProtocol.getModel() && !liftProtocol.getRun() && liftProtocol.getReady() && !extend.getLock() ) { return true; } return false; } //***************设备层通讯-不同厂商设备通讯方案不一致*************** //请求登录 private String requestLoginToken() { try { HashMap param = new HashMap<>(); param.put("username", "admin"); param.put("password", "admin123"); param.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); String response = new HttpHandler.Builder() .setUri(API_URL) .setPath("/RDS/loginToken") .setJson(JSON.toJSONString(param)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); Integer code = jsonObject.getInteger("code"); if (code.equals(200)) { return jsonObject.getString("token"); } } catch (Exception e) { e.printStackTrace(); } return null; } //获取设备状态 private JSONObject requestDeviceStatus() { //模拟数据 String data = "[{\"taskNo\":1244,\"curFloor\":2,\"readyState\":1,\"haveCar\":'N',\"completeTaskNo\":0,\"haveCargo\":\"Y\",\"runningstate\":0,\"floors\":[{\"floor\":1,\"location\":1,\"run\":1,\"error\":1,\"cargoState\":\"Y\"},{\"floor\":1,\"location\":2,\"run\":0,\"error\":0,\"cargoState\":\"N\"}]}]"; return JSON.parseArray(data).getJSONObject(0); // try { // String loginToken = requestLoginToken(); // if (loginToken == null) { // return null; // } // // HashMap headers = new HashMap<>(); // headers.put("Authorization", "Bearer " + loginToken); // // HashMap param = new HashMap<>(); // param.put("messageName", "deviceRgvStatus"); // param.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // param.put("deviceNo", device.getDeviceNo()); // String response = new HttpHandler.Builder() // .setUri(API_URL) // .setPath("/RDS/deviceLifterStatus") // .setHeaders(headers) // .setJson(JSON.toJSONString(param)) // .build() // .doPost(); // JSONObject jsonObject = JSON.parseObject(response); // Integer code = jsonObject.getInteger("code"); // if (code.equals(200)) { // return jsonObject.getJSONArray("data").getJSONObject(0); // } // } catch (Exception e) { // e.printStackTrace(); // } // return null; } //空载移动 @Override public LiftCommand getEmptyMoveCommand(Integer taskNo, Integer targetLev) { HashMap 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", 3);//空载移动 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 originLev, Integer targetLev) { HashMap 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", originLev); 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(originLev); command.setTargetLev(targetLev); return command; } //托盘出入 @Override public LiftCommand getPalletInOutCommand(Integer taskNo, Integer originLev, Integer targetLev, Integer originSta, Integer targetSta) { HashMap 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", originLev); 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(originLev); command.setTargetLev(targetLev); command.setOriginSta(originSta); command.setTargetSta(targetSta); return command; } //锁定/解锁提升机 @Override public LiftCommand getLockCommand(Integer taskNo, Boolean lock) { HashMap 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 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; } }