Files
zpark-ems/backend/alembic/versions/004_charging_tables.py
Du Wenbo 026c837b91 Squashed 'core/' content from commit 92ec910
git-subtree-dir: core
git-subtree-split: 92ec910a132e379a3a6e442a75bcb07cac0f0010
2026-04-04 18:17:10 +08:00

169 lines
7.4 KiB
Python

"""Add charging tables
Revision ID: 004_charging
Revises: 003_energy_categories
Create Date: 2026-04-03
"""
from alembic import op
import sqlalchemy as sa
revision = "004_charging"
down_revision = "003_energy_categories"
branch_labels = None
depends_on = None
def upgrade() -> None:
# --- charging_merchants ---
op.create_table(
"charging_merchants",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("name", sa.String(200), nullable=False),
sa.Column("contact_person", sa.String(100)),
sa.Column("phone", sa.String(20)),
sa.Column("email", sa.String(100)),
sa.Column("address", sa.String(500)),
sa.Column("business_license", sa.String(100)),
sa.Column("status", sa.String(20), default="active"),
sa.Column("settlement_type", sa.String(20)),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_brands ---
op.create_table(
"charging_brands",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("brand_name", sa.String(100), nullable=False),
sa.Column("logo_url", sa.String(500)),
sa.Column("country", sa.String(50)),
sa.Column("description", sa.Text),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_stations ---
op.create_table(
"charging_stations",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("name", sa.String(200), nullable=False),
sa.Column("merchant_id", sa.Integer, sa.ForeignKey("charging_merchants.id")),
sa.Column("type", sa.String(50)),
sa.Column("address", sa.String(500)),
sa.Column("latitude", sa.Float),
sa.Column("longitude", sa.Float),
sa.Column("price", sa.Float),
sa.Column("activity", sa.Text),
sa.Column("status", sa.String(20), default="active"),
sa.Column("total_piles", sa.Integer, default=0),
sa.Column("available_piles", sa.Integer, default=0),
sa.Column("total_power_kw", sa.Float, default=0),
sa.Column("photo_url", sa.String(500)),
sa.Column("operating_hours", sa.String(100)),
sa.Column("created_by", sa.Integer, sa.ForeignKey("users.id")),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_piles ---
op.create_table(
"charging_piles",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("station_id", sa.Integer, sa.ForeignKey("charging_stations.id"), nullable=False),
sa.Column("encoding", sa.String(100), unique=True),
sa.Column("name", sa.String(200)),
sa.Column("type", sa.String(50)),
sa.Column("brand", sa.String(100)),
sa.Column("model", sa.String(100)),
sa.Column("rated_power_kw", sa.Float),
sa.Column("connector_type", sa.String(50)),
sa.Column("status", sa.String(20), default="active"),
sa.Column("work_status", sa.String(20), default="offline"),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_price_strategies ---
op.create_table(
"charging_price_strategies",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("strategy_name", sa.String(200), nullable=False),
sa.Column("station_id", sa.Integer, sa.ForeignKey("charging_stations.id")),
sa.Column("bill_model", sa.String(20)),
sa.Column("description", sa.Text),
sa.Column("status", sa.String(20), default="inactive"),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_price_params ---
op.create_table(
"charging_price_params",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("strategy_id", sa.Integer, sa.ForeignKey("charging_price_strategies.id"), nullable=False),
sa.Column("start_time", sa.String(10), nullable=False),
sa.Column("end_time", sa.String(10), nullable=False),
sa.Column("period_mark", sa.String(20)),
sa.Column("elec_price", sa.Float, nullable=False),
sa.Column("service_price", sa.Float, default=0),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- charging_orders ---
op.create_table(
"charging_orders",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("order_no", sa.String(50), unique=True, nullable=False),
sa.Column("user_id", sa.Integer),
sa.Column("user_name", sa.String(100)),
sa.Column("phone", sa.String(20)),
sa.Column("station_id", sa.Integer, sa.ForeignKey("charging_stations.id")),
sa.Column("station_name", sa.String(200)),
sa.Column("pile_id", sa.Integer, sa.ForeignKey("charging_piles.id")),
sa.Column("pile_name", sa.String(200)),
sa.Column("start_time", sa.DateTime(timezone=True)),
sa.Column("end_time", sa.DateTime(timezone=True)),
sa.Column("car_no", sa.String(20)),
sa.Column("car_vin", sa.String(50)),
sa.Column("charge_method", sa.String(20)),
sa.Column("settle_type", sa.String(20)),
sa.Column("pay_type", sa.String(20)),
sa.Column("settle_time", sa.DateTime(timezone=True)),
sa.Column("settle_price", sa.Float),
sa.Column("paid_price", sa.Float),
sa.Column("discount_amt", sa.Float, default=0),
sa.Column("elec_amt", sa.Float),
sa.Column("serve_amt", sa.Float),
sa.Column("order_status", sa.String(20), default="charging"),
sa.Column("charge_duration", sa.Integer),
sa.Column("energy", sa.Float),
sa.Column("start_soc", sa.Float),
sa.Column("end_soc", sa.Float),
sa.Column("abno_cause", sa.Text),
sa.Column("order_source", sa.String(20)),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
# --- occupancy_orders ---
op.create_table(
"occupancy_orders",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("order_id", sa.Integer, sa.ForeignKey("charging_orders.id")),
sa.Column("pile_id", sa.Integer, sa.ForeignKey("charging_piles.id")),
sa.Column("start_time", sa.DateTime(timezone=True)),
sa.Column("end_time", sa.DateTime(timezone=True)),
sa.Column("occupancy_fee", sa.Float, default=0),
sa.Column("status", sa.String(20), default="active"),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
)
def downgrade() -> None:
op.drop_table("occupancy_orders")
op.drop_table("charging_orders")
op.drop_table("charging_price_params")
op.drop_table("charging_price_strategies")
op.drop_table("charging_piles")
op.drop_table("charging_stations")
op.drop_table("charging_brands")
op.drop_table("charging_merchants")