src/main/java/com/zy/asrs/controller/ConsoleController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/vo/ScaleDataVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/ServerBootstrap.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/ScaleThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/css/console.css | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/console.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -1,6 +1,7 @@ package com.zy.asrs.controller; import com.core.annotations.ManagerAuth; import com.core.common.Arith; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.domain.enums.CrnStatusType; @@ -25,6 +26,7 @@ import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.ScaleThread; import com.zy.core.thread.SiemensCrnThread; import com.zy.core.DevpThread; import lombok.extern.slf4j.Slf4j; @@ -166,6 +168,23 @@ return R.ok().add(list); } @PostMapping("/latest/data/scale") @ManagerAuth(memo = "磅秤实时数据") public R scaleLatestData(){ List<ScaleDataVo> list = new ArrayList<>(); for (Slave scale : slaveProperties.getScale()) { ScaleThread scaleThread = (ScaleThread) SlaveConnection.get(SlaveType.Scale, scale.getId()); if (null == scaleThread) { continue; } ScaleDataVo vo = new ScaleDataVo(); vo.setScaleId(scale.getId()); vo.setValue(String.valueOf(Arith.multiplys(1, scaleThread.getScale(), 1))); list.add(vo); } return R.ok().add(list); } /****************************************************************/ /************************** 详情操作 ******************************/ /****************************************************************/ src/main/java/com/zy/asrs/domain/vo/ScaleDataVo.java
New file @@ -0,0 +1,18 @@ package com.zy.asrs.domain.vo; import lombok.Data; /** * 磅秤实时数据视图对象 * Created by vincent on 2020-06-03 */ @Data public class ScaleDataVo { // 磅秤编号 private Integer scaleId; // 磅秤内容 private String value; } src/main/java/com/zy/core/ServerBootstrap.java
@@ -78,7 +78,6 @@ new Thread((Runnable) crnThread).start(); SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread); } // 初始化输送线线程 log.info("初始化输送线线程..................................................."); for (DevpSlave devp : slaveProperties.getDevp()) { @@ -86,7 +85,6 @@ new Thread((Runnable) devpThread).start(); SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread); } // 初始化条码扫描仪线程 log.info("初始化条码扫描仪线程..................................................."); for (Slave barcode : slaveProperties.getBarcode()) { @@ -101,6 +99,13 @@ new Thread(ledThread).start(); SlaveConnection.put(SlaveType.Led, led.getId(), ledThread); } // 初始化磅秤线程 log.info("初始化磅秤线程..................................................."); for (Slave scale : slaveProperties.getScale()) { ScaleThread barcodeThread = new ScaleThread(scale); new Thread(barcodeThread).start(); SlaveConnection.put(SlaveType.Scale, scale.getId(), barcodeThread); } } src/main/java/com/zy/core/thread/ScaleThread.java
New file @@ -0,0 +1,136 @@ package com.zy.core.thread; import com.core.common.Cools; import com.zy.core.Slave; import com.zy.core.ThreadHandler; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketTimeoutException; /** * 磅秤线程 * Created by vincent on 2020/8/4 */ @Data @Slf4j public class ScaleThread implements Runnable, ThreadHandler { private Slave slave; private Double scale = 0.0D; private Socket socket; private DataOutputStream dataOutputStream; private DataInputStream dataInputStream; public ScaleThread(Slave slave) { this.slave = slave; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { connect(); while (true) { try { byte[] read = read(8, 100); if (null != read) { String s = new String(read); if (!Cools.isEmpty(s) && s.startsWith("=")) { scale = Double.parseDouble(s.substring(1)); } } Thread.sleep(100); } catch (SocketTimeoutException ignore) { } catch (Exception e) { // e.printStackTrace(); } } } @Override public boolean connect() { try { close(); //1.主动释放连接 //2.某些服务器对指定ip有链路数限制 socket = new Socket(); //socket.setKeepAlive(true); SocketAddress socketAddress = new InetSocketAddress(slave.getIp(), slave.getPort()); socket.connect(socketAddress, 1000); //某些服务器ping延迟高时要增加,否则会报错connect timeout dataOutputStream = new DataOutputStream(socket.getOutputStream()); dataInputStream = new DataInputStream(socket.getInputStream()); // log.info("条码扫描仪连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } catch (Exception e) { socket = null; log.error("条码扫描仪连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } return true; } @Override public void close() { try { if (null != dataOutputStream) { dataOutputStream.close(); } if (null != dataInputStream) { dataInputStream.close(); } // if (null != socket && !socket.isClosed()) { // socket.close(); // } if (null != socket){ socket.close(); } socket = null; } catch (IOException e) { log.error("SocketClient close Exception:" + e.getMessage()); } } public void write(byte[] msg, int len) throws IOException { if (null != dataInputStream) { dataOutputStream.write(msg, 0, len); dataOutputStream.flush(); } } public byte[] read(int bufferSize, int timeOut) throws IOException { // if (socket == null) { // connect(); // } connect(); socket.setSoTimeout(timeOut); byte[] bytes = new byte[bufferSize]; int len = dataInputStream.read(bytes); byte[] tempBytes = null; if (len > 0) { tempBytes = new byte[len]; System.arraycopy(bytes, 0, tempBytes, 0, len); } return tempBytes; } public boolean valid() throws Exception { if (null == socket || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { if (dataInputStream != null) { dataInputStream.close(); } if (dataOutputStream != null) { dataOutputStream.close(); } if (socket != null) { socket.close(); } return false; } return true; } } src/main/webapp/static/css/console.css
@@ -465,6 +465,21 @@ font-size: xx-small; margin-left: 35px; } /* 磅秤 */ .scale { position: absolute; width: 50px; height: 20px; /*background-image: url("../image/bscanner.png");*/ background-repeat: no-repeat; background-size:100% 60%; background-position: top center; } /* 磅秤1 */ #scale-1 { top: 290px; left: 240px; } /* 弹窗 */ form .form-item { src/main/webapp/views/console.html
@@ -89,6 +89,10 @@ <div id="code-decoder-2" class="code-decoder"> <span id="code-decoder-data-2" class="code-decoder-data">0</span> </div> <!-- 磅秤 --> <div class="scale" id="scale-1"> <button id="scale-data-1">磅秤</button> </div> <!----------- 左输送线 ----------> @@ -528,11 +532,13 @@ getCrnInfo(); getSystemRunningStatus(); getBarcodeInfo(); getScaleInfo(); // 实时访问 setInterval(function () { getCrnInfo(); getSystemRunningStatus(); getBarcodeInfo() getBarcodeInfo(); getScaleInfo(); }, 1000); setInterval(function () { getSitesInfo(); @@ -689,6 +695,29 @@ }); } // 磅秤实时数据获取 function getScaleInfo(){ $.ajax({ url: baseUrl+ "/console/latest/data/scale", headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { if (res.code === 200){ var sclaes = res.data; for (var i = 0; i < sclaes.length; i++){ console.log(sclaes[i].scaleId + ":" + sclaes[i].value) $("#scale-data-"+sclaes[i].scaleId).text(sclaes[i].value); } } else if (res.code === 403){ parent.location.href = baseUrl+"/login"; } else { console.log(res.msg); } } }); } // 堆垛机偏移动画 function crnAnimate(id, leftVal) { switch (id) {