From 515966e62de2133866c37ece6a92f69379b28c59 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期四, 05 二月 2026 08:49:56 +0800
Subject: [PATCH] 空板增加回退触发

---
 src/main/java/com/zy/service/impl/MainServiceImpl.java |  251 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 237 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/zy/service/impl/MainServiceImpl.java b/src/main/java/com/zy/service/impl/MainServiceImpl.java
index 140986d..bfe221e 100644
--- a/src/main/java/com/zy/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -27,9 +27,13 @@
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.BarcodeThread;
 import com.zy.core.thread.LedThread;
+import com.zy.core.thread.RgvThread;
 import com.zy.core.thread.SiemensDevpThread;
+import com.zy.core.model.RgvSlave;
+import com.zy.core.model.protocol.RgvProtocol;
 import com.zy.entity.*;
 import com.zy.mapper.*;
+import com.zy.mapper.BasRgvErrMapper;
 import com.zy.service.*;
 import com.zy.utils.*;
 import lombok.extern.slf4j.Slf4j;
@@ -93,6 +97,9 @@
 
     @Resource
     private BasDevpErrLogService basDevpErrLogService;
+
+    @Autowired
+    private BasRgvErrMapper basRgvErrMapper;
 
     @Value("${wms.url}")
     private String wmsUrl;
@@ -1100,6 +1107,48 @@
                         continue;
                     }
                     
+                    // 灏哄妫�娴嬪紓甯革紙澶嶅埢generateStoreWrkFile鐨勯�昏緫锛屼絾涓嶅寘鎷壂鐮佸け璐ワ級
+                    boolean back = false;
+                    String errMsg = "";
+                    if (staProtocol.isFrontErr()) {
+                        errMsg = "鍓嶈秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isBackErr()) {
+                        errMsg = "鍚庤秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isHighErr()) {
+                        errMsg = "楂樿秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isLeftErr()) {
+                        errMsg = "宸﹁秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isRightErr()) {
+                        errMsg = "鍙宠秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isWeightErr()) {
+                        errMsg = "瓒呴噸";
+                        back = true;
+                    }
+                    // 閫�鍥烇紙绌烘墭鍏ュ簱鐨勬潯浠舵槸isEmptyMk涓簍rue锛�
+                    if (back && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && staProtocol.isEmptyMk()) {
+                        Integer ledId = emptyInSta.getLed();
+                        if (ledId != null) {
+                            MessageQueue.offer(SlaveType.Led, ledId, new Task(3, errMsg));
+                        }
+                        News.info("{}绌烘澘鍏ュ簱鍥為��锛歿}锛屼换鍔″彿锛歿}", emptyInSta.getStaNo(), errMsg, staProtocol.getWorkNo());
+                        staProtocol.setWorkNo(9999);
+                        staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
+                        devpThread.setPakMk(staProtocol.getSiteId(), false);
+                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                        log.error("杈撻�佺嚎涓嬪彂1锛堢┖鏉匡級锛�"+staProtocol.getWorkNo()+","+emptyInSta.getBackSta());
+                        continue;
+                    }
+                    
                     News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛岋細绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐э紝鏉$爜锛歿}", barcode);
 
                     try {
@@ -1148,30 +1197,25 @@
                                 ledCommand.setStaNo(dto.getStaNo());
                                 commands.add(ledCommand);
                                 MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(1, commands));
-//                                ledThread.errorReset();
+                            }
+                            // 鎴愬姛鏃堕噸缃甃ED閿欒
+                            if (ledThread != null) {
+                                ledThread.errorReset();
                             }
                         } else {
                             String errorMsg = jsonObject.getString("msg");
                             // 濡傛灉浠诲姟鍥為��锛屽苟涓旂珯鐐逛笉鏄嚜鍔ㄧ姸鎬侊紝鍒欎笉瑙﹀彂鍥為��
                             if (!staProtocol.isAutoing()) {
-                                log.error("绌烘澘鍏ュ簱鍥為��"+staProtocol.getWorkNo()+","+errorMsg+"锛岀珯鐐逛笉鏄嚜鍔ㄧ姸鎬侊紝涓嶈Е鍙戝洖閫�");
+                                log.error("绌烘澘鍏ュ簱鍥為��,"+staProtocol.getWorkNo()+","+errorMsg+"锛岀珯鐐逛笉鏄嚜鍔ㄧ姸鎬侊紝涓嶈Е鍙戝洖閫�");
                                 continue;
                             }
-                            log.error("绌烘澘鍏ュ簱鍥為��"+staProtocol.getWorkNo()+","+errorMsg);
                             staProtocol.setWorkNo(9999);
                             staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                             devpThread.setPakMk(staProtocol.getSiteId(), false);
-                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-                            if (!result) {
-                                News.errorNoLog(""+mark+" - 2"+" - 鏇存柊plc绔欑偣淇℃伅澶辫触");
-                                throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
-                            }
-
-                            if (ledThread != null) {
-
-                                if (!Cools.isEmpty(errorMsg)) {
-                                    MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
-                                }
+                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                            log.error("绌烘澘鍏ュ簱鍥為��,"+staProtocol.getWorkNo()+","+errorMsg);
+                            if (!Cools.isEmpty(errorMsg)) {
+                                MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
                             }
 //                            News.error(""+mark+" - 3"+" - 璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                         }
@@ -1244,6 +1288,31 @@
                                 );
                                 if (!basDevpErrLogService.insert(basErrLog)) {
                                     News.error("杈撻�佺嚎寮傚父淇℃伅鎻掑叆琛╝sr_bas_devp_err_log寮傚父锛歿}", basErrLog);
+                                }
+                                
+                                // 杈撻�佺嚎鎶ヨ鏃舵墭鐩橀��鍥�
+                                if (staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && !staProtocol.isEmptyMk()) {
+                                    Integer backSta = findBackSta(devp, siteNo);
+                                    if (backSta != null) {
+                                        log.info("銆愯緭閫佺嚎鎶ヨ閫�鍥炪�戠珯鐐癸細{}锛屽伐浣滃彿锛歿}锛屾姤璀︼細{}锛岄��鍥炵珯锛歿}", siteNo, workNo, plcErr, backSta);
+                                        // 鎺ㄩ�佸埌LED鏄剧ず鎶ヨ淇℃伅
+                                        Integer ledId = findLedId(devp, siteNo);
+                                        if (ledId != null) {
+                                            MessageQueue.offer(SlaveType.Led, ledId, new Task(3, plcErr));
+                                        }
+                                        // 璁剧疆閫�鍥炵珯
+                                        staProtocol.setWorkNo(9999);
+                                        staProtocol.setStaNo(backSta.shortValue());
+                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
+                                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                                        if (!result) {
+                                            News.error("杈撻�佺嚎鎶ヨ閫�鍥炲け璐ワ紝绔欑偣锛歿}锛屽伐浣滃彿锛歿}", siteNo, workNo);
+                                        } else {
+                                            log.info("銆愯緭閫佺嚎鎶ヨ閫�鍥炪�戞垚鍔熶笅鍙戦��鍥炴寚浠わ紝绔欑偣锛歿}锛屽伐浣滃彿锛歿}锛岄��鍥炵珯锛歿}", siteNo, workNo, backSta);
+                                        }
+                                    } else {
+                                        log.warn("銆愯緭閫佺嚎鎶ヨ閫�鍥炪�戞湭鎵惧埌閫�鍥炵珯閰嶇疆锛岀珯鐐癸細{}锛屽伐浣滃彿锛歿}", siteNo, workNo);
+                                    }
                                 }
                             }
                         } else {
@@ -1358,6 +1427,160 @@
     }
 
     /**
+     * 鏍规嵁绔欑偣鍙锋煡鎵鹃��鍥炵珯
+     */
+    private Integer findBackSta(DevpSlave devp, Integer siteNo) {
+        // 鏌ユ壘鍏ュ簱绔�
+        for (DevpSlave.Sta inSta : devp.getInSta()) {
+            if (inSta.getStaNo().equals(siteNo)) {
+                return inSta.getBackSta();
+            }
+        }
+        // 鏌ユ壘鎷f枡绔�
+        for (DevpSlave.Sta pickSta : devp.getPickSta()) {
+            if (pickSta.getStaNo().equals(siteNo)) {
+                return pickSta.getBackSta();
+            }
+        }
+        // 鏌ユ壘绌烘澘鍏ュ簱绔�
+        for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
+            if (emptyInSta.getStaNo().equals(siteNo)) {
+                return emptyInSta.getBackSta();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鏍规嵁绔欑偣鍙锋煡鎵綥ED ID
+     */
+    private Integer findLedId(DevpSlave devp, Integer siteNo) {
+        // 鏌ユ壘鍏ュ簱绔�
+        for (DevpSlave.Sta inSta : devp.getInSta()) {
+            if (inSta.getStaNo().equals(siteNo)) {
+                return inSta.getLed();
+            }
+        }
+        // 鏌ユ壘鎷f枡绔�
+        for (DevpSlave.Sta pickSta : devp.getPickSta()) {
+            if (pickSta.getStaNo().equals(siteNo)) {
+                return pickSta.getLed();
+            }
+        }
+        // 鏌ユ壘绌烘澘鍏ュ簱绔�
+        for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
+            if (emptyInSta.getStaNo().equals(siteNo)) {
+                return emptyInSta.getLed();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * RGV寮傚父妫�娴嬪拰鎵樼洏閫�鍥�
+     */
+    public synchronized void recRgvErr() {
+        Date now = new Date();
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol == null) {
+                continue;
+            }
+            
+            // 妫�娴婻GV鎶ヨ
+            Short alarm = rgvProtocol.getAlarm();
+            Short taskNo1 = rgvProtocol.getTaskNo1();
+            
+            // 濡傛灉鏈夋姤璀︿笖鏈変换鍔�
+            if (alarm != null && alarm > 0 && taskNo1 != null && taskNo1 > 0 && taskNo1 <= 9000) {
+                Integer workNo = taskNo1.intValue();
+                WrkMast wrkMast = wrkMastMapper.selectById(workNo);
+                if (wrkMast == null) {
+                    log.warn("銆怰GV鎶ヨ澶勭悊銆戝伐浣滄。涓嶅瓨鍦紝RGV锛歿}锛屽伐浣滃彿锛歿}", rgv.getId(), workNo);
+                    continue;
+                }
+                
+                // 鑾峰彇鎶ヨ淇℃伅
+                BasRgvErr rgvErr = basRgvErrMapper.selectById(alarm.longValue());
+                String alarmMsg = rgvErr != null ? rgvErr.getErrName() : "鏈煡寮傚父(" + alarm + ")";
+                
+                log.info("銆怰GV鎶ヨ澶勭悊銆慠GV锛歿}锛屽伐浣滃彿锛歿}锛屾姤璀︼細{}", rgv.getId(), workNo, alarmMsg);
+                
+                // 鏍规嵁宸ヤ綔妗g殑婧愮珯鐐规煡鎵惧搴旂殑杈撻�佺嚎绔欑偣鍜岄��鍥炵珯
+                Integer sourceStaNo = wrkMast.getStaNo(); // 婧愮珯鐐癸紙鐩爣绔欙級
+                if (sourceStaNo == null) {
+                    log.warn("銆怰GV鎶ヨ澶勭悊銆戝伐浣滄。婧愮珯鐐逛负绌猴紝RGV锛歿}锛屽伐浣滃彿锛歿}", rgv.getId(), workNo);
+                    continue;
+                }
+                
+                // 鏌ユ壘瀵瑰簲鐨勮緭閫佺嚎閰嶇疆鍜岄��鍥炵珯
+                Integer backSta = null;
+                Integer finalDevpId = null;
+                Integer siteNo = null;
+                DevpThread devpThread = null;
+                DevpSlave targetDevp = null;
+                
+                // 閬嶅巻鎵�鏈夎緭閫佺嚎锛屾煡鎵惧寘鍚绔欑偣鐨勯厤缃�
+                for (DevpSlave devp : slaveProperties.getDevp()) {
+                    DevpThread dt = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+                    if (dt == null) {
+                        continue;
+                    }
+                    Map<Integer, StaProtocol> station = dt.getStation();
+                    if (station != null && station.containsKey(sourceStaNo)) {
+                        // 鎵惧埌瀵瑰簲鐨勮緭閫佺嚎绔欑偣
+                        backSta = findBackSta(devp, sourceStaNo);
+                        if (backSta != null) {
+                            finalDevpId = devp.getId();
+                            siteNo = sourceStaNo;
+                            devpThread = dt;
+                            targetDevp = devp;
+                            break;
+                        }
+                    }
+                }
+                
+                if (backSta != null && devpThread != null && siteNo != null && finalDevpId != null) {
+                    StaProtocol staProtocol = devpThread.getStation().get(siteNo);
+                    if (staProtocol != null && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && !staProtocol.isEmptyMk()) {
+                        log.info("銆怰GV鎶ヨ閫�鍥炪�慠GV锛歿}锛屽伐浣滃彿锛歿}锛屾姤璀︼細{}锛岀珯鐐癸細{}锛岄��鍥炵珯锛歿}", rgv.getId(), workNo, alarmMsg, siteNo, backSta);
+                        
+                        // 鎺ㄩ�佸埌LED鏄剧ず鎶ヨ淇℃伅
+                        Integer ledId = findLedId(targetDevp, siteNo);
+                        if (ledId != null) {
+                            MessageQueue.offer(SlaveType.Led, ledId, new Task(3, "RGV鎶ヨ锛�" + alarmMsg));
+                        }
+                        
+                        // 璁剧疆閫�鍥炵珯
+                        staProtocol.setWorkNo(9999);
+                        staProtocol.setStaNo(backSta.shortValue());
+                        devpThread.setPakMk(staProtocol.getSiteId(), false);
+                        boolean result = MessageQueue.offer(SlaveType.Devp, finalDevpId, new Task(2, staProtocol));
+                        if (!result) {
+                            News.error("RGV鎶ヨ閫�鍥炲け璐ワ紝RGV锛歿}锛岀珯鐐癸細{}锛屽伐浣滃彿锛歿}", rgv.getId(), siteNo, workNo);
+                        } else {
+                            log.info("銆怰GV鎶ヨ閫�鍥炪�戞垚鍔熶笅鍙戦��鍥炴寚浠わ紝RGV锛歿}锛岀珯鐐癸細{}锛屽伐浣滃彿锛歿}锛岄��鍥炵珯锛歿}", rgv.getId(), siteNo, workNo, backSta);
+                        }
+                    } else {
+                        log.debug("銆怰GV鎶ヨ閫�鍥炪�戠珯鐐圭姸鎬佷笉绗﹀悎閫�鍥炴潯浠讹紝RGV锛歿}锛岀珯鐐癸細{}锛屽伐浣滃彿锛歿}锛宨nEnable锛歿}锛宭oading锛歿}锛宲akMk锛歿}锛宔mptyMk锛歿}", 
+                                rgv.getId(), siteNo, workNo, 
+                                staProtocol != null ? staProtocol.isInEnable() : false,
+                                staProtocol != null ? staProtocol.isLoading() : false,
+                                staProtocol != null ? staProtocol.isPakMk() : false,
+                                staProtocol != null ? staProtocol.isEmptyMk() : false);
+                    }
+                } else {
+                    log.warn("銆怰GV鎶ヨ閫�鍥炪�戞湭鎵惧埌瀵瑰簲鐨勮緭閫佺嚎绔欑偣鎴栭��鍥炵珯閰嶇疆锛孯GV锛歿}锛屽伐浣滃彿锛歿}锛屾簮绔欑偣锛歿}", rgv.getId(), workNo, sourceStaNo);
+                }
+            }
+        }
+    }
+
+    /**
      * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
      */
     public synchronized void ledExecute() {

--
Gitblit v1.9.1