From c020f31a67fc5aa5644511bddff075f7ecc85234 Mon Sep 17 00:00:00 2001 From: qinchulong <qinchulong@hnkhzn.com> Date: 星期二, 27 五月 2025 15:35:27 +0800 Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/HuaYiZhongHeng/ZhongHeLiTiKu --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs | 185 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 185 insertions(+), 0 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" new file mode 100644 index 0000000..37e75a2 --- /dev/null +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" @@ -0,0 +1,185 @@ +锘縰sing AutoMapper; +using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WIDESEA_Core; +using WIDESEA_Core.BaseServices; +using WIDESEA_Core.Enums; +using WIDESEA_Core.Helper; +using WIDESEA_DTO.Stock; +using WIDESEA_IBasicRepository; +using WIDESEA_IRecordRepository; +using WIDESEA_IRecordService; +using WIDESEA_IStockRepository; +using WIDESEA_IStockService; +using WIDESEA_Model.Models; + +namespace WIDESEA_StockService +{ + public partial class StockInfoService : ServiceBase<Dt_StockInfo, IStockInfoRepository>, IStockInfoService + { + /// <summary> + /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛� + /// </summary> + /// <param name="palletCode"></param> + /// <returns></returns> + public Dt_StockInfo? GetStockByPalletCode(string palletCode) + { + Dt_StockInfo stockInfo = BaseDal.QueryFirst(x => x.PalletCode == palletCode); + if (stockInfo != null) + { + stockInfo.Details = _stockRepository.StockInfoDetailRepository.QueryData(x => x.StockId == stockInfo.Id); + } + return stockInfo; + } + + public void AddMaterielGroup(Dt_StockInfo stockInfo) + { + decimal beforeQuantity = 0; + List<Dt_StockInfoDetail> details = new List<Dt_StockInfoDetail>(); + if (stockInfo.Id == 0) + { + BaseDal.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); + details = stockInfo.Details; + } + else + { + beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); + + for (int i = 0; i < stockInfo.Details.Count; i++) + { + if (stockInfo.Details[i].Id == 0) + { + details.Add(_stockRepository.StockInfoDetailRepository.Db.Insertable(stockInfo.Details[i]).ExecuteReturnEntity()); + } + + } + + } + stockInfo.Details = details; + _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup,0); + } + + public List<Dt_StockInfo> GetUseableStocks(string materielCode) + { + List<string> roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos; + + List<int> warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds; + + List<int> areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds); + + List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds); + + return BaseDal.GetStockInfos(materielCode, locationCodes); + } + public List<StockSelectViewDTO> GetStockSelectViews(string materielCode) + { + List<string> roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos; + + List<int> warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds; + + List<int> areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds); + + List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds); + + + return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO + { + LocationCode = a.LocationCode, + MaterielCode = b.MaterielCode, + MaterielName = b.MaterielName, + PalletCode = a.PalletCode, + UseableQuantity = b.StockQuantity - b.OutboundQuantity + }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO + { + LocationCode = x.FirstOrDefault()?.LocationCode ?? "", + MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", + MaterielName = x.FirstOrDefault()?.MaterielName ?? "", + PalletCode = x.Key, + UseableQuantity = x.Sum(x => x.UseableQuantity) + }).ToList(); + } + + public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode, decimal needQuantity, out decimal residueQuantity) + { + List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); + decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x); + stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); + if (stockTotalQuantity >= needQuantity)//搴撳瓨澶� + { + int index = 0; + while (needQuantity > 0) + { + + Dt_StockInfo stockInfo = stockInfos[index]; + decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.Details.ForEach(x => + { + if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) + { + if (x.StockQuantity - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockQuantity - x.OutboundQuantity); + x.OutboundQuantity = x.StockQuantity; + } + } + }); + } + outStocks.Add(stockInfo); + index++; + } + } + else + { + for (int i = 0; i < stockInfos.Count; i++) + { + Dt_StockInfo stockInfo = stockInfos[i]; + decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.Details.ForEach(x => + { + if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) + { + if (x.StockQuantity - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockQuantity - x.OutboundQuantity); + x.OutboundQuantity = x.StockQuantity; + } + } + }); + } + outStocks.Add(stockInfo); + } + } + residueQuantity = needQuantity; + return outStocks; + } + } +} -- Gitblit v1.9.3