From b388915fffeab2fc8ce9c8b59e2c657ebd7d7047 Mon Sep 17 00:00:00 2001 From: Blizzard Date: Wed, 8 Jul 2026 10:56:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E7=A7=9F=E6=88=B7=E9=A1=B5?= =?UTF-8?q?=E5=8A=A0=E3=80=8C=E5=85=B1=E4=BA=AB=E8=AE=A1=E8=B4=B9=E3=80=8D?= =?UTF-8?q?=E5=BC=80=E5=85=B3=EF=BC=88=E6=AF=8F=E7=A7=9F=E6=88=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TenantRow 带 shared_billing;选定租户成员区上方加共享计费开关(PUT /admin/tenants/:id/shared-billing):开=成员消耗计本租户池、关=各计个人池。 live 验证:公司A 开关随真实状态回显为勾选。 Co-Authored-By: Claude Opus 4.8 --- sundynix-admin/src/api.ts | 9 +++++++++ sundynix-admin/src/pages/TenantsPage.tsx | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sundynix-admin/src/api.ts b/sundynix-admin/src/api.ts index 4965919..cdad392 100644 --- a/sundynix-admin/src/api.ts +++ b/sundynix-admin/src/api.ts @@ -447,6 +447,7 @@ export interface TenantRow { plan: string; status: string; credit_balance_micro: number; + shared_billing: boolean; members: number; } export interface Member { @@ -500,3 +501,11 @@ export async function removeMember(tenantId: string, uid: string): Promise throw new Error(d.error ?? `remove member failed: ${res.status}`); } } + +export async function setSharedBilling(tenantId: string, on: boolean): Promise { + const res = guard(await fetch(`${ADMIN}/tenants/${tenantId}/shared-billing`, { method: "PUT", headers: authHeaders(true), body: JSON.stringify({ shared_billing: on }) })); + if (!res.ok) { + const d = (await res.json().catch(() => ({}))) as { error?: string }; + throw new Error(d.error ?? `set shared billing failed: ${res.status}`); + } +} diff --git a/sundynix-admin/src/pages/TenantsPage.tsx b/sundynix-admin/src/pages/TenantsPage.tsx index 5e2bca4..aeac194 100644 --- a/sundynix-admin/src/pages/TenantsPage.tsx +++ b/sundynix-admin/src/pages/TenantsPage.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from "react"; -import { listTenants, createTenant, listMembers, addMember, setMemberRole, removeMember, type TenantRow, type Member } from "../api"; +import { listTenants, createTenant, listMembers, addMember, setMemberRole, removeMember, setSharedBilling, type TenantRow, type Member } from "../api"; // 管理端「租户 & 用户」= 多成员租户管理(平台运维口径):租户目录 + 每租户成员增改删。 // 全真数据:GET/POST /admin/tenants、/admin/tenants/:id/members。 @@ -110,6 +110,14 @@ export function TenantsPage() { setMErr((e as Error).message); } }; + const onToggleShared = async (on: boolean) => { + try { + await setSharedBilling(selId, on); + await loadTenants(); + } catch (e) { + setMErr((e as Error).message); + } + }; if (loading) return
加载租户中…
; @@ -172,6 +180,13 @@ export function TenantsPage() { {credits(selected.credit_balance_micro)} 积分 + {/* 共享计费开关 */} + + {/* 加成员 */}
setMEmail(e.target.value)} />