|  |  | 
 |  |  |         public List<Dt_ProStockInfo> GetUseableStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder) | 
 |  |  |         { | 
 |  |  |             //è½¬æ¢æ æåä»ä»åºä¿¡æ¯è·åå°¾æ°å±æ§çè´§ä½ | 
 |  |  |             Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString()); | 
 |  |  |             Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId== mesRworkOutboundOrder.WarehouseId); | 
 |  |  |             List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse.WarehouseId); | 
 |  |  |             return BaseDal.GetProStocks(mesRworkOutboundOrder, locationCodes); | 
 |  |  |         } | 
 |  |  |         //æ¥æ¾å¯ç¨æ¥åºåºå | 
 |  |  |         public List<Dt_ProStockInfo> GetUseableStocks(int warehoseId, Dt_ErpProScrapSheetDetail erpProScrapSheetDetail) | 
 |  |  |         { | 
 |  |  |             List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); | 
 |  |  |             return BaseDal.GetProStocks(erpProScrapSheetDetail, locationCodes); | 
 |  |  |         } | 
 |  |  |         /// <summary> | 
 |  |  |         /// è·ååºåºåºå | 
 |  |  | 
 |  |  |         public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ProOutOrderDetail outOrderDetail, float needQuantity, out float residueQuantity) | 
 |  |  |         { | 
 |  |  |             List<Dt_ProStockInfo> assignOutStocks =new List<Dt_ProStockInfo>(); | 
 |  |  |             float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); | 
 |  |  |             //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); | 
 |  |  |             bool isCanLot = string.IsNullOrEmpty(outOrderDetail.PLot); | 
 |  |  |             bool isCanDate = string.IsNullOrEmpty(outOrderDetail.DateCode); | 
 |  |  |             float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1)) | 
 |  |  |                             && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot) | 
 |  |  |                             && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) | 
 |  |  |                         .Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); | 
 |  |  |             //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); | 
 |  |  |              | 
 |  |  |             if (stockTotalQuantity >= needQuantity)//åºåå¤ | 
 |  |  |             { | 
 |  |  |                 int index = 0; | 
 |  |  | 
 |  |  |                     Dt_ProStockInfo stockInfo = stockInfos[index]; | 
 |  |  |                     float useableStockQuantity = stockInfo.proStockInfoDetails | 
 |  |  |                         .Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0,1)) | 
 |  |  |                             && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot) | 
 |  |  |                             && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot) | 
 |  |  |                             && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) | 
 |  |  |                         .Sum(x => x.StockPcsQty - x.OutboundQuantity); | 
 |  |  |                     if (useableStockQuantity < needQuantity) | 
 |  |  |                     if (useableStockQuantity < needQuantity && useableStockQuantity >0) | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1)) | 
 |  |  |                             && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot) | 
 |  |  |                             && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot) | 
 |  |  |                             && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)).ToList().ForEach(x => x.OutboundQuantity = x.StockPcsQty); | 
 |  |  |                         needQuantity -= useableStockQuantity; | 
 |  |  |                     } | 
 |  |  | 
 |  |  |                             //满足æ¡ä»¶è¿è¡åé
 | 
 |  |  |                             if ((x.StockPcsQty > x.OutboundQuantity) | 
 |  |  |                                 && x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1))  | 
 |  |  |                                 && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot) | 
 |  |  |                                 && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot) | 
 |  |  |                                 && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) | 
 |  |  |                             { | 
 |  |  |                                 if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) | 
 |  |  | 
 |  |  |             return assignOutStocks; | 
 |  |  |         } | 
 |  |  |         /// <summary> | 
 |  |  |         /// è·åMESæåºåºå | 
 |  |  |         /// è·åæ¥åºåºå | 
 |  |  |         /// </summary> | 
 |  |  |         public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity) | 
 |  |  |         public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ErpProScrapSheetDetail outOrderDetail, float needQuantity, out float residueQuantity) | 
 |  |  |         { | 
 |  |  |             List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>(); | 
 |  |  |             float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); | 
 |  |  |             float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x => | 
 |  |  |                             x.ProductCode == outOrderDetail.ScrapProCode | 
 |  |  |                             && x.ProductVersion == outOrderDetail.ScrapProVersion | 
 |  |  |                             && x.LotNumber == outOrderDetail.ScrapProLotNo).Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); | 
 |  |  |             //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); | 
 |  |  |             bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); | 
 |  |  |             if (stockTotalQuantity >= needQuantity)//åºåå¤ | 
 |  |  |             { | 
 |  |  |                 int index = 0; | 
 |  |  | 
 |  |  |                 { | 
 |  |  |                     Dt_ProStockInfo stockInfo = stockInfos[index]; | 
 |  |  |                     float useableStockQuantity = stockInfo.proStockInfoDetails | 
 |  |  |                         .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder  | 
 |  |  |                             && x.ProductCode == mesRworkOutboundOrder.ProductCode  | 
 |  |  |                         .Where(x =>  | 
 |  |  |                             x.ProductCode == outOrderDetail.ScrapProCode  | 
 |  |  |                             && x.ProductVersion==outOrderDetail.ScrapProVersion | 
 |  |  |                             && x.LotNumber == outOrderDetail.ScrapProLotNo) | 
 |  |  |                         .Sum(x => x.StockPcsQty - x.OutboundQuantity); | 
 |  |  |                     if (useableStockQuantity < needQuantity && useableStockQuantity > 0) | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.Where(x =>  | 
 |  |  |                             x.ProductCode == outOrderDetail.ScrapProCode | 
 |  |  |                             && x.ProductVersion == outOrderDetail.ScrapProVersion | 
 |  |  |                             && x.LotNumber == outOrderDetail.ScrapProLotNo).ToList().ForEach(x => x.OutboundQuantity = x.StockPcsQty); | 
 |  |  |                         needQuantity -= useableStockQuantity; | 
 |  |  |                     } | 
 |  |  |                     else | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.ForEach(x => | 
 |  |  |                         { | 
 |  |  |                             //满足æ¡ä»¶è¿è¡åé
 | 
 |  |  |                             if ((x.StockPcsQty > x.OutboundQuantity) | 
 |  |  |                             && x.ProductCode == outOrderDetail.ScrapProCode | 
 |  |  |                             && x.ProductVersion == outOrderDetail.ScrapProVersion | 
 |  |  |                             && x.LotNumber == outOrderDetail.ScrapProLotNo) | 
 |  |  |                             { | 
 |  |  |                                 if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) | 
 |  |  |                                 { | 
 |  |  |                                     x.OutboundQuantity += needQuantity; | 
 |  |  |                                     needQuantity = 0; | 
 |  |  |                                     x.OutDetailId = outOrderDetail.Id; | 
 |  |  |                                 } | 
 |  |  |                                 else | 
 |  |  |                                 { | 
 |  |  |                                     needQuantity -= (x.StockPcsQty - x.OutboundQuantity); | 
 |  |  |                                     x.OutboundQuantity = x.StockPcsQty; | 
 |  |  |                                     x.OutDetailId = outOrderDetail.Id; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                     } | 
 |  |  |                     assignOutStocks.Add(stockInfo); | 
 |  |  |                     index++; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             residueQuantity = needQuantity; | 
 |  |  |             return assignOutStocks; | 
 |  |  |         } | 
 |  |  |         /// <summary> | 
 |  |  |         /// è·åMESæåºåºå | 
 |  |  |         /// </summary> | 
 |  |  |         public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity) | 
 |  |  |         { | 
 |  |  |             List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>(); | 
 |  |  |             bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); | 
 |  |  |             float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x => x.ProductCode == mesRworkOutboundOrder.ProductCode | 
 |  |  |                             && x.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
 |  |  |                             && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) | 
 |  |  |                         .Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); | 
 |  |  |             //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); | 
 |  |  |             if (stockTotalQuantity >= needQuantity)//åºåå¤ | 
 |  |  |             { | 
 |  |  |                 int index = 0; | 
 |  |  |                 while (needQuantity > 0) | 
 |  |  |                 { | 
 |  |  |                     Dt_ProStockInfo stockInfo = stockInfos[index]; | 
 |  |  |                     float useableStockQuantity = stockInfo.proStockInfoDetails | 
 |  |  |                         .Where(x => x.ProductCode == mesRworkOutboundOrder.ProductCode  | 
 |  |  |                             && x.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
 |  |  |                             && (isCanDate? isCanDate: x.DateCode == mesRworkOutboundOrder.DateCode)) | 
 |  |  |                         .Sum(x => x.StockPcsQty - x.OutboundQuantity); | 
 |  |  | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.ForEach(x => | 
 |  |  |                         { | 
 |  |  |                             if ((x.StockPcsQty > x.OutboundQuantity) && x.SaleOrder == mesRworkOutboundOrder.SaleOrder  | 
 |  |  |                             if ((x.StockPcsQty > x.OutboundQuantity)  | 
 |  |  |                                 && x.ProductCode == mesRworkOutboundOrder.ProductCode  | 
 |  |  |                                 && x.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
 |  |  |                                 && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                     assignOutStocks.Add(stockInfo); | 
 |  |  |                     index++; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 for (int i = 0; i < stockInfos.Count; i++) | 
 |  |  |                 { | 
 |  |  |                     Dt_ProStockInfo stockInfo = stockInfos[i]; | 
 |  |  |                     float useableStockQuantity = stockInfo.proStockInfoDetails | 
 |  |  |                         .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder | 
 |  |  |                             && x.ProductCode == mesRworkOutboundOrder.ProductCode | 
 |  |  |                             && x.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
 |  |  |                             && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) | 
 |  |  |                         .Sum(x => x.StockPcsQty - x.OutboundQuantity); | 
 |  |  |                     if (useableStockQuantity < needQuantity) | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty); | 
 |  |  |                         needQuantity -= useableStockQuantity; | 
 |  |  |                     } | 
 |  |  |                     else | 
 |  |  |                     { | 
 |  |  |                         stockInfo.proStockInfoDetails.ForEach(x => | 
 |  |  |                         { | 
 |  |  |                             if (x.StockPcsQty > x.OutboundQuantity && x.SaleOrder == mesRworkOutboundOrder.SaleOrder  | 
 |  |  |                                 && x.ProductCode == mesRworkOutboundOrder.ProductCode  | 
 |  |  |                                 && x.ProductVersion == mesRworkOutboundOrder.ProductVersion | 
 |  |  |                                 && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) | 
 |  |  |                             { | 
 |  |  |                                 if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) | 
 |  |  |                                 { | 
 |  |  |                                     x.OutboundQuantity += needQuantity; | 
 |  |  |                                     needQuantity = 0; | 
 |  |  |                                 } | 
 |  |  |                                 else | 
 |  |  |                                 { | 
 |  |  |                                     needQuantity -= (x.StockPcsQty - x.OutboundQuantity); | 
 |  |  |                                     x.OutboundQuantity = x.StockPcsQty; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                     } | 
 |  |  |                     assignOutStocks.Add(stockInfo); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             residueQuantity = needQuantity; | 
 |  |  | 
 |  |  |         //    } | 
 |  |  |         //    return (deleteStockDetails, updateStockDetails); | 
 |  |  |         //} | 
 |  |  |         public WebResponseContent GetProCodeByWarehouse(int warehouseId) | 
 |  |  |         { | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 //è·åææåºååå· | 
 |  |  |                 List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId) | 
 |  |  |                 .Where((master, detail) => master.WarehouseId == warehouseId) | 
 |  |  |                 .Select((master, detail) => detail) | 
 |  |  |                 .ToList(); | 
 |  |  |                 //è¿æ»¤éå¤ | 
 |  |  |                 List<string> proCode = proStockInfoDetails.Select(x => x.ProductCode).Distinct().ToList(); | 
 |  |  |                 return WebResponseContent.Instance.OK("æå",data: proCode); | 
 |  |  |             } | 
 |  |  |             catch (Exception ex) | 
 |  |  |             { | 
 |  |  |                 return WebResponseContent.Instance.Error(ex.Message); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public WebResponseContent GetProVersionByCode(string scrapProCode, int warehouseId) | 
 |  |  |         { | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 //è·åæå®äº§ååºåçæ¬ | 
 |  |  |                 List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId) | 
 |  |  |                 .Where((master, detail) => master.WarehouseId == warehouseId && detail.ProductCode== scrapProCode) | 
 |  |  |                 .Select((master, detail) => detail) | 
 |  |  |                 .ToList(); | 
 |  |  |                 //è¿æ»¤éå¤ | 
 |  |  |                 List<string> productVersion = proStockInfoDetails.Select(x => x.ProductVersion).Distinct().ToList(); | 
 |  |  |                 return WebResponseContent.Instance.OK("æå",data: productVersion); | 
 |  |  |             } | 
 |  |  |             catch (Exception ex) | 
 |  |  |             { | 
 |  |  |                 return WebResponseContent.Instance.Error(ex.Message); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public WebResponseContent GetProLotNoByCode(string scrapProCode, int warehouseId) | 
 |  |  |         { | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 //è·åæå®äº§ååºåæ¹æ¬¡ | 
 |  |  |                 List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId) | 
 |  |  |                 .Where((master, detail) => master.WarehouseId == warehouseId && detail.ProductCode == scrapProCode) | 
 |  |  |                 .Select((master, detail) => detail) | 
 |  |  |                 .ToList(); | 
 |  |  |                 //è¿æ»¤éå¤ | 
 |  |  |                 List<string> lotNumber = proStockInfoDetails.Select(x => x.LotNumber).Distinct().ToList(); | 
 |  |  |                 return WebResponseContent.Instance.OK("æå", data: lotNumber); | 
 |  |  |             } | 
 |  |  |             catch (Exception ex) | 
 |  |  |             { | 
 |  |  |                 return WebResponseContent.Instance.Error(ex.Message); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |