Files
server-core/alembic/versions/0036_service_orders.py
T
Pine 6d0bfae6aa feat(hall): 服务订单状态机 + 发包方任务操作(0036)
- 0036 迁移 + ServiceOrder ORM/仓储(service_orders:预约/下单→接单→交付→完成)
- /hall/services/{id}/order 预约下单(禁下自己的单);/hall/orders/bought|selling 双视角
- /hall/orders/{id}/{action} 六动作流转(accept/reject/start/deliver/complete/cancel),
  服务方/买方/运营三方权限约束 + 状态机非法流转校验
- /hall/tasks/{id}/win|assign|select|cancel:评标定标/指派/报名选定/取消(仅发包方或运营端)
2026-08-31 23:09:27 +08:00

53 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""服务订单(OPC 服务大厅:预约/下单 → 接单 → 交付 → 完成)。
状态机:pending → accepted → in_progress → delivered → completed
pending → rejected / cancelledaccepted|in_progress → cancelled(买方取消/卖方拒单)。
Revision ID: 0036_service_orders
Revises: 0035_hall_community
Create Date: 2026-08-31
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision = "0036_service_orders"
down_revision = "0035_hall_community"
branch_labels = None
depends_on = None
S = sa.String
T = sa.Text
def upgrade() -> None:
op.create_table(
"service_orders",
sa.Column("id", S(), primary_key=True),
sa.Column("service_id", S(), nullable=False),
sa.Column("opc_id", S(), nullable=True), # 服务提供者
sa.Column("buyer_id", S(), nullable=True),
sa.Column("buyer_name", S(), nullable=True, server_default=""),
sa.Column("contact", S(), nullable=True, server_default=""),
sa.Column("schedule_at", S(), nullable=True, server_default=""), # 预约时间
sa.Column("price", sa.Integer(), nullable=True, server_default="0"), # 成交价(元,0=按服务价)
sa.Column("note", T(), nullable=True), # 需求说明
sa.Column("status", S(), nullable=True, server_default="pending"),
sa.Column("accept_at", S(), nullable=True, server_default=""),
sa.Column("delivered_at", S(), nullable=True, server_default=""),
sa.Column("completed_at", S(), nullable=True, server_default=""),
sa.Column("created_at", S(), nullable=True, server_default=""),
sa.Column("updated_at", S(), nullable=True, server_default=""),
)
op.create_index("ix_service_orders_service_id", "service_orders", ["service_id"])
op.create_index("ix_service_orders_opc_id", "service_orders", ["opc_id"])
op.create_index("ix_service_orders_buyer_id", "service_orders", ["buyer_id"])
def downgrade() -> None:
op.drop_index("ix_service_orders_buyer_id", table_name="service_orders")
op.drop_index("ix_service_orders_opc_id", table_name="service_orders")
op.drop_index("ix_service_orders_service_id", table_name="service_orders")
op.drop_table("service_orders")