惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
月光博客
月光博客
V
Visual Studio Blog
T
Tailwind CSS Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
Jina AI
Jina AI
J
Java Code Geeks
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
Recorded Future
Recorded Future
C
Check Point Blog
腾讯CDC
N
Netflix TechBlog - Medium
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
SecWiki News
SecWiki News
博客园 - Franky
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
News | PayPal Newsroom
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
F
Full Disclosure
The Cloudflare Blog
Y
Y Combinator Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
S
Schneier on Security
Schneier on Security
Schneier on Security
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
AI
AI
N
News and Events Feed by Topic
T
Tor Project blog
P
Palo Alto Networks Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog

博客园 - 老头

简易OA漫谈之工作流设计(六,快捷表单和动态表单) 简易OA漫谈之工作流设计(五,直接上级) 简易OA漫谈之工作流设计(四,怎么支持会签) 简易OA漫谈之工作流设计(一个Demo),完成6年前的一个贴子 bom头 简易OA漫谈之工作流设计(DB实现) 简易OA漫谈之工作流设计(DB) charindex使用一个异常记录思考 开发人员死得很惨的一个问题 程序员半夜泡奶粉,睡不着了 sql server 2005行列轉換 web效率14條規則(轉) 使用mht格式做多sheet excel報表 Gridview小技巧-保存選擇狀態 SOA、反射+緩存 擴展Membership建立中小型WEB權限框架(一) 一个简单的WEB流程图组件[demo] 常用javascript 表達式驗證[綜合轉載] 数据表的设计原则(轉載)
ERP产品价格成本计算的几个方法
老头 · 2013-01-25 · via 博客园 - 老头

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

       /// <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;
        }