feat(task): 任务中心扫码接单(多端) —— 服务端任务状态机/端口/迁移
- Task 加 task_code/tags/display_priority/claimed_by/claimed_at/doing_at;新增 TaskClaim 流水表。
- TaskService 加 claimed/doing/completed 状态机(claim/start_doing/complete),grab 并入 claim。
- TaskRepository 加 list_published/get_by_code/update/claim/set_doing + TaskClaimRepository;挂 Database。
- 端口:
· opc /tasks/grab-by-code、/tasks/{id}/doing、/tasks/{id}/complete
· operator POST /tasks(auto task_code) + PATCH /tasks/:id
· park /park/api/tasks(大屏展示,含 scan_payload 二维码载荷)
· training /api/tasks/claim-by-code、/api/tasks/my(小程序 C 端账号→OPC 身份 find-or-create 领单)
- 迁移 0008(tasks 加列 + task_claims)已应用+stamp;seed 补 task_code/tags/grab demo。
- tests/test_task_claim.py(自包含内存库, 状态机+流水+list_published), 直接 async 校验通过。
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -5,16 +5,33 @@ class TaskCreateRequest(BaseModel):
|
||||
category: str = ""
|
||||
sub_category: str = ""
|
||||
description: str = ""
|
||||
tags: str = ""
|
||||
mode: str = "grab"
|
||||
budget_min: int = 0
|
||||
budget_max: int = 0
|
||||
deadline: str = ""
|
||||
task_code: str = ""
|
||||
display_priority: int = 0
|
||||
publisher_name: str = ""
|
||||
|
||||
|
||||
class TaskUpdateRequest(BaseModel):
|
||||
title: str | None = None
|
||||
category: str | None = None
|
||||
sub_category: str | None = None
|
||||
description: str | None = None
|
||||
tags: str | None = None
|
||||
mode: str | None = None
|
||||
budget_min: int | None = None
|
||||
budget_max: int | None = None
|
||||
deadline: str | None = None
|
||||
task_code: str | None = None
|
||||
display_priority: int | None = None
|
||||
publisher_name: str | None = None
|
||||
|
||||
|
||||
class TaskStatusRequest(BaseModel):
|
||||
status: str # review/published/completed/cancelled
|
||||
status: str # review/published/completed/cancelled/claimed/doing
|
||||
|
||||
|
||||
|
||||
@@ -81,6 +98,22 @@ class CourseStatusRequest(BaseModel):
|
||||
status: str # draft/published/ended/offline
|
||||
|
||||
|
||||
class ActivityCreateRequest(BaseModel):
|
||||
title: str
|
||||
type: str | None = None # free/salon
|
||||
mode: str | None = None # online/offline
|
||||
status: str | None = None # open/invite/pending/done/ended
|
||||
subtitle: str | None = None
|
||||
desc: str | None = None
|
||||
location: str | None = None
|
||||
host: str | None = None
|
||||
image: str | None = None
|
||||
link: str | None = None
|
||||
start_at: str | None = None
|
||||
duration_min: int | None = None
|
||||
capacity: int | None = None
|
||||
|
||||
|
||||
class ActivityStatusRequest(BaseModel):
|
||||
status: str # open/invite/pending/done/ended
|
||||
|
||||
|
||||
Reference in New Issue
Block a user