From 1ba0dbfde5634c8bf2ec20891d6b226b996f6b59 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 02 九月 2026 14:24:38 +0800
Subject: [PATCH] refactor(mes): 优化MES生产扫码入库功能支持多类型扫码

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java |   93 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 79 insertions(+), 14 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
index cc2413d..d3a7a25 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -22,13 +23,15 @@
     default PageResult<MesWmMaterialStockDO> selectPage(MesWmMaterialStockPageReqVO reqVO,
                                                          Collection<Long> itemTypeIds,
                                                          Collection<Long> itemIds,
-                                                         Long virtualWarehouseId) {
+                                                         Long virtualWarehouseId,
+                                                         Collection<Long> warehouseIds) {
         LambdaQueryWrapperX<MesWmMaterialStockDO> wrapper = new LambdaQueryWrapperX<MesWmMaterialStockDO>()
                 .inIfPresent(MesWmMaterialStockDO::getItemTypeId, itemTypeIds)
                 .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds)
                 .likeIfPresent(MesWmMaterialStockDO::getBatchCode, reqVO.getBatchCode())
                 .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId())
                 .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId())
+                .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds)
                 .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId())
                 .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId())
                 .eqIfPresent(MesWmMaterialStockDO::getVendorId, reqVO.getVendorId())
@@ -149,9 +152,10 @@
     }
 
     /**
-     * 鎸夌粍鍚堥敭鏌ヨ搴撳瓨璁板綍锛堝拷鐣ヤ緵搴斿晢缁村害锛�
+     * 鎸夌粍鍚堥敭鏌ヨ搴撳瓨璁板綍锛堝拷鐣ヤ緵搴斿晢缁村害锛屼粎鍚堟牸搴擄級
      *
-     * 鐢ㄤ簬绉诲簱鍦烘櫙锛氱Щ搴撴椂灏嗗簱瀛樺悎骞跺埌鐩爣搴撲綅宸叉湁搴撳瓨锛屼笉鍖哄垎渚涘簲鍟�
+     * 鐢ㄤ簬绉诲簱鍦烘櫙锛氱Щ搴撴椂灏嗗悎鏍煎簱瀛樺悎骞跺埌鐩爣搴撲綅宸叉湁鍚堟牸搴撳瓨锛屼笉鍖哄垎渚涘簲鍟�
+     * 鍙尮閰嶅悎鏍煎簱(20)锛岄伩鍏嶅皢绉诲叆鏁伴噺鍚堝苟鍒板悓鎵规鐨勬殏瀛樺簱璁板綍
      */
     default MesWmMaterialStockDO selectByCompositeKeyIgnoreVendor(Long itemId, Long warehouseId, Long locationId,
                                                                     Long areaId, Long batchId) {
@@ -159,7 +163,8 @@
                 .eq(MesWmMaterialStockDO::getItemId, itemId)
                 .eq(MesWmMaterialStockDO::getWarehouseId, warehouseId)
                 .eq(MesWmMaterialStockDO::getLocationId, locationId)
-                .eq(MesWmMaterialStockDO::getAreaId, areaId);
+                .eq(MesWmMaterialStockDO::getAreaId, areaId)
+                .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState());
         // batchId=null 鏃剁簿纭尮閰� is null
         if (batchId != null) {
             wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId);
@@ -170,9 +175,41 @@
         return selectOne(wrapper);
     }
 
+    /**
+     * 鎸夌粍鍚堥敭鏌ヨ鍚堟牸搴撳簱瀛樿褰曪紙鐢ㄤ簬鍑哄簱浜嬪姟鍖归厤锛�
+     *
+     * 鍚屾壒娆″彲鑳藉悓鏃跺瓨鍦ㄦ殏瀛樺簱(10)涓庡悎鏍煎簱(20)涓ゆ潯璁板綍锛堢瀛愯川妫�鎸夎鎷嗘暟閲忥級锛�
+     * 鍑哄簱蹇呴』鍙粠鍚堟牸搴撳尮閰嶏紝閬垮厤鎵e埌鏈川妫�鐨勬殏瀛樺簱瀛樸��
+     */
+    default MesWmMaterialStockDO selectQualifiedByCompositeKey(Long itemId, Long warehouseId, Long locationId,
+                                                                 Long areaId, Long batchId, Long vendorId) {
+        LambdaQueryWrapperX<MesWmMaterialStockDO> wrapper = new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .eq(MesWmMaterialStockDO::getItemId, itemId)
+                .eq(MesWmMaterialStockDO::getWarehouseId, warehouseId)
+                .eq(MesWmMaterialStockDO::getLocationId, locationId)
+                .eq(MesWmMaterialStockDO::getAreaId, areaId)
+                .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState());
+        // batchId=null 鏃剁簿纭尮閰� is null
+        if (batchId != null) {
+            wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId);
+        } else {
+            wrapper.isNull(MesWmMaterialStockDO::getBatchId);
+        }
+        if (vendorId != null) {
+            wrapper.eq(MesWmMaterialStockDO::getVendorId, vendorId);
+        }
+        wrapper.last("ORDER BY quantity DESC LIMIT 1");
+        return selectOne(wrapper);
+    }
+
     default List<MesWmMaterialStockDO> selectList(MesWmMaterialStockListReqVO reqVO) {
+        return selectList(reqVO, null);
+    }
+
+    default List<MesWmMaterialStockDO> selectList(MesWmMaterialStockListReqVO reqVO, Collection<Long> warehouseIds) {
         return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
                 .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId())
+                .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds)
                 .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId())
                 .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId())
                 .eqIfPresent(MesWmMaterialStockDO::getItemId, reqVO.getItemId())
@@ -197,6 +234,36 @@
                 .orderByAsc(MesWmMaterialStockDO::getReceiptTime));
     }
 
+    /**
+     * 鎸夌墿鏂�/鎵规鏌ヨ鍚堟牸搴撳簱瀛樿褰曪紙浠� stock_state=20锛屼笖浠呴檺鍚堟牸浠撳簱锛�
+     *
+     * <p>鍚屾壒娆″彲鑳藉悓鏃跺瓨鍦ㄦ殏瀛樺簱(10)涓庡悎鏍煎簱(20)涓ゆ潯璁板綍锛堢瀛愯川妫�鎸夎鎷嗘暟閲忥級锛�
+     * 閿�鍞嚭搴撻�夊簱瀛樺彧鑳戒粠鍚堟牸搴撹褰曚腑閫夛紝鏉滅粷閫変腑鏈川妫�鐨勬殏瀛樺簱瀛橈紱
+     * 鍚屾椂闄愬畾鍚堟牸浠撳簱锛坱ype=20锛夛紝閬垮厤浠庢殏瀛樹粨搴撲腑璇�夊悎鏍兼�佸簱瀛樸��</p>
+     */
+    default List<MesWmMaterialStockDO> selectQualifiedListByItemAndBatch(Long itemId, Long batchId,
+                                                                          Collection<Long> qualifiedWarehouseIds) {
+        return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .eq(MesWmMaterialStockDO::getItemId, itemId)
+                .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId)
+                .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState())
+                .in(MesWmMaterialStockDO::getWarehouseId, qualifiedWarehouseIds)
+                .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)
+                .orderByAsc(MesWmMaterialStockDO::getReceiptTime));
+    }
+
+    /**
+     * 鎸変粨搴撴壒娆℃煡璇㈠叏閮ㄥ簱瀛樿褰曪紙鍚殏瀛樺簱涓庡悎鏍煎簱锛宷uantity>0锛�
+     *
+     * <p>鐢ㄤ簬绉嶅瓙璐ㄦ鎸夎鐮佹祦杞細瀹氫綅璇ユ壒娆℃殏瀛樺簱璁板綍鎵e噺 1 琚嬶紝浠ュ強瀹氫綅/鏂板缓鍚堟牸搴撹褰曠疮鍔� 1 琚嬨��</p>
+     */
+    default List<MesWmMaterialStockDO> selectStockListByBatchId(Long batchId) {
+        return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .eq(MesWmMaterialStockDO::getBatchId, batchId)
+                .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)
+                .orderByAsc(MesWmMaterialStockDO::getReceiptTime));
+    }
+
     default List<MesWmMaterialStockDO> selectListByItemIds(Collection<Long> itemIds) {
         if (itemIds == null || itemIds.isEmpty()) {
             return java.util.Collections.emptyList();
@@ -207,18 +274,16 @@
     }
 
     /**
-     * 鎸夋壒娆″彿鏇存柊搴撳瓨鐘舵�侊紙鐢ㄤ簬绉嶅瓙璐ㄦ鍚堟牸鍚庯紝灏嗘殏瀛樺簱鏁存壒杞负鍚堟牸搴擄級
+     * 缁熻鎵规鍦ㄦ殏瀛樺簱涓殑搴撳瓨璁板綍鏁帮紙鐢ㄤ簬绉嶅瓙璐ㄦ鍓嶆牎楠岃鐮�/鎵规鏄惁澶勪簬寰呰川妫�鐘舵�侊級
      *
-     * @param batchId   浠撳簱鎵规ID
-     * @param toState   鐩爣搴撳瓨鐘舵��
-     * @param fromState 鍘熷簱瀛樼姸鎬侊紙闄愬畾鍙洿鏂拌鐘舵�佺殑璁板綍锛�
-     * @return 褰卞搷琛屾暟
+     * @param batchId 浠撳簱鎵规ID
+     * @return 鏆傚瓨搴撳簱瀛樿褰曟暟
      */
-    default int updateStockStateByBatchId(Long batchId, Integer toState, Integer fromState) {
-        return update(new MesWmMaterialStockDO().setStockState(toState),
-                new LambdaUpdateWrapper<MesWmMaterialStockDO>()
-                        .eq(MesWmMaterialStockDO::getBatchId, batchId)
-                        .eq(MesWmMaterialStockDO::getStockState, fromState));
+    default Long selectTempStockCountByBatchId(Long batchId) {
+        return selectCount(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .eq(MesWmMaterialStockDO::getBatchId, batchId)
+                .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.TEMP.getState())
+                .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO));
     }
 
 }

--
Gitblit v1.9.3