From 87733eb3623593da247c051593d64b8ff9e1d3a4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 06 十一月 2026 19:00:39 +0800
Subject: [PATCH] feat(crm,mes): 扩展客户字段与重构批次号生成逻辑

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java |  106 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 99 insertions(+), 7 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 38a7df2..196b777 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,19 +23,24 @@
     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);
+        if (!Boolean.TRUE.equals(reqVO.getIncludeZero())) {
+            wrapper.ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO);
+        }
+        wrapper.orderByAsc(MesWmMaterialStockDO::getReceiptTime);
         // 铏氭嫙浠撹繃婊わ紙Service 灞傚凡灏� virtualFilter 瑙f瀽涓� virtualWarehouseId锛�
         if (virtualWarehouseId != null) {
             if (MesWmMaterialStockPageReqVO.VIRTUAL_FILTER_ONLY.equals(reqVO.getVirtualFilter())) {
@@ -148,17 +154,19 @@
     }
 
     /**
-     * 鎸夌粍鍚堥敭鏌ヨ搴撳瓨璁板綍锛堝拷鐣ヤ緵搴斿晢缁村害锛�
+     * 鎸夌粍鍚堥敭鏌ヨ搴撳瓨璁板綍锛堝拷鐣ヤ緵搴斿晢缁村害锛屼粎鍚堟牸搴擄級
      *
-     * 鐢ㄤ簬绉诲簱鍦烘櫙锛氱Щ搴撴椂灏嗗簱瀛樺悎骞跺埌鐩爣搴撲綅宸叉湁搴撳瓨锛屼笉鍖哄垎渚涘簲鍟�
+     * 鐢ㄤ簬绉诲簱鍦烘櫙锛氱Щ搴撴椂灏嗗悎鏍煎簱瀛樺悎骞跺埌鐩爣搴撲綅宸叉湁鍚堟牸搴撳瓨锛屼笉鍖哄垎渚涘簲鍟�
+     * 鍙尮閰嶅悎鏍煎簱(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);
+                .eqIfPresent(MesWmMaterialStockDO::getLocationId, locationId)
+                .eqIfPresent(MesWmMaterialStockDO::getAreaId, areaId)
+                .eq(MesWmMaterialStockDO::getStockState, MesWmStockStateEnum.QUALIFIED.getState());
         // batchId=null 鏃剁簿纭尮閰� is null
         if (batchId != null) {
             wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId);
@@ -169,14 +177,47 @@
         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)
+                .eqIfPresent(MesWmMaterialStockDO::getLocationId, locationId)
+                .eqIfPresent(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())
@@ -187,6 +228,44 @@
     /**
      * 鎸夌墿鏂欑紪鍙锋壒閲忔煡璇㈠簱瀛樿褰曪紙鐢ㄤ簬鐗╂枡闇�姹傚簱瀛樻牎楠岋級
      */
+    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();
@@ -196,4 +275,17 @@
                 .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