From 11a590bda370ddad398b2c3ae68a218ee8d5a5d2 Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期一, 10 十一月 2025 15:41:55 +0800
Subject: [PATCH] 项目wms功能初始化

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

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 65775b0..cdc6420 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -18,7 +18,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 璐ф灦鏍稿績鍔熻兘
@@ -50,6 +51,9 @@
     private SlaveProperties slaveProperties;
     @Autowired
     private WrkDetlService wrkDetlService;
+
+    // 娣卞簱浣嶆帓
+    private static final List<Integer> deepLocRowList = Arrays.asList(1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32);
 
     /**
      * 鐢熸垚宸ヤ綔鍙�
@@ -91,6 +95,102 @@
         return workNo;
     }
 
+    /**
+     * 鑾峰彇搴撲綅---灞变笢瀹滃拰绾虹粐
+     *
+     * @param sourceSiteNo 鍏ュ簱婧愮珯鐐�
+     */
+    public StartupDto getLocNoBySdyhfz(Integer sourceSiteNo,int ioType) {
+
+        // 鑾峰彇鍙敤锛屽彲鍏ワ紝鏃犳姤璀﹀爢鍨涙満
+        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable", "Y"));
+        if (basCrnps.size() == 0) {
+            log.error(sourceSiteNo + "鍏ュ簱璇锋眰搴撲綅澶辫触:鍫嗗灈鏈烘姤璀�/鏃犲彲鐢�/鏃犲彲鍏�");
+            throw new CoolException(sourceSiteNo + "鍏ュ簱璇锋眰搴撲綅澶辫触:鍫嗗灈鏈烘姤璀�/鏃犲彲鐢�/鏃犲彲鍏�");
+        }
+
+        // 璁$畻璐熻浇鍧囪 
+        List<CraneLoadInfo> craneInfos = new ArrayList<>();
+        // 璐熻浇鍧囪 鏉冮噸锛堝彲璋冩暣锛変换鍔″皯锛屽簱浣嶅崰鐢ㄥ皯鐨勫厛鍒嗛厤
+        double w1 = 0.6; // 浠诲姟鏁版潈閲�
+        double w2 = 0.4; // 浠撲綅鏉冮噸
+        for (BasCrnp basCrnp : basCrnps) {
+            // 鎸傝浇浠诲姟鏁�
+            int taskCount = locMastService.selectCount(new EntityWrapper<LocMast>().eq("crn_no", basCrnp.getCrnNo()).in("loc_sts", "S", "R"));
+            // 绌哄簱浣嶆暟閲�
+            int emptyCount = locMastService.selectCount(new EntityWrapper<LocMast>().eq("crn_no", basCrnp.getCrnNo()).eq("loc_sts", "O"));
+            // 搴撲綅鍗犵敤鐜�
+            double emptyLocOccupancy = (double) (800 - emptyCount) / 800;
+            CraneLoadInfo craneLoadInfo = new CraneLoadInfo();
+            craneLoadInfo.setCrnNo(basCrnp.getCrnNo());
+            craneLoadInfo.setTaskCount(taskCount);
+            craneLoadInfo.setOccupancy(emptyLocOccupancy);
+            craneInfos.add(craneLoadInfo);
+        }
+        // 鑾峰彇鏈�鍊�
+        int taskMax = craneInfos.stream().mapToInt(CraneLoadInfo::getTaskCount).max().orElse(0);
+        int taskMin = craneInfos.stream().mapToInt(CraneLoadInfo::getTaskCount).min().orElse(0);
+        double occMax = craneInfos.stream().mapToDouble(CraneLoadInfo::getOccupancy).max().orElse(0);
+        double occMin = craneInfos.stream().mapToDouble(CraneLoadInfo::getOccupancy).min().orElse(0);
+
+        // 閬垮厤鍒嗘瘝涓�0鐨勬儏鍐�
+        double taskRange = (taskMax - taskMin) == 0 ? 1 : (taskMax - taskMin);
+        double occRange = (occMax - occMin) == 0 ? 1 : (occMax - occMin);
+
+        // 璁$畻 伪
+        for (CraneLoadInfo info : craneInfos) {
+            double taskNorm = (info.getTaskCount() - taskMin) / taskRange;
+            double occNorm = (info.getOccupancy() - occMin) / occRange;
+            double alpha = w1 * taskNorm + w2 * occNorm;
+            info.setAlpha(alpha);
+        }
+
+        // 鎺掑簭锛毼� 瓒婂皬瓒婄┖闂�
+        craneInfos.sort(Comparator.comparingDouble(CraneLoadInfo::getAlpha));
+
+        // 瀵绘壘搴撲綅
+        LocMast locMast = null;
+        // 鏍规嵁鍏ュ簱绫诲瀷鍜屾簮绔欑偣鑾峰彇宸ヤ綔璺緞
+        StaDesc staDesc = null;
+
+        for (CraneLoadInfo craneLoadInfo : craneInfos) {
+            List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("crn_no", craneLoadInfo.getCrnNo()).eq("loc_sts", "O").orderBy("lev1").orderBy("bay1").orderBy("row1"));
+            if (locMastList.size() <= 4) {
+                continue;
+            }
+            // 鍏堝彇娣卞簱浣�
+            Optional<LocMast> first = locMastList.stream().filter(o -> deepLocRowList.contains(o.getRow1())).findFirst();
+            // 娣卞簱浣嶉噷闈㈡病鏈変粠娴呭簱浣嶉噷闈㈠彇
+            locMast = first.orElseGet(() -> locMastList.get(0));
+
+            if (locMast != null) {
+                staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("crn_no", locMast.getCrnNo()).eq("stn_no", sourceSiteNo));
+                if (staDesc == null) {
+                    log.error("鑾峰彇宸ヤ綔璺緞寮傚父,绫诲瀷:{},鍫嗗灈鏈�:{},婧愮珯:{}", ioType, locMast.getCrnNo(), sourceSiteNo);
+                    throw new CoolException("鑾峰彇宸ヤ綔璺緞寮傚父,绫诲瀷:" + ioType + ",鍫嗗灈鏈�:" + locMast.getCrnNo() + ",婧愮珯:" + sourceSiteNo);
+                }
+                break;
+            }
+        }
+
+        if (locMast == null) {
+            log.error("鍫嗗灈鏈哄墿浣欏簱浣嶄笉瓒筹細{}", craneInfos);
+            throw new CoolException("鍫嗗灈鏈轰笉鍙敤/搴撲綅涓嶈冻锛岃妫�鏌�");
+        }
+
+        // 鐢熸垚宸ヤ綔鍙�
+        int workNo = getWorkNo(0);
+        // 杩斿洖dto
+        StartupDto startupDto = new StartupDto();
+        startupDto.setWorkNo(workNo);
+        startupDto.setCrnNo(locMast.getCrnNo());
+        startupDto.setSourceStaNo(sourceSiteNo);
+        startupDto.setStaNo(staDesc.getCrnStn());
+        startupDto.setLocNo(locMast.getLocNo());
+
+        return startupDto;
+    }
+
     //鎷嗙洏鏈哄绌烘澘鎵爜锛岄┍鍔ㄦ墭鐩樺悜鐮佸灈浣嶏紝涓嶅叆搴�
     @Transactional
     public StartupDto getScanBarcodeEmptyBoard() {

--
Gitblit v1.9.1