From edca9fd026f88d4edad94b528694d95d62246c67 Mon Sep 17 00:00:00 2001 From: zs <zhousong@weben-smart.com> Date: 周五, 16 5月 2025 16:19:33 +0800 Subject: [PATCH] 添加记录 --- HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs | 186 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 179 insertions(+), 7 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 177cf9a..f90eeff 100644 --- a/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs +++ b/HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsCommonAppService.cs @@ -2,10 +2,13 @@ using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsPlace; using CMS.Plugin.HIAWms.Application.Contracts.Services; +using CMS.Plugin.HIAWms.Domain.Shared.Enums; +using CMS.Plugin.HIAWms.Domain.WmsInOutStockRecord; using CMS.Plugin.HIAWms.Domain.WmsMaterials; using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; using CMS.Plugin.HIAWms.Domain.WmsPlaces; using CmsQueryExtensions.Extension; +using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; @@ -13,26 +16,33 @@ using System.Text; using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.Uow; namespace CMS.Plugin.HIAWms.Application.Implements { /// <summary> /// 鍏叡鎿嶄綔鏈嶅姟 /// </summary> - public class WmsCommonAppService : CMSPluginAppService,IWmsCommonAppService + public class WmsCommonAppService : CMSPluginAppService, IWmsCommonAppService { private readonly IWmsMaterialRepository _wmsMaterialRepository; private readonly IWmsPlaceRepository _wmsPlaceRepository; private readonly IWmsMaterialStockRepository _wmsMaterialStockRepository; + private readonly IWmsInOutStockRecordRepository _wmsInOutStockRecordRepository; + private readonly IServiceProvider _serviceProvider; public WmsCommonAppService(IWmsMaterialRepository wmsMaterialRepository, IWmsPlaceRepository wmsPlaceRepository, IWmsMaterialStockRepository wmsMaterialStockRepository - ) +, + IServiceProvider serviceProvider, + IWmsInOutStockRecordRepository wmsInOutStockRecordRepository) { _wmsMaterialRepository = wmsMaterialRepository; _wmsPlaceRepository = wmsPlaceRepository; _wmsMaterialStockRepository = wmsMaterialStockRepository; + _serviceProvider = serviceProvider; + _wmsInOutStockRecordRepository = wmsInOutStockRecordRepository; } @@ -44,14 +54,14 @@ /// <param name="requiredNum"></param> /// <returns></returns> /// <exception cref="UserFriendlyException"></exception> - public async Task<Dictionary<WmsPlaceDto, int>> FindAvailablePlacesAsync(string materialModel,int requiredNum, string materialNo="" ) + 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(whereConditions); - var placeList = await _wmsPlaceRepository.GetListAsync(new WmsPlace { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI}); + var placeList = await _wmsPlaceRepository.GetListAsync(new WmsPlace { StorageTypeNo = Domain.Shared.Enums.PlaceTypeEnum.YUANLIAOKUWEI }); var allPlaceList = ObjectMapper.Map<List<WmsPlace>, List<WmsPlaceDto>>(placeList.Where(x => !x.IsDisabled).ToList()); // 2. 鏌ユ壘鐩稿悓鐗╂枡鍨嬪彿鍜岀紪鍙风殑搴撳瓨锛堟寜搴撳瓨閲忛檷搴忥級 @@ -114,14 +124,28 @@ /// <param name="requiredNum"></param> /// <param name="materialNo"></param> /// <returns></returns> - public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "") + public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string placeNo = "", PlaceTypeEnum placeType = PlaceTypeEnum.YUANLIAOKUWEI, string materialNo = "") { + var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <搴撲綅鍙�, 鍑哄簱鏁�> // 1. 鑾峰彇鎵�鏈夊簱瀛橈紙鎺掗櫎閿佸畾搴撳瓨锛� + var input = new GetWmsMaterialStockInput(); 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) + .Where(x => x.StorageTypeNo == placeType) .ToList(); + + if (!string.IsNullOrEmpty(placeNo)) + { + var stock = stockList.Where(x => x.PlaceNo == placeNo).FirstOrDefault(); + if (stock.StockNumber < requiredNum) + { + throw new UserFriendlyException($"搴撲綅{placeNo}搴撳瓨涓嶈冻,鍙敤: {stock.StockNumber}, 缂�: {requiredNum - stock.StockNumber}"); + } + + allocation.Add(ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(stock), requiredNum); + return allocation; + } // 2. 绛涢�夊尮閰嶇墿鏂� var availableStocklist = stockList @@ -141,7 +165,6 @@ } // 4. 璁$畻鍚勫簱浣嶅嚭搴撴暟閲� - var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <搴撲綅鍙�, 鍑哄簱鏁�> int remaining = requiredNum; foreach (var stock in availableStocks) @@ -173,5 +196,154 @@ return whereConditions; } + + + /// <summary> + /// 鎵e噺搴撳瓨 + /// </summary> + /// <returns></returns> + public async Task<List<WmsMaterialStockDto>> ReduceMaterialStockAsync(ReduceStockInput input) + { + using var scope = _serviceProvider.CreateScope(); + var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); + using var uow = unitOfWorkManager.Begin(requiresNew: true); + + var materialModel = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel); + if (materialModel == null) + { + throw new UserFriendlyException("鐗╂枡鍨嬪彿涓嶅瓨鍦�"); + } + var placeInfo = await _wmsPlaceRepository.FindByNameAsync(input.PlaceNo); + if (placeInfo == null) + { + throw new UserFriendlyException("搴撲綅淇℃伅涓嶅瓨鍦�"); + } + var stockresult = await FindStockAsync(input.MaterialModel, input.StockNumber, input.PlaceNo, placeInfo.StorageTypeNo); + if (stockresult == null) + { + throw new UserFriendlyException("褰撳墠鏃犲簱瀛�"); + } + var recordList = new List<WmsInOutStockRecord>(); + var delStock = new List<WmsMaterialStock>(); + foreach (var kvp in stockresult) + { + var stock = kvp.Key; // WmsPlace瀵硅薄 + var quantity = kvp.Value; // 鍒嗛厤鏁伴噺 + + // 鎵e噺搴撳瓨 + var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = input.MaterialModel, PlaceNo = stock.PlaceNo }); + var reduceStockList = stockList.OrderBy(x => x.InStockTime).Take(quantity).ToList(); + delStock.AddRange(reduceStockList); + + // 鍑哄叆搴撹褰� + foreach (var item in reduceStockList) + { + var record = new WmsInOutStockRecord + { + TaskNo = input.TaskNo, + OrderNo = input.OrderNo, + StockType = StockTypeEnum.Move, + ContainerNo = item.ContainerNo, + MaterialId = item.MaterialId, + MaterialModel = item.MaterialModel, + MaterialName = item.MaterialName, + MaterialNo = item.MaterialNo, + MaterialBatch = item.MaterialBatch, + SourcePlace = item.PlaceNo, + ToPlace = "鍑哄簱", + OperateTime = DateTime.Now, + Remark = "鍑哄簱鎵e噺", + }; + recordList.Add(record); + } + } + await _wmsMaterialStockRepository.DeleteManyAsync(delStock); + await _wmsInOutStockRecordRepository.InsertManyAsync(recordList); + + await uow.SaveChangesAsync(); + await uow.CompleteAsync(); + + var result = ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(delStock); + return result; + } + + /// <summary> + /// 搴撳瓨杞Щ + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<List<WmsMaterialStockDto>> MoveMaterialStock(MoveStockInput input) + { + using var scope = _serviceProvider.CreateScope(); + var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); + using var uow = unitOfWorkManager.Begin(requiresNew: true); + + var materialModel = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel); + if (materialModel == null) + { + throw new UserFriendlyException("鐗╂枡鍨嬪彿涓嶅瓨鍦�"); + } + + var placeInfo = await _wmsPlaceRepository.FindByNameAsync(input.SourcePlace); + if (placeInfo == null) + { + throw new UserFriendlyException("鏉ユ簮搴撲綅淇℃伅涓嶅瓨鍦�"); + } + var toPlace = await _wmsPlaceRepository.FindByNameAsync(input.ToPlace); + if (toPlace == null) + { + throw new UserFriendlyException("鐩爣搴撲綅淇℃伅涓嶅瓨鍦�"); + } + var stockresult = await FindStockAsync(input.MaterialModel, input.StockNumber, input.SourcePlace, placeInfo.StorageTypeNo); + if (stockresult == null) + { + throw new UserFriendlyException("褰撳墠鏃犲簱瀛�"); + } + + var recordList = new List<WmsInOutStockRecord>(); + var result = new List<WmsMaterialStockDto>(); + foreach (var kvp in stockresult) + { + var stock = kvp.Key; // WmsPlace瀵硅薄 + var quantity = kvp.Value; // 鍒嗛厤鏁伴噺 + + // 鎵e噺杞Щ + var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = input.MaterialModel, PlaceNo = stock.PlaceNo }); + var reduceStockList = stockList.OrderBy(x => x.InStockTime).Take(quantity).ToList(); + + // 鍑哄叆搴撹褰� + foreach (var item in reduceStockList) + { + var record = new WmsInOutStockRecord + { + TaskNo = input.TaskNo, + OrderNo = input.OrderNo, + StockType = StockTypeEnum.Move, + ContainerNo = item.ContainerNo, + MaterialId = item.MaterialId, + MaterialModel = item.MaterialModel, + MaterialName = item.MaterialName, + MaterialNo = item.MaterialNo, + MaterialBatch = item.MaterialBatch, + SourcePlace = item.PlaceNo, + ToPlace = input.ToPlace, + OperateTime = DateTime.Now, + Remark = "鍑哄簱鎵e噺", + }; + recordList.Add(record); + item.PlaceNo = input.ToPlace; + } + + await _wmsMaterialStockRepository.UpdateManyAsync(reduceStockList); + await _wmsInOutStockRecordRepository.InsertManyAsync(recordList); + + result.AddRange(ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(reduceStockList)); + } + + await uow.SaveChangesAsync(); + await uow.CompleteAsync(); + + return result; + } } } -- Gitblit v1.9.3