feat(opc): OPC认证/入园/转园 端点 + 园区端方案B审核 + 迁移0013

- rbac_opc.py: /opc/certification/apply|mine、/opc/park-transfer/apply|mine
- rbac_admin.py: platform operator 兜底 list/review (opc-certifications/park-admissions/park-transfers),通过回填 users.set_classification
- park/routers.py: carrier 角色凭 operator_user_id 定位本园区,/park/api park-admissions|transfers view+review
- park/tenants.py: bind_admin 写 operator_user_id + find_by_operator_user_id
- 迁移 0013: opc_certifications + park_transfers + park_tenants.operator_user_id
This commit is contained in:
Pine
2026-08-26 15:43:34 +08:00
parent 30f0baf074
commit bc6265eb67
5 changed files with 377 additions and 3 deletions
@@ -0,0 +1,66 @@
"""opc_certifications + park_transfers + park_tenants 归属列
Revision ID: 0013_opc_cert_park_transfer
Revises: 0012_park_admissions
Create Date: 2026-08-26
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision = "0013_opc_cert_park_transfer"
down_revision = "0012_park_admissions"
branch_labels = None
depends_on = None
def upgrade() -> None:
# OPC 认证申请表(用户提交资料 → 运营方审核)
op.create_table(
"opc_certifications",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("user_id", sa.String(), default="", index=True),
sa.Column("username", sa.String(), default=""),
sa.Column("real_name", sa.String(), default=""),
sa.Column("gender", sa.String(), default=""),
sa.Column("address", sa.String(), default=""),
sa.Column("industry", sa.String(), default=""),
sa.Column("ability", sa.Text(), default=""),
sa.Column("phone", sa.String(), default=""),
sa.Column("docs_json", sa.Text(), default="{}"),
sa.Column("status", sa.String(), default="pending"),
sa.Column("review_comment", sa.String(), default=""),
sa.Column("reviewed_by", sa.String(), default=""),
sa.Column("reviewed_at", sa.String(), default=""),
sa.Column("created_at", sa.String(), default=""),
sa.Column("updated_at", sa.String(), default=""),
)
# OPC 转园申请表(园区 OPC 发起 → 园区/平台审核)
op.create_table(
"park_transfers",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("user_id", sa.String(), default="", index=True),
sa.Column("username", sa.String(), default=""),
sa.Column("from_park_id", sa.String(), default=""),
sa.Column("from_park_name", sa.String(), default=""),
sa.Column("to_park_id", sa.String(), default=""),
sa.Column("to_park_name", sa.String(), default=""),
sa.Column("reason", sa.Text(), default=""),
sa.Column("status", sa.String(), default="pending"),
sa.Column("review_comment", sa.String(), default=""),
sa.Column("reviewed_by", sa.String(), default=""),
sa.Column("reviewed_at", sa.String(), default=""),
sa.Column("created_at", sa.String(), default=""),
sa.Column("updated_at", sa.String(), default=""),
)
# 园区→载体归属:园区端据此只审本园区
op.add_column("park_tenants", sa.Column("operator_user_id", sa.String(), default=""))
def downgrade() -> None:
op.drop_column("park_tenants", "operator_user_id")
op.drop_table("park_transfers")
op.drop_table("opc_certifications")