From 8407e277e156a55fee38e7bb7b8930ec16a15f0e Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期五, 24 四月 2026 09:08:47 +0800
Subject: [PATCH] 库存上下限预警,物料高低频摆放

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

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index e659ad1..8c50881 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -3,17 +3,15 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
-import com.core.common.Arith;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.result.FindLocNoAttributeVo;
-import com.zy.asrs.entity.result.KeyValueVo;
+import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.Utils;
 import com.zy.asrs.utils.VersionUtils;
 import com.zy.common.model.LocTypeDto;
-import com.zy.common.model.Shelves;
 import com.zy.common.model.StartupDto;
 import com.zy.common.properties.SlaveProperties;
 import lombok.extern.slf4j.Slf4j;
@@ -21,11 +19,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.List;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 璐ф灦鏍稿績鍔熻兘
@@ -1031,4 +1027,127 @@
         }
     }
 
+    @Resource
+    private LocMastMapper locMastMapper;
+
+    public StartupDto getLocNoNew(int ioType, Integer sourceStaNo, Integer locType, List<Integer> rows, int sortRole) {
+        // 瀵绘壘鍒扮殑搴撲綅
+        LocMast locMast = null;
+
+        // 鍙敤鍫嗗灈鏈�
+        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("鍏ュ簱璇锋眰搴撲綅澶辫触锛屾病鏈夎仈鏈哄爢鍨涙満鎴栧爢鍨涙満寮傚父");
+            throw new CoolException("鍏ュ簱璇锋眰搴撲綅澶辫触锛屾病鏈夎仈鏈哄爢鍨涙満鎴栧爢鍨涙満寮傚父");
+        }
+
+        // 涓�娆℃煡鎵�鏈夊爢鍨涙満浠诲姟鏁帮紙group by锛�
+        List<Map<String, Object>> countList = locMastMapper.selectMaps(
+                new EntityWrapper<LocMast>()
+                        .setSqlSelect("crn_no, COUNT(*) AS cnt")
+                        .eq("loc_sts", "S")
+                        .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()))
+                        .groupBy("crn_no")
+        );
+
+        // 鍫嗗灈鏈哄搴斾换鍔℃暟
+        Map<Integer, Integer> countMap = countList.stream()
+                .collect(Collectors.toMap(
+                        m -> (Integer) m.get("crn_no"),
+                        m -> ((Number) m.get("cnt")).intValue()
+                ));
+
+        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>()
+                .eq("loc_type1", locType)
+                .eq("loc_sts", 'O')
+                .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()));
+        if(sortRole == 0) {
+            wrapper.last("ORDER BY CASE WHEN row1 IN (1,4,5,8,9,12) THEN 0 ELSE 1 END, lev1, bay1, row1");
+        } else {
+            wrapper.last("ORDER BY CASE WHEN row1 IN (1,4,5,8,9,12) THEN 0 ELSE 1 END, lev1, bay1 desc, row1");
+        }
+
+        // 鎵�鏈夋弧瓒虫潯浠剁殑搴撲綅
+        List<LocMast> allLocs = locMastMapper.selectList(wrapper);
+
+        // 鎸夊爢鍨涙満鍒嗙粍
+        Map<Integer, List<LocMast>> locMap = allLocs.stream()
+                .collect(Collectors.groupingBy(LocMast::getCrnNo));
+
+        // 鍫嗗灈鏈哄搴斿簱浣嶇被鍨嬬殑鍓╀綑搴撲綅鏁板ぇ浜�4涓殑鍫嗗灈鏈轰繚鐣�
+        List<BasCrnp> availableCrn = basCrnps.stream()
+                .filter(c -> locMap.containsKey(c.getCrnNo()) && locMap.get(c.getCrnNo()).size() > 4)
+                .collect(Collectors.toList());
+
+        if (availableCrn.isEmpty()) {
+            // 閫掑綊鍏煎
+            if (locType >= 3) return null;
+            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows, sortRole);
+        }
+
+        availableCrn.sort(Comparator.comparing(c -> countMap.getOrDefault(c.getCrnNo(), 0)));
+
+        for (BasCrnp crnp : availableCrn) {
+
+            List<LocMast> locs = locMap.get(crnp.getCrnNo());
+            if (locs == null || locs.isEmpty()) {
+                continue;
+            }
+            Map<String, LocMast> locNoMap = locs.stream()
+                    .collect(Collectors.toMap(LocMast::getLocNo, e -> e));
+            for(LocMast locMast1: locs) {
+                String locNo = locMast1.getLocNo();
+                // 鏄繁搴撲綅
+                if(Utils.isDeepLoc(slaveProperties,locMast1.getLocNo())){
+                    // 鑾峰彇娴呭簱浣�
+                    String shallowLoc = Utils.getShallowLoc(slaveProperties, locNo);
+                    LocMast shallow = locNoMap.get(shallowLoc);
+                    // 娴呭簱浣嶆槸绌哄簱浣嶏紝鏀炬繁搴撲綅
+                    if (shallow != null) {
+                        locMast = locMast1;
+                        break;
+                    }
+                } else { // 鏄祬搴撲綅锛屽垽鏂繁搴撲綅鏄惁涓虹┖,鏄垯鏀撅紝涓嶆槸鍒欒烦杩�
+                    // 鑾峰彇娣卞簱浣�
+                    String deepLoc = Utils.getDeepLoc(slaveProperties, locNo);
+                    LocMast deep = locNoMap.get(deepLoc);
+                    // 娣卞簱浣嶄笉绌烘斁娣卞簱浣�
+                    if (deep != null) {
+                        locMast = deep;
+                        break;
+                    } else {
+                        locMast = locMast1;
+                        break;
+                    }
+                }
+            }
+            if (locMast != null) {
+                break;
+            }
+        }
+
+        if (locMast == null) {
+            if (locType >= 3) return null;
+            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows, sortRole);
+        }
+
+        // 鏍规嵁鍏ュ簱绫诲瀷鍜屾簮绔欑偣鑾峰彇宸ヤ綔璺緞
+        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo()));
+        if (staDesc == null) {
+            log.error("鑾峰彇宸ヤ綔璺緞寮傚父,绫诲瀷锛歿}锛屾簮绔欑偣锛歿}锛屽簱浣嶏細{}",ioType,sourceStaNo,locMast.getLocNo());
+            throw new CoolException("鑾峰彇宸ヤ綔璺緞寮傚父");
+        }
+        // 鐢熸垚宸ヤ綔鍙�
+        int workNo = getWorkNo(0);
+        // 杩斿洖dto
+        StartupDto startupDto = new StartupDto();
+        startupDto.setWorkNo(workNo);
+        startupDto.setCrnNo(locMast.getCrnNo());
+        startupDto.setSourceStaNo(sourceStaNo);
+        startupDto.setStaNo(staDesc.getCrnStn());
+        startupDto.setLocNo(locMast.getLocNo());
+        startupDto.setTaskPri(13D);
+
+        return startupDto;
+    }
 }

--
Gitblit v1.9.1