From f5e49b2c04137fdc88c453cbe5d190cf7daab079 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期二, 30 十二月 2025 15:39:53 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/common/service/CommonService.java |  176 +++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 129 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index f9c3670..138e46b 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -1,6 +1,7 @@
 package com.zy.common.service;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
@@ -8,11 +9,13 @@
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.Utils;
+import com.zy.common.entity.FindCrnNoResult;
 import com.zy.common.model.NavigateNode;
 import com.zy.common.utils.NavigateUtils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
 import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.SlaveType;
 import com.zy.core.enums.WrkIoType;
 import com.zy.core.enums.WrkStsType;
 import com.zy.core.model.StationObjModel;
@@ -20,6 +23,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -36,9 +40,9 @@
     @Autowired
     private BasCrnpService basCrnpService;
     @Autowired
-    private NavigateUtils navigateUtils;
+    private BasDualCrnpService basDualCrnpService;
     @Autowired
-    private CommonService commonService;
+    private NavigateUtils navigateUtils;
     @Autowired
     private RedisUtil redisUtil;
 
@@ -118,20 +122,20 @@
         Date now = new Date();
         LocMast sourceLocMast = locMastService.queryByLoc(param.getSourceLocNo());
         if (null == sourceLocMast) {
-            throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+            throw new CoolException(param.getSourceLocNo() + "婧愬簱浣嶄笉瀛樺湪");
         }
 
         if (!sourceLocMast.getLocSts().equals("F")) {
-            throw new CoolException("婧愬簱浣嶄笉澶勪簬鍦ㄥ簱鐘舵��");
+            throw new CoolException(sourceLocMast.getLocNo() + "婧愬簱浣嶄笉澶勪簬鍦ㄥ簱鐘舵��");
         }
 
         LocMast locMast = locMastService.queryByLoc(param.getLocNo());
         if (null == locMast) {
-            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+            throw new CoolException(param.getLocNo() + "鐩爣搴撲綅涓嶅瓨鍦�");
         }
 
         if (!locMast.getLocSts().equals("O")) {
-            throw new CoolException("鐩爣搴撲綅涓嶅浜庣┖搴撶姸鎬�");
+            throw new CoolException(locMast.getLocNo() + "鐩爣搴撲綅涓嶅浜庣┖搴撶姸鎬�");
         }
 
         double ioPri = 800D;
@@ -139,19 +143,20 @@
             ioPri = param.getTaskPri().doubleValue();
         }
 
-        Integer sourceCrnNo = commonService.findCrnNoByLocNo(sourceLocMast.getLocNo());
-        if (sourceCrnNo == null) {
+        FindCrnNoResult sourceCrnResult = this.findCrnNoByLocNo(sourceLocMast.getLocNo());
+        if (sourceCrnResult == null) {
             throw new CoolException("鏈壘鍒板搴斿爢鍨涙満");
         }
 
-        Integer crnNo = commonService.findCrnNoByLocNo(locMast.getLocNo());
-        if (crnNo == null) {
+        FindCrnNoResult targetCrnResult = this.findCrnNoByLocNo(locMast.getLocNo());
+        if (targetCrnResult == null) {
             throw new CoolException("鏈壘鍒板搴斿爢鍨涙満");
         }
 
-        if (!sourceCrnNo.equals(crnNo)) {
+        if (!sourceCrnResult.getCrnNo().equals(targetCrnResult.getCrnNo())) {
             throw new CoolException("婧愬簱浣嶅拰鐩爣搴撲綅涓嶅湪鍚屼竴宸烽亾");
         }
+        Integer crnNo = targetCrnResult.getCrnNo();
 
         // 鑾峰彇宸ヤ綔鍙�
         int workNo = getWorkNo(WrkIoType.LOC_MOVE.id);
@@ -166,6 +171,7 @@
         wrkMast.setLocNo(param.getLocNo()); // 鐩爣搴撲綅
         wrkMast.setCrnNo(crnNo);
         wrkMast.setWmsWrkNo(param.getTaskNo());
+        wrkMast.setBarcode(sourceLocMast.getBarcode());
         wrkMast.setAppeTime(now);
         wrkMast.setModiTime(now);
         boolean res = wrkMastService.insert(wrkMast);
@@ -186,15 +192,15 @@
     }
 
     //鍏ュ簱浠诲姟
-    public boolean createInTask(CreateInTaskParam param) {
+    public WrkMast createInTask(CreateInTaskParam param) {
         Date now = new Date();
         LocMast locMast = locMastService.queryByLoc(param.getLocNo());
         if (null == locMast) {
-            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+            throw new CoolException(param.getLocNo() + "鐩爣搴撲綅涓嶅瓨鍦�");
         }
 
         if (!locMast.getLocSts().equals("O")) {
-            throw new CoolException("鐩爣搴撲綅涓嶅浜庣┖搴撶姸鎬�");
+            throw new CoolException(locMast.getLocNo() + "鐩爣搴撲綅涓嶅浜庣┖搴撶姸鎬�");
         }
 
         double ioPri = 100D;
@@ -202,10 +208,11 @@
             ioPri = param.getTaskPri().doubleValue();
         }
 
-        Integer crnNo = commonService.findCrnNoByLocNo(locMast.getLocNo());
-        if (crnNo == null) {
+        FindCrnNoResult findCrnResult = this.findCrnNoByLocNo(locMast.getLocNo());
+        if (findCrnResult == null) {
             throw new CoolException("鏈壘鍒板搴斿爢鍨涙満");
         }
+        Integer crnNo = findCrnResult.getCrnNo();
 
         // 鑾峰彇宸ヤ綔鍙�
         int workNo = getWorkNo(WrkIoType.IN.id);
@@ -221,9 +228,20 @@
         wrkMast.setStaNo(param.getStaNo());//鐩爣绔�
         wrkMast.setWmsWrkNo(param.getTaskNo());
         wrkMast.setBarcode(param.getBarcode());
-        wrkMast.setCrnNo(crnNo);
         wrkMast.setAppeTime(now);
         wrkMast.setModiTime(now);
+
+        if (findCrnResult.getCrnType().equals(SlaveType.Crn)) {
+            wrkMast.setCrnNo(findCrnResult.getCrnNo());
+
+            //缂撳瓨璁板綍褰撳墠鍛戒护鍫嗗灈鏈虹紪鍙�
+            redisUtil.set(RedisKeyType.CURRENT_CIRCLE_TASK_CRN_NO.key, crnNo, 60 * 60 * 24);
+        } else if (findCrnResult.getCrnType().equals(SlaveType.DualCrn)) {
+            wrkMast.setDualCrnNo(findCrnResult.getCrnNo());
+        }else {
+            throw new CoolException("鏈煡璁惧绫诲瀷");
+        }
+
         boolean res = wrkMastService.insert(wrkMast);
         if (!res) {
             News.error("鍏ュ簱浠诲姟 --- 淇濆瓨宸ヤ綔妗eけ璐ワ紒");
@@ -233,10 +251,7 @@
         locMast.setLocSts("S");
         locMast.setModiTime(new Date());
         locMastService.updateById(locMast);
-
-        //缂撳瓨璁板綍褰撳墠鍛戒护鍫嗗灈鏈虹紪鍙�
-        redisUtil.set(RedisKeyType.CURRENT_CIRCLE_TASK_CRN_NO.key, crnNo, 60 * 60 * 24);
-        return true;
+        return wrkMast;
     }
 
     //鍑哄簱浠诲姟
@@ -256,12 +271,13 @@
             ioPri = param.getTaskPri().doubleValue();
         }
 
-        Integer crnNo = commonService.findCrnNoByLocNo(locMast.getLocNo());
-        if (crnNo == null) {
+        FindCrnNoResult findCrnResult = this.findCrnNoByLocNo(locMast.getLocNo());
+        if (findCrnResult == null) {
             throw new CoolException("鏈壘鍒板搴斿爢鍨涙満");
         }
+        Integer crnNo = findCrnResult.getCrnNo();
 
-        Integer sourceStationId = commonService.findOutStationId(crnNo, param.getStaNo());
+        Integer sourceStationId = this.findOutStationId(findCrnResult, param.getStaNo());
         if (sourceStationId == null) {
             throw new CoolException("鏈壘鍒拌緭閫佺洰鏍囩珯鐐瑰彲璧拌璺緞");
         }
@@ -280,9 +296,45 @@
         wrkMast.setStaNo(param.getStaNo());//鐩爣绔�
         wrkMast.setWmsWrkNo(param.getTaskNo());
         wrkMast.setBarcode(locMast.getBarcode());
-        wrkMast.setCrnNo(crnNo);
         wrkMast.setAppeTime(now);
         wrkMast.setModiTime(now);
+
+        if (findCrnResult.getCrnType().equals(SlaveType.Crn)) {
+            BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
+            if(basCrnp == null) {
+                throw new CoolException("鏈壘鍒板搴斿爢鍨涙満鏁版嵁");
+            }
+            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .eq("crn_no", crnNo)
+                    .eq("io_type", WrkIoType.OUT.id)
+            );
+            // 妫�鏌ユ槸鍚﹁秴杩囨渶澶у嚭搴撲换鍔℃暟
+            if(outWrkMasts.size() >= basCrnp.getMaxOutTask()){
+                News.info("鍫嗗灈鏈�:{} 宸茶揪鏈�澶у嚭搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:{}", basCrnp.getCrnNo(), outWrkMasts.size());
+                throw new CoolException("鍫嗗灈鏈�:" + basCrnp.getCrnNo() + "宸茶揪鏈�澶у嚭搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:" + outWrkMasts.size());
+            }
+
+            wrkMast.setCrnNo(findCrnResult.getCrnNo());
+        } else if (findCrnResult.getCrnType().equals(SlaveType.DualCrn)) {
+            BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", crnNo));
+            if(basDualCrnp == null) {
+                throw new CoolException("鏈壘鍒板搴斿弻宸ヤ綅鍫嗗灈鏈烘暟鎹�");
+            }
+            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .eq("dual_crn_no", crnNo)
+                    .eq("io_type", WrkIoType.OUT.id)
+            );
+            // 妫�鏌ユ槸鍚﹁秴杩囨渶澶у嚭搴撲换鍔℃暟
+            if(outWrkMasts.size() >= basDualCrnp.getMaxOutTask()){
+                News.info("鍙屽伐浣嶅爢鍨涙満:{} 宸茶揪鏈�澶у嚭搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:{}", basDualCrnp.getCrnNo(), outWrkMasts.size());
+                throw new CoolException("鍙屽伐浣嶅爢鍨涙満:" + basDualCrnp.getCrnNo() + "宸茶揪鏈�澶у嚭搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:" + outWrkMasts.size());
+            }
+
+            wrkMast.setDualCrnNo(findCrnResult.getCrnNo());
+        }else {
+            throw new CoolException("鏈煡璁惧绫诲瀷");
+        }
+
         boolean res = wrkMastService.insert(wrkMast);
         if (!res) {
             News.error("鍑哄簱浠诲姟 --- 淇濆瓨宸ヤ綔妗eけ璐ワ紒");
@@ -292,38 +344,59 @@
         locMast.setLocSts("R");
         locMast.setModiTime(new Date());
         locMastService.updateById(locMast);
-
         return true;
     }
 
-    public Integer findCrnNoByLocNo(String locNo) {
+    public FindCrnNoResult findCrnNoByLocNo(String locNo) {
         List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
         for (BasCrnp basCrnp : basCrnps) {
-            String controlRows = basCrnp.getControlRows();
-            if (Cools.isEmpty(controlRows)) {
-                continue;
+            List<List<Integer>> rowList = basCrnp.getControlRows$();
+            for (List<Integer> rows : rowList) {
+                if(rows.contains(Utils.getRow(locNo))) {
+                    FindCrnNoResult result = new FindCrnNoResult();
+                    result.setCrnNo(basCrnp.getCrnNo());
+                    result.setCrnType(SlaveType.Crn);
+                    return result;
+                }
             }
+        }
 
-            List<Integer> rowList = JSON.parseArray(controlRows, Integer.class);
-            if(rowList.contains(Utils.getRow(locNo))) {
-                return basCrnp.getCrnNo();
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            List<List<Integer>> rowList = basDualCrnp.getControlRows$();
+            for (List<Integer> rows : rowList) {
+                if(rows.contains(Utils.getRow(locNo))) {
+                    FindCrnNoResult result = new FindCrnNoResult();
+                    result.setCrnNo(basDualCrnp.getCrnNo());
+                    result.setCrnType(SlaveType.DualCrn);
+                    return result;
+                }
             }
         }
         return null;
     }
 
-    public Integer findInStationId(Integer crnNo, Integer sourceStationId) {
-        BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
-        if(basCrnp == null) {
-            return null;
+    public Integer findInStationId(FindCrnNoResult findCrnNoResult, Integer sourceStationId) {
+        List<StationObjModel> stationList = new ArrayList<>();
+        Integer crnNo = findCrnNoResult.getCrnNo();
+        if (findCrnNoResult.getCrnType().equals(SlaveType.Crn)) {
+            BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
+            if(basCrnp == null) {
+                return null;
+            }
+            stationList = basCrnp.getInStationList$();
+        } else if (findCrnNoResult.getCrnType().equals(SlaveType.DualCrn)) {
+            BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", crnNo));
+            if(basDualCrnp == null) {
+                return null;
+            }
+            stationList = basDualCrnp.getInStationList$();
         }
 
         Integer targetStationId = null;
-        List<StationObjModel> stationList = basCrnp.getInStationList$();
         for (StationObjModel stationObjModel : stationList) {
             try {
-                String startLev = String.valueOf(sourceStationId).substring(0, 1);
-                List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), sourceStationId, stationObjModel.getStationId());
+                List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(sourceStationId, stationObjModel.getStationId());
                 if(navigateNodes != null) {
                     targetStationId = stationObjModel.getStationId();
                     break;
@@ -335,18 +408,27 @@
         return targetStationId;
     }
 
-    public Integer findOutStationId(Integer crnNo, Integer targetStationId) {
-        BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
-        if(basCrnp == null) {
-            return null;
+    public Integer findOutStationId(FindCrnNoResult findCrnNoResult, Integer targetStationId) {
+        List<StationObjModel> stationList = new ArrayList<>();
+        Integer crnNo = findCrnNoResult.getCrnNo();
+        if (findCrnNoResult.getCrnType().equals(SlaveType.Crn)) {
+            BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
+            if(basCrnp == null) {
+                return null;
+            }
+            stationList = basCrnp.getOutStationList$();
+        } else if (findCrnNoResult.getCrnType().equals(SlaveType.DualCrn)) {
+            BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", crnNo));
+            if(basDualCrnp == null) {
+                return null;
+            }
+            stationList = basDualCrnp.getOutStationList$();
         }
 
         Integer finalSourceStationId = null;
-        List<StationObjModel> stationList = basCrnp.getOutStationList$();
         for (StationObjModel stationObjModel : stationList) {
             try {
-                String startLev = String.valueOf(targetStationId).substring(0, 1);
-                List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationObjModel.getStationId(), targetStationId);
+                List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(stationObjModel.getStationId(), targetStationId);
                 if(navigateNodes != null) {
                     finalSourceStationId = stationObjModel.getStationId();
                     break;

--
Gitblit v1.9.1