/// <summary> /// 先進先出算法 /// </summary> /// <param name="inRecord">入庫記錄(一個周期內)</param> /// <param name="outRecord">出庫記錄(一個周期內)</param> /// <returns>InventoryPRice為結果價格</returns> public List<BaseStock> ComputerPriceFIFO (List<BaseStock> inRecord, List<BaseStock> outRecord) { //排序 var inList = (from o in inRecord orderby o.CDate select o).ToList(); var outList = (from o in outRecord orderby o.CDate select o).ToList(); foreach (var outItem in outList) { //當前條已出部分金額 decimal money = 0; //當前還需出的數量 decimal qty = outItem.Qty; foreach (var inItem in inList) { //如果當前這一條夠出庫,那么結束去計算價格 if (inItem.Qty > qty) { money = money + inItem.Price * qty; //更新入庫表 inItem.Qty = inItem.Qty - qty; break; } else { qty = qty - inItem.Qty; money = money + (inItem.Price * inItem.Qty); //更新入庫表 inItem.Qty = 0; } } //計算出貨價格 outItem.Price = money / outItem.Qty; } return outList; } /// <summary> /// 后進先出算法 /// </summary> /// <param name="inRecord">入庫記錄(一個周期內)</param> /// <param name="outRecord">出庫記錄(一個周期內)</param> /// <returns>InventoryPrice為結果價格</returns> public List<BaseStock> ComputerPriceFOFI (List<BaseStock> inRecord, List<BaseStock> outRecord) { //排序 var inList = (from o in inRecord orderby o.CDate descending select o).ToList(); var outList = (from o in outRecord orderby o.CDate select o).ToList(); foreach (var outItem in outList) { //當前條已出部分金額 decimal money = 0; //當前還需出的數量 decimal qty = outItem.Qty; foreach (var inItem in inList) { //如果當前這一條夠出庫,那么結束去計算價格 if (inItem.Qty > qty) { money = money + inItem.Price * qty; //更新入庫表 inItem.Qty = inItem.Qty - qty; break; } else { qty = qty - inItem.Qty; money = money + (inItem.Price * inItem.Qty); //更新入庫表 inItem.Qty = 0; } } //計算出貨價格 outItem.Price = money / outItem.Qty; } return outList; } /// <summary> /// 加權平均算法 /// </summary> /// <param name="inRecord">入庫記錄(一個周期內)</param> /// <param name="outRecord">出庫記錄(一個周期內)</param> /// <param name="prePrice">上期價格</param> /// <param name="preQty">上期數量</param> /// <returns></returns> public List<BaseStock> ComputerPriceBalance (List<BaseStock> inRecord, List<BaseStock> outRecord, decimal prePrice, decimal preQty) { decimal money = 0; decimal qty = 0; foreach (var inItem in inRecord) { money = money + inItem.Price * inItem.Qty; qty = qty + inItem.Qty; } decimal price = (money + prePrice * preQty) / (qty + preQty); foreach (var outItem in outRecord) { outItem.Price = price; } return outRecord; } /// <summary> /// 移動加權平均算法 /// </summary> /// <param name="inRecord">入庫記錄(一個周期內)</param> /// <param name="outRecord">出庫記錄(一個周期內)</param> /// <param name="prePrice">上期價格</param> /// <param name="preQty">上期數量</param> /// <returns></returns> public List<BaseStock> ComputerPriceTrack (List<BaseStock> inRecord, List<BaseStock> outRecord, decimal prePrice, decimal preQty, DateTime preDate) { //排序 var outList = (from o in outRecord orderby o.CDate select o).ToList(); List<Guid> preDetail_IDs = new List<Guid>(); foreach (var outItem in outList) { //取出比當前出庫記錄要早的入庫記錄,并且排除已經結算的記錄 var inList = (from o in inRecord where o.CDate <= outItem.CDate && !preDetail_IDs.Contains(o.Detail_ID) orderby o.CDate select o).ToList(); decimal money = 0; decimal qty = 0; foreach (var inItem in inList) { money = money + inItem.Price * inItem.Qty; qty = qty + inItem.Qty; preDetail_IDs.Add(inItem.Detail_ID); } outItem.Price = (money + prePrice * preQty) / (qty + preQty); //修改上期價格和數量 prePrice = outItem.Price; preQty = qty - outItem.Qty; } return outList; }
新聞熱點
疑難解答