From 80c54edf900521057f69c81abb5cf3c056926350 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 29 五月 2023 13:50:58 +0800
Subject: [PATCH] 出库作业-提取后自动选择出库库位

---
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java            |    5 +
 src/main/java/com/zy/asrs/service/LocDetlService.java          |    8 ++
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java    |  162 +++++++++++++++++++++++++++++++++++++++
 src/main/resources/mapper/LocDetlMapper.xml                    |   18 ++++
 src/main/java/com/zy/asrs/entity/param/StockOutParam.java      |    7 +
 src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java |   19 ++++
 6 files changed, 216 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
index 331d3b0..9a99ca0 100644
--- a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -31,6 +31,13 @@
         // 鏁伴噺
         private Double count;
 
+        public LocDetl(String locNo, String matnr, String batch, Double count) {
+            this.locNo = locNo;
+            this.matnr = matnr;
+            this.batch = batch;
+            this.count = count;
+        }
+
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index 0d488d4..18f7a4f 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -73,5 +73,10 @@
 
     List<LocDetl> selectByLocNo(@Param("locNo") String locNo);
 
+    List<LocDetl> selectByLocNosAndMatnr(@Param("locNos") List<String> locNos, String matnr);
+
     List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//閫氳繃璁㈠崟鍙枫�佺墿鏂欏彿銆佺墿鏂欏悕绉般�佽鏍笺�佸簱浣嶅彿杩涜妯$硦鎼滅储
+
+    List<LocDetl> findAreaByMatnr(String matnr,Integer locType2);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index 6f5a09d..20c61df 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -68,5 +68,13 @@
 
     List<LocDetl> selectByLocNo(String locNo);
 
+    List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr);
+
     List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//閫氳繃璁㈠崟鍙枫�佺墿鏂欏彿銆佺墿鏂欏悕绉般�佽鏍笺�佸簱浣嶅彿杩涜妯$硦鎼滅储
+
+    List<LocDetl> findHighAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇㈤珮棰戝尯鍩�
+
+    List<LocDetl> findSingleAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇㈠崟鍝佸尯鍩�
+
+    List<LocDetl> findLowAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇綆棰戞贩鏀惧尯
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index 2008981..80f3207 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -154,6 +154,10 @@
         return this.baseMapper.selectByLocNo(locNo);
     }
 
+    @Override
+    public List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr) {
+        return this.baseMapper.selectByLocNosAndMatnr(locNos, matnr);
+    }
 
     @Override
     public LocDetl selectItem(String locNo, String matnr, String batch) {
@@ -167,4 +171,19 @@
         }
         return this.baseMapper.searchByLike(orderNo, matnr, maktx, specs, locNo);
     }
+
+    @Override
+    public List<LocDetl> findHighAreaByMatnr(String matnr) {
+        return this.baseMapper.findAreaByMatnr(matnr, 2);
+    }
+
+    @Override
+    public List<LocDetl> findSingleAreaByMatnr(String matnr) {
+        return this.baseMapper.findAreaByMatnr(matnr, 1);
+    }
+
+    @Override
+    public List<LocDetl> findLowAreaByMatnr(String matnr) {
+        return this.baseMapper.findAreaByMatnr(matnr, 3);
+    }
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 3f02ed6..ed6eed2 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -160,8 +160,38 @@
     @Transactional
     public void startupFullTakeStore(StockOutParam param, Long userId) {
         ArrayList<String> locNos = new ArrayList<>();
-        for (StockOutParam.LocDetl locDetl:param.getLocDetls()){
-            if (!locNos.contains(locDetl.getLocNo())){
+        List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
+        ArrayList<String> matnrs = new ArrayList<>();
+        for (StockOutParam.LocDetl locDetl : param.getLocDetls()) {
+            if (!matnrs.contains(locDetl.getMatnr())) {
+                matnrs.add(locDetl.getMatnr());
+
+                //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+                List<StockOutParam.LocDetl> locNoStep1 = this.findLocNoStep1(locDetl);
+                if (locNoStep1 != null) {
+                    locDetls.addAll(locNoStep1);
+                    continue;
+                }
+
+                //楂橀娣锋斁鍖哄煙娌℃湁婊¤冻鐨勫簱浣嶏紝鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+                List<StockOutParam.LocDetl> locNoStep2 = this.findLocNoStep2(locDetl);
+                if (locNoStep2 != null) {
+                    locDetls.addAll(locNoStep2);
+                    continue;
+                }
+
+                //浣庨娣锋斁鍖哄煙杩涜鎼滅储
+                List<StockOutParam.LocDetl> locNoStep3 = this.findLocNoStep3(locDetl);
+                if (locNoStep3 != null) {
+                    locDetls.addAll(locNoStep3);
+                    continue;
+                }
+
+            }
+        }
+
+        for (StockOutParam.LocDetl locDetl : locDetls) {
+            if (!locNos.contains(locDetl.getLocNo())) {
                 locNos.add(locDetl.getLocNo());
             }
         }
@@ -173,7 +203,7 @@
         BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
         // 鑾峰彇搴撲綅鏄庣粏
         List<LocDetlDto> locDetlDtos = new ArrayList<>();
-        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
+        for (StockOutParam.LocDetl paramLocDetl : locDetls) {
             if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                 LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
                 if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
@@ -192,6 +222,132 @@
         }
     }
 
+    //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+    private List<StockOutParam.LocDetl> findLocNoStep1(StockOutParam.LocDetl locDetl) {
+        List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+        //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+        List<LocDetl> locDetls = locDetlService.findHighAreaByMatnr(locDetl.getMatnr());
+        if (locDetls.size() > 0) {
+            for (LocDetl locDetl0 : locDetls) {
+                if (locDetl0.getAnfme() >= locDetl.getCount()) {
+                    //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+                    locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl0.getAnfme()));
+                    return locDetlList;
+                } else {
+                    //涓嶆弧瓒冲簱瀛樻潯浠�
+                    //鍒ゆ柇鏈�澶栦晶搴撲綅鐨勬繁澶勬槸鍚︽湁鐩稿悓鐗╂枡
+                    Double useCount = locDetl0.getAnfme();//宸蹭娇鐢ㄧ殑鏁伴噺
+                    List<StockOutParam.LocDetl> tmpLocDetlList = new ArrayList<>();//璁板綍缁忚繃鐨勫簱浣�
+                    tmpLocDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl0.getAnfme()));
+
+                    List<String> insideLoc = Utils.getGroupInsideLoc(locDetl0.getLocNo());
+                    List<LocDetl> locDetls1 = locDetlService.selectByLocNosAndMatnr(insideLoc, locDetl.getMatnr());
+                    if (locDetls1.size() == 0) {//鍐呬晶搴撲綅娌℃湁鐩稿悓鐨勭墿鏂欙紝璺宠繃
+                        continue;
+                    }
+
+                    for (LocDetl detl : locDetls1) {
+                        double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+                        double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+                        if (detl.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+                            realCount = lastCount;
+                        }else {
+                            //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+                            realCount = detl.getAnfme();
+                        }
+                        useCount += realCount;
+                        tmpLocDetlList.add(new StockOutParam.LocDetl(detl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+                        if (useCount >= locDetl.getCount()) {
+                            //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+                            locDetlList.addAll(tmpLocDetlList);
+                            return locDetlList;
+                        }
+                    }
+
+                }
+            }
+
+            //鏈�澶栦晶鍖呮嫭鍐呬晶閮芥棤婊¤冻搴撲綅锛屽垯鍒ゆ柇鎼滅储鍑烘潵鐨勫叏閮ㄦ渶澶栦晶搴撲綅鍔犺捣鏉ユ槸鍚︽弧瓒冲嚭搴撴暟閲忚姹�
+            Double useCount = 0D;
+            for (LocDetl locDetl0 : locDetls) {
+                double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+                double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+                if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+                    realCount = lastCount;
+                }else {
+                    //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+                    realCount = locDetl0.getAnfme();
+                }
+                useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+                locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+                if (useCount >= locDetl.getCount()) {
+                    //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+                    return locDetlList;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    //楂橀娣锋斁鍖哄煙娌℃湁婊¤冻鐨勫簱浣嶏紝鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+    private List<StockOutParam.LocDetl> findLocNoStep2(StockOutParam.LocDetl locDetl) {
+        List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+        //鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+        List<LocDetl> locDetls = locDetlService.findSingleAreaByMatnr(locDetl.getMatnr());
+        if (locDetls.size() > 0) {
+            Double useCount = 0D;
+            for (LocDetl locDetl0 : locDetls) {
+                double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+                double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+                if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+                    realCount = lastCount;
+                }else {
+                    //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+                    realCount = locDetl0.getAnfme();
+                }
+                useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+
+                locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+                if (useCount >= locDetl.getCount()) {
+                    //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+                    return locDetlList;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    //浣庨娣锋斁鍖哄煙杩涜鎼滅储
+    private List<StockOutParam.LocDetl> findLocNoStep3(StockOutParam.LocDetl locDetl) {
+        List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+        //鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+        List<LocDetl> locDetls = locDetlService.findLowAreaByMatnr(locDetl.getMatnr());
+        if (locDetls.size() > 0) {
+            Double useCount = 0D;
+            for (LocDetl locDetl0 : locDetls) {
+                double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+                double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+                if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+                    realCount = lastCount;
+                }else {
+                    //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+                    realCount = locDetl0.getAnfme();
+                }
+                useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+
+                locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+                if (useCount >= locDetl.getCount()) {
+                    //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+                    return locDetlList;
+                }
+            }
+        }
+
+        return null;
+    }
+
     @Override
     @Transactional
     public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 6726429..c605993 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -512,9 +512,17 @@
         SELECT  *  FROM [dbo].[asr_loc_detl_group] WHERE 1 = 1
         <include refid="groupListCondition"></include>
     </select>
+
     <select id="selectByLocNo" resultMap="BaseResultMap">
         SELECT * FROM asr_loc_detl WHERE loc_no = #{locNo}
+    </select>
 
+    <select id="selectByLocNosAndMatnr" resultMap="BaseResultMap">
+        SELECT * FROM asr_loc_detl WHERE loc_no in
+        <foreach item="item" collection="locNos" index="index"  separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        and matnr = #{matnr}
     </select>
 
     <select id="searchByLike" resultMap="BaseResultMap">
@@ -539,4 +547,14 @@
         </if>
     </select>
 
+    <select id="findAreaByMatnr" resultMap="BaseResultMap">
+        select * from asr_loc_detl ld
+        left join asr_loc_mast lm
+        on lm.loc_no = ld.loc_no
+        where matnr = #{matnr}
+        and loc_type2 = #{locType2}
+        and loc_sts = 'F'
+        order by anfme desc,row1,bay1,lev1
+    </select>
+
 </mapper>

--
Gitblit v1.9.1