luxiaotao1123
2021-01-30 4aaf4991f544da347574c1abb10c72762e60a9b1
#磅秤
4个文件已修改
2个文件已添加
228 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ScaleDataVo.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ScaleThread.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/console.css 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 31 ●●●●● 补丁 | 查看 | 原始文档 | 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) {