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 |  136 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 130 insertions(+), 6 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 fa1bda7..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,16 +23,19 @@
     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())
+                .eqIfPresent(MesWmMaterialStockDO::getStockState, reqVO.getStockState())
                 .eqIfPresent(MesWmMaterialStockDO::getFrozen, reqVO.getFrozen());
         wrapper.ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)
                 .orderByAsc(MesWmMaterialStockDO::getReceiptTime);
@@ -99,8 +103,7 @@
                 .setSql("reserved_quantity = reserved_quantity + " + count);
         if (checkFlag && count.compareTo(BigDecimal.ZERO) > 0) {
             // 鏍¢獙鍙敤閲忓厖瓒筹細quantity - frozen_quantity - reserved_quantity >= count
-            updateWrapper.setSql("reserved_quantity = reserved_quantity + " + count +
-                    " WHERE quantity - IFNULL(frozen_quantity, 0) - IFNULL(reserved_quantity, 0) >= " + count);
+            updateWrapper.apply("quantity - IFNULL(frozen_quantity, 0) - IFNULL(reserved_quantity, 0) >= {0}", count);
         }
         return update(null, updateWrapper);
     }
@@ -138,23 +141,81 @@
         } else {
             wrapper.isNull(MesWmMaterialStockDO::getBatchId);
         }
-        // vendorId=null 鏃剁簿纭尮閰� is null
+        // vendorId=null 鏃朵笉闄愬埗锛屽尮閰嶄换鎰忎緵搴斿晢鐨勫簱瀛�
+        // 锛堥伩鍏嶅洜渚涘簲鍟嗙淮搴︽媶鍒嗭紝OUT 浜嬪姟鎵句笉鍒扮湡姝f湁搴撳瓨鐨勮褰曡�屾墸閿欏埌 vendor_id IS NULL 鐨勮褰曪級
         if (vendorId != null) {
             wrapper.eq(MesWmMaterialStockDO::getVendorId, vendorId);
-        } else {
-            wrapper.isNull(MesWmMaterialStockDO::getVendorId);
         }
+        // 澶氳褰曟椂浼樺厛鍙栧簱瀛橀噺鏈�澶氱殑锛堥伩鍏嶆墸鍒伴浂搴撳瓨鎴栬礋搴撳瓨鐨勮褰曪級
+        wrapper.last("ORDER BY quantity DESC LIMIT 1");
+        return selectOne(wrapper);
+    }
+
+    /**
+     * 鎸夌粍鍚堥敭鏌ヨ搴撳瓨璁板綍锛堝拷鐣ヤ緵搴斿晢缁村害锛屼粎鍚堟牸搴擄級
+     *
+     * 鐢ㄤ簬绉诲簱鍦烘櫙锛氱Щ搴撴椂灏嗗悎鏍煎簱瀛樺悎骞跺埌鐩爣搴撲綅宸叉湁鍚堟牸搴撳瓨锛屼笉鍖哄垎渚涘簲鍟�
+     * 鍙尮閰嶅悎鏍煎簱(20)锛岄伩鍏嶅皢绉诲叆鏁伴噺鍚堝苟鍒板悓鎵规鐨勬殏瀛樺簱璁板綍
+     */
+    default MesWmMaterialStockDO selectByCompositeKeyIgnoreVendor(Long itemId, Long warehouseId, Long locationId,
+                                                                    Long areaId, Long batchId) {
+        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);
+        }
+        wrapper.last("LIMIT 1");
+        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())
                 .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId())
                 .eqIfPresent(MesWmMaterialStockDO::getVendorId, reqVO.getVendorId())
+                .eqIfPresent(MesWmMaterialStockDO::getStockState, reqVO.getStockState())
                 .likeIfPresent(MesWmMaterialStockDO::getBatchCode, reqVO.getBatchCode())
                 .geIfPresent(MesWmMaterialStockDO::getUpdateTime, reqVO.getStartTime())
                 .leIfPresent(MesWmMaterialStockDO::getUpdateTime, reqVO.getEndTime())
@@ -162,4 +223,67 @@
                 .orderByAsc(MesWmMaterialStockDO::getReceiptTime));
     }
 
+    /**
+     * 鎸夌墿鏂欑紪鍙锋壒閲忔煡璇㈠簱瀛樿褰曪紙鐢ㄤ簬鐗╂枡闇�姹傚簱瀛樻牎楠岋級
+     */
+    default List<MesWmMaterialStockDO> selectListByItemAndBatch(Long itemId, Long batchId) {
+        return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .eq(MesWmMaterialStockDO::getItemId, itemId)
+                .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId)
+                .gt(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)
+                .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();
+        }
+        return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
+                .in(MesWmMaterialStockDO::getItemId, itemIds)
+                .ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO));
+    }
+
+    /**
+     * 缁熻鎵规鍦ㄦ殏瀛樺簱涓殑搴撳瓨璁板綍鏁帮紙鐢ㄤ簬绉嶅瓙璐ㄦ鍓嶆牎楠岃鐮�/鎵规鏄惁澶勪簬寰呰川妫�鐘舵�侊級
+     *
+     * @param batchId 浠撳簱鎵规ID
+     * @return 鏆傚瓨搴撳簱瀛樿褰曟暟
+     */
+    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