Parcourir la source

feat(api): expose CC unread count and mark-read endpoints.

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu il y a 3 mois
Parent
commit
fbfbaa6d17
1 fichiers modifiés avec 70 ajouts et 1 suppressions
  1. 70 1
      backend/app/api/oa_approval.py

+ 70 - 1
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: