From fbfbaa6d17d7b26bf7379774043a08cc76974f8f Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 6 Aug 2026 12:11:14 +0800 Subject: [PATCH] feat(api): expose CC unread count and mark-read endpoints. Co-authored-by: Cursor --- backend/app/api/oa_approval.py | 71 +++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/backend/app/api/oa_approval.py b/backend/app/api/oa_approval.py index abd10412..a93c471e 100644 --- a/backend/app/api/oa_approval.py +++ b/backend/app/api/oa_approval.py @@ -490,6 +490,11 @@ class OaTaskActionBody(BaseModel): comment: Optional[str] = None +class OaCcReadBatchBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + ids: List[str] = Field(default_factory=list) + + class OaAddSignBody(BaseModel): model_config = ConfigDict(populate_by_name=True) user_ids: List[str] = Field(default_factory=list, alias="userIds") @@ -695,9 +700,69 @@ async def get_related_summaries( return success_response({"list": items}) +@router.get("/tasks/cc/unread-count") +async def oa_cc_unread_count( + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + from app.services.oa_engine import OaEngineError, count_cc_unread + + try: + tenant_no = _get_tenant_no(db, user) + n = count_cc_unread( + db, tenant_no=tenant_no, user_id=user.get("user_id") or "" + ) + return success_response({"count": int(n)}) + except OaEngineError as e: + return error_response(400, str(e)) + + +@router.post("/tasks/cc/read-batch") +async def oa_cc_read_batch( + body: OaCcReadBatchBody, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + from app.services.oa_engine import OaEngineError, mark_cc_tasks_read_batch + + try: + tenant_no = _get_tenant_no(db, user) + data = mark_cc_tasks_read_batch( + db, + tenant_no=tenant_no, + user_id=user.get("user_id") or "", + ids=body.ids or [], + ) + return success_response(data, message="已标记已读") + except OaEngineError as e: + return error_response(400, str(e)) + + +@router.post("/tasks/{task_id}/read") +async def oa_task_mark_read( + task_id: str, + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + from app.services.oa_engine import OaEngineError, mark_cc_task_read + + try: + tenant_no = _get_tenant_no(db, user) + data = mark_cc_task_read( + db, + tenant_no=tenant_no, + user_id=user.get("user_id") or "", + task_id=task_id, + ) + return success_response(data, message="已标记已读") + except OaEngineError as e: + return error_response(400, str(e)) + + @router.get("/tasks/{kind}") async def list_oa_tasks( kind: str, + readStatus: Optional[str] = Query(None, alias="readStatus"), user: dict = Depends(require_admin_or_super_admin), db: Session = Depends(get_db), ): @@ -706,7 +771,11 @@ async def list_oa_tasks( try: tenant_no = _get_tenant_no(db, user) items = list_tasks( - db, tenant_no=tenant_no, user_id=user.get("user_id") or "", kind=kind + db, + tenant_no=tenant_no, + user_id=user.get("user_id") or "", + kind=kind, + read_status=readStatus, ) return success_response({"list": items}) except OaEngineError as e: