From c28812eb7e5afa79cb5e2f4fbee7f96c7d7767ed Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期五, 03 四月 2026 14:33:22 +0800
Subject: [PATCH] AGV出库,立库查询库存优化

---
 src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java |    5 +
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java    |   54 +++++++++---------
 src/main/resources/mapper/LocMastMapper.xml                    |    8 ++
 src/main/java/com/zy/asrs/mapper/LocMastMapper.java            |    2 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java  |   69 ++++++++++++++++++-----
 src/main/java/com/zy/asrs/service/LocMastService.java          |   10 +++
 6 files changed, 106 insertions(+), 42 deletions(-)

diff --git a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
index f179d73..30fdc9e 100644
--- a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -62,4 +62,6 @@
      * @return 搴撲綅鍙�
      */
     String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
+
+    LocMast selectNotFull(@Param("locType")Long locType, @Param("id")Long id);
 }
diff --git a/src/main/java/com/zy/asrs/service/LocMastService.java b/src/main/java/com/zy/asrs/service/LocMastService.java
index a0677de..23905c8 100644
--- a/src/main/java/com/zy/asrs/service/LocMastService.java
+++ b/src/main/java/com/zy/asrs/service/LocMastService.java
@@ -62,4 +62,14 @@
 
     //鏌ヨ鎸囧畾妤煎眰鐨勫簱浣嶆暟鎹�
     List<LocMast> selectLocByLev(Integer lev);
+
+    /**
+     * 鑾峰彇鏈弧鏉挎墭鐩�
+     * @author Ryan
+     * @date 2026/4/3 13:01
+     * @param locType
+     * @param id
+     * @return com.zy.asrs.entity.LocMast
+     */
+    LocMast selectNotFull(Long locType, Long id);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
index 3879571..a728106 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -119,6 +119,11 @@
     }
 
     @Override
+    public LocMast selectNotFull(Long locType, Long id) {
+        return this.baseMapper.selectNotFull(locType, id);
+    }
+
+    @Override
     public Boolean checkWhole(List<LocDetl> locDetls) {
         return null;
     }
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index a900c9f..c6c3eea 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1740,7 +1740,7 @@
                 double val = Math.round((combMat.getAnfme() + wrkDetl.getAnfme()) * 10000) / 10000.0;
                 WrkDetl detl = new WrkDetl();
                 detl.setOrderNo(stationDetl.getOrderNo());
-                detl.setBoxType1(wrkDetl.getBoxType1());
+                detl.setBoxType1(param.getBoxType1());
                 detl.setZpallet(param.getBarcode());
                 detl.setBarcode(param.getBarcode());
                 detl.setThreeCode(combMat.getThreeCode());
@@ -2250,7 +2250,16 @@
         AtomicReference<Double> totalOut = new AtomicReference<>(0.0);
         listMap.forEach((matnr, detls) -> {
             Map<String, List<LocDetl>> supIds = detls.stream().collect(Collectors.groupingBy(LocDetl::getStandby1));
-            supIds.forEach((supId, sups) -> {
+            for (String supId : supIds.keySet()) {
+                List<LocDetl> sups = supIds.get(supId);
+//            }
+//            supIds.forEach((supId, sups) -> {
+                Mat mats = matService.selectOne(new EntityWrapper<Mat>()
+                        .eq("supp_code", supId)
+                        .eq("matnr", matnr));
+                if (Objects.isNull(mats)) {
+                    throw new CoolException("鐗╂枡涓嶅瓨鍦紒锛�");
+                }
                 // 鏍规嵁supId(渚涘簲鍟�)鍒嗙被锛屽緱鍒伴渶瑕佸瓨鏀剧殑鎬荤┖搴撳瓨鏁伴噺
                 Double sum = sups.stream().mapToDouble(LocDetl::getAnfme).sum();
                 AtomicReference<Double> itemed = new AtomicReference<>(0.0);
@@ -2278,12 +2287,6 @@
                         if (container.getMixMax() > sets.size()) {
                             //浣欎笅鍙贩鏀剧绫�
                             long suplus = Math.round((container.getMixMax() - sets.size()) * 10000) / 10000;
-                            Mat mats = matService.selectOne(new EntityWrapper<Mat>()
-                                    .eq("supp_code", supId)
-                                    .eq("matnr", matnr));
-                            if (Objects.isNull(mats)) {
-                                throw new CoolException("鐗╂枡涓嶅瓨鍦紒锛�");
-                            }
                             //浣欎笅鏈�澶у彲鏀炬暟閲�
                             Double v = Math.round((mats.getUpQty() * suplus) * 10000) / 10000.0;
                             // 鍏ュ簱鏁伴噺灏忎簬闆朵笖鍏ュ簱鏁伴噺鍑忓幓宸茶鍒掑嚭鏁伴噺澶т簬闆讹紙锛�
@@ -2296,8 +2299,46 @@
                             }
                         }
                     });
+                } else {
+                    // 鑾峰彇褰撳墠渚涘簲鍟�+ 鐗╂枡鍦ㄥ簱
+                    LocMast notFullList = locMastService.selectNotFull(mats.getLocType(), one.getId());
+                    if (Objects.isNull(notFullList)) {
+                        continue;
+                    }
+                    BasContainer container = basContainerService
+                            .selectOne(new EntityWrapper<BasContainer>().eq("barcode", notFullList.getBarcode()));
+                    if (Objects.isNull(container)) {
+                        throw new CoolException("鏁版嵁閿欒锛屽鍣ㄤ笉瀛樺湪锛侊紒");
+                    }
+                    List<LocDetl> adetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", notFullList.getLocNo()));
+                    Set<String> sets = adetls.stream().map(LocDetl::getMatnr).collect(Collectors.toSet());
+                    List<LocDetl> locDtls = new ArrayList<>();
+                    // 鍒ゆ柇瀹瑰櫒鏄惁杩樺彲娣锋斁,鍙婂綋鍓嶇墿鏂欏彲鏀惧灏�
+                    if (container.getMixMax() > sets.size()) {
+                        //浣欎笅鍙贩鏀剧绫�
+                        long suplus = Math.round((container.getMixMax() - sets.size()) * 10000) / 10000;
+                        //浣欎笅鏈�澶у彲鏀炬暟閲�
+                        Double v = Math.round((mats.getUpQty() * suplus) * 10000) / 10000.0;
+                        // 鍏ュ簱鏁伴噺灏忎簬闆朵笖鍏ュ簱鏁伴噺鍑忓幓宸茶鍒掑嚭鏁伴噺澶т簬闆讹紙锛�
+                        if (sum.compareTo(v) <= 0 && sum.compareTo(itemed.get()) > 0) {
+                            itemed.set(Math.round((itemed.get() + v) * 10000) / 10000.0);
+                            // 鍙斁涓�
+                            LocDetl locDetl = new LocDetl();
+                            BeanUtils.copyProperties(mats, locDetl);
+                            locDetl.setLocNo(notFullList.getLocNo());
+                            locDetl.setAnfme(0.0);
+                            locDetl.setMatnr(mats.getMatnr());
+                            locDetl.setZpallet(notFullList.getBarcode());
+                            locDetl.setSuppCode(mats.getSuppCode());
+                            locDetl.setMaktx(mats.getMaktx());
+                            locDtls.add(locDetl);
+                            CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(notFullList.getLocNo()).setLocDetlList(locDtls);
+                            locMasts.add(crnTaskDetlDTO);
+                            totalOut.set(Math.round((totalOut.get() + itemed.get()) * 10000) / 10000.0);
+                        }
+                    }
                 }
-            });
+            }
         });
 
         /**鏄惁浼樺厛绌烘澘鍑哄簱*/
@@ -2314,7 +2355,6 @@
             }
             CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(new ArrayList<>());
             locMasts.add(crnTaskDetlDTO);
-
             // 绌烘澘鍑哄簱
             generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station);
         } else {
@@ -2626,14 +2666,14 @@
             if (Objects.isNull(station)) {
                 throw new CoolException("绔欑偣涓嶅瓨鍦�!!");
             }
-
-            station.setLocSts("O"); // S.鍏ュ簱棰勭害
+            station.setLocSts("O");
             station.setBarcode(barcode);
             station.setModiTime(new Date());
             station.setModiUser(userId);
             if (!basStationService.updateById(station)) {
                 throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
             }
+            basStationDetlService.delete(new EntityWrapper<BasStationDetl>().eq("dev_no", station.getDevNo()));
         }
     }
 
@@ -2718,13 +2758,12 @@
         if (Objects.isNull(station)) {
             throw new CoolException("绔欑偣涓嶅瓨鍦�!!");
         }
-
         try {
             //绌哄彴杞﹀洖搴�
             generateAgvTask("agv_back", locCache, callAgvBackParam.getOrgSite(), station.getBarcode(), userId, "M2");
         } catch (Exception e) {
-            e.printStackTrace();
-            return R.error(e.getMessage());
+            log.error(e.getMessage());
+            throw new CoolException(e.getMessage());
         }
 
         return R.ok(locCache);
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 7afbf9d..db16ddc 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -370,35 +370,35 @@
                                     .eq("supp_code", wrkDetl.getSuppCode())
                                     .eq("matnr", wrkDetl.getMatnr())
                                     .eq("loc_no", locMast.getLocNo()));
+                            // 鏇存柊璁㈠崟瀹屾垚鏁伴噺
+                            OrderDetlPakin detlPakin = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
+//                                                .eq("three_code", wrkDetl.getThreeCode()) //TODO 骞舵澘鏃堕渶瑕佷慨鏀笲SCODE涓鸿鍗昩scode
+                                    .eq("supp_code", wrkDetl.getSuppCode())
+                                    .eq("matnr", wrkDetl.getMatnr())
+                                    .eq("order_no", wrkDetl.getOrderNo()));
+                            if (!Cools.isEmpty(detlPakin)) {
+                                //浠诲姟鏄庣粏鏁伴噺=鏂板叆搴撴暟閲� + 鍘熷簱瀛樻暟閲�
+                                double locQty = 0.0;
+                                if (!Objects.isNull(locDetl)) {
+                                    locQty = locDetl.getAnfme();
+                                }
+                                double v = Math.round((wrkDetl.getAnfme() - locQty) * 10000) / 10000.0;
+                                double v1 = Math.round((detlPakin.getQty() + v) * 10000) / 10000.0;
+                                detlPakin.setQty(v1);
+                                detlPakin.setWorkQty(v1);
+                                detlPakin.setAdjustQty(wrkDetl.getAdjustQty());
+                                detlPakin.setSplusQty(wrkDetl.getSplusQty());
+                                if (!orderDetlPakinService.update(detlPakin, new EntityWrapper<OrderDetlPakin>()
+                                        .eq("matnr", detlPakin.getMatnr())
+                                        .eq("supp_code", detlPakin.getSuppCode())
+                                        .eq("order_no", detlPakin.getOrderNo()))) {
+                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                                    return FAIL.setMsg("骞舵澘鍏ュ簱 ===>> 鏇存柊璁㈠崟瀹屾垚鏁伴噺澶辫触; [workNo=" + wrkMast.getWrkNo()
+                                            + "],[locNo=" + wrkMast.getLocNo() + "]");
+                                }
+                            }
 
                             if (null != locDetl) {
-                                // 鏇存柊璁㈠崟瀹屾垚鏁伴噺
-                                OrderDetlPakin detlPakin = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
-//                                                .eq("three_code", wrkDetl.getThreeCode()) //TODO 骞舵澘鏃堕渶瑕佷慨鏀笲SCODE涓鸿鍗昩scode
-                                        .eq("supp_code", wrkDetl.getSuppCode())
-                                        .eq("matnr", wrkDetl.getMatnr())
-                                        .eq("order_no", wrkDetl.getOrderNo()));
-                                try {
-                                    if (!Cools.isEmpty(detlPakin)) {
-                                        double v = Math.round((wrkDetl.getAnfme() - locDetl.getAnfme()) * 10000) / 10000.0;
-                                        double v1 = Math.round((detlPakin.getQty() + v) * 10000) / 10000.0;
-                                        detlPakin.setQty(v1);
-                                        detlPakin.setWorkQty(v1);
-                                        detlPakin.setAdjustQty(wrkDetl.getAdjustQty());
-                                        detlPakin.setSplusQty(wrkDetl.getSplusQty());
-                                        if (!orderDetlPakinService.update(detlPakin, new EntityWrapper<OrderDetlPakin>()
-                                                .eq("matnr", detlPakin.getMatnr())
-                                                .eq("supp_code", detlPakin.getSuppCode())
-                                                .eq("order_no", detlPakin.getOrderNo()))) {
-                                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                                            return FAIL.setMsg("骞舵澘鍏ュ簱 ===>> 鏇存柊璁㈠崟瀹屾垚鏁伴噺澶辫触; [workNo=" + wrkMast.getWrkNo()
-                                                    + "],[locNo=" + wrkMast.getLocNo() + "]");
-                                        }
-                                    }
-                                } catch (Exception e) {
-                                    log.error(e.getMessage());
-                                }
-
                                 LocDetl detl = new LocDetl();
                                 detl.setAnfme(wrkDetl.getAnfme());
                                 detl.setStandby1(wrkDetl.getSuppCode());
diff --git a/src/main/resources/mapper/LocMastMapper.xml b/src/main/resources/mapper/LocMastMapper.xml
index 216d15a..37e4f23 100644
--- a/src/main/resources/mapper/LocMastMapper.xml
+++ b/src/main/resources/mapper/LocMastMapper.xml
@@ -215,5 +215,13 @@
             #{item}
         </foreach>
     </select>
+    <select id="selectNotFull" resultType="com.zy.asrs.entity.LocMast">
+        SELECT
+            TOP 1 *
+        FROM
+            asr_loc_mast
+        WHERE
+            barcode IN (SELECT zpallet  FROM asr_loc_detl ald INNER JOIN man_mat mt ON ald.matnr = mt.matnr AND ald.supp_code = mt.supp_code  WHERE mt.loc_type =#{locType}  AND area_id = #{id} GROUP BY zpallet HAVING COUNT ( * ) &lt; 2) ORDER BY loc_no, modi_time ASC
+    </select>
 
 </mapper>

--
Gitblit v1.9.1