From da3c868c08f43eae54780d5744130b210c91da18 Mon Sep 17 00:00:00 2001
From: zzgtfwq <zzgtfwq>
Date: 星期三, 10 十二月 2025 12:40:01 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java |    4 +
 src/main/java/com/zy/asrs/service/BasDevpOptService.java          |    1 
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java       |  194 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java            |    1 
 src/main/java/com/zy/core/MainProcess.java                        |    4 +
 src/main/resources/application.yml                                |   14 +-
 src/main/resources/mapper/BasDevpOptMapper.xml                    |    7 +
 7 files changed, 218 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java b/src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java
index 9d835ab..73f0536 100644
--- a/src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/BasDevpOptMapper.java
@@ -8,5 +8,6 @@
 @Mapper
 @Repository
 public interface BasDevpOptMapper extends BaseMapper<BasDevpOpt> {
+    String getErr(Integer wrkNo);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/BasDevpOptService.java b/src/main/java/com/zy/asrs/service/BasDevpOptService.java
index 13d23b7..34ad01a 100644
--- a/src/main/java/com/zy/asrs/service/BasDevpOptService.java
+++ b/src/main/java/com/zy/asrs/service/BasDevpOptService.java
@@ -4,5 +4,6 @@
 import com.baomidou.mybatisplus.service.IService;
 
 public interface BasDevpOptService extends IService<BasDevpOpt> {
+    String getErr(Integer wrkNo);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java
index 9f7d39c..65008b9 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasDevpOptServiceImpl.java
@@ -8,5 +8,9 @@
 
 @Service("basDevpOptService")
 public class BasDevpOptServiceImpl extends ServiceImpl<BasDevpOptMapper, BasDevpOpt> implements BasDevpOptService {
+    @Override
+    public String getErr(Integer wrkNo){
+        return baseMapper.getErr(wrkNo);
+    }
 
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index a4aaea2..0ea3a1f 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -14,19 +14,24 @@
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.*;
 import com.zy.common.model.LocTypeDto;
+import com.zy.common.model.MatDto;
 import com.zy.common.model.SearchLocParam;
 import com.zy.common.model.StartupDto;
 import com.zy.common.service.CommonService;
+import com.zy.common.utils.CollectionUtils;
 import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.News;
 import com.zy.core.CrnThread;
 import com.zy.core.DevpThread;
 import com.zy.core.cache.*;
 import com.zy.core.enums.*;
 import com.zy.core.model.*;
 import com.zy.core.model.command.CrnCommand;
+import com.zy.core.model.command.LedCommand;
 import com.zy.core.model.protocol.*;
 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.system.entity.license.LicenseVerify;
@@ -40,6 +45,7 @@
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
@@ -60,6 +66,8 @@
     private WrkMastMapper wrkMastMapper;
     @Autowired
     private WrkDetlService wrkDetlService;
+    @Autowired
+    private BasDevpOptService basDevpOptService;
     @Autowired
     private LocMastService locMastService;
     @Autowired
@@ -1138,6 +1146,192 @@
         }
     }
 
+
+    /**
+     * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
+     */
+    public synchronized void ledExecute() {
+        for (LedSlave led : slaveProperties.getLed()) {
+            // 鑾峰彇杈撻�佺嚎plc绾跨▼
+            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
+            // 鍛戒护闆嗗悎
+            List<LedCommand> commands = new ArrayList<>();
+            // 宸ヤ綔妗i泦鍚�
+            List<WrkMast> wrkMasts = new ArrayList<>();
+            for (Integer staNo : led.getStaArr()) {
+                // 鑾峰彇鍙夎溅绔欑偣
+                StaProtocol staProtocol = devpThread.getStation().get(staNo);
+                if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
+                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                // 鑾峰彇宸ヤ綔妗f暟鎹�
+                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
+                if (null == wrkMast) {
+                    if(staProtocol.getWorkNo() > 9999){ //寮傚父閫�鍑�
+                        String err = basDevpOptService.getErr(staProtocol.getWorkNo());
+                        MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, err));
+                    }
+                    continue;
+                }
+                wrkMasts.add(wrkMast);
+                // 缁勮鍛戒护
+                LedCommand ledCommand = new LedCommand();
+                ledCommand.setWorkNo(wrkMast.getWrkNo());
+                ledCommand.setIoType(wrkMast.getIoType());
+                // 鍑哄簱妯″紡
+                switch (wrkMast.getIoType()) {
+                    case 1:
+                        ledCommand.setTitle("鍏ㄦ澘鍏ュ簱");
+                        break;
+                    case 10:
+                        ledCommand.setTitle("绌烘澘鍏ュ簱");
+                        break;
+                    case 12:
+                        ledCommand.setTitle("鐗╂枡琛旀帴");
+                        break;
+                    case 57:
+                        ledCommand.setTitle("鐩樼偣鍐嶅叆搴�");
+                        break;
+                    case 53:
+                        ledCommand.setTitle("鎷f枡鍐嶅叆搴�");
+                        break;
+                    case 101:
+                        ledCommand.setTitle("鍏ㄦ澘鍑哄簱");
+                        break;
+                    case 103:
+                        ledCommand.setTitle("鎷f枡鍑哄簱");
+                        break;
+                    case 104:
+                        ledCommand.setTitle("骞舵澘鍑哄簱");
+                        break;
+                    case 107:
+                        ledCommand.setTitle("鐩樼偣鍑哄簱");
+                        break;
+                    case 110:
+                        ledCommand.setTitle("绌烘澘鍑哄簱");
+                        ledCommand.setEmptyMk(true);
+                        break;
+                    default:
+                        News.error("浠诲姟鍏ュ嚭搴撶被鍨嬮敊璇紒锛侊紒[宸ヤ綔鍙凤細{}] [鍏ュ嚭搴撶被鍨嬶細{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
+                        break;
+                }
+                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
+                ledCommand.setStaNo(wrkMast.getStaNo());
+                ledCommand.setBarcode(wrkMast.getBarcode());
+                if(wrkMast.getIoType() == 12){
+                    List<WrkDetl> wrkDetls = wrkDetlService.findByBarcode(wrkMast.getBarcode());
+                    wrkDetls.forEach(wrkDetl -> {
+                        Double total = 0.0;
+                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
+                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
+                        if (Cools.isEmpty(locDetl)) {
+                            total = wrkDetl.getAnfme();
+                        } else {
+                            total = locDetl.getAnfme();
+                        }
+                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
+                    });
+                }
+                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
+                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
+
+                    wrkDetls.forEach(wrkDetl -> {
+                        Double total = 0.0;
+                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
+                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
+                        if (Cools.isEmpty(locDetl)) {
+                            total = wrkDetl.getAnfme();
+                        } else {
+                            total = locDetl.getAnfme();
+                        }
+                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
+                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
+                        }
+                        if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
+                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
+                        }
+                        if (wrkMast.getIoType() == 107) {
+                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
+                        }
+                    });
+                }
+                commands.add(ledCommand);
+            }
+            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
+            // 鑾峰彇LED绾跨▼
+            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
+            // 鐩稿悓宸ヤ綔鍙烽泦鍚堝垯杩囨护
+            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
+                continue;
+            }
+            // 鍛戒护涓嬪彂 -------------------------------------------------------------------------------
+            if (!commands.isEmpty()) {
+                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
+                    News.error("{}鍙稬ED鏄剧ず鍐呭鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
+                    continue;
+                }
+            }
+
+            try {
+                // 淇敼涓绘。led鏍囪
+                for (WrkMast wrkMast : wrkMasts) {
+                    wrkMast.setOveMk("Y");
+                    wrkMast.setModiTime(new Date());
+                    if (wrkMastMapper.updateById(wrkMast) == 0) {
+                        throw new CoolException("鏇存柊宸ヤ綔妗eけ璐�");
+                    }
+                }
+
+                // 鏇存柊绾跨▼褰撳墠宸ヤ綔鍙烽泦鍚�
+                ledThread.setWorkNos(workNos);
+
+            } catch (Exception e) {
+                e.printStackTrace();
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            }
+
+        }
+    }
+
+    /**
+     * 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
+     */
+    public synchronized void ledReset() {
+        for (LedSlave led : slaveProperties.getLed()) {
+            // 鑾峰彇杈撻�佺嚎plc绾跨▼
+            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
+            // 鍛戒护闆嗗悎
+            boolean reset = true;
+            for (Integer staNo : led.getStaArr()) {
+//                System.out.println("staArr = " + staNo);
+
+                // 鑾峰彇鍙夎溅绔欑偣
+                StaProtocol staProtocol = devpThread.getStation().get(staNo);
+                if (staProtocol == null) { continue; }
+                if (staProtocol.getWorkNo() != 0 || staProtocol.isErr()) {
+                    reset = false;
+                    break;
+                }
+            }
+            // 鑾峰彇led绾跨▼
+            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
+            // led鏄剧ず榛樿鍐呭
+            if (reset) {
+                if (ledThread == null) {
+                    continue;
+                }
+                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
+                    News.error("{}鍙稬ED鏄剧ず榛樿鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
+                }
+//                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) {
+//                    News.error("{}鍙稬ED鏄剧ず榛樿鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
+//                }
+            }
+        }
+    }
+
     /**
      * 鍫嗗灈鏈�5鍒嗛挓鏃犱换鍔″垯鍥炲埌婧愮偣
      */
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index 5459597..2db4ac7 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -68,6 +68,10 @@
                 mainService.crnIoExecute();
                 // 鍏ュ簱  ===>> 鎵ц瀵瑰伐浣滄。鐨勫畬鎴愭搷浣�
                 mainService.storeFinished();
+                // 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
+                mainService.ledExecute();
+                // 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
+                mainService.ledReset();
                 // 鍑哄簱  ===>>  鍫嗗灈鏈�10鍒嗛挓鏃犱换鍔″垯鍥炲埌婧愮偣
                 mainService.crnStnToOutStnSou();
 
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 43c40c2..26a3a8f 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -808,39 +808,39 @@
     ip: 10.10.10.209
     port: 5005
     devpPlcId: ${wcs-slave.devp[0].id}
-    staArr: 1036
+    staArr: 119
   # LED2
   led[1]:
     id: 2
     ip: 10.10.10.210
     port: 5005
     devpPlcId: ${wcs-slave.devp[0].id}
-    staArr: 1041
+    staArr: 122
   # LED3
   led[2]:
     id: 3
     ip: 10.10.10.211
     port: 5005
     devpPlcId: ${wcs-slave.devp[0].id}
-    staArr: 1103
+    staArr: 125
   # LED4
   led[3]:
     id: 4
     ip: 10.10.10.212
     port: 5005
-    devpPlcId: ${wcs-slave.devp[0].id}
-    staArr: 1047
+    devpPlcId: ${wcs-slave.devp[1].id}
+    staArr: 219
   # LED4
   led[4]:
     id: 5
     ip: 10.10.10.213
     port: 5005
     devpPlcId: ${wcs-slave.devp[1].id}
-    staArr: 2037
+    staArr: 222
   # LED5
   led[5]:
     id: 6
     ip: 10.10.10.214
     port: 5005
     devpPlcId: ${wcs-slave.devp[1].id}
-    staArr: 4001
\ No newline at end of file
+    staArr: 225
\ No newline at end of file
diff --git a/src/main/resources/mapper/BasDevpOptMapper.xml b/src/main/resources/mapper/BasDevpOptMapper.xml
index 26f9d6f..54e0b35 100644
--- a/src/main/resources/mapper/BasDevpOptMapper.xml
+++ b/src/main/resources/mapper/BasDevpOptMapper.xml
@@ -23,4 +23,11 @@
 
     </resultMap>
 
+    <select id="getErr" resultType="String">
+        SELECT TOP 1 pos_loading
+        FROM asr_bas_devp_opt
+        WHERE wrk_no = #{wrkNo}
+        ORDER BY send_time DESC
+    </select>
+
 </mapper>

--
Gitblit v1.9.1