#
zy
2025-07-17 f4d696baffce9c3bd8653a3598eb69f0962a5e92
#
2个文件已添加
5个文件已修改
270 ■■■■■ 已修改文件
src/main/java/com/zy/core/controller/OpenController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/param/GetFakeThreadStatusParam.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/param/UpdateFakeThreadStatusParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/FakeThread.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/fake/FakeZyForkLiftThread.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/controller/OpenController.java
@@ -1,10 +1,14 @@
package com.zy.core.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zy.common.R;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.param.AddFakeDeviceParam;
import com.zy.core.model.param.DeleteDeviceParam;
import com.zy.core.model.param.GetFakeThreadStatusParam;
import com.zy.core.model.param.UpdateFakeThreadStatusParam;
import com.zy.core.properties.DeviceConfig;
import com.zy.core.thread.FakeThread;
import com.zy.core.thread.ForkLiftThread;
@@ -18,6 +22,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@RestController
@RequestMapping("/open")
@@ -41,8 +46,51 @@
        return R.ok().add(map);
    }
    @GetMapping("/getFakeThreadList")
    public R getFakeThreadList() {
    @PostMapping("/updateFakeThreadStatus")
    public R updateFakeThreadStatus(@RequestBody UpdateFakeThreadStatusParam param) {
        FakeThread fakeThread = null;
        if (param.getDeviceType().equals(String.valueOf(SlaveType.Shuttle))) {
            fakeThread = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 1);
        } else if (param.getDeviceType().equals(String.valueOf(SlaveType.ForkLift))) {
            fakeThread = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 1);
        }
        if (fakeThread == null) {
            return R.error("找不到设备线程");
        }
        boolean result = fakeThread.updateFakeStatus(param);
        if (result) {
            return R.ok();
        }
        return R.error("更新失败");
    }
    @PostMapping("/getFakeThreadStatus")
    public R getFakeThreadStatus(@RequestBody GetFakeThreadStatusParam param) {
        FakeThread fakeThread = null;
        if (param.getDeviceType().equals(String.valueOf(SlaveType.Shuttle))) {
            fakeThread = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 1);
        } else if (param.getDeviceType().equals(String.valueOf(SlaveType.ForkLift))) {
            fakeThread = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 1);
        }
        if (fakeThread == null) {
            return R.error("找不到设备线程");
        }
        ConcurrentHashMap<String, JSONObject> fakeStatusMap = fakeThread.getFakeStatusMap();
        String key = param.getDeviceType() + param.getDeviceNo();
        JSONObject result = fakeStatusMap.get(key);
        if (result == null) {
            return R.error("数据不存在");
        }
        return R.ok().add(result);
    }
    @GetMapping("/getFakeThreadStatusList")
    public R getFakeThreadStatusList() {
        FakeThread fakeThread1 = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 1);
        FakeThread fakeThread2 = (FakeThread) SlaveConnection.get(SlaveType.FakeThread, 2);
src/main/java/com/zy/core/model/param/GetFakeThreadStatusParam.java
New file
@@ -0,0 +1,13 @@
package com.zy.core.model.param;
import lombok.Data;
@Data
public class GetFakeThreadStatusParam {
    private Integer deviceNo;
    private String deviceType;
}
src/main/java/com/zy/core/model/param/UpdateFakeThreadStatusParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.core.model.param;
import lombok.Data;
@Data
public class UpdateFakeThreadStatusParam {
    private Integer deviceNo;
    private String deviceType;
    private String data;
}
src/main/java/com/zy/core/thread/FakeThread.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.zy.core.ThreadHandler;
import com.zy.core.model.param.UpdateFakeThreadStatusParam;
import java.util.concurrent.ConcurrentHashMap;
@@ -13,4 +14,6 @@
    ConcurrentHashMap<String, JSONObject> getFakeCommandMap();
    boolean updateFakeStatus(UpdateFakeThreadStatusParam param);
}
src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java
@@ -3,11 +3,13 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zy.common.Cools;
import com.zy.common.R;
import com.zy.common.SpringUtils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.param.UpdateFakeThreadStatusParam;
import com.zy.core.properties.DeviceConfig;
import com.zy.core.thread.FakeThread;
import com.zy.core.thread.impl.NyShuttleThread;
@@ -334,6 +336,15 @@
                    String pathList = body.getString("path");
                    List<JSONObject> list = JSON.parseArray(pathList, JSONObject.class);
                    for (JSONObject path : list) {
                        while (true) {
                            JSONObject realFakeStatus = fakeStatusMap.get(key);
                            Integer errorCode = realFakeStatus.getInteger("errorCode");
                            if (errorCode > 0) {
                                continue;
                            }
                            break;
                        }
                        String currentCode = fakeStatus.getString("currentCode");
                        JSONObject point = JSON.parseObject(currentCode);
                        point.put("x", path.getInteger("xp"));
@@ -529,4 +540,17 @@
    public ConcurrentHashMap<String, JSONObject> getFakeCommandMap() {
        return this.fakeCommandMap;
    }
    @Override
    public boolean updateFakeStatus(UpdateFakeThreadStatusParam param) {
        String key = param.getDeviceType() + param.getDeviceNo();
        JSONObject result = fakeStatusMap.get(key);
        if (result == null) {
            return false;
        }
        JSONObject newData = JSON.parseObject(param.getData());
        this.fakeStatusMap.put(key, newData);
        return true;
    }
}
src/main/java/com/zy/core/thread/fake/FakeZyForkLiftThread.java
@@ -11,6 +11,7 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DeviceCommandMsgModel;
import com.zy.core.model.DeviceMsgModel;
import com.zy.core.model.param.UpdateFakeThreadStatusParam;
import com.zy.core.properties.DeviceConfig;
import com.zy.core.thread.FakeThread;
import com.zy.core.thread.impl.ZyForkLiftThread;
@@ -376,4 +377,17 @@
    public ConcurrentHashMap<String, JSONObject> getFakeCommandMap() {
        return this.fakeCommandMap;
    }
    @Override
    public boolean updateFakeStatus(UpdateFakeThreadStatusParam param) {
        String key = param.getDeviceType() + param.getDeviceNo();
        JSONObject result = fakeStatusMap.get(key);
        if (result == null) {
            return false;
        }
        JSONObject newData = JSON.parseObject(param.getData());
        this.fakeStatusMap.put(key, newData);
        return true;
    }
}
src/main/webapp/views/index.html
@@ -18,19 +18,20 @@
<body>
<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
    <div style="width: 50%;">
    <div style="width: 40%;">
        <el-card class="box-card">
            <div slot="header" class="clearfix">
                <span>模拟设备 - {{ systemInfo.gatewayId }}号网关</span>
                <el-button style="float: right; padding: 3px 0" type="text" @click="addDeviceVisible = true">添加设备</el-button>
<!--                <el-button style="float: right; padding: 3px 0" type="text" @click="addDeviceVisible = true">添加设备</el-button>-->
            </div>
            <div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
                <div v-for="item in deviceList" style="width: 49%;margin-top: 20px">
                    <el-card  class="box-card">
                    <el-card  class="box-card" >
                        <div slot="header" class="clearfix">
                            <span>{{ item.deviceType }} - {{ item.deviceNo }}</span>
                            <el-button style="float: right; padding: 3px 0" type="text" @click="delDevice(item)">删除设备</el-button>
<!--                            <el-button style="float: right; padding: 3px 0" type="text" @click="delDevice(item)">删除设备</el-button>-->
                            <el-button style="float: right; padding: 3px 0" type="text" @click="setCurrentDeviceConfig(item)">状态</el-button>
                        </div>
                        <div>
@@ -45,6 +46,58 @@
        </el-card>
    </div>
    <div v-if="currentDeviceConfig != null" style="width: 30%;margin-left: 30px;">
        <el-card class="box-card">
            <div slot="header" class="clearfix">
                <span>模拟设备状态</span>
            </div>
            <div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
                <div v-if="currentDeviceData != null" style="width: 100%;margin-top: 20px">
                    <el-card class="box-card" >
                        <div slot="header" class="clearfix">
                            <span>{{ currentDeviceData.deviceType }} - {{ currentDeviceData.deviceNo }}</span>
                            <el-button v-if="currentDeviceDataForm == null" style="float: right; padding: 3px 0" type="text" @click="updateCurrentDeviceStatus(currentDeviceData)">更新状态</el-button>
                            <el-button v-else style="float: right; padding: 3px 0" type="text" @click="submitUpdateCurrentDeviceStatus(currentDeviceDataForm)">提交更新</el-button>
                        </div>
                        <div v-if="currentDeviceDataForm == null">
                            <div>模式: {{ currentDeviceData.data.mode }}</div>
                            <div>状态: {{ currentDeviceData.data.deviceStatus }}</div>
                            <div>顶升: {{ currentDeviceData.data.hasLift }}</div>
                            <div>托盘: {{ currentDeviceData.data.hasPallet }}</div>
                            <div>坐标: {{ currentDeviceData.data.currentCode }}</div>
                            <div>异常: {{ currentDeviceData.data.errorCode }}</div>
                            <div>充电: {{ currentDeviceData.data.hasCharge }}</div>
                            <div>电量: {{ currentDeviceData.data.batteryPower }}</div>
                            <div>电压: {{ currentDeviceData.data.batteryVoltage }}</div>
                            <div>运行方向: {{ currentDeviceData.data.runDirection }}</div>
                            <div>速度: {{ currentDeviceData.data.speed }}</div>
                        </div>
                        <div v-else>
                            <div>模式: <el-input v-model="currentDeviceDataForm.data.mode"></el-input></div>
                            <div>状态: <el-input v-model="currentDeviceDataForm.data.deviceStatus"></el-input></div>
                            <div>顶升: <el-input v-model="currentDeviceDataForm.data.hasLift"></el-input></div>
                            <div>托盘: <el-input v-model="currentDeviceDataForm.data.hasPallet"></el-input></div>
                            <div>坐标: <el-input v-model="currentDeviceDataForm.data.currentCode"></el-input></div>
                            <div>异常: <el-input v-model="currentDeviceDataForm.data.errorCode"></el-input></div>
                            <div>充电: <el-input v-model="currentDeviceDataForm.data.hasCharge"></el-input></div>
                            <div>电量: <el-input v-model="currentDeviceDataForm.data.batteryPower"></el-input></div>
                            <div>电压: <el-input v-model="currentDeviceDataForm.data.batteryVoltage"></el-input></div>
                            <div>运行方向: <el-input v-model="currentDeviceDataForm.data.runDirection"></el-input></div>
                            <div>速度: <el-input v-model="currentDeviceDataForm.data.speed"></el-input></div>
                        </div>
                        <div>
                            原始数据:
                            {{ currentDeviceData }}
                        </div>
                    </el-card>
                </div>
            </div>
        </el-card>
    </div>
    <el-dialog title="添加模拟设备" :visible.sync="addDeviceVisible">
        <el-form :model="addDeviceParam">
@@ -88,7 +141,10 @@
                gatewayPort: 0
            },
            formLabelWidth: '120px',
            deviceList: []
            deviceList: [],
            currentDeviceConfig: null,
            currentDeviceData: null,
            currentDeviceDataForm: null
        },
        created() {
            this.init()
@@ -99,7 +155,8 @@
                setInterval(() => {
                    this.getDeviceList()
                }, 100);
                    this.getFakeThreadStatus()
                }, 1000);
            },
            getSystemInfo() {
                let that = this;
@@ -125,6 +182,86 @@
                    }
                });
            },
            setCurrentDeviceConfig(deviceConfig) {
                this.currentDeviceConfig = deviceConfig
                this.currentDeviceDataForm = null;
            },
            updateCurrentDeviceStatus(currentDeviceData) {
                if (this.currentDeviceDataForm == null) {
                    this.currentDeviceDataForm = currentDeviceData;
                }else {
                    this.currentDeviceDataForm = null;
                }
            },
            submitUpdateCurrentDeviceStatus(currentDeviceDataForm) {
                let that = this;
                $.ajax({
                    url: baseUrl + "/open/updateFakeThreadStatus",
                    headers: {
                        'token': localStorage.getItem('token')
                    },
                    data: JSON.stringify({
                        deviceType: currentDeviceDataForm.deviceType,
                        deviceNo: currentDeviceDataForm.deviceNo,
                        data: JSON.stringify(currentDeviceDataForm.data)
                    }),
                    dataType: 'json',
                    contentType: 'application/json;charset=UTF-8',
                    method: 'POST',
                    success: function (res) {
                        if (res.code == 200) {
                            that.currentDeviceDataForm = null;
                            that.$message({
                                message: res.msg,
                                type: 'success'
                            });
                        } else {
                            that.$message({
                                message: res.msg,
                                type: 'error'
                            });
                        }
                    }
                });
            },
            getFakeThreadStatus() {
                let that = this;
                if (this.currentDeviceConfig == null) {
                    return;
                }
                $.ajax({
                    url: baseUrl + "/open/getFakeThreadStatus",
                    headers: {
                        'token': localStorage.getItem('token')
                    },
                    data: JSON.stringify({
                        deviceType: this.currentDeviceConfig.deviceType,
                        deviceNo: this.currentDeviceConfig.deviceNo
                    }),
                    dataType: 'json',
                    contentType: 'application/json;charset=UTF-8',
                    method: 'POST',
                    success: function (res) {
                        if (res.code == 200) {
                            let data = res.data;
                            let result = {
                                deviceType: that.currentDeviceConfig.deviceType,
                                deviceNo: that.currentDeviceConfig.deviceNo,
                                data: data
                            }
                            that.currentDeviceData = result
                        } else {
                            that.currentDeviceConfig = null;
                            that.$message({
                                message: res.msg,
                                type: 'error'
                            });
                        }
                    }
                });
            },
            addDevice() {
                //添加设备
                let that = this;