From 14f9c8378bde7d9a8d8f1fcc393e0e8d49eced82 Mon Sep 17 00:00:00 2001 From: zs <zhousong@weben-smart.com> Date: 周五, 09 5月 2025 17:44:29 +0800 Subject: [PATCH] 查找空库位,查找库存 --- HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs | 67 ++++++++++++++++++++++++++------- 1 files changed, 52 insertions(+), 15 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..63d57b9 100644 --- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs @@ -1,4 +1,6 @@ 锘縰sing CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto; +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; @@ -14,7 +16,7 @@ /// <summary> /// 鍏叡鎿嶄綔鏈嶅姟 /// </summary> - public class WmsCommonAppService : CMSPluginAppService + public class WmsCommonAppService : CMSPluginAppService,IWmsCommonAppService { private readonly IWmsMaterialRepository _wmsMaterialRepository; private readonly IWmsPlaceRepository _wmsPlaceRepository; @@ -30,17 +32,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 +41,12 @@ /// <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="" ) { // 1. 鑾峰彇鎵�鏈夊簱瀛樺拰搴撲綅淇℃伅 var stockList = await _wmsMaterialStockRepository.GetListAsync(new WmsMaterialStock()); - var allPlaceList = await _wmsPlaceRepository.GetListAsync(new WmsPlace()); + + var allPlaceList = ObjectMapper.Map<List<WmsPlace>, List<WmsPlaceDto>>(await _wmsPlaceRepository.GetListAsync(new WmsPlace())); // 2. 鏌ユ壘鐩稿悓鐗╂枡鍨嬪彿鍜岀紪鍙风殑搴撳瓨锛堟寜搴撳瓨閲忛檷搴忥級 var sameModelStocks = stockList @@ -63,7 +55,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 +100,50 @@ return availablePlaces; } + + /// <summary> + /// 鏌ユ壘搴撳瓨 + /// </summary> + /// <param name="materialModel"></param> + /// <param name="requiredNum"></param> + /// <param name="materialNo"></param> + /// <returns></returns> + public async Task<Dictionary<string, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "") + { + // 1. 鑾峰彇鎵�鏈夊簱瀛橈紙鎺掗櫎閿佸畾搴撳瓨锛� + var stockList = (await _wmsMaterialStockRepository.GetListAsync(new WmsMaterialStock())) + .Where(x => x.IsLock == Domain.Shared.Enums.YesNoEnum.N) + .ToList(); + + // 2. 绛涢�夊尮閰嶇墿鏂� + var availableStocks = stockList + .Where(x => x.MaterialModel == materialModel) + .WhereIf(!string.IsNullOrEmpty(materialNo), x => x.MaterialNo == materialNo) + .OrderBy(x => x.StockNumber) // 浼樺厛浠庡簱瀛樺皯鐨勫簱浣嶅嚭 + .ToList(); + + // 3. 妫�鏌ユ�诲簱瀛樻槸鍚﹁冻澶� + int totalAvailable = availableStocks.Sum(x => x.StockNumber); + if (totalAvailable < requiredNum) + { + throw new UserFriendlyException( + $"搴撳瓨涓嶈冻锛侀渶姹�: {requiredNum}, 鍙敤: {totalAvailable}, 缂�: {requiredNum - totalAvailable}"); + } + + // 4. 璁$畻鍚勫簱浣嶅嚭搴撴暟閲� + var allocation = new Dictionary<string, int>(); // <搴撲綅鍙�, 鍑哄簱鏁�> + int remaining = requiredNum; + + foreach (var stock in availableStocks) + { + if (remaining <= 0) break; + + int deductAmount = Math.Min(stock.StockNumber, remaining); + allocation.Add(stock.PlaceNo, deductAmount); + remaining -= deductAmount; + } + + return allocation; + } } } -- Gitblit v1.9.3