农资小店季节性囤货智能库存加权成本核算实操。

张开发
2026/4/11 18:32:51 15 分钟阅读

分享文章

农资小店季节性囤货智能库存加权成本核算实操。
结合智能会计中的移动加权平均法为你打造一套“农资小店季节性囤货智能库存核算系统”。一、 实际应用场景描述场景 “老张农资店”位于山东某农业大县。* 时间线 每年10月到次年3月是淡季化肥厂家会低价促销4月到9月是旺季价格随行就市。* 业务流 老张在1月份以 2400元/吨 囤了50吨尿素淡季低价3月份厂家调价又以 2600元/吨 补了30吨到了5月份春耕旺季卖出了60吨。* 痛点 到了月底算账老张不知道这卖出的60吨到底应该按哪个价格算成本如果只按最后一次进货价算利润虚高因为卖的是之前便宜囤的货如果只按第一次算又不符合实际资金流向。二、 引入痛点与技术选型痛点 传统做法弊端 智能会计解决方案价格波动剧烈 手工记录易错Excel公式复杂 Python自动化计算跨期成本分摊 无法准确区分淡旺季库存成本 移动加权平均法 (Moving Weighted Average)库存积压/临期 不清楚哪批货快过期 批次追踪 保质期预警为什么选 Python* Pandas: 处理表格数据进销存流水极其高效。* Datetime: 精确处理农资保质期如农药通常2年。* 模块化: 易于后期扩展为Web APIFastAPI/Django。三、 核心逻辑讲解移动加权平均法我们的核心算法不是简单的“先进先出”而是实时更新的加权平均。计算公式\text{当前单位成本} \frac{\text{期初库存金额} \text{本期入库金额}}{\text{期初库存数量} \text{本期入库数量}}在农资场景下的特殊逻辑1. 入库Purchase 更新库存字典记录批次号、数量、单价、生产日期。2. 出库Sale 不指定批次直接调用当前加权平均成本扣减库存。3. 期末重算 每次入库都会触发一次全店库存成本的重新加权计算。四、 代码模块化实现我们将项目命名为AgriInventoryCosting。1. 项目结构AgriInventoryCosting/├── main.py # 主程序入口├── models.py # 数据模型定义├── inventory.py # 库存核心逻辑加权计算├── accounting.py # 会计凭证生成└── README.md2.models.py - 数据模型使用dataclass 简化models.py功能定义农资库存的数据结构作者Your Name日期2026-04-11from dataclasses import dataclassfrom datetime import datefrom decimal import Decimaldataclassclass InventoryItem:库存商品模型sku_id: str # 商品编码如 CHEM_UREA_001name: str # 商品名称如 尿素batch_no: str # 批次号quantity: Decimal # 数量吨/瓶unit_cost: Decimal # 单位成本元production_date: date # 生产日期expiry_days: int # 保质期天propertydef total_cost(self) - Decimal:计算该批次总成本return self.quantity * self.unit_costpropertydef is_expired(self) - bool:检查是否过期农资关键指标return (date.today() - self.production_date).days self.expiry_days3.inventory.py - 核心逻辑加权算法inventory.py功能实现移动加权平均法的库存管理from collections import defaultdictfrom decimal import Decimal, ROUND_HALF_UPfrom .models import InventoryItemclass AgriInventoryManager:农资库存管理器核心维护一个以 SKU_ID 为键的库存池def __init__(self):# 库存结构: {sku_id: [InventoryItem1, InventoryItem2]}self.inventory_pool defaultdict(list)# 存储每个SKU当前的加权成本价self.weighted_avg_cost {}def purchase(self, item: InventoryItem):采购入库季节性囤货逻辑新增批次并立即触发加权平均重算self.inventory_pool[item.sku_id].append(item)self._recalculate_weighted_average(item.sku_id)print(f✅ 入库成功: {item.name}, 批次: {item.batch_no}, 数量: {item.quantity})def _recalculate_weighted_average(self, sku_id: str):【核心算法】重新计算移动加权平均成本items self.inventory_pool[sku_id]total_quantity sum(item.quantity for item in items)total_amount sum(item.total_cost for item in items)if total_quantity 0:self.weighted_avg_cost[sku_id] Decimal(0)return# 四舍五入保留两位小数符合财务规范avg_cost (total_amount / total_quantity).quantize(Decimal(0.01), roundingROUND_HALF_UP)self.weighted_avg_cost[sku_id] avg_costprint(f [{sku_id}] 当前加权均价更新为: {avg_cost} 元/单位)def sale(self, sku_id: str, quantity: Decimal) - Decimal:销售出库返回本次销售的成本总额if sku_id not in self.inventory_pool:raise ValueError(f商品 {sku_id} 不存在于库存中)current_avg_cost self.weighted_avg_cost.get(sku_id, Decimal(0))cost_of_goods_sold quantity * current_avg_cost# 扣减库存简化处理从第一个批次开始扣不影响加权成本remaining_to_deduct quantityfor item in self.inventory_pool[sku_id]:if remaining_to_deduct 0:breakif item.quantity remaining_to_deduct:item.quantity - remaining_to_deductremaining_to_deduct 0else:remaining_to_deduct - item.quantityitem.quantity 0# 清理数量为0的批次self.inventory_pool[sku_id] [i for i in self.inventory_pool[sku_id] if i.quantity 0]# 出库后再次重算理论上数量变少成本不变但为保持一致性仍执行self._recalculate_weighted_average(sku_id)print(f 销售出库: {sku_id}, 数量: {quantity}, 单位成本: {current_avg_cost}, 总成本: {cost_of_goods_sold})return cost_of_goods_sold4.main.py - 实操演示main.py功能模拟老张农资店的季节性囤货与销售from datetime import datefrom decimal import Decimalfrom models import InventoryItemfrom inventory import AgriInventoryManagerdef run_demo():manager AgriInventoryManager()print( 第一阶段淡季囤货 (1月-3月) )# 1月进货低价囤货manager.purchase(InventoryItem(sku_idUREA_001,name尿素,batch_noBATCH_20260115,quantityDecimal(50),unit_costDecimal(2400), # 淡季低价production_datedate(2026, 1, 15),expiry_days730))# 3月进货厂家调价manager.purchase(InventoryItem(sku_idUREA_001,name尿素,batch_noBATCH_20260320,quantityDecimal(30),unit_costDecimal(2600), # 价格上涨production_datedate(2026, 3, 20),expiry_days730))print(\n 第二阶段旺季销售 (5月) )# 5月卖出60吨cogs manager.sale(sku_idUREA_001, quantityDecimal(60))print(f\n 最终核算结果销售60吨尿素的总成本为 {cogs} 元)print(f 智能会计提示如果不加权直接按2600算成本是156000元存在利润虚增风险。)if __name__ __main__:run_demo()五、 README 文件# AgriInventoryCosting农资小店季节性囤货智能库存加权成本核算系统## 项目简介本项目旨在解决农资行业化肥、农药因季节性价格波动导致的库存成本核算难题。通过Python实现的移动加权平均法帮助店主精准计算淡旺季混合销售后的真实成本。## ️ 技术栈* Python 3.8* Dataclass (数据建模)* Decimal (高精度金融计算)## 快速开始1. 克隆仓库git clone https://github.com/yourname/AgriInventoryCosting.git2. 运行主程序python main.py## 核心功能* ✅ 多批次入库管理* ✅ 移动加权平均成本自动计算* ✅ 保质期过期预警TODO* ✅ 销售成本自动结转六、 使用说明书给老张这样的店主看操作步骤1. 准备环境 确保电脑安装了Python。2. 录入进货 打开main.py修改manager.purchase() 部分填入你实际的进货单信息日期、数量、单价。3. 录入销售 修改manager.sale() 部分填入卖出的数量和商品编码。4. 查看结果 运行程序 (python main.py)控制台会打印出* 当前的库存平均价格。* 本次销售出去的货物到底花了多少钱成本这个数字用于报税和算利润。七、 核心知识点卡片 知识点卡片移动加权平均法 (Moving Weighted Average)* 适用场景 价格波动频繁、同质性强的商品如化肥、粮食、燃油。* 优点 平滑价格波动避免人为选择计价方法的主观性符合智能会计的客观性原则。* 缺点 计算量相对较大但在Python加持下可忽略不计。* Python关键点 必须使用decimal.Decimal 而非float否则在处理大量金钱时会出现浮点数精度误差例如0.1 0.2 ! 0.3。八、 总结作为全栈工程师我们在本次实操中不仅仅是写了几行代码而是将智能会计理论工程化1. 解决了痛点 针对农资行业“淡季囤货、旺季混卖”的混乱账目利用移动加权平均法实现了成本的自动化流转。2. 代码质量 通过模块化设计models,inventory保证了代码的可维护性。未来如果要接入微信小程序只需将AgriInventoryManager 封装成 API 即可。3. 财务合规 严格使用Decimal 进行货币计算确保每一分钱的精确性。这套程序可以作为农资ERP系统的核心算法模块可以把它改造成一个基于 FastAPI 的后端服务或者增加临期商品自动折价的智能会计策略。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

更多文章