From eb7c5371c6ccc254fe9f95c7129ed00a27600250 Mon Sep 17 00:00:00 2001 From: Pine Date: Sun, 6 Sep 2026 21:44:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=AD=E5=8C=BA=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=92=8C=E6=88=90=E5=91=98=E5=88=97=E8=A1=A8API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增API: - GET /admin/park/tenants/{tid} - 园区详情(含统计:成员数/企业数/管理员信息) - GET /admin/park/tenants/{tid}/members - 园区成员列表(含用户信息) - GET /admin/companies/{cid}/members - 企业成员列表(含用户信息) 扩展_park_tenant_public函数,增加更多字段: operator_user_id、city、address、contact、tags、area_m2、 default_company_discount、default_user_discount、created_at --- app/api/routers/rbac_admin.py | 71 ++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/app/api/routers/rbac_admin.py b/app/api/routers/rbac_admin.py index a5ee91b..a55cdc8 100644 --- a/app/api/routers/rbac_admin.py +++ b/app/api/routers/rbac_admin.py @@ -443,7 +443,9 @@ class AdminTenantStatusBody(BaseModel): def _park_tenant_public(t: dict) -> dict: """脱敏园区:剔除 auth(username/salt/password_hash),仅留管理用字段。""" - return {k: t.get(k) for k in ("id", "name", "intro", "admin_username", "status")} + return {k: t.get(k) for k in ("id", "name", "intro", "admin_username", "status", + "operator_user_id", "city", "address", "contact", "tags", "area_m2", + "default_company_discount", "default_user_discount", "created_at")} @router.get("/park/screens", summary="全部屏幕(含未绑定+归属园区名,平台)") @@ -576,6 +578,73 @@ async def admin_park_tenant_companies( return {"items": await tnt.list_companies(tid)} +@router.get("/park/tenants/{tid}", summary="园区详情(含统计:成员数/企业数,平台)") +async def admin_park_tenant_detail( + tid: str, + db: Database = Depends(get_db), + _role: dict = Depends(require_roles("operator")), + _perm: dict = Depends(require_permission("menu:admin_user_mgmt")), +): + from app.park import tenants as tnt + t = await tnt.get_tenant(tid) + if t is None: + raise HTTPException(status_code=404, detail="园区不存在") + # 统计数据 + companies = await tnt.list_companies(tid) + members = await db.park_members.list_by_park(tid) + # 管理员信息 + admin_user = None + if t.get("operator_user_id"): + admin_user = await db.users.get_by_id(t["operator_user_id"]) + result = _park_tenant_public(t) + result["company_count"] = len(companies) + result["member_count"] = len(members) + result["admin_user"] = {k: admin_user.get(k, "") for k in ("id", "username", "nickname", "phone", "avatar")} if admin_user else None + result["companies"] = companies + return result + + +@router.get("/park/tenants/{tid}/members", summary="园区成员列表(含用户信息,平台)") +async def admin_park_tenant_members( + tid: str, + db: Database = Depends(get_db), + _role: dict = Depends(require_roles("operator")), + _perm: dict = Depends(require_permission("menu:admin_user_mgmt")), +): + members = await db.park_members.list_by_park(tid) + items = [] + for m in members: + user = await db.users.get_by_id(m["user_id"]) + d = dict(m) + if user: + d["user"] = {k: user.get(k, "") for k in ("id", "username", "nickname", "phone", "role", "avatar", "certification_status")} + items.append(d) + return {"items": items} + + +@router.get("/companies/{cid}/members", summary="企业成员列表(含用户信息,平台)") +async def admin_company_members( + cid: str, + db: Database = Depends(get_db), + _role: dict = Depends(require_roles("operator")), +): + from ...infrastructure.models import ParkCompany + from sqlalchemy import select + comp = (await db.session.execute( + select(ParkCompany).where(ParkCompany.id == cid))).scalars().first() + if comp is None: + raise HTTPException(status_code=404, detail="企业不存在") + members = await db.company_members.list_by_company(cid) + items = [] + for m in members: + user = await db.users.get_by_id(m["user_id"]) + d = dict(m) + if user: + d["user"] = {k: user.get(k, "") for k in ("id", "username", "nickname", "phone", "role", "avatar", "certification_status")} + items.append(d) + return {"items": items} + + @router.put("/park/tenants/{tid}/companies/{cid}/compute", summary="设置企业算力(只增不减,平台兜底)") async def admin_park_tenant_company_compute( tid: str,