Files
WonderQ-Project/WonderQ-Admin/alembic/versions/0024_vehicle_demand.py
T
duanshuwen fbf2c772a8 refactor: 清理废弃模块并重构管理端与全端代码
- 移除所有废弃的旧首页配置模块,包括destinationHero、demand相关、HomeExperience、vehicleService等表结构与代码,新增数据库迁移删除遗留表
- 重构管理端后台布局为标准RuoYi风格,新增Sidebar、Navbar、SettingsDrawer等组件,替换旧的过渡菜单实现
- 调整移动端响应断点为768px,更新布局相关测试用例,新增布局组件测试
- 删除OperationsTools发布/重置页面,移除/tools菜单入口,清理对应的API调用与测试代码
- 重构玩法模块编辑器:替换旧的图片手动输入框为图片上传组件,移除冗余的取消按钮
- 新增线索查询offset参数支持,完善查询参数处理逻辑
- 优化rbac菜单构建逻辑,新增可见性控制参数
- 修正管家编辑器提示文案,优化系统资源编辑器表单初始化逻辑
- 清理小程序端废弃的体验推荐组件与相关测试代码
- 更新文档与种子脚本,匹配新的API契约与使用说明
2026-08-26 23:24:28 +08:00

143 lines
5.4 KiB
Python

"""Add vehicle demand fields and service configuration."""
from alembic import context, op
import sqlalchemy as sa
from sqlalchemy import inspect
from sqlalchemy.dialects import postgresql
revision = "0024_vehicle_demand"
down_revision = "0023_detail_concierge_advisor"
branch_labels = None
depends_on = None
LEAD_COLUMNS = {
"leadType",
"contactName",
"customerId",
"vehicleDemand",
}
LEAD_INDEXES = {
"ix_Lead_leadType": ["leadType"],
"ix_Lead_customerId": ["customerId"],
}
VEHICLE_SERVICE_INDEXES = {
"ix_VehicleServiceConfig_isActive": ["isActive"],
}
def missing_lead_columns(existing_columns: set[str]) -> set[str]:
return LEAD_COLUMNS.difference(existing_columns)
def missing_named_indexes(existing_indexes: set[str], expected_indexes: dict[str, list[str]]) -> set[str]:
return set(expected_indexes).difference(existing_indexes)
def should_create_customer_fk(foreign_keys: list[dict]) -> bool:
return not any(
foreign_key.get("referred_table") == "Customer"
and foreign_key.get("referred_columns") == ["id"]
and foreign_key.get("constrained_columns") == ["customerId"]
for foreign_key in foreign_keys
)
def is_offline_mode() -> bool:
try:
return context.is_offline_mode()
except (NameError, AttributeError):
return False
def upgrade() -> None:
if is_offline_mode():
existing_lead_columns = set()
existing_lead_indexes = set()
existing_lead_foreign_keys = []
vehicle_service_table_exists = False
existing_vehicle_service_indexes = set()
else:
inspector = inspect(op.get_bind())
existing_lead_columns = {
column["name"]
for column in inspector.get_columns("Lead")
}
existing_lead_indexes = {
index["name"]
for index in inspector.get_indexes("Lead")
if index.get("name")
}
existing_lead_foreign_keys = inspector.get_foreign_keys("Lead")
vehicle_service_table_exists = "VehicleServiceConfig" in set(inspector.get_table_names())
existing_vehicle_service_indexes = {
index["name"]
for index in inspector.get_indexes("VehicleServiceConfig")
if index.get("name")
} if vehicle_service_table_exists else set()
added_lead_type = "leadType" not in existing_lead_columns
lead_columns = {
"leadType": sa.Column("leadType", sa.String(), nullable=False, server_default="general"),
"contactName": sa.Column("contactName", sa.String(), nullable=True),
"customerId": sa.Column("customerId", sa.String(), nullable=True),
"vehicleDemand": sa.Column("vehicleDemand", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
}
for column_name in ("leadType", "contactName", "customerId", "vehicleDemand"):
if column_name in missing_lead_columns(existing_lead_columns):
op.add_column("Lead", lead_columns[column_name])
for index_name in missing_named_indexes(existing_lead_indexes, LEAD_INDEXES):
op.create_index(index_name, "Lead", LEAD_INDEXES[index_name])
if should_create_customer_fk(existing_lead_foreign_keys):
op.create_foreign_key(
"fk_Lead_customerId_Customer",
"Lead",
"Customer",
["customerId"],
["id"],
ondelete="SET NULL",
)
if added_lead_type:
op.alter_column("Lead", "leadType", server_default=None)
if not vehicle_service_table_exists:
op.create_table(
"VehicleServiceConfig",
sa.Column("id", sa.String(), nullable=False),
sa.Column("introTitle", sa.String(), nullable=False),
sa.Column("intro", sa.Text(), nullable=False),
sa.Column("serviceSections", postgresql.JSONB(astext_type=sa.Text()), nullable=False, server_default=sa.text("'[]'::jsonb")),
sa.Column("advantages", postgresql.JSONB(astext_type=sa.Text()), nullable=False, server_default=sa.text("'[]'::jsonb")),
sa.Column("processSteps", postgresql.JSONB(astext_type=sa.Text()), nullable=False, server_default=sa.text("'[]'::jsonb")),
sa.Column("isActive", sa.Boolean(), nullable=False, server_default=sa.text("true")),
sa.Column("createdAt", sa.DateTime(), nullable=False),
sa.Column("updatedAt", sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
existing_vehicle_service_indexes = set()
for column_name in ("serviceSections", "advantages", "processSteps", "isActive"):
if column_name != "isActive":
op.alter_column("VehicleServiceConfig", column_name, server_default=None)
op.alter_column("VehicleServiceConfig", "isActive", server_default=None)
for index_name in missing_named_indexes(existing_vehicle_service_indexes, VEHICLE_SERVICE_INDEXES):
op.create_index(index_name, "VehicleServiceConfig", VEHICLE_SERVICE_INDEXES[index_name])
def downgrade() -> None:
op.drop_index("ix_VehicleServiceConfig_isActive", table_name="VehicleServiceConfig")
op.drop_table("VehicleServiceConfig")
op.drop_constraint("fk_Lead_customerId_Customer", "Lead", type_="foreignkey")
op.drop_index("ix_Lead_customerId", table_name="Lead")
op.drop_index("ix_Lead_leadType", table_name="Lead")
op.drop_column("Lead", "vehicleDemand")
op.drop_column("Lead", "customerId")
op.drop_column("Lead", "contactName")
op.drop_column("Lead", "leadType")