From a40b871aa511865d1a7363c88ffb733f6b084d35 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 02 三月 2026 17:14:15 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java       |   21 +++++
 src/main/java/com/zy/core/model/command/StationCommand.java            |    3 
 src/main/java/com/zy/asrs/controller/StationController.java            |   90 ++++++++++++++++++---
 src/main/webapp/components/DevpCard.js                                 |   79 +++++++++++++++++++
 src/main/java/com/zy/core/network/fake/ZyStationFakeSegConnect.java    |   21 +++++
 src/main/java/com/zy/asrs/domain/param/StationCommandBarcodeParam.java |   14 +++
 6 files changed, 211 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/StationController.java b/src/main/java/com/zy/asrs/controller/StationController.java
index d232d99..75a7367 100644
--- a/src/main/java/com/zy/asrs/controller/StationController.java
+++ b/src/main/java/com/zy/asrs/controller/StationController.java
@@ -1,12 +1,18 @@
 package com.zy.asrs.controller;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.asrs.domain.param.StationCommandBarcodeParam;
 import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.DeviceConfig;
 import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.DeviceConfigService;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.StationCommandType;
 import com.zy.core.model.StationObjModel;
+import com.zy.system.entity.Config;
+import com.zy.system.service.ConfigService;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,10 +35,16 @@
 @RequestMapping("/station")
 public class StationController {
 
+    @Value("${mainProcessPlugin}")
+    private String mainProcessPlugin;
     @Autowired
     private BasDevpService basDevpService;
     @Autowired
     private RedisUtil redisUtil;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private DeviceConfigService deviceConfigService;
 
     @PostMapping("/command/move")
     public R commandMove(@RequestBody StationCommandMoveParam param) {
@@ -44,21 +56,7 @@
         Integer taskNo = param.getTaskNo();
         Integer targetStationId = param.getTargetStationId();
 
-        StationObjModel finalStation = null;
-        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>());
-        for (BasDevp basDevp : basDevps) {
-            List<StationObjModel> list = basDevp.getStationList$();
-            for (StationObjModel entity : list) {
-                if(entity.getStationId().equals(stationId)){
-                    finalStation = entity;
-                    break;
-                }
-            }
-
-            if(finalStation != null){
-                break;
-            }
-        }
+        StationObjModel finalStation = findStation(stationId);
 
         if(finalStation == null){
             return R.error("绔欑偣涓嶅瓨鍦�");
@@ -76,6 +74,51 @@
         return R.ok();
     }
 
+    @PostMapping("/command/barcode")
+    public R commandBarcode(@RequestBody StationCommandBarcodeParam param) {
+        if (Cools.isEmpty(param) || Cools.isEmpty(param.getStationId())) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+
+        if (!mainProcessPlugin.contains("Fake")) {
+            return R.error("褰撳墠绯荤粺鏈惎鐢ㄤ豢鐪熸彃浠�");
+        }
+
+        Config enableFakeConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "enableFake"));
+        if (enableFakeConfig == null || !"Y".equals(enableFakeConfig.getValue())) {
+            return R.error("褰撳墠闈炰豢鐪熻繍琛屾ā寮忥紝绂佹淇敼鏉$爜");
+        }
+
+        Integer stationId = param.getStationId();
+        StationObjModel finalStation = findStation(stationId);
+        if (finalStation == null) {
+            return R.error("绔欑偣涓嶅瓨鍦�");
+        }
+
+        Integer devpNo = finalStation.getDeviceNo();
+        DeviceConfig deviceConfig = deviceConfigService.selectOne(new EntityWrapper<DeviceConfig>()
+                .eq("device_no", devpNo)
+                .eq("device_type", String.valueOf(SlaveType.Devp)));
+        if (deviceConfig == null || deviceConfig.getFake() == null || deviceConfig.getFake() != 1) {
+            return R.error("褰撳墠绔欑偣璁惧鏈惎鐢ㄤ豢鐪燂紝绂佹淇敼鏉$爜");
+        }
+
+        StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, devpNo);
+        if (stationThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+
+        String barcode = param.getBarcode();
+        if (barcode == null) {
+            barcode = "";
+        }
+
+        StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, 9997, stationId, stationId, 0);
+        command.setBarcode(barcode.trim());
+        MessageQueue.offer(SlaveType.Devp, devpNo, new Task(2, command));
+        return R.ok();
+    }
+
     @PostMapping("/command/reset")
     public R commandReset(@RequestBody StationCommandMoveParam param) {
         if (Cools.isEmpty(param)) {
@@ -87,4 +130,21 @@
         return R.ok();
     }
 
+    private StationObjModel findStation(Integer stationId) {
+        if (Cools.isEmpty(stationId)) {
+            return null;
+        }
+
+        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>());
+        for (BasDevp basDevp : basDevps) {
+            List<StationObjModel> list = basDevp.getStationList$();
+            for (StationObjModel entity : list) {
+                if (entity.getStationId().equals(stationId)) {
+                    return entity;
+                }
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/domain/param/StationCommandBarcodeParam.java b/src/main/java/com/zy/asrs/domain/param/StationCommandBarcodeParam.java
new file mode 100644
index 0000000..2764be7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/StationCommandBarcodeParam.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class StationCommandBarcodeParam {
+
+    // 绔欑偣缂栧彿
+    private Integer stationId;
+
+    // 鏉$爜鍊硷紙鍏佽涓虹┖瀛楃涓诧級
+    private String barcode;
+
+}
diff --git a/src/main/java/com/zy/core/model/command/StationCommand.java b/src/main/java/com/zy/core/model/command/StationCommand.java
index a896e33..6ff4356 100644
--- a/src/main/java/com/zy/core/model/command/StationCommand.java
+++ b/src/main/java/com/zy/core/model/command/StationCommand.java
@@ -23,4 +23,7 @@
 
     private StationCommandType commandType;
 
+    // 浠跨湡妯″紡涓嬪彲閫夛細鎵嬪伐鎸囧畾鏉$爜
+    private String barcode;
+
 }
diff --git a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
index 99d4dd9..c5ac97e 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -129,6 +129,10 @@
         }
 
         if(commandType == StationCommandType.WRITE_INFO){
+            if (command.getBarcode() != null) {
+                updateStationBarcode(deviceNo, stationId, command.getBarcode());
+                return;
+            }
             if (taskNo == 9998 && targetStationId == 0) {
                 //鐢熸垚鍑哄簱绔欑偣浠跨湡鏁版嵁
                 generateFakeOutStationData(deviceNo, stationId);
@@ -199,6 +203,23 @@
         }
     }
 
+    private void updateStationBarcode(Integer deviceNo, Integer stationId, String barcode) {
+        List<ZyStationStatusEntity> statusList = deviceStatusMap.get(deviceNo);
+        if (statusList == null) {
+            return;
+        }
+
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        synchronized (status) {
+            status.setBarcode(barcode);
+        }
+    }
+
     private void currentLevCommand(StationCommand command, boolean generateBarcode) {
         NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
         if (navigateUtils == null) {
diff --git a/src/main/java/com/zy/core/network/fake/ZyStationFakeSegConnect.java b/src/main/java/com/zy/core/network/fake/ZyStationFakeSegConnect.java
index ccf3230..b5a077f 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeSegConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeSegConnect.java
@@ -411,6 +411,10 @@
         }
 
         if (command.getCommandType() == StationCommandType.WRITE_INFO) {
+            if (command.getBarcode() != null) {
+                updateStationBarcode(deviceNo, stationId, command.getBarcode());
+                return;
+            }
             if (taskNo == 9998 && targetStationId == 0) {
                 // 鐢熸垚鍑哄簱绔欑偣浠跨湡鏁版嵁
                 generateFakeOutStationData(deviceNo, stationId);
@@ -466,6 +470,23 @@
         }
     }
 
+    private void updateStationBarcode(Integer deviceNo, Integer stationId, String barcode) {
+        List<ZyStationStatusEntity> statusList = deviceStatusMap.get(deviceNo);
+        if (statusList == null) {
+            return;
+        }
+
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        synchronized (status) {
+            status.setBarcode(barcode);
+        }
+    }
+
     // segmentedPathCommand 鏂规硶宸插垹闄わ紝鍔熻兘宸叉暣鍚堝埌 runTaskLoop
 
     private Integer getDeviceNoByStationId(Integer stationId) {
diff --git a/src/main/webapp/components/DevpCard.js b/src/main/webapp/components/DevpCard.js
index 20de078..361ba72 100644
--- a/src/main/webapp/components/DevpCard.js
+++ b/src/main/webapp/components/DevpCard.js
@@ -53,9 +53,9 @@
                       />
                       <div style="margin-top: 4px; font-size: 12px; word-break: break-all;">{{ item.barcode }}</div>
                     </div>
-                    <span slot="reference" style="cursor: pointer; color: #409EFF;">{{ item.barcode }}</span>
+                    <span slot="reference" @click.stop="handleBarcodeClick(item)" style="cursor: pointer; color: #409EFF;">{{ item.barcode }}</span>
                   </el-popover>
-                  <span v-else>-</span>
+                  <span v-else @click.stop="handleBarcodeClick(item)" style="cursor: pointer; color: #409EFF;">-</span>
                 </el-descriptions-item>
                 <el-descriptions-item label="閲嶉噺">{{ item.weight }}</el-descriptions-item>
                 <el-descriptions-item label="鏁呴殰浠g爜">{{ item.error }}</el-descriptions-item>
@@ -303,6 +303,81 @@
         }
       }
     },
+    handleBarcodeClick(item) {
+      if (this.readOnly || !item || item.stationId == null) {
+        return;
+      }
+
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/openapi/getFakeSystemRunStatus",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        method: "get",
+        success: (res) => {
+          if (res.code !== 200 || !res.data || !res.data.isFake || !res.data.running) {
+            that.$message({
+              message: "浠呬豢鐪熸ā寮忚繍琛屼腑鍙慨鏀规潯鐮�",
+              type: "warning",
+            });
+            return;
+          }
+
+          that.$prompt("璇疯緭鍏ユ柊鐨勬潯鐮佸�硷紙鍙暀绌烘竻绌猴級", "淇敼鏉$爜", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            inputValue: item.barcode || "",
+            inputPlaceholder: "璇疯緭鍏ユ潯鐮�",
+          }).then(({ value }) => {
+            that.updateStationBarcode(item.stationId, value == null ? "" : String(value).trim());
+          }).catch(() => {});
+        },
+      });
+    },
+    updateStationBarcode(stationId, barcode) {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/station/command/barcode",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify({
+          stationId: stationId,
+          barcode: barcode,
+        }),
+        success: (res) => {
+          if (res.code == 200) {
+            that.syncLocalBarcode(stationId, barcode);
+            that.$message({
+              message: "鏉$爜淇敼鎴愬姛",
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg || "鏉$爜淇敼澶辫触",
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
+    syncLocalBarcode(stationId, barcode) {
+      let updateFn = (list) => {
+        if (!list || list.length === 0) {
+          return;
+        }
+        list.forEach((row) => {
+          if (row.stationId == stationId) {
+            row.barcode = barcode;
+          }
+        });
+      };
+      updateFn(this.stationList);
+      updateFn(this.fullStationList);
+    },
     openControl() {
       this.showControl = !this.showControl;
     },

--
Gitblit v1.9.1