From 5496a3a7b476135208d46dee279f506f9d69a234 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期四, 08 一月 2026 10:54:04 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/plugin/NormalProcess.java                |  160 ++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java |   49 ++++++++++--
 src/main/java/com/zy/core/enums/WrkIoType.java                     |    2 
 src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java       |    4 
 src/main/java/com/zy/asrs/controller/BasMapController.java         |   14 +++
 src/main/java/com/zy/core/enums/RedisKeyType.java                  |    1 
 src/main/resources/application.yml                                 |    2 
 src/main/java/com/zy/core/model/StationObjModel.java               |    2 
 8 files changed, 220 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index fbfd4db..7506271 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -218,8 +218,20 @@
 
                         Integer isBarcodeStation = value.getInteger("isBarcodeStation");
                         if (isBarcodeStation != null && isBarcodeStation == 1) {
+                            StationObjModel barcodeStationModel = new StationObjModel();
+                            barcodeStationModel.setDeviceNo(deviceNo);
+                            barcodeStationModel.setStationId(value.getInteger("stationId"));
+
+                            if (value.getInteger("backStation") != null) {
+                                StationObjModel backStation = new StationObjModel();
+                                barcodeStationModel.setBackStation(backStation);
+
+                                backStation.setDeviceNo(value.getInteger("backStationDeviceNo"));
+                                backStation.setStationId(value.getInteger("backStation"));
+                            }
+
                             List<StationObjModel> barcodeStationList = barcodeStationMap.getOrDefault(deviceNo, new ArrayList<>());
-                            barcodeStationList.add(stationObjModel);
+                            barcodeStationList.add(barcodeStationModel);
                             barcodeStationMap.put(deviceNo, barcodeStationList);
                         }
 
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index da4641c..1154b8f 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -39,6 +39,7 @@
     STATION_OUT_EXECUTE_COMPLETE_LIMIT("station_out_execute_complete_limit_"),
     CHECK_STATION_RUN_BLOCK_LIMIT_("check_station_run_block_limit_"),
     CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"),
+    GENERATE_ENABLE_IN_STATION_DATA_LIMIT("generate_enable_in_station_data_limit_"),
 
     DUAL_CRN_PICK_WAIT_NEXT_TASK("dual_crn_pick_wait_next_task_"),
     DUAL_CRN_OUT_TASK_STATION_INFO("dual_crn_out_task_station_info_"),
diff --git a/src/main/java/com/zy/core/enums/WrkIoType.java b/src/main/java/com/zy/core/enums/WrkIoType.java
index f25d00a..ecde168 100644
--- a/src/main/java/com/zy/core/enums/WrkIoType.java
+++ b/src/main/java/com/zy/core/enums/WrkIoType.java
@@ -7,8 +7,6 @@
     IN(1, "鍏ュ簱"),
     OUT(101, "鍑哄簱"),
     LOC_MOVE(201, "绉诲簱浠诲姟"),
-    PREVIEW_LIFT_MOVE(98, "鎻愬崌鏈洪璋冨害绉诲姩浠诲姟"),
-    MANUAL(99, "鎵嬪姩浠诲姟"),
     FAKE_TASK_NO(9999, "浠跨湡闅忔満宸ヤ綔鍙�"),
     ;
 
diff --git a/src/main/java/com/zy/core/model/StationObjModel.java b/src/main/java/com/zy/core/model/StationObjModel.java
index 0d160ba..4f047cb 100644
--- a/src/main/java/com/zy/core/model/StationObjModel.java
+++ b/src/main/java/com/zy/core/model/StationObjModel.java
@@ -19,4 +19,6 @@
 
     private StationObjModel barcodeStation;
 
+    private StationObjModel backStation;
+
 }
diff --git a/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java b/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
index 8f0af83..4bc50fc 100644
--- a/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
@@ -50,7 +50,7 @@
     @Override
     public boolean connect() {
         boolean connected = false;
-        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
+        siemensNet = new SiemensS7Net(SiemensPLCS.S1500, deviceConfig.getIp());
         OperateResult connect = siemensNet.ConnectServer();
         if (connect.IsSuccess) {
             connected = true;
@@ -66,6 +66,7 @@
             News.error("杈撻�佺珯plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]",
                     deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort());
         }
+//        siemensNet.ConnectClose();
         return connected;
     }
 
@@ -97,6 +98,10 @@
             if (barcodeStatusList != null) {
                 barcodeStatusList.sort(Comparator.comparing(ZyStationStatusEntity::getStationId));
             }
+        }
+
+        if (siemensNet == null) {
+            return statusList;
         }
 
         OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) (statusList.size() * 8));
@@ -146,10 +151,12 @@
             return commandResponse;
         }
 
+        int maxTryCount = 999;
+        int tryCount = 0;
         if (command.getCommandType().equals(StationCommandType.MOVE)) {
             int enableCommandIdx = -1;
             while (true) {
-                enableCommandIdx = getEnableCommandIdx();
+                enableCommandIdx = getEnableCommandIdx(command.getTaskNo());
                 if(enableCommandIdx == -1) {
                     try {
                         Thread.sleep(300);
@@ -157,11 +164,16 @@
                 }else {
                     break;
                 }
+                tryCount++;
+                if (tryCount > maxTryCount) {
+                    commandResponse.setMessage("鍛戒护涓嬪彂瓒呮椂锛屾棤娉曟壘鍒板彲鐢ㄤ笅鍙戝尯鍩�");
+                    return commandResponse;
+                }
             }
 
             List<Integer> pathList = command.getNavigatePath();
 
-            short[] data = new short[22];
+            short[] data = new short[21];
             data[0] = command.getTargetStaNo().shortValue();
 
             int dataIdx = 1;
@@ -169,9 +181,18 @@
                 data[dataIdx++] = path.shortValue();
             }
 
-            OperateResult writeTask = siemensNet.Write("DB23." + enableCommandIdx * taskAddressLength, command.getTaskNo());
-            OperateResult writeData = siemensNet.Write("DB23." + enableCommandIdx * taskAddressLength + 4, data);
-            if(writeTask.IsSuccess &&  writeData.IsSuccess) {
+            OperateResult writeTask = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength), command.getTaskNo());
+            try {
+                Thread.sleep(50);
+            }catch (Exception e) {}
+
+            OperateResult writeData = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength + 4), data);
+            try {
+                Thread.sleep(200);
+            }catch (Exception e) {}
+            OperateResult writeConfirm = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength + 46), (short) 1);
+
+            if(writeTask.IsSuccess &&  writeData.IsSuccess &&  writeConfirm.IsSuccess) {
                 log.error("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛銆備换鍔″彿={}锛岀珯鐐规暟鎹�={}", command.getTaskNo(), JSON.toJSON(command));
                 commandResponse.setResult(true);
             }else {
@@ -219,11 +240,21 @@
         return null;
     }
 
-    private int getEnableCommandIdx() {
+    private int getEnableCommandIdx(int taskNo) {
         int useIdx = -1;
         for (int i = 0; i < taskAddressLimit; i++) {
-            OperateResultExOne<byte[]> result = siemensNet.Read("DB23." + i * taskAddressLength, (short) taskAddressLength);
-            int taskStatus = siemensNet.getByteTransform().TransInt16(result.Content, i * taskAddressLength + 46);
+            OperateResultExOne<byte[]> resultTask = siemensNet.Read("DB23." + (i * taskAddressLength + 0), (short) 2);
+            OperateResultExOne<byte[]> resultStatus = siemensNet.Read("DB23." + (i * taskAddressLength + 46), (short) 2);
+            if(resultTask.IsSuccess && resultStatus.IsSuccess) {
+                continue;
+            }
+
+            int commandAreaTaskNo = siemensNet.getByteTransform().TransInt32(resultTask.Content, 0);
+            if(commandAreaTaskNo == taskNo) {
+                return -1;
+            }
+
+            int taskStatus = siemensNet.getByteTransform().TransInt16(resultStatus.Content, 0);
             if (taskStatus == 1) {
                 continue;
             }
diff --git a/src/main/java/com/zy/core/plugin/NormalProcess.java b/src/main/java/com/zy/core/plugin/NormalProcess.java
index afd310b..3792035 100644
--- a/src/main/java/com/zy/core/plugin/NormalProcess.java
+++ b/src/main/java/com/zy/core/plugin/NormalProcess.java
@@ -1,11 +1,39 @@
 package com.zy.core.plugin;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.zy.asrs.domain.param.CreateInTaskParam;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.common.model.StartupDto;
+import com.zy.common.service.CommonService;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.enums.StationCommandType;
+import com.zy.core.enums.WrkIoType;
+import com.zy.core.model.StationObjModel;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.StationCommand;
+import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.thread.StationThread;
 import com.zy.core.utils.CrnOperateProcessUtils;
 import com.zy.core.utils.StationOperateProcessUtils;
+import com.zy.core.utils.WmsOperateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @Component
@@ -15,9 +43,24 @@
     private CrnOperateProcessUtils crnOperateUtils;
     @Autowired
     private StationOperateProcessUtils stationOperateProcessUtils;
+    @Autowired
+    private CommonService commonService;
+    @Autowired
+    private BasDevpService basDevpService;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private WmsOperateUtils wmsOperateUtils;
 
     @Override
     public void run() {
+        //璇锋眰鐢熸垚鍏ュ簱浠诲姟
+        generateStoreWrkFile();
+        //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
+        checkInStationHasTask();
+
         //鎵ц鍫嗗灈鏈轰换鍔�
         crnOperateUtils.crnIoExecute();
         //鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�-鍏峰浠跨湡鑳藉姏
@@ -30,4 +73,121 @@
         stationOperateProcessUtils.stationOutExecuteFinish();
     }
 
+    /**
+     * 璇锋眰鐢熸垚鍏ュ簱浠诲姟
+     * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
+     */
+    public synchronized void generateStoreWrkFile() {
+        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+        for (BasDevp basDevp : basDevps) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+            if(stationThread == null){
+                continue;
+            }
+
+            Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
+
+            List<StationObjModel> list = basDevp.getBarcodeStationList$();
+            for (StationObjModel entity : list) {
+                Integer stationId = entity.getStationId();
+                if(!stationMap.containsKey(stationId)){
+                    continue;
+                }
+
+                StationProtocol stationProtocol = stationMap.get(stationId);
+                if (stationProtocol == null) {
+                    continue;
+                }
+
+                //婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
+                if (stationProtocol.isAutoing()
+                        && stationProtocol.isLoading()
+                        && stationProtocol.getTaskNo() > 0
+                ) {
+                    if (Cools.isEmpty(stationProtocol.getBarcode())) {
+                        continue;
+                    }
+
+                    //妫�娴嬩换鍔℃槸鍚︾敓鎴�
+                    List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
+                    if (!wrkMasts.isEmpty()) {
+                        continue;
+                    }
+
+                    Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
+                    if (lock != null) {
+                        continue;
+                    }
+                    redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
+
+                    String response = wmsOperateUtils.applyInTask(stationProtocol.getBarcode(), stationProtocol.getStationId(), stationProtocol.getPalletHeight());
+                    if (response == null) {
+                        News.error("璇锋眰WMS鍏ュ簱鎺ュ彛澶辫触锛屾帴鍙f湭鍝嶅簲锛侊紒锛乺esponse锛歿}", response);
+                        continue;
+                    }
+                    JSONObject jsonObject = JSON.parseObject(response);
+                    if (jsonObject.getInteger("code").equals(200)) {
+                        StartupDto dto = jsonObject.getObject("data", StartupDto.class);
+
+                        CreateInTaskParam taskParam = new CreateInTaskParam();
+                        taskParam.setTaskNo(dto.getTaskNo());
+                        taskParam.setLocNo(dto.getLocNo());
+                        taskParam.setTaskPri(dto.getTaskPri());
+                        taskParam.setBarcode(stationProtocol.getBarcode());
+                        WrkMast wrkMast = commonService.createInTask(taskParam);
+
+                        StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, wrkMast.getWrkNo(), stationId, stationId, 0);
+                        if(command == null){
+                            News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
+                            continue;
+                        }
+                        MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+                    }
+                }
+            }
+        }
+    }
+
+    //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
+    private synchronized void checkInStationHasTask() {
+        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+        for (BasDevp basDevp : basDevps) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+            if(stationThread == null){
+                continue;
+            }
+
+            Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
+
+            List<StationObjModel> list = basDevp.getInStationList$();
+            for (StationObjModel entity : list) {
+                Integer stationId = entity.getStationId();
+                if(!stationMap.containsKey(stationId)){
+                    continue;
+                }
+
+                StationProtocol stationProtocol = stationMap.get(stationId);
+                if (stationProtocol == null) {
+                    continue;
+                }
+
+                Object lock = redisUtil.get(RedisKeyType.GENERATE_ENABLE_IN_STATION_DATA_LIMIT.key + stationId);
+                if(lock != null){
+                    continue;
+                }
+
+                //婊¤冻鑷姩銆佹棤鐗┿�佸伐浣滃彿0锛岀敓鎴愬叆搴撴暟鎹�
+                if (stationProtocol.isAutoing()
+                        && stationProtocol.isLoading()
+                        && stationProtocol.getTaskNo() == 0
+                        && stationProtocol.isEnableIn()
+                ) {
+                    StationCommand command = stationThread.getCommand(StationCommandType.MOVE, commonService.getWorkNo(WrkIoType.FAKE_TASK_NO.id), stationId, entity.getBarcodeStation().getStationId(), 0);
+                    MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+                    redisUtil.set(RedisKeyType.GENERATE_ENABLE_IN_STATION_DATA_LIMIT.key + stationId, "lock", 10);
+                }
+            }
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java b/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
index 70a0cde..bb7fbd8 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
@@ -217,7 +217,8 @@
         CommandResponse commandResponse = null;
         try {
             commandResponse = zyStationConnectDriver.sendCommand(command);
-            return commandResponse;
+        } catch (Exception e) {
+            e.printStackTrace();
         } finally {
             BasStationOptService optService = SpringUtils.getBean(BasStationOptService.class);
             List<ZyStationStatusEntity> statusListEntity = zyStationConnectDriver.getStatus();
@@ -249,6 +250,7 @@
                 optService.insert(basStationOpt);
             }
         }
+        return commandResponse;
     }
 
     @Override
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index cc1b962..c056164 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -78,7 +78,7 @@
   expireDays: 7
 
 llm:
-  platform: python
+  platform: java
   pythonPlatformUrl: http://127.0.0.1:9000/ai/diagnose/askStream
 #  base-url: https://api.siliconflow.cn/v1
 #  api-key: sk-sxdtebtquwrugzrmaqqqkzdzmrgzhzmplwwuowysdasccent

--
Gitblit v1.9.1