zoukankan      html  css  js  c++  java
  • 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;
     }
  • 相关阅读:
    python检测挖矿特征的几种方式
    python检测当前端口是否使用
    matlab界面UI设计资料
    python中struct.pack()函数和struct.unpack()函数
    网络编程:主机字节序和网络字节序
    【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题
    【原创】python中文编码问题深入分析(二):print打印中文异常及显示乱码问题分析与解决
    ivew定制主题 less ^3.0 时报错 .bezierEasingMixin(); Inline JavaScript is not enabled. Is it set in your options?
    Vue子组件中 data 从props中动态更新数据
    Vue 自动吸顶
  • 原文地址:https://www.cnblogs.com/starksoft/p/3937298.html
Copyright © 2011-2022 走看看