| | |
| | | using AutoMapper; |
| | | using Autofac.Core; |
| | | using AutoMapper; |
| | | using MailKit.Search; |
| | | using SqlSugar; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_IAllocateService; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IOutboundService; |
| | | using WIDESEA_IRecordService; |
| | |
| | | public IRepository<Dt_StockInfo> Repository => BaseDal; |
| | | private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository; |
| | | private readonly IOutboundOrderService _outboundOrderService; |
| | | //private readonly IOutboundOrderDetailService _outboundOrderDetailService; |
| | | |
| | | private readonly IRepository<Dt_AllocateOrder> _allocateRepository; |
| | | private readonly ILocationInfoService _locationInfoService; |
| | | public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService) : base(BaseDal) |
| | | public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoDetailRepository = stockInfoDetailRepository; |
| | | _recordService = recordService; |
| | | _locationInfoService = locationInfoService; |
| | | _outboundOrderService = outboundOrderService; |
| | | _allocateRepository = allocateRepository; |
| | | //_outboundOrderDetailService = outboundOrderDetailService; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | if (stockTotalQuantity < needQuantity) |
| | | { |
| | | residueQuantity = needQuantity - stockTotalQuantity; |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | |
| | | residueQuantity = remainingNeed; |
| | | return (outStocks, stockAllocations); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æ¡ç è·ååºåä¿¡æ¯ |
| | | /// </summary> |
| | |
| | | public List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, string supplyCode, List<string> locationCodes) |
| | | { |
| | | var query = Db.Queryable<Dt_StockInfo>() |
| | | .Where(x => locationCodes.Contains(x.LocationCode) |
| | | .Where(x => locationCodes.Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.å
¥åºå®æ.ObjToInt() |
| | | // && x.StockStatus == (int)StockStatusEmun.æ£å¸¸) |
| | | ).Includes(x => x.Details); |
| | | |
| | |
| | | if (!string.IsNullOrEmpty(supplyCode)) |
| | | { |
| | | query = query.Where(x => x.Details.Any(d => d.SupplyCode == supplyCode)); |
| | | } |
| | | } |
| | | |
| | | return query.OrderBy(x => x.CreateDate).ToList(); |
| | | return query.OrderBy(x => x.CreateDate).ToList(); |
| | | //ISugarQueryable<Dt_LocationInfo> sugarQueryable = Db.Queryable<Dt_LocationInfo>().Where(x => locationCodes.Contains(x.LocationCode)); |
| | | //ISugarQueryable<Dt_StockInfo> sugarQueryable1 = Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)); |
| | | //return sugarQueryable.InnerJoin(sugarQueryable1, (a, b) => a.LocationCode == b.LocationCode).Select((a, b) => b).OrderBy(a => a.CreateDate).Includes(a => a.Details).ToList(); |
| | |
| | | { |
| | | List<string> locationCodes = _locationInfoService.GetCanOutLocationCodes(); |
| | | |
| | | return GetStockInfos(materielCode, batchNo,supplyCode, locationCodes); |
| | | return GetStockInfos(materielCode, batchNo, supplyCode, locationCodes); |
| | | } |
| | | |
| | | public Dt_StockInfo GetPalletStockInfo(int locationType) |
| | |
| | | { |
| | | return Db.Queryable<Dt_StockInfo>().Where(x => palletCodes.Contains(x.PalletCode)).Includes(x => x.Details).OrderBy(x => x.CreateDate).ToList(); |
| | | } |
| | | // æ·»å è·åå个æçåºåçæ¹æ³ï¼å¦æä¸åå¨ï¼ |
| | | public Dt_StockInfo GetStockInfoByPalletCode(string palletCode) |
| | | { |
| | | return Db.Queryable<Dt_StockInfo>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="orderId"></param> |
| | | /// <param name="materielCode"></param> |
| | | /// <returns></returns> |
| | | //public List<StockSelectViewDTO> GetStockSelectViews(int orderId, string materielCode) |
| | | //{ |
| | | // try |
| | | // { |
| | | // Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == orderId); |
| | | // if (outboundOrder == null) |
| | | // { |
| | | // throw new Exception($"æªæ¾å°åºåºåä¿¡æ¯"); |
| | | // } |
| | | |
| | | // List<string> locationCodes = _locationInfoService.GetCanOutLocationCodes(); |
| | | |
| | | // 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, |
| | | // Barcode=b.Barcode, |
| | | // 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 ?? "", |
| | | // Barcode=x.FirstOrDefault()?.Barcode??"", |
| | | // PalletCode = x.Key, |
| | | // UseableQuantity = x.Sum(x => x.UseableQuantity) |
| | | // }).ToList(); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // return null; |
| | | // } |
| | | |
| | | //} |
| | | |
| | | public List<StockSelectViewDTO> GetAllocateSelectViewDTOs(int orderId, string materielCode) |
| | | { |
| | | var dballocate = _allocateRepository.Db.Queryable<Dt_AllocateOrder>().First(x => x.Id == orderId); |
| | | if (dballocate == null) |
| | | { |
| | | throw new Exception($"æªæ¾å°åæ®ç¼å·ä¸º{dballocate.OrderNo}çåä¿¡æ¯"); |
| | | |
| | | } |
| | | |
| | | var outboundOrder = SqlSugarHelper.DbWMS.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == dballocate.OrderNo).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | throw new Exception($"æªæ¾å°åæ®ç¼å·ä¸º{dballocate.OrderNo}çåºåºåä¿¡æ¯"); |
| | | } |
| | | return GetStockSelectViews(outboundOrder.Id, materielCode); |
| | | } |
| | | |
| | | public List<StockSelectViewDTO> GetSelectViewDTOs(string orderNo, string materielCode) |
| | | { |
| | | var outboundOrder = SqlSugarHelper.DbWMS.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == orderNo).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | throw new Exception($"æªæ¾å°åæ®ç¼å·ä¸º{orderNo}çåºåºåä¿¡æ¯"); |
| | | } |
| | | return GetStockSelectViews(outboundOrder.Id, materielCode); |
| | | } |
| | | |
| | | public List<StockSelectViewDTO> GetStockSelectViews(int orderId, string materielCode) |
| | | { |
| | | try |
| | | Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == orderId); |
| | | if (outboundOrder == null) |
| | | { |
| | | Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == orderId); |
| | | if (outboundOrder == null) |
| | | throw new Exception($"æªæ¾å°ID为{orderId}çåºåºåä¿¡æ¯"); |
| | | } |
| | | |
| | | // è·ååºåºåæç»ï¼ç¨äºç¡®å®éè¦çæ¹æ¬¡åä¾åºå |
| | | var orderDetails = SqlSugarHelper.DbWMS.Queryable<Dt_OutboundOrderDetail>().Where(x => x.OrderId == orderId && x.MaterielCode == materielCode).ToList(); |
| | | |
| | | if (!orderDetails.Any()) |
| | | { |
| | | throw new Exception($"åºåºå{orderId}䏿ªæ¾å°ç©æ{materielCode}çæç»ä¿¡æ¯"); |
| | | } |
| | | |
| | | List<string> locationCodes = _locationInfoService.GetCanOutLocationCodes(); |
| | | var result = new List<StockSelectViewDTO>(); |
| | | |
| | | // 为æ¯ä¸ªåºåºåæç»æ¥è¯¢å¯¹åºçåºå |
| | | foreach (var orderDetail in orderDetails) |
| | | { |
| | | // æå»ºæ¥è¯¢æ¡ä»¶ |
| | | var stockQuery = Db.Queryable<Dt_StockInfo>() |
| | | .Where(x => locationCodes.Contains(x.LocationCode)) |
| | | .Where(x => x.StockStatus == (int)StockStatusEmun.å
¥åºå®æ) |
| | | .Includes(x => x.Details); |
| | | |
| | | // æ§è¡æ¥è¯¢å¹¶æå
è¿å
åºæåº |
| | | var Qstocks = stockQuery.Where(x => x.Details.Any(d => d.MaterielCode == materielCode && d.StockQuantity > d.OutboundQuantity)); |
| | | |
| | | if (!string.IsNullOrEmpty(orderDetail.BatchNo)) |
| | | { |
| | | throw new Exception($"æªæ¾å°åºåºåä¿¡æ¯"); |
| | | |
| | | Qstocks = stockQuery.Where(x => x.Details.Any(d => d.BatchNo == orderDetail.BatchNo)); |
| | | |
| | | } |
| | | if (!string.IsNullOrEmpty(orderDetail.SupplyCode)) |
| | | { |
| | | |
| | | Qstocks = stockQuery.Where(x => x.Details.Any(d => d.SupplyCode == orderDetail.SupplyCode)); |
| | | |
| | | } |
| | | |
| | | List<string> locationCodes = _locationInfoService.GetCanOutLocationCodes(); |
| | | var stocks = Qstocks.OrderBy(x => x.CreateDate).ToList(); |
| | | |
| | | return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO |
| | | foreach (var stock in stocks) |
| | | { |
| | | LocationCode = a.LocationCode, |
| | | MaterielCode = b.MaterielCode, |
| | | MaterielName = b.MaterielName, |
| | | Barcode=b.Barcode, |
| | | 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 ?? "", |
| | | Barcode=x.FirstOrDefault()?.Barcode??"", |
| | | PalletCode = x.Key, |
| | | UseableQuantity = x.Sum(x => x.UseableQuantity) |
| | | }).ToList(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return null; |
| | | var relevantDetails = stock.Details |
| | | .Where(d => d.MaterielCode == materielCode && |
| | | string.IsNullOrEmpty(orderDetail.BatchNo) ? true : d.BatchNo == orderDetail.BatchNo && |
| | | string.IsNullOrEmpty(orderDetail.SupplyCode) ? true : d.SupplyCode == orderDetail.SupplyCode && |
| | | d.StockQuantity > d.OutboundQuantity) |
| | | .ToList(); |
| | | |
| | | if (relevantDetails.Any()) |
| | | { |
| | | var firstDetail = relevantDetails.First(); |
| | | var useableQuantity = relevantDetails.Sum(d => d.StockQuantity - d.OutboundQuantity); |
| | | |
| | | result.Add(new StockSelectViewDTO |
| | | { |
| | | LocationCode = stock.LocationCode, |
| | | MaterielCode = firstDetail.MaterielCode, |
| | | MaterielName = firstDetail.MaterielName, |
| | | BatchNo = orderDetail.BatchNo, |
| | | SupplyCode = orderDetail.SupplyCode, |
| | | Barcode = firstDetail.Barcode, |
| | | PalletCode = stock.PalletCode, |
| | | UseableQuantity = useableQuantity, |
| | | StockCreateDate = stock.CreateDate, |
| | | StockId = stock.Id, |
| | | OrderDetailId = orderDetail.Id // å
³èå°å
·ä½çåºåºåæç» |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | } |
| | | } |