feat(park): 视频识别剥离,per-tenant 配置接入 park-vision 独立服务

- 删除 vision_yolo/vision_llm 及路由 /api/vision/frame|llm(保留遥测 event),去除 ultralytics 依赖
- 视频识别改为每园区(per-tenant)配置,经 park_settings(kv) 键 vision_api:<tid> 存取
- /park/api/vision/config GET/PUT(园区端读写本园区识别地址,可局域网);bind 下发含 vision_api
- 新增 alembic 0004(tenant_id 可空) / 0005(park_settings 表),迁移脚本执行
This commit is contained in:
Pine
2026-08-25 01:52:23 +08:00
parent 634ed22dcd
commit 5f0acfa79e
10 changed files with 141 additions and 945 deletions
@@ -0,0 +1,35 @@
"""park_screens.tenant_id 改为可空(纠正早期 create_all 遗留的 NOT NULL
Revision ID: 0004_park_screen_nullable_tenant
Revises: 0003_training_tables
Create Date: 2026-08-24
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision = "0004_park_screen_nullable_tenant"
down_revision = "0003_training_tables"
branch_labels = None
depends_on = None
def upgrade() -> None:
# SQLite 不能直接 ALTER 去除 NOT NULL → 用 batch(内部 rename+copy 重建表,保留既有行)
with op.batch_alter_table("park_screens") as batch_op:
batch_op.alter_column(
"tenant_id",
existing_type=sa.String(),
nullable=True,
)
def downgrade() -> None:
# 回退:恢复 NOT NULL(如无数据则安全;有数据且为 NULL 时需先处理)
with op.batch_alter_table("park_screens") as batch_op:
batch_op.alter_column(
"tenant_id",
existing_type=sa.String(),
nullable=False,
)
+30
View File
@@ -0,0 +1,30 @@
"""park_settings 全局配置 kv 表(视频识别开关/地址等,admin 可写)
Revision ID: 0005_park_settings
Revises: 0004_park_screen_nullable_tenant
Create Date: 2026-08-24
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision = "0005_park_settings"
down_revision = "0004_park_screen_nullable_tenant"
branch_labels = None
depends_on = None
def upgrade() -> None:
conn = op.get_bind()
if not conn.dialect.has_table(conn, "park_settings"):
op.create_table(
"park_settings",
sa.Column("key", sa.String(), primary_key=True),
sa.Column("value", sa.Text(), nullable=False, server_default=""),
sa.Column("updated_at", sa.String(), nullable=False, server_default=""),
)
def downgrade() -> None:
op.drop_table("park_settings")