169 lines
7.4 KiB
Python
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")
|