From 25246d39da4b74b54a844b36d8a50752917b81cc Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周二, 13 5月 2025 16:59:24 +0800
Subject: [PATCH] Merge branch 'master' of http://222.71.245.114:9086/r/HIA24016N_PipeLineDemo

---
 HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs |   97 ++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs
index e8ef141..904fd93 100644
--- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs
+++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs
@@ -1,10 +1,15 @@
 锘縰sing CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto;
+using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
+using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsPlaces;
+using CMS.Plugin.HIAWms.Application.Contracts.Services;
 using CMS.Plugin.HIAWms.Domain.WmsMaterials;
 using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
 using CMS.Plugin.HIAWms.Domain.WmsPlaces;
+using CmsQueryExtensions.Extension;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Linq.Expressions;
 using System.Text;
 using System.Threading.Tasks;
 using Volo.Abp;
@@ -14,7 +19,7 @@
     /// <summary>
     /// 鍏叡鎿嶄綔鏈嶅姟
     /// </summary>
-    public class WmsCommonAppService : CMSPluginAppService
+    public class WmsCommonAppService : CMSPluginAppService,IWmsCommonAppService
     {
         private readonly IWmsMaterialRepository _wmsMaterialRepository;
         private readonly IWmsPlaceRepository _wmsPlaceRepository;
@@ -30,17 +35,6 @@
             _wmsMaterialStockRepository = wmsMaterialStockRepository;
         }
 
-        public async Task<List<MaterialModelOutput>> GetMaterialModeListAsync()
-        {
-            var materialList = await _wmsMaterialRepository.GetMaterialListAsync(new WmsMaterial());
-            if (materialList == null || materialList.Count <= 0) return new List<MaterialModelOutput>(); ;
-
-            return materialList.Select(material => new MaterialModelOutput
-            {
-                MaterialModel = material.MaterialModel,
-                MaterialModelDesc = material.MaterialModel
-            }).ToList();
-        }
 
         /// <summary>
         /// 鏌ユ壘绌哄簱浣�
@@ -50,11 +44,15 @@
         /// <param name="requiredNum"></param>
         /// <returns></returns>
         /// <exception cref="UserFriendlyException"></exception>
-        public async Task<Dictionary<WmsPlace, int>> FindAvailablePlacesAsync(string materialModel, string materialNo, int requiredNum)
+        public async Task<Dictionary<WmsPlaceDto, int>> FindAvailablePlacesAsync(string materialModel,int requiredNum, string materialNo="" )
         {
+
+            var whereConditions = DynamicGetQueryParams(new GetWmsMaterialStockInput { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI });
             // 1. 鑾峰彇鎵�鏈夊簱瀛樺拰搴撲綅淇℃伅
-            var stockList = await _wmsMaterialStockRepository.GetListAsync(new WmsMaterialStock());
-            var allPlaceList = await _wmsPlaceRepository.GetListAsync(new WmsPlace());
+            var stockList = await _wmsMaterialStockRepository.GetListAsync(whereConditions);
+
+            var placeList = await _wmsPlaceRepository.GetListAsync(new WmsPlace { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI});
+            var allPlaceList = ObjectMapper.Map<List<WmsPlace>, List<WmsPlaceDto>>(placeList);
 
             // 2. 鏌ユ壘鐩稿悓鐗╂枡鍨嬪彿鍜岀紪鍙风殑搴撳瓨锛堟寜搴撳瓨閲忛檷搴忥級
             var sameModelStocks = stockList
@@ -63,7 +61,7 @@
                 .OrderByDescending(x => x.StockNumber)
                 .ToList();
 
-            var availablePlaces = new Dictionary<WmsPlace, int>();
+            var availablePlaces = new Dictionary<WmsPlaceDto, int>();
             int remainingNum = requiredNum;
 
             // 3. 浼樺厛妫�鏌ュ凡鏈夊簱瀛樼殑搴撲綅鏄惁鑳藉瓨鏀撅紙鐩稿悓 MaterialNo锛�
@@ -108,5 +106,72 @@
 
             return availablePlaces;
         }
+
+        /// <summary>
+        /// 鏌ユ壘搴撳瓨
+        /// </summary>
+        /// <param name="materialModel"></param>
+        /// <param name="requiredNum"></param>
+        /// <param name="materialNo"></param>
+        /// <returns></returns>
+        public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "")
+        {
+            // 1. 鑾峰彇鎵�鏈夊簱瀛橈紙鎺掗櫎閿佸畾搴撳瓨锛�
+            var whereConditions = DynamicGetQueryParams(new GetWmsMaterialStockInput());
+            var stockList = (await _wmsMaterialStockRepository.GetListAsync(whereConditions))
+                .Where(x => x.IsLock == Domain.Shared.Enums.YesNoEnum.N)
+                .Where(x=>x.StorageTypeNo == Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI)
+                .ToList();
+
+            // 2. 绛涢�夊尮閰嶇墿鏂�
+            var availableStocklist = stockList
+                .Where(x => x.MaterialModel == materialModel)
+                .WhereIf(!string.IsNullOrEmpty(materialNo), x => x.MaterialNo == materialNo)
+                .OrderBy(x => x.StockNumber) // 浼樺厛浠庡簱瀛樺皯鐨勫簱浣嶅嚭
+                .ToList();
+
+            var availableStocks = ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(availableStocklist);
+
+            // 3. 妫�鏌ユ�诲簱瀛樻槸鍚﹁冻澶�
+            int totalAvailable = availableStocks.Sum(x => x.StockNumber);
+            if (totalAvailable < requiredNum)
+            {
+                throw new UserFriendlyException(
+                    $"搴撳瓨涓嶈冻锛侀渶姹�: {requiredNum}, 鍙敤: {totalAvailable}, 缂�: {requiredNum - totalAvailable}");
+            }
+
+            // 4. 璁$畻鍚勫簱浣嶅嚭搴撴暟閲�
+            var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <搴撲綅鍙�, 鍑哄簱鏁�>
+            int remaining = requiredNum;
+
+            foreach (var stock in availableStocks)
+            {
+                if (remaining <= 0) break;
+
+                int deductAmount = Math.Min(stock.StockNumber, remaining);
+                allocation.Add(stock, deductAmount);
+                remaining -= deductAmount;
+            }
+
+            return allocation;
+        }
+
+        private FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> DynamicGetQueryParams(GetWmsMaterialStockInput input)
+        {
+            //鍔ㄦ�佹瀯閫犳煡璇㈡潯浠�  
+            var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsMaterialStock, GetWmsMaterialStockInput>(input);
+            if (!whereConditions.IsSuccess)
+            {
+                throw new Exception("鍔ㄦ�佹瀯閫犳煡璇㈡潯浠跺け璐�:" + whereConditions.ErrMsg);
+            }
+
+            //涔熷彲鍐嶆鑷畾涔夋瀯寤烘煡璇㈡潯浠�  
+            Expression<Func<WmsMaterialStock, bool>> extendExpression = a => a.IsDeleted == false;
+            // 浣跨敤 System.Linq.PredicateBuilder 鐨� And 
+            var pres = (System.Linq.Expressions.Expression<Func<WmsMaterialStock, bool>>)(whereConditions.data);
+            whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
+
+            return whereConditions;
+        }
     }
 }

--
Gitblit v1.9.3