feat(tasks): 运营端任务详情/竞标/报名端点 + 园区发布任务端点

- 运营端 /admin/tasks/{id} 详情、/{id}/bids、/{id}/claims、/{id}/bids/{bid_id}/win 开标定标(余标置lost+进 in_progress)
- 园区端 POST /park/api/park/tasks 发布任务(publisher_role=park/park_id=本园/发布即上架/默认公有)
This commit is contained in:
Pine
2026-08-27 20:19:40 +08:00
parent 084f039d10
commit b745328d49
2 changed files with 107 additions and 0 deletions
+53
View File
@@ -75,6 +75,59 @@ async def operator_escrow_release(
return released
@router.get("/tasks/{task_id}", summary="任务详情")
async def get_task_detail(
task_id: str,
db: Database = Depends(get_db),
_u: dict = Depends(require_roles("operator")),
):
task = await db.tasks.get(task_id)
if task is None:
raise HTTPException(status_code=404, detail="任务不存在")
return task
@router.get("/tasks/{task_id}/bids", summary="任务竞标(报名/投标情况)")
async def get_task_bids(
task_id: str,
db: Database = Depends(get_db),
_u: dict = Depends(require_roles("operator")),
):
return {"items": await db.bids.list_for_task(task_id)}
@router.get("/tasks/{task_id}/claims", summary="任务报名/接单情况(抢单/指派/推荐)")
async def get_task_claims(
task_id: str,
db: Database = Depends(get_db),
_u: dict = Depends(require_roles("operator")),
):
return {"items": await db.task_claims.list_by_task(task_id)}
@router.post("/tasks/{task_id}/bids/{bid_id}/win", summary="开标/定标(选定中标 OPC")
async def operator_win_bid(
task_id: str,
bid_id: str,
request: Request,
db: Database = Depends(get_db),
_u: dict = Depends(require_roles("operator")),
):
from ...services.task_service import TaskService
bid = await db.bids.set_status(bid_id, "win")
if bid is None:
raise HTTPException(status_code=404, detail="竞标不存在")
# 其余标置为 lost
for b in await db.bids.list_for_task(task_id):
if b["id"] != bid_id and b.get("status") == "submitted":
await db.bids.set_status(b["id"], "lost")
await db.tasks.set_status(task_id, "in_progress")
await write_audit(db, action="bid.win", resource="bid", resource_id=bid_id,
detail=f"task={task_id} winner={bid.get('opc_name')}", user=_u, request=request)
return bid
@router.get("/tasks", summary="任务列表")
async def list_tasks(
status: str | None = None,