• ERP产品价格成本计算的几个方法


    一般财务计算产品价格又很多方法,我这里做了几个供参考,实体属性主要是编号、数量、价格等,这里就不列出了。

           /// <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;
            }
    
  • 相关阅读:
    蛙蛙推荐:蛙蛙教你配置linux+mysql+.net环境
    今日阅读20081231学习remoting
    翻译:改进.NET应用程序的性能和可伸缩性(一)概述及ADO.NET 性能
    翻译:改进.NET应用程序的性能和可伸缩性(二)为性能和可伸缩性做架构和设计上的Review
    蛙蛙推荐:作一个支持过载自适应和动态扩容的负载均衡服务
    翻译:改进.NET应用程序的性能和可伸缩性(三)Remoting性能
    清空日志后备份数据库
    CLR宿主相关
    每日阅读20081216
    iis 无法安装提示错误,无法复制一个或多个文件,错误码0x4b8 dodo
  • 原文地址:https://www.cnblogs.com/wangxiaohuo/p/2876583.html
Copyright © 2020-2023  润新知