From 37e8ce52a72844b0c509d892f4cbb96a1dad5fdb Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Fri, 28 Aug 2026 10:50:06 +0800 Subject: [PATCH] feat(oa): expose GET /instances/history for start-page history Co-authored-by: Cursor --- backend/app/api/oa_approval.py | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/backend/app/api/oa_approval.py b/backend/app/api/oa_approval.py index 9025961e..ca4b8279 100644 --- a/backend/app/api/oa_approval.py +++ b/backend/app/api/oa_approval.py @@ -18,6 +18,8 @@ from app.services.oa_receive_account import normalize_account_fields router = APIRouter(prefix="/web/admin/oa-approval", tags=["OA审批"]) +OA_START_HISTORY_ALL_PERM = "oa:start:history:all" + def _get_tenant_no(db: Session, user: dict) -> str: tenant = (user.get("tenant_no") or "").strip() @@ -893,6 +895,48 @@ async def start_oa_instance( return error_response(400, str(e)) +@router.get("/instances/history") +async def list_oa_instance_history( + appId: str = Query(..., description="流程应用 ID"), + instanceId: str = Query(""), + instanceStatus: str = Query(""), + initiatorName: str = Query(""), + applyTimeFrom: str = Query(""), + applyTimeTo: str = Query(""), + finishTimeFrom: str = Query(""), + finishTimeTo: str = Query(""), + page: int = Query(1), + pageSize: int = Query(20, alias="pageSize"), + user: dict = Depends(require_admin_or_super_admin), + db: Session = Depends(get_db), +): + from app.core.menu_guard import user_has_menu_perm + from app.services.oa_engine import OaEngineError, list_instance_history + + try: + tenant_no = _get_tenant_no(db, user) + can_view_all = user_has_menu_perm(db, user, OA_START_HISTORY_ALL_PERM) + data = list_instance_history( + db, + tenant_no=tenant_no, + user_id=user.get("user_id") or "", + can_view_all=can_view_all, + app_id=appId, + instance_id=instanceId or None, + initiator_name=initiatorName or None, + apply_time_from=applyTimeFrom or None, + apply_time_to=applyTimeTo or None, + finish_time_from=finishTimeFrom or None, + finish_time_to=finishTimeTo or None, + instance_status=instanceStatus or None, + page=page, + page_size=pageSize, + ) + return success_response(data) + except OaEngineError as e: + return error_response(400, str(e)) + + @router.get("/instances/{instance_id}") async def get_oa_instance( instance_id: str,