v0.2.0: CRM/ERP 系统升级 - 清理 .gitignore 并移除误提交的 venv/env/db 文件
- 更新 .gitignore:全面覆盖环境变量、数据库、日志、缓存、上传文件 - 移除误跟踪的 server/venv/、crm_data.db、.env 文件 - 新增 server/.env.example 模板 - 新增合同管理、利润核算、AI教练等功能模块 - 新增 Playwright e2e 测试套件 - 前后端多项功能升级和 bug 修复
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
"""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")
|
||||
Reference in New Issue
Block a user