"""Phase C: MWA inventory + profit accounting Revision ID: f6a7b8c9d0e1 Revises: e5f6a7b8c9d0 Create Date: 2026-03-27 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.postgresql import UUID revision = "f6a7b8c9d0e1" down_revision = "e5f6a7b8c9d0" branch_labels = None depends_on = None def upgrade() -> None: # ── 1. erp_sku_inventory 新增 mwa_unit_cost ── op.add_column( "erp_sku_inventory", sa.Column("mwa_unit_cost", sa.Numeric(12, 4), server_default="0", comment="移动加权均价 (Moving Weighted Average)"), ) # ── 2. erp_inventory_flows 新增 purchase_unit_price + is_special_zero_cost ── op.add_column( "erp_inventory_flows", sa.Column("purchase_unit_price", sa.Numeric(12, 2), server_default="0", comment="入库采购单价"), ) op.add_column( "erp_inventory_flows", sa.Column("is_special_zero_cost", sa.Boolean, server_default="false", comment="特殊零元入库标识,不参与 MWA 计算"), ) # ── 3. erp_order_item_costs 新表 ── op.create_table( "erp_order_item_costs", sa.Column("id", UUID(as_uuid=True), primary_key=True), sa.Column("order_item_id", UUID(as_uuid=True), sa.ForeignKey("erp_order_items.id"), nullable=False, unique=True), sa.Column("purchase_unit_price", sa.Numeric(12, 4), nullable=False, comment="MWA 成本快照"), sa.Column("profit_amount", sa.Numeric(14, 2), server_default="0", comment="利润额 = (售价-成本)*数量"), sa.Column("profit_rate", sa.Numeric(5, 4), server_default="0", comment="利润率"), sa.Column("created_at", sa.DateTime, server_default=sa.func.now()), ) def downgrade() -> None: op.drop_table("erp_order_item_costs") op.drop_column("erp_inventory_flows", "is_special_zero_cost") op.drop_column("erp_inventory_flows", "purchase_unit_price") op.drop_column("erp_sku_inventory", "mwa_unit_cost")