| | |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Inbound; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_DTO.WCSInfo; |
| | | using WIDESEA_IBasicRepository; |
| | | using WIDESEA_IRecordRepository; |
| | | using WIDESEA_IRecordService; |
| | |
| | | stockInfo.Details = _stockRepository.StockInfoDetailRepository.QueryData(x => x.StockId == stockInfo.Id); |
| | | } |
| | | return stockInfo; |
| | | } |
| | | /// <summary> |
| | | /// æ·»å 空æçç»çä¿¡æ¯ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public WebResponseContent AddStockEmpty(string palletCode) |
| | | { |
| | | try |
| | | { |
| | | Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == "Empty000"); |
| | | if (materielInfo == null) throw new Exception($"æªæ¾å°ç©ºæçä¿¡æ¯,ç©æç¼å·ãEmpty000ã"); |
| | | Dt_StockInfo stockInfo = new Dt_StockInfo() |
| | | { |
| | | PalletCode = palletCode, |
| | | StockStatus = StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt(), |
| | | Creater = "System", |
| | | Details = new List<Dt_StockInfoDetail>() |
| | | }; |
| | | Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() |
| | | { |
| | | Status = StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt(), |
| | | OrderNo = DateTime.Now.ToString("yyMMdd"), |
| | | StockId = stockInfo.Id != 0 ? stockInfo.Id : 0, |
| | | MaterielName = materielInfo.MaterielName, |
| | | MaterielCode = materielInfo.MaterielCode, |
| | | BatchNo = DateTime.Now.ToString("yyMMdd") + "E", |
| | | StockQuantity = 1, |
| | | SerialNumber = "", |
| | | Creater = "System" |
| | | }; |
| | | stockInfo.Details.Add(stockInfoDetail); |
| | | AddMaterielGroup(stockInfo); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ·»å ç»ç/åºåä¿¡æ¯ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public WebResponseContent AddStockInfo(ref Dt_StockInfo stockInfo, ref Dt_InboundOrder inboundOrder, ProductionlineDTO productionlineDTO) |
| | | { |
| | | WebResponseContent content = new WebResponseContent().OK(); |
| | | try |
| | | { |
| | | var materielCode = productionlineDTO.traytype.ToString(); |
| | | var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == productionlineDTO.batchNo); |
| | | materielCode = inboundOrderDetail.MaterielCode; |
| | | inboundOrderDetail.ReceiptQuantity++; |
| | | inboundOrderDetail.OrderDetailStatus = inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity ? OrderDetailStatusEnum.Over.ObjToInt() : OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); |
| | | |
| | | if (inboundOrder.Details.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) == null) |
| | | { |
| | | inboundOrder.OrderStatus = InboundStatusEnum.å
¥åºå®æ.ObjToInt(); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InboundStatusEnum.æªå¼å§.ObjToInt()) |
| | | { |
| | | inboundOrder.OrderStatus = InboundStatusEnum.å
¥åºä¸.ObjToInt(); |
| | | } |
| | | var materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); |
| | | if (materielInfo == null) throw new Exception($"æªæ¾å°ç©æä¿¡æ¯,ç©æç¼ç ã{materielCode}ã"); |
| | | Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() |
| | | { |
| | | Status = StockStatusEmun.ç»çæå.ObjToInt(), |
| | | OrderNo = inboundOrder?.OrderNo, |
| | | StockId = stockInfo.Id != 0 ? stockInfo.Id : 0, |
| | | MaterielName = materielInfo.MaterielName, |
| | | MaterielCode = materielInfo.MaterielCode, |
| | | BatchNo = inboundOrderDetail.BatchNo, |
| | | StockQuantity = 1,// productionlineDTO.QtySum, |
| | | SerialNumber = "", |
| | | //SerialNumber = $"{inboundOrder.OrderNo} | {materielInfo.MaterielCode} | {pdaMaterielGroupDTO.BatchNo} | {pdaMaterielGroupDTO.ReceiptQuantity}", |
| | | Creater = "System" |
| | | }; |
| | | if (stockInfo.Id == 0) |
| | | { |
| | | stockInfo.PalletCode = productionlineDTO.Barcode; |
| | | stockInfo.StockStatus = StockStatusEmun.ç»çæå.ObjToInt(); |
| | | stockInfo.Creater = "System"; |
| | | stockInfo.Remark = productionlineDTO.productQty; |
| | | } |
| | | stockInfo.Details.Add(stockInfoDetail); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | public void AddMaterielGroup(Dt_StockInfo stockInfo) |
| | |
| | | //}); |
| | | } |
| | | //_stockQuantityChangeRecordRepository.AddData(stockQuantityChangeRecords); |
| | | stockInfo.Details = details; |
| | | _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup); |
| | | if (details.Count > 0) |
| | | { |
| | | stockInfo.Details = details; |
| | | _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup); |
| | | } |
| | | else |
| | | { |
| | | details = stockInfo.Details; |
| | | _stockRepository.StockInfoDetailRepository.UpdateData(details); |
| | | } |
| | | } |
| | | |
| | | public List<Dt_StockInfo> GetUseableStocks(string materielCode) |
| | |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, locationCodes); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæå®ç©æåºåä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="materielCode"></param> |
| | | /// <returns></returns> |
| | | 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 |
| | | try |
| | | { |
| | | 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 |
| | | //Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); |
| | | //if (materielInfo == null) throw new Exception($"æªæ¾å°ç©æä¿¡æ¯"); |
| | | 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 |
| | | UseableQuantity = b.StockQuantity, |
| | | BatchNo = b.BatchNo, |
| | | }, a => a.StockStatus == StockStatusEmun.å·²å
¥åº.ObjToInt(), b => b.Status == StockStatusEmun.å·²å
¥åº.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.LocationCode).Select(x => new StockSelectViewDTO |
| | | { |
| | | LocationCode = x.FirstOrDefault()?.LocationCode ?? "", |
| | | MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", |
| | | MaterielName = x.FirstOrDefault()?.MaterielName ?? "", |
| | | PalletCode = string.Join(",", x.Select(x => x.PalletCode).ToList()), |
| | | //UseableQuantity = x.Sum(x => x.UseableQuantity) |
| | | UseableQuantity = x.Sum(x => x.UseableQuantity), |
| | | BatchNo = x.FirstOrDefault()?.BatchNo ?? "" |
| | | }).ToList(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LocationCode = x.FirstOrDefault()?.LocationCode ?? "", |
| | | MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", |
| | | MaterielName = x.FirstOrDefault()?.MaterielName ?? "", |
| | | PalletCode = x.Key, |
| | | UseableQuantity = x.Sum(x => x.UseableQuantity) |
| | | }).ToList(); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 计ç®åºå |
| | | /// </summary> |
| | | /// <param name="stockInfos"></param> |
| | | /// <param name="materielCode"></param> |
| | | /// <param name="needQuantity"></param> |
| | | /// <param name="residueQuantity"></param> |
| | | /// <returns></returns> |
| | | 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)//åºåå¤ |
| | | #region |
| | | if (stockInfos.Count >= needQuantity)//åºåå¤ |
| | | { |
| | | int index = 0; |
| | | while (needQuantity > 0) |
| | | foreach (var item in stockInfos.OrderBy(x => x.InDate).ToList().GroupBy(x => x.LocationCode)) |
| | | { |
| | | Dt_StockInfo stockInfo = stockInfos[index]; |
| | | decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | if (useableStockQuantity < needQuantity) |
| | | if (item.Count() <= needQuantity && needQuantity > 0) |
| | | { |
| | | stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); |
| | | needQuantity -= useableStockQuantity; |
| | | outStocks.AddRange(item); |
| | | needQuantity -= item.Count(); |
| | | } |
| | | else |
| | | else if (needQuantity > 0) |
| | | { |
| | | 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(item.OrderByDescending(x => x.InDate).First()); |
| | | needQuantity -= 1; |
| | | } |
| | | 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); |
| | | } |
| | | outStocks = stockInfos; |
| | | needQuantity -= stockInfos.Count(); |
| | | } |
| | | residueQuantity = needQuantity; |
| | | #endregion |
| | | |
| | | #region æåºåä¸æçæ°éè®¡ç® |
| | | //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; |
| | | #endregion |
| | | |
| | | return outStocks; |
| | | } |
| | | } |