| using Microsoft.IdentityModel.Tokens; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Common.CommonEnum; | 
| using WIDESEA_Common.StockEnum; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_IBasicRepository; | 
| using WIDESEA_IStockRepository; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_StockRepository | 
| { | 
|     public class ProStockInfoRepository : RepositoryBase<Dt_ProStockInfo>, IProStockInfoRepository | 
|     { | 
|         private readonly IBasicRepository _basicRepository; | 
|         public ProStockInfoRepository(IUnitOfWorkManage unitOfWorkManage,IBasicRepository basicRepository) : base(unitOfWorkManage) | 
|         { | 
|             _basicRepository = basicRepository; | 
|         } | 
|         //根据明细数据查找可用库存库存 | 
|         public List<Dt_ProStockInfo> GetProStocks(Dt_ProOutOrderDetail proOutOrderDetail,List<string> locationInfos) | 
|         { | 
|             List<Dt_ProStockInfo>? proStockInfos = null; | 
|             bool isCanLot= string.IsNullOrEmpty(proOutOrderDetail.PLot); | 
|             bool isCanDate = string.IsNullOrEmpty(proOutOrderDetail.DateCode); | 
|             bool isCanVer = string.IsNullOrEmpty(proOutOrderDetail.OutSpecifyVer); | 
|             ////判断客户出入规则 | 
|             //Dt_CustomerInfo customerInfo = _basicRepository.CustomerInfoRepository.QueryFirst(x=>x.Code== proOutOrderDetail.Customer); | 
|             //if (customerInfo==null) | 
|             //{ | 
|             //    throw new Exception("未找到客户信息"); | 
|             //} | 
|             //if (customerInfo.OutRule==CustomerOutRuleEnum.SaleOrderRule.ObjToInt()) | 
|             //{ | 
|             //    proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt()) | 
|             //    .Includes(x => x.proStockInfoDetails) | 
|             //    .Where(x => x.proStockInfoDetails | 
|             //    .Any(v => | 
|             //        v.SaleOrder==proOutOrderDetail.SaleOrder | 
|             //        && v.ProductCode == proOutOrderDetail.PCode | 
|             //        && v.ProductVersion == proOutOrderDetail.PVer | 
|             //        && (isCanLot ? isCanLot : v.BagNo == proOutOrderDetail.PLot) | 
|             //        && (isCanDate ? isCanDate : v.DateCode == proOutOrderDetail.DateCode) | 
|             //    )) | 
|             //    .ToList(); | 
|             //} | 
|             //else | 
|             //{ | 
|                 proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt()) | 
|                 .Includes(x => x.proStockInfoDetails) | 
|                 .Where(x => x.proStockInfoDetails | 
|                 .Any(v => | 
|                     v.ProductCode == proOutOrderDetail.PCode | 
|                     && v.ProductVersion.StartsWith(proOutOrderDetail.PVer.Substring(0,1))  | 
|                     && (isCanLot ? isCanLot : v.ProductCode == proOutOrderDetail.PLot) | 
|                     && (isCanDate ? isCanDate : v.DateCode == proOutOrderDetail.DateCode) | 
|                 )) | 
|                 .ToList(); | 
|             //} | 
|             proStockInfos = proStockInfos?.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x=>x.CreateDate).ThenBy(x=>x.proStockInfoDetails.Sum(x=>x.StockPcsQty)).ToList(); | 
|             return proStockInfos; | 
|         } | 
|         /// <summary> | 
|         /// 获取MES提库库存(尾数仓) | 
|         /// </summary> | 
|         /// <param name="mesRworkOutboundOrder"></param> | 
|         /// <param name="locationInfos"></param> | 
|         /// <returns></returns> | 
|         public List<Dt_ProStockInfo> GetProStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<string> locationInfos) | 
|         { | 
|             List<Dt_ProStockInfo>? proStockInfos = null; | 
|             bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); | 
|             proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode)) | 
|                 .Includes(x => x.proStockInfoDetails) | 
|                 .Where(x => x.proStockInfoDetails | 
|                 .Any(v => v.ProductCode == mesRworkOutboundOrder.ProductCode | 
|                 && v.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
|                 && (isCanDate ? isCanDate : v.DateCode == mesRworkOutboundOrder.DateCode) | 
|                 )) | 
|             .ToList(); | 
|             proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList(); | 
|             return proStockInfos; | 
|         } | 
|         /// <summary> | 
|         /// 获取MES提库库存(尾数仓) | 
|         /// </summary> | 
|         /// <param name="mesRworkOutboundOrder"></param> | 
|         /// <param name="locationInfos"></param> | 
|         /// <returns></returns> | 
|         public List<Dt_ProStockInfo> GetProStocks(Dt_ErpProScrapSheetDetail erpProScrapSheetDetail, List<string> locationInfos) | 
|         { | 
|             List<Dt_ProStockInfo>? proStockInfos = null; | 
|             proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt()) | 
|                 .Includes(x => x.proStockInfoDetails) | 
|                 .Where(x => x.proStockInfoDetails | 
|                 .Any(v => | 
|                 v.LotNumber == erpProScrapSheetDetail.ScrapProLotNo | 
|                 && v.ProductCode == erpProScrapSheetDetail.ScrapProCode | 
|                 && v.ProductVersion == erpProScrapSheetDetail.ScrapProVersion | 
|                 )) | 
|             .ToList(); | 
|             proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList(); | 
|             return proStockInfos; | 
|         } | 
|     } | 
| } |