smart-admin-web 10.25.0 → 10.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +7 -5
- package/dist/api/index.js +12 -9
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +12 -4
- package/dist/layouts/NoticeBell.vue.js +2 -2
- package/dist/layouts/NoticeBell2.vue.js +203 -146
- package/dist/layouts/NoticeBell2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/locales/en-US.d.ts +3 -0
- package/dist/locales/en-US.js +3 -0
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +3 -0
- package/dist/locales/zh-CN.js +3 -0
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/api/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { components } from './schema';
|
|
2
|
-
import { AddUserInput, AddUserOutput, AiProviderAddInput, AiProviderPreset, AiProviderUpdateInput, AiProviderView, AiTestResult, AiUsageGroupBy, AiUsageSummary, AiUsageTrendPoint, ChunkInitOutput, ConfigInput, CronPreviewOutput, DashboardSummary, DataScopeType, DictItem, DictItemInput, DictTypeInput, DuplicateStrategy, FileUploadOutput, ImportCommitResult, ImportPreview, ImportRow, JobDashboard, JobHandlersOutput, JobInput, LastLoginInfo, LoginOutput, ModuleInput, ModuleRow, MyModulesOutput, MySessionItem, NoticeMineItem, NoticePublishInput, OnlineSessionItem, OrgInput, OrgOption, PermissionRouteItem, PositionInput, PositionOption, RoleInput, RoleOption, ServerInfoOutput, SysAiUsageLog, SysConfig, SysDictItem, SysDictType, SysExceptionLog, SysFile, SysJob, SysJobLog, SysLoginLog, SysNotice, SysOpLog, SysOrg, SysPosition, SysRole, SysRoleDataScope, UpdateUserInput, UserDetail, UserItem, UserMenuEffect, UserMenuEffective, UserMenuGrantItem, UserMenuGrantPageItem, UserMenuGrantStatus, UserMenuGrantUpsert, UserOption, UserProfile, UserShortcutItem, WorkbenchTodoSummary } from '../types/api';
|
|
2
|
+
import { AddUserInput, AddUserOutput, AiProviderAddInput, AiProviderPreset, AiProviderUpdateInput, AiProviderView, AiTestResult, AiUsageGroupBy, AiUsageSummary, AiUsageTrendPoint, ChunkInitOutput, ConfigInput, CronPreviewOutput, DashboardSummary, DataScopeType, DictItem, DictItemInput, DictTypeInput, DuplicateStrategy, FileUploadOutput, ImportCommitResult, ImportPreview, ImportRow, JobDashboard, JobHandlersOutput, JobInput, LastLoginInfo, LoginOutput, ModuleInput, ModuleRow, MyModulesOutput, MySessionItem, NoticeMineItem, NoticePublishInput, NoticeType, OnlineSessionItem, OrgInput, OrgOption, PermissionRouteItem, PositionInput, PositionOption, RoleInput, RoleOption, ServerInfoOutput, SysAiUsageLog, SysConfig, SysDictItem, SysDictType, SysExceptionLog, SysFile, SysJob, SysJobLog, SysLoginLog, SysNotice, SysOpLog, SysOrg, SysPosition, SysRole, SysRoleDataScope, UpdateUserInput, UserDetail, UserItem, UserMenuEffect, UserMenuEffective, UserMenuGrantItem, UserMenuGrantPageItem, UserMenuGrantStatus, UserMenuGrantUpsert, UserOption, UserProfile, UserShortcutItem, WorkbenchTodoSummary } from '../types/api';
|
|
3
3
|
import { MenuInput, MenuNode, MenuTreeNode } from '../types/menu';
|
|
4
4
|
import { WatermarkSettings } from '../lib/watermark';
|
|
5
5
|
/** 业务错误(含后端 code / msgKey);视图 catch 后经 translateError 展示。 */
|
|
@@ -662,19 +662,21 @@ export declare const noticeApi: {
|
|
|
662
662
|
}>;
|
|
663
663
|
publish: (body: NoticePublishInput) => Promise<number>;
|
|
664
664
|
remove: (id: number) => Promise<boolean>;
|
|
665
|
-
/** 我的通知分页(含已读标记);onlyUnread 供"未读"
|
|
665
|
+
/** 我的通知分页(含已读标记);onlyUnread 供"未读"页签用,types 供铃铛页签用。 */
|
|
666
666
|
mine: (params: {
|
|
667
667
|
page: number;
|
|
668
668
|
pageSize: number;
|
|
669
669
|
onlyUnread?: boolean;
|
|
670
|
+
types?: NoticeType[];
|
|
670
671
|
}) => Promise<{
|
|
671
672
|
items: NoticeMineItem[];
|
|
672
673
|
total: number;
|
|
673
674
|
}>;
|
|
674
|
-
/** 当前用户未读通知数(顶栏角标轮询)
|
|
675
|
-
unreadCount: () => Promise<number>;
|
|
675
|
+
/** 当前用户未读通知数(顶栏角标轮询);带 types 只数这几种类型。 */
|
|
676
|
+
unreadCount: (types?: NoticeType[]) => Promise<number>;
|
|
676
677
|
markRead: (id: number) => Promise<boolean>;
|
|
677
|
-
|
|
678
|
+
/** 全部标为已读;带 types 只标这几种类型。 */
|
|
679
|
+
markAllRead: (types?: NoticeType[]) => Promise<boolean>;
|
|
678
680
|
};
|
|
679
681
|
export declare const menuApi: {
|
|
680
682
|
tree: () => Promise<MenuTreeNode[]>;
|
package/dist/api/index.js
CHANGED
|
@@ -143,12 +143,12 @@ const C = {
|
|
|
143
143
|
smsLoginSend: (e) => s.POST("/api/v1/auth/sms/send", { body: e }).then((t) => a(t)),
|
|
144
144
|
/** 免密登录:手机号 + 短信码换令牌。 */
|
|
145
145
|
smsLogin: (e) => s.POST("/api/v1/auth/sms/login", { body: e }).then((t) => a(t))
|
|
146
|
-
},
|
|
146
|
+
}, q = {
|
|
147
147
|
bindStart: (e) => s.POST("/api/v1/auth/mfa/bind/start", { body: e }).then((t) => a(t)),
|
|
148
148
|
bindComplete: (e) => s.POST("/api/v1/auth/mfa/bind/complete", { body: e }).then((t) => a(t)),
|
|
149
149
|
recovery: (e) => s.POST("/api/v1/auth/mfa/recovery", { body: e }).then((t) => a(t)),
|
|
150
150
|
clear: (e) => s.POST("/api/v1/sys/mfa/clear", { body: e }).then((t) => a(t))
|
|
151
|
-
},
|
|
151
|
+
}, I = {
|
|
152
152
|
list: () => s.GET("/api/v1/sys/mfa/high-sensitivity", {}).then((e) => a(e)),
|
|
153
153
|
add: (e) => s.POST("/api/v1/sys/mfa/high-sensitivity", { body: e }).then((t) => a(t)),
|
|
154
154
|
remove: (e) => s.DELETE("/api/v1/sys/mfa/high-sensitivity/{id}", { params: { path: { id: e } } }).then((t) => a(t))
|
|
@@ -592,14 +592,17 @@ const M = {
|
|
|
592
592
|
publish: (e) => s.POST("/api/v1/sys/notice", { body: e }).then((t) => a(t)),
|
|
593
593
|
remove: (e) => s.DELETE("/api/v1/sys/notice/{id}", { params: { path: { id: e } } }).then((t) => a(t)),
|
|
594
594
|
// ── 用户端(任何登录用户) ──
|
|
595
|
-
/** 我的通知分页(含已读标记);onlyUnread 供"未读"
|
|
595
|
+
/** 我的通知分页(含已读标记);onlyUnread 供"未读"页签用,types 供铃铛页签用。 */
|
|
596
596
|
mine: (e) => s.GET("/api/v1/sys/notice/mine", {
|
|
597
|
-
params: {
|
|
597
|
+
params: {
|
|
598
|
+
query: { ...r(e), OnlyUnread: e.onlyUnread, Types: e.types }
|
|
599
|
+
}
|
|
598
600
|
}).then((t) => p(t)),
|
|
599
|
-
/** 当前用户未读通知数(顶栏角标轮询)
|
|
600
|
-
unreadCount: () => s.GET("/api/v1/sys/notice/unread-count", {}).then((
|
|
601
|
+
/** 当前用户未读通知数(顶栏角标轮询);带 types 只数这几种类型。 */
|
|
602
|
+
unreadCount: (e) => s.GET("/api/v1/sys/notice/unread-count", { params: { query: { Types: e } } }).then((t) => a(t)),
|
|
601
603
|
markRead: (e) => s.PUT("/api/v1/sys/notice/{id}/read", { params: { path: { id: e } } }).then((t) => a(t)),
|
|
602
|
-
|
|
604
|
+
/** 全部标为已读;带 types 只标这几种类型。 */
|
|
605
|
+
markAllRead: (e) => s.PUT("/api/v1/sys/notice/read-all", { params: { query: { Types: e } } }).then((t) => a(t))
|
|
603
606
|
}, W = {
|
|
604
607
|
tree: () => s.GET("/api/v1/sys/menu/tree", {}).then((e) => a(e)),
|
|
605
608
|
/** 可授权路由清单(后端 EndpointDataSource 实时算出,含消费方自建控制器);喂菜单表单「权限码」下拉,免手敲。 */
|
|
@@ -745,12 +748,12 @@ export {
|
|
|
745
748
|
J as dictApi,
|
|
746
749
|
D as externalAuthApi,
|
|
747
750
|
_ as fileApi,
|
|
748
|
-
|
|
751
|
+
I as highSensApi,
|
|
749
752
|
X as jobApi,
|
|
750
753
|
x as listQuery,
|
|
751
754
|
M as logApi,
|
|
752
755
|
W as menuApi,
|
|
753
|
-
|
|
756
|
+
q as mfaApi,
|
|
754
757
|
j as moduleApi,
|
|
755
758
|
B as monitorApi,
|
|
756
759
|
O as normalizeCommit,
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/api/index.ts"],"sourcesContent":["// 平台内核 API + 给域模块复用的原语(unwrap/ApiError/pageParams/toPage/listQuery/dayRange)。\n// 应用的业务端点写在自己的 src/api/<域>.ts 里,从 smart-admin-web 导入这些原语与 createApiClient。\n// 这些原语是包的公开导出,包内没有调用方是设计如此,别当未使用代码清掉。\nimport { client, LONG_TIMEOUT_MS } from './client'\nimport { runtime } from '#/lib/runtime'\nimport type { components } from './schema'\nimport type {\n AddUserInput,\n AddUserOutput,\n AiProviderAddInput,\n AiProviderPreset,\n AiProviderUpdateInput,\n AiProviderView,\n AiTestResult,\n AiUsageGroupBy,\n AiUsageSummary,\n AiUsageTrendPoint,\n ChunkInitOutput,\n ConfigInput,\n CronPreviewOutput,\n DashboardSummary,\n DataScopeType,\n DictItem,\n DictItemInput,\n DictTypeInput,\n DuplicateStrategy,\n FileUploadOutput,\n ImportCommitResult,\n ImportPreview,\n ImportRow,\n JobDashboard,\n JobHandlersOutput,\n JobInput,\n LastLoginInfo,\n LoginOutput,\n ModuleInput,\n ModuleRow,\n MyModulesOutput,\n MySessionItem,\n NoticeMineItem,\n NoticePublishInput,\n OnlineSessionItem,\n OrgInput,\n OrgOption,\n PagedList,\n PermissionRouteItem,\n PositionInput,\n PositionOption,\n RoleInput,\n RoleOption,\n ServerInfoOutput,\n SysAiUsageLog,\n SysConfig,\n SysDictItem,\n SysDictType,\n SysExceptionLog,\n SysFile,\n SysJob,\n SysJobLog,\n SysLoginLog,\n SysNotice,\n SysOpLog,\n SysOrg,\n SysPosition,\n SysRole,\n SysRoleDataScope,\n UpdateUserInput,\n UserDetail,\n UserItem,\n UserMenuEffect,\n UserMenuEffective,\n UserMenuGrantItem,\n UserMenuGrantPageItem,\n UserMenuGrantStatus,\n UserMenuGrantUpsert,\n UserOption,\n UserProfile,\n UserShortcutItem,\n WorkbenchTodoSummary,\n} from '#/types/api'\nimport type { MenuInput, MenuNode, MenuTreeNode } from '#/types/menu'\nimport type { WatermarkSettings } from '#/lib/watermark'\n\n/** 业务错误(含后端 code / msgKey);视图 catch 后经 translateError 展示。 */\nexport class ApiError extends Error {\n code: number\n msgKey?: string\n args?: Record<string, unknown>\n constructor(code: number, msgKey?: string, args?: Record<string, unknown>, message?: string) {\n super(message ?? msgKey ?? `Error ${code}`)\n this.name = 'ApiError'\n this.code = code\n this.msgKey = msgKey\n this.args = args\n }\n}\n\ninterface Envelope {\n code?: number\n msgKey?: string\n args?: Record<string, unknown>\n message?: string\n data?: unknown\n}\n\n/**\n * 解包 openapi-fetch 结果,同时容忍两种形状:\n * - 2xx:body 是 Result<T> 信封;code!==0 抛 ApiError,否则返回 data.data。\n * - 非 2xx:enveloped(401/403/429)有 code → 抛带 code 的 ApiError;\n * ProblemDetails(400 校验 / 500)无 code → 抛 status + title/detail。\n */\nexport function unwrap<T>(res: { data?: unknown; error?: unknown; response: Response }): T {\n const { data, error, response } = res\n if (error !== undefined && error !== null) {\n const env = error as Envelope\n if (typeof env.code === 'number') {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n const pd = error as { title?: string; detail?: string }\n throw new ApiError(\n response.status,\n undefined,\n undefined,\n pd.title ?? pd.detail ?? response.statusText,\n )\n }\n const env = (data ?? {}) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n return env.data as T\n}\n\n/**\n * 按「方法 + 站内路径」调一个运行期才知道 url 的接口(通知动作按钮这类场景),\n * 走同一套中间件(令牌 / CSRF / 刷新重放 / 超时)与信封解包。url 必须是 /api/ 开头的站内路径,\n * 调用方先用 lib/noticeActions 的 classifyNoticeAction 把关。\n */\nexport function callApi<T = unknown>(\n method: 'GET' | 'POST',\n url: string,\n body?: unknown,\n): Promise<T> {\n // openapi-fetch 的 request 只认 schema 里的路径字面量;这里的 url 来自数据,类型上放开一次。\n const request = client.request as unknown as (\n m: string,\n u: string,\n init?: { body?: unknown },\n ) => Promise<{ data?: unknown; error?: unknown; response: Response }>\n return request(method, url, body === undefined ? undefined : { body }).then(r => unwrap<T>(r))\n}\n\n/**\n * 分页三件套复用(每个列表端点都重复):\n * - 前端 {page,pageSize} → 后端 record 属性 {Current,Size}(PascalCase;ASP.NET 绑定大小写不敏感但类型要 Pascal)。\n * `...pageParams(p)` 展进各端点自己的 PascalCase 过滤条件,查询对象仍逐端点强类型校验(不走 any)。\n * - 后端 PagedList<T>({current,size,total,items}) → SmartTable fetcher 契约的 {items,total}。\n *\n * 二者连同 unwrap/ApiError 一起从包入口导出,是<b>应用写自己 API 模块的接缝</b>:应用的 `src/api/<域>.ts`\n * 从 smart-admin-web 导入它们,分页端点就与内核端点同一套映射。包内没有别的调用方也必须留着,别当未使用导出清掉。\n */\nexport const pageParams = (p: { page: number; pageSize: number }) => ({\n Current: p.page,\n Size: p.pageSize,\n})\n\n/**\n * 「编号 + 名称 + 关键字 + 排序」这套列表参数是后端 CRUD 模板的默认产出,二十来个端点逐字重复。\n * 不带 Keyword 的端点用 `Omit<ListParams, 'keyword'>`,别把不存在的过滤条件写进签名骗调用方。\n */\nexport interface ListParams {\n page: number\n pageSize: number\n keyword?: string\n number?: string\n name?: string\n sortField?: string\n sortOrder?: string\n}\n\n/**\n * ListParams → 后端 PascalCase 查询串。\n * undefined 字段由 openapi-fetch 的 querySerializer 直接跳过,所以不带 keyword 的端点复用它也不会多发参数。\n */\nexport const listQuery = (p: ListParams) => ({\n ...pageParams(p),\n Keyword: p.keyword,\n Number: p.number,\n Name: p.name,\n SortField: p.sortField,\n SortOrder: p.sortOrder,\n})\n\n/**\n * SmartTable 的 daterange 控件回传 `[开始, 结束]`(YYYY-MM-DD),后端要拆成两个参数。\n * 结束日必须补 23:59:59,否则\"筛到今天\"会把今天已经发生的数据全部漏掉(纯日期串等价于当天 00:00:00)。\n * 各域 API 模块的参数名不同(XxxStart/XxxEnd),所以这里只回中性的 start/end 由调用方改名。\n */\nexport const dayRange = (range?: [string, string] | null) => {\n if (!range || range.length !== 2) return { start: undefined, end: undefined }\n return { start: range[0] || undefined, end: range[1] ? `${range[1]} 23:59:59` : undefined }\n}\n\nexport function toPage<T>(res: Parameters<typeof unwrap>[0]): { items: T[]; total: number } {\n const p = unwrap<PagedList<T>>(res)\n return { items: p.items, total: p.total }\n}\n\n/**\n * 下载 xlsx 等二进制:parseAs blob + 手查 ok(unwrap 假定 JSON 信封,接不了二进制)。\n * AdminExceptionFilter 对业务失败仍回 HTTP 200 + JSON 信封,故还要辨 content-type /\n * 是否以 `{` 开头,避免把错误信封当 xlsx 触发下载。\n *\n * 与 unwrap/pageParams/toPage 一样是<b>应用接缝</b>:应用 `src/api/<域>.ts` 的导出端点从 smart-admin-web 导入它,\n * 别在自己文件里再抄一份错误信封嗅探(抄漏一个分支就会把失败信封当 xlsx 存到用户磁盘上)。\n */\nexport async function unwrapDownload(res: {\n data?: unknown\n error?: unknown\n response: Response\n}): Promise<Blob> {\n const { data, error, response } = res\n if (!response.ok) {\n const env = (error ?? {}) as Envelope\n if (typeof env.code === 'number')\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n throw new ApiError(response.status, undefined, undefined, response.statusText)\n }\n const blob = data as Blob\n const ct = response.headers.get('content-type') ?? ''\n if (ct.includes('spreadsheet') || ct.includes('octet-stream')) return blob\n // 200 + application/json = 业务失败信封(导出行数超限等)\n if (ct.includes('json') || ct.includes('text/plain')) {\n const env = JSON.parse(await blob.text()) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n } else {\n // content-type 缺失时嗅探:xlsx 是 zip(`PK`),信封以 `{` 开头\n const head = new Uint8Array(await blob.slice(0, 1).arrayBuffer())\n if (head[0] === 0x7b /* { */) {\n const env = JSON.parse(await blob.text()) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n }\n }\n return blob\n}\n\n/**\n * 归一 ImportPreview:int64/int 序列化噪音 → number,缺省数组补齐。\n * 与 unwrap/unwrapDownload 一样是<b>应用接缝</b>:应用 `src/api/<域>.ts` 接自己的导入端点时从 smart-admin-web 导入它,\n * 别各自抄一份归一逻辑 —— 漏一个 Number() 就会让 ImportWizard 的错误计数错位。\n */\nexport function normalizePreview(raw: ImportPreview): ImportPreview {\n return {\n headers: raw.headers ?? [],\n mapping: raw.mapping ?? {},\n columns: (raw.columns ?? []).map(c => ({\n key: c.key,\n title: c.title,\n required: c.required,\n dictTypeCode: c.dictTypeCode,\n hint: c.hint,\n width: c.width != null ? Number(c.width) : undefined,\n })),\n rows: (raw.rows ?? []).map(normalizeRow),\n total: Number(raw.total ?? 0),\n errorRows: Number(raw.errorRows ?? 0),\n columnErrors: (raw.columnErrors ?? []).map(e => ({\n columnKey: e.columnKey,\n code: Number(e.code),\n args: e.args,\n })),\n }\n}\n\nfunction normalizeRow(r: ImportRow): ImportRow {\n return {\n index: Number(r.index ?? 0),\n cells: { ...r.cells },\n errors: (r.errors ?? []).map(e => ({\n columnKey: e.columnKey,\n code: Number(e.code),\n args: e.args,\n })),\n }\n}\n\nexport function normalizeCommit(raw: ImportCommitResult): ImportCommitResult {\n return {\n total: Number(raw.total ?? 0),\n inserted: Number(raw.inserted ?? 0),\n updated: Number(raw.updated ?? 0),\n skipped: Number(raw.skipped ?? 0),\n failed: Number(raw.failed ?? 0),\n failures: (raw.failures ?? []).map(normalizeRow),\n }\n}\n\n/**\n * 回传行:schema 把 cells 标成 `Record<string, string>`(无 null),而运行时/编辑态允许空。\n * 发送前把 null/undefined 收成 `''`,避免 openapi-fetch 类型卡死。\n * 同为应用接缝,见 normalizePreview 上的说明。\n */\nexport function toWireRows(rows: ImportRow[]) {\n return rows.map(r => {\n const cells: Record<string, string> = {}\n for (const [k, v] of Object.entries(r.cells ?? {})) cells[k] = v ?? ''\n return {\n index: r.index,\n cells,\n errors: r.errors.map(e => ({\n columnKey: e.columnKey,\n code: e.code,\n args: e.args as Record<string, never> | null | undefined,\n })),\n }\n })\n}\n\nexport const authApi = {\n login: (body: { account: string; password: string; captchaId?: string; captchaCode?: string }) =>\n client.POST('/api/v1/auth/login', { body }).then(r => unwrap<LoginOutput>(r)),\n logout: () => client.POST('/api/v1/auth/logout', {}).then(r => unwrap<boolean>(r)),\n captcha: () =>\n client\n .GET('/api/v1/auth/captcha', {})\n .then(r => unwrap<{ captchaId: string; svg: string; type?: string }>(r)),\n /** 短信二次验证:凭密码登录 40009 信令下发的挑战 Id + 短信码完成登录。 */\n smsChallengeLogin: (body: { challengeId: string; code: string }) =>\n client.POST('/api/v1/auth/login/sms', { body }).then(r => unwrap<LoginOutput>(r)),\n /** 短信二次验证:重发验证码(服务端冷却/日上限,过频抛 40008)。 */\n smsChallengeResend: (body: { challengeId: string }) =>\n client\n .POST('/api/v1/auth/login/sms/resend', { body })\n .then(r => unwrap<{ expiresSeconds: number; resendSeconds: number }>(r)),\n /** TOTP 二次验证完成登录(40018 / SSO totpChallenge);走 openapi-fetch → CSRF/credentials 中间件生效。 */\n totpChallengeLogin: (body: { challengeId: string; code: string }) =>\n client.POST('/api/v1/auth/login/totp', { body }).then(r => unwrap<LoginOutput>(r)),\n /** 短时再认证(高危写操作 40024 后由中间件唤起;窗口约 5 分钟)。 */\n reauth: (body: { method?: string; totpCode?: string; password?: string }) =>\n client.POST('/api/v1/auth/reauth', { body }).then(r => unwrap<void>(r)),\n /** 免密登录发码(图形验证码启用时须携带;响应不区分手机号是否存在,防枚举)。 */\n smsLoginSend: (body: { phone: string; captchaId?: string; captchaCode?: string }) =>\n client\n .POST('/api/v1/auth/sms/send', { body })\n .then(r => unwrap<{ expiresSeconds: number; resendSeconds: number }>(r)),\n /** 免密登录:手机号 + 短信码换令牌。 */\n smsLogin: (body: { phone: string; code: string }) =>\n client.POST('/api/v1/auth/sms/login', { body }).then(r => unwrap<LoginOutput>(r)),\n}\n\n/** TOTP 自助绑定 / 恢复 / 管理员清除(无邀请路径)。 */\nexport const mfaApi = {\n bindStart: (body: components['schemas']['TotpBindStartInput']) =>\n client\n .POST('/api/v1/auth/mfa/bind/start', { body })\n .then(r => unwrap<components['schemas']['TotpBindStartOutput']>(r)),\n bindComplete: (body: components['schemas']['TotpBindCompleteInput']) =>\n client\n .POST('/api/v1/auth/mfa/bind/complete', { body })\n .then(r => unwrap<components['schemas']['TotpBindCompleteOutput']>(r)),\n recovery: (body: components['schemas']['TotpRecoveryInput']) =>\n client.POST('/api/v1/auth/mfa/recovery', { body }).then(r => unwrap<void>(r)),\n clear: (body: components['schemas']['TotpClearMfaInput']) =>\n client.POST('/api/v1/sys/mfa/clear', { body }).then(r => unwrap<void>(r)),\n}\n\n/** 高敏权限自定义追加(内核默认只读;写操作须 reauth)。 */\nexport const highSensApi = {\n list: () =>\n client\n .GET('/api/v1/sys/mfa/high-sensitivity', {})\n .then(r => unwrap<components['schemas']['HighSensitivityPermissionList']>(r)),\n add: (body: components['schemas']['HighSensitivityPermissionInput']) =>\n client\n .POST('/api/v1/sys/mfa/high-sensitivity', { body })\n .then(r => unwrap<components['schemas']['HighSensitivityPermissionItem']>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/mfa/high-sensitivity/{id}', { params: { path: { id } } })\n .then(r => unwrap<void>(r)),\n}\n\nexport interface ExternalProvider {\n code: string\n displayName: string\n icon?: string | null\n}\n\n/** 管理端:全部已注册 provider(含已禁用)+ enabled / linkByAccount 两个运营开关。 */\nexport interface ExternalProviderAdmin extends ExternalProvider {\n enabled: boolean\n linkByAccount: boolean\n}\n\nexport interface ExternalBinding {\n provider: string\n displayName?: string | null\n boundAt: string\n}\n\n// 外部登录 / SSO。登录:providers 点亮按钮 → 顶层导航到 authorizeUrl(后端 302 跳 IdP)→ 回调页 exchange 换令牌。\n// 绑定(个人中心):bindStart 拿授权 URL 跳转 → 同一回调把外部身份绑到当前用户;bindings 查、unbind 解绑。\nexport const externalAuthApi = {\n /** 登录页可用的外部登录方式(启用的);空数组 = 不显 SSO 区。 */\n providers: () =>\n client.GET('/api/v1/auth/external/providers', {}).then(r => unwrap<ExternalProvider[]>(r)),\n /** 管理端全量列表(含已禁用);系统配置「第三方登录」Tab。 */\n providersAll: () =>\n client\n .GET('/api/v1/auth/external/providers/all', {})\n .then(r => unwrap<ExternalProviderAdmin[]>(r)),\n /** 发起某 provider 登录的 URL(顶层浏览器导航,不走 fetch —— 后端 302 跳 IdP)。 */\n authorizeUrl: (code: string) =>\n `${runtime.apiBase}/api/v1/auth/external/${encodeURIComponent(code)}/authorize`,\n /** 一次性票据换令牌(登录回调后);票据无效/过期/已用抛 40014。 */\n exchange: (ticket: string) =>\n client\n .POST('/api/v1/auth/external/exchange', { body: { ticket } })\n .then(r => unwrap<LoginOutput>(r)),\n /** 认领未绑定 SSO 的 pending-link(账密登录后);票据无效 40014,已被他人绑 40017。 */\n claimPendingLink: (pendingLink: string) =>\n client\n .POST('/api/v1/auth/external/pending-link/claim', { body: { pendingLink } })\n .then(r => unwrap<boolean>(r)),\n /** 我的外部账号绑定列表(个人中心)。 */\n bindings: () =>\n client.GET('/api/v1/auth/external/bindings', {}).then(r => unwrap<ExternalBinding[]>(r)),\n /** 发起绑定:返回授权 URL,前端跳转开始 OAuth 往返(回调把身份绑到当前用户)。 */\n bindStart: (code: string) =>\n client\n .POST('/api/v1/auth/external/{provider}/bind', { params: { path: { provider: code } } })\n .then(r => unwrap<{ authorizeUrl: string }>(r)),\n /** 解绑某 provider 的外部账号。 */\n unbind: (code: string) =>\n client\n .DELETE('/api/v1/auth/external/{provider}/binding', { params: { path: { provider: code } } })\n .then(r => unwrap<boolean>(r)),\n /** 管理端:类型目录 + 全部 provider 的配置状态(机密只回 hasValue 与尾四位)。「登录方式」页。 */\n catalog: () =>\n client.GET('/api/v1/sys/external-auth/providers', {}).then(r => unwrap<ExternalAuthCatalog>(r)),\n /** 新增或更新一条配置;机密留空 = 不改。需重新验证身份。 */\n saveProvider: (code: string, body: ExternalAuthProviderSaveInput) =>\n client\n .PUT('/api/v1/sys/external-auth/providers/{code}', { params: { path: { code } }, body })\n .then(r => unwrap<boolean>(r)),\n /** 清除配置(软删,不动用户已绑定的外部账号)。需重新验证身份。 */\n removeProvider: (code: string) =>\n client\n .DELETE('/api/v1/sys/external-auth/providers/{code}', { params: { path: { code } } })\n .then(r => unwrap<boolean>(r)),\n /** 连接测试:用表单里的值,机密留空取已保存的;不落库,失败原因在 checks 里。 */\n testProvider: (body: ExternalAuthProviderTestInput) =>\n client\n .POST('/api/v1/sys/external-auth/providers/test', { body })\n .then(r => unwrap<ExternalAuthTestResult>(r)),\n}\n\nexport type ExternalAuthCatalog = components['schemas']['ExternalAuthCatalogOutput']\nexport type ExternalAuthType = components['schemas']['ExternalAuthTypeView']\nexport type ExternalAuthField = components['schemas']['ExternalAuthFieldView']\nexport type ExternalAuthProvider = components['schemas']['ExternalAuthProviderView']\nexport type ExternalAuthProviderSaveInput = components['schemas']['ExternalAuthProviderSaveInput']\nexport type ExternalAuthProviderTestInput = components['schemas']['ExternalAuthProviderTestInput']\nexport type ExternalAuthTestResult = components['schemas']['ExternalAuthTestView']\nexport type ExternalAuthCheck = components['schemas']['ExternalAuthCheckView']\n\nexport const dashboardApi = {\n /** 工作台首页统计([ActiveSession]:任何登录用户可取,无需权限码)。 */\n summary: () => client.GET('/api/v1/dashboard/summary', {}).then(r => unwrap<DashboardSummary>(r)),\n}\n\nexport const personalApi = {\n modules: () => client.GET('/api/v1/personal/modules', {}).then(r => unwrap<MyModulesOutput>(r)),\n menu: (moduleId: number) =>\n client\n .GET('/api/v1/personal/menu', { params: { query: { moduleId } } })\n .then(r => unwrap<MenuNode[]>(r)),\n setDefaultModule: (moduleId: number) =>\n client\n .PUT('/api/v1/personal/default-module', { body: { moduleId } })\n .then(r => unwrap<boolean>(r)),\n profile: () => client.GET('/api/v1/personal/profile', {}).then(r => unwrap<UserProfile>(r)),\n /** 改自己的资料(全量替换语义:缺字段即置空,前端整表单提交)。 */\n updateProfile: (body: {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n }) => client.PUT('/api/v1/personal/profile', { body }).then(r => unwrap<boolean>(r)),\n /** 我的活跃会话列表(个人视角;isCurrent = 本次请求所用会话)。 */\n sessions: () => client.GET('/api/v1/personal/sessions', {}).then(r => unwrap<MySessionItem[]>(r)),\n /** 下线自己的某个会话;他人的/不存在的一律 42024(不区分,防探测)。 */\n kickSession: (sessionId: string) =>\n client\n .DELETE('/api/v1/personal/sessions/{sessionId}', { params: { path: { sessionId } } })\n .then(r => unwrap<boolean>(r)),\n updatePassword: (body: { oldPassword: string; newPassword: string }) =>\n client.PUT('/api/v1/personal/password', { body }).then(r => unwrap<boolean>(r)),\n /** 当前用户权限码集合(= 规范化路由);喂给 authStore.permissionCodes 驱动 v-auth。超管返回空集。 */\n permissions: () => client.GET('/api/v1/personal/permissions', {}).then(r => unwrap<string[]>(r)),\n /** 上一次成功登录的信息(排除本次);首次登录返回 null。 */\n lastLogin: () =>\n client.GET('/api/v1/personal/last-login', {}).then(r => unwrap<LastLoginInfo | null>(r)),\n /** 工作台待办摘要;内核默认恒空,消费方接入真实审批/工单系统后有数据。 */\n workbenchTodo: () =>\n client.GET('/api/v1/personal/workbench/todo', {}).then(r => unwrap<WorkbenchTodoSummary>(r)),\n /** 工作台快捷方式(置顶优先 + 高频自动补位,已按此排好序)。 */\n shortcuts: () =>\n client.GET('/api/v1/personal/shortcuts', {}).then(r => unwrap<UserShortcutItem[]>(r)),\n /** 置顶一个快捷方式(幂等)。 */\n pinShortcut: (menuPath: string) =>\n client\n .PUT('/api/v1/personal/shortcuts/pin', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n /** 取消置顶(幂等)。 */\n unpinShortcut: (menuPath: string) =>\n client\n .PUT('/api/v1/personal/shortcuts/unpin', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n /** 记一次快捷方式访问(高频自动补位用);失败静默,不是用户能感知的操作。 */\n recordShortcutVisit: (menuPath: string) =>\n client\n .POST('/api/v1/personal/shortcuts/visit', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 用户管理:CRUD + 启停 / 重置密码 + xlsx 导入导出。\nexport const userApi = {\n /** 归一后端 PagedList<UserItem>({current,size,total,items}) → SmartTable fetcher 契约的 {items,total}。 */\n page: (params: {\n page: number\n pageSize: number\n account?: string\n name?: string\n orgId?: number\n roleId?: number\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/user/page', {\n // 查询参数名沿用后端 record 属性(PascalCase);ASP.NET 绑定大小写不敏感,类型要求 PascalCase。\n // roleId:角色反查(「这个角色有哪些人」/ 删角色前报人数)复用本端点,不另开接口。\n // sortField/sortOrder:SmartTable 排序;后端按实体列白名单校验(非法忽略回退默认),见 PagedListExtensions.OrderBySafe。\n params: {\n query: {\n ...pageParams(params),\n Account: params.account,\n Name: params.name,\n OrgId: params.orgId,\n RoleId: params.roleId,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<UserItem>(r)),\n /**\n * 选择器数据源(仅启用用户,只回 id / 姓名 / 账号):不占用户页权限码,没有「用户-查询」的角色也能选人。\n * keyword 同时匹配姓名与账号;范围同 page。人员选择器一律走它,不走 page。\n */\n options: (params: { page: number; pageSize: number; keyword?: string; orgId?: number }) =>\n client\n .GET('/api/v1/sys/user/options', {\n params: {\n query: { ...pageParams(params), Keyword: params.keyword, OrgId: params.orgId },\n },\n })\n .then(r => toPage<UserOption>(r)),\n /** 用户详情(含 roleIds,编辑回显 + 提交时原样带回避免清空角色)。 */\n detail: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}', { params: { path: { id } } })\n .then(r => unwrap<UserDetail>(r)),\n /** 新增用户;返回新 Id + 实际生效的初始口令(留空 password 时后端随机生成,不接住就没人知道这个号的密码)。 */\n add: (body: AddUserInput) =>\n client.POST('/api/v1/sys/user', { body }).then(r => unwrap<AddUserOutput>(r)),\n update: (id: number, body: UpdateUserInput) =>\n client\n .PUT('/api/v1/sys/user/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/user/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量软删除;集合含超管后端整体拒绝(SuperAdminProtected)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/user/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 重置密码;返回实际生效的初始密码(newPassword 留空 = 后端默认初始密码)。 */\n resetPassword: (id: number, newPassword?: string | null) =>\n client\n .PUT('/api/v1/sys/user/{id}/password', {\n params: { path: { id } },\n body: { newPassword: newPassword || null },\n })\n .then(r => unwrap<string>(r)),\n /** 专用启停端点(非全量 update)。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/user/{id}/enabled', { params: { path: { id } }, body: { enabled } })\n .then(r => unwrap<boolean>(r)),\n\n // ── 单独授权 ──\n\n /** 某用户的单独授权记录(授权菜单弹窗回显)。 */\n getMenuGrants: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}/menus', { params: { path: { id } } })\n .then(r => unwrap<UserMenuGrantItem[]>(r)),\n /** 某用户的有效权限与来源:能否授、能否编辑及原因、委派最长天数、模块清单,一次取齐。 */\n getEffectiveMenus: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}/menus/effective', { params: { path: { id } } })\n .then(r => unwrap<UserMenuEffective>(r)),\n /** 按变更集保存单独授权:没提到的记录原样保留。 */\n setMenuGrants: (userId: number, upserts: UserMenuGrantUpsert[], removes: number[]) =>\n client\n .PUT('/api/v1/sys/user/menu', { body: { userId, upserts, removes } })\n .then(r => unwrap<boolean>(r)),\n /** 单独授权一览:分页 + 筛选(用户 / 授权人模糊,效果、状态精确)。 */\n menuGrantPage: (params: {\n page: number\n pageSize: number\n user?: string\n grantor?: string\n effect?: UserMenuEffect\n status?: UserMenuGrantStatus\n }) =>\n client\n .GET('/api/v1/sys/user/menu-grants/page', {\n params: {\n query: {\n ...pageParams(params),\n User: params.user,\n Grantor: params.grantor,\n Effect: params.effect,\n Status: params.status,\n },\n },\n })\n .then(r => toPage<UserMenuGrantPageItem>(r)),\n\n // ── 导入 / 导出 ──\n\n /** 下载用户导入模板(xlsx)。[ActiveSession],无需独立权限码。 */\n importTemplate: () =>\n client\n .GET('/api/v1/sys/user/import/template', { parseAs: 'blob' })\n .then(r => unwrapDownload(r)),\n\n /**\n * 上传 xlsx 预览校验。multipart:`file` + 可选 `mapping`(JSON 字符串:表头→列 Key)。\n * bodySerializer 建 FormData(与 fileApi.upload 同型)。\n */\n importPreview: (file: File, mapping?: Record<string, string>) =>\n client\n .POST('/api/v1/sys/user/import/preview', {\n timeout: LONG_TIMEOUT_MS,\n body: {\n file: file as unknown as string,\n mapping: mapping ? JSON.stringify(mapping) : undefined,\n },\n bodySerializer: body => {\n const b = body as unknown as { file: File; mapping?: string }\n const fd = new FormData()\n fd.append('file', b.file)\n if (b.mapping) fd.append('mapping', b.mapping)\n return fd\n },\n })\n .then(r => normalizePreview(unwrap<ImportPreview>(r))),\n\n /** 对前端改过的行重新校验(不碰文件)。 */\n importValidate: (rows: ImportRow[]) =>\n client\n .POST('/api/v1/sys/user/import/validate', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows) },\n })\n .then(r => normalizePreview(unwrap<ImportPreview>(r))),\n\n /** 下载错误报告 xlsx(原列 +「错误原因」列)。 */\n importErrorReport: (rows: ImportRow[]) =>\n client\n .POST('/api/v1/sys/user/import/error-report', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows) },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n\n /** 按策略提交导入(部分提交:有错行跳过;服务端重校验,不信任前端 Errors)。 */\n importCommit: (rows: ImportRow[], strategy: DuplicateStrategy = 0) =>\n client\n .POST('/api/v1/sys/user/import/commit', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows), strategy },\n })\n .then(r => normalizeCommit(unwrap<ImportCommitResult>(r))),\n\n /**\n * 导出用户 xlsx。筛选条件与列表同源(Account/Name/OrgId/RoleId…)+ `columns` 逗号分隔列 Key。\n * 返回 blob,不进信封。\n */\n export: (params: {\n account?: string\n name?: string\n orgId?: number\n roleId?: number\n enabled?: boolean\n sortField?: string\n sortOrder?: string\n /** 逗号分隔列 Key;缺省 = 档案 DefaultSelected */\n columns?: string\n }) =>\n client\n .GET('/api/v1/sys/user/export', {\n timeout: LONG_TIMEOUT_MS,\n params: {\n query: {\n Account: params.account,\n Name: params.name,\n OrgId: params.orgId,\n RoleId: params.roleId,\n Enabled: params.enabled,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n columns: params.columns,\n },\n },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n}\n\n// 机构管理:树形机构 CRUD + 子树复制,list 平铺返回由前端 buildTree 拼树。\nexport const orgApi = {\n /** 全部机构(平铺,按 Sort、Id 排序)。前端 buildTree 拼树。下拉 / 树表复用。 */\n list: () => client.GET('/api/v1/sys/org/list', {}).then(r => unwrap<SysOrg[]>(r)),\n /** 选择器数据源(平铺 id / parentId / name,范围同 list):不占机构页权限码。机构下拉 / 树选择一律走它,不走 list。 */\n options: () => client.GET('/api/v1/sys/org/options', {}).then(r => unwrap<OrgOption[]>(r)),\n add: (body: OrgInput) =>\n client.POST('/api/v1/sys/org/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: OrgInput) =>\n client\n .PUT('/api/v1/sys/org/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/org/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 复制机构子树(整支克隆挂到源节点同级),返回新根 Id。 */\n copy: (id: number, body?: { name?: string }) =>\n client\n .POST('/api/v1/sys/org/{id}/copy', { params: { path: { id } }, body: body })\n .then(r => unwrap<number>(r)),\n}\n\n// 职位管理:普通 CRUD;岗位与机构无关联。\nexport const positionApi = {\n /** 职位分页;搜索键 name → PascalCase Name;sortField/sortOrder → 后端安全排序。下拉(拉大页)/ SmartTable 复用。 */\n page: (params: {\n page: number\n pageSize: number\n name?: string\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/position/page', {\n params: {\n query: {\n ...pageParams(params),\n Name: params.name,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<SysPosition>(r)),\n /** 选择器数据源(全部职位,按排序,只回 id / name):不占职位页权限码。 */\n options: () =>\n client.GET('/api/v1/sys/position/options', {}).then(r => unwrap<PositionOption[]>(r)),\n add: (body: PositionInput) =>\n client.POST('/api/v1/sys/position/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: PositionInput) =>\n client\n .PUT('/api/v1/sys/position/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/position/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 角色管理:CRUD + 菜单授权 / 数据范围 / 关联用户三块设置。\nexport const roleApi = {\n /** 角色分页;搜索键 name → PascalCase Name。列表用 + 用户/授权页拉一大页当下拉源。 */\n page: (params: { page: number; pageSize: number; name?: string }) =>\n client\n .GET('/api/v1/sys/role/page', {\n params: { query: { ...pageParams(params), Name: params.name } },\n })\n .then(r => toPage<SysRole>(r)),\n /** 选择器数据源(仅启用角色,按排序,只回 id / name):不占角色页权限码。 */\n options: () => client.GET('/api/v1/sys/role/options', {}).then(r => unwrap<RoleOption[]>(r)),\n add: (body: RoleInput) =>\n client.POST('/api/v1/sys/role/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: RoleInput) =>\n client\n .PUT('/api/v1/sys/role/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/role/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除角色(各自级联清关联)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/role/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 某角色当前授予的菜单 Id 集合(授权抽屉回显)。 */\n getMenus: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/menus', { params: { path: { id } } })\n .then(r => unwrap<number[]>(r)),\n /** 全量设置角色授予的菜单(空数组 = 收回全部)。 */\n setMenus: (roleId: number, menuIds: number[]) =>\n client\n .PUT('/api/v1/sys/role/menu', { body: { roleId, menuIds } })\n .then(r => unwrap<boolean>(r)),\n /** 某角色的数据范围配置(未配置返回 null)。 */\n getDataScope: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/datascope', { params: { path: { id } } })\n .then(r => unwrap<SysRoleDataScope | null>(r)),\n /** 设置角色数据范围;customOrgIds 仅 scopeType=Custom(5)时有意义。 */\n setDataScope: (roleId: number, scopeType: DataScopeType, customOrgIds?: number[]) =>\n client\n .PUT('/api/v1/sys/role/datascope', { body: { roleId, scopeType, customOrgIds } })\n .then(r => unwrap<boolean>(r)),\n /** 某角色当前关联的用户 Id 集合(授权用户抽屉回显)。 */\n getUsers: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/users', { params: { path: { id } } })\n .then(r => unwrap<number[]>(r)),\n /** 全量设置角色关联的用户(空数组 = 收回全部)。 */\n setUsers: (roleId: number, userIds: number[]) =>\n client\n .PUT('/api/v1/sys/role/users', { body: { roleId, userIds } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 应用(模块)管理:CRUD,门户多应用切换的应用清单来源。\nexport const moduleApi = {\n list: () => client.GET('/api/v1/sys/module/list', {}).then(r => unwrap<ModuleRow[]>(r)),\n add: (body: ModuleInput) =>\n client.POST('/api/v1/sys/module/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: ModuleInput) =>\n client\n .PUT('/api/v1/sys/module/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/module/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 系统配置:key/value 分页 CRUD + 按分组批量取/存(结构化表单用)+ 站点信息 / 密码策略两个匿名可读端点。\nexport const configApi = {\n /** 归一后端 PagedList<SysConfig> → SmartTable {items,total};搜索键 configKey/name/groupCode → PascalCase 查询参。 */\n page: (params: {\n page: number\n pageSize: number\n configKey?: string\n name?: string\n groupCode?: string\n excludedGroupCodes?: string[]\n excludedKeys?: string[]\n }) =>\n client\n .GET('/api/v1/sys/config/page', {\n params: {\n query: {\n ...pageParams(params),\n ConfigKey: params.configKey,\n Name: params.name,\n GroupCode: params.groupCode,\n ExcludedGroupCodes: params.excludedGroupCodes,\n ExcludedKeys: params.excludedKeys,\n },\n },\n })\n .then(r => toPage<SysConfig>(r)),\n add: (body: ConfigInput) =>\n client.POST('/api/v1/sys/config', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: ConfigInput) =>\n client\n .PUT('/api/v1/sys/config/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/config/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /**\n * 取某分组下全部配置(完整行,含 id/key/value),供分类配置中心结构化表单回填。\n * 逐页取全:结构化表单按键回写,漏取的字段会拿默认值把库里的真实值覆盖掉。\n */\n listByGroup: async (group: string) => {\n const all: SysConfig[] = []\n for (let current = 1; ; current++) {\n const page = await client\n .GET('/api/v1/sys/config/page', {\n params: { query: { Current: current, Size: 100, GroupCode: group } },\n })\n .then(r => unwrap<PagedList<SysConfig>>(r))\n all.push(...page.items)\n if (page.items.length === 0 || all.length >= page.total) return all\n }\n },\n /** 批量按键回写配置值(结构化表单保存);仅更新已存在键,未知键后端忽略。 */\n saveBatch: (items: { configKey: string; configValue?: string | null }[]) =>\n client.PUT('/api/v1/sys/config/batch', { body: items }).then(r => unwrap<boolean>(r)),\n /**\n * 上传站点 Logo(只收 PNG/JPG/WEBP、1 MB 以内,不受全局上传白名单约束)。\n * 返回的 viewUrl 是签名直链,写进 sys.site.logo 随批量保存生效。FormData 写法同 fileApi.upload。\n */\n uploadLogo: (file: File) =>\n client\n .POST('/api/v1/sys/config/logo', {\n timeout: LONG_TIMEOUT_MS,\n body: { file: file as unknown as string },\n bodySerializer: body => {\n const fd = new FormData()\n fd.append('file', (body as unknown as { file: File }).file)\n return fd\n },\n })\n .then(r => unwrap<FileUploadOutput>(r)),\n /** 站点信息(匿名可读:站点标题/副标题/版权等品牌展示白名单)。 */\n siteInfo: () =>\n client.GET('/api/v1/sys/config/site', {}).then(r =>\n unwrap<{\n title?: string | null\n subtitle?: string | null\n copyright?: string | null\n copyrightUrl?: string | null\n logo?: string | null\n loginHero?: Record<\n string,\n {\n headline?: string | null\n highlight?: string | null\n features?: string[] | null\n }\n > | null\n showFeatures?: boolean | null\n captchaEnabled?: boolean\n smsLoginEnabled?: boolean\n watermark?: Partial<Record<keyof WatermarkSettings, unknown>> | null\n }>(r),\n ),\n /** 当前生效密码策略(任何登录用户可读);改密页据此展示真实规则清单,免配置读权限。 */\n passwordPolicy: () =>\n client.GET('/api/v1/sys/config/password-policy', {}).then(r =>\n unwrap<{\n minLength: number\n requireUpper: boolean\n requireLower: boolean\n requireDigit: boolean\n requireSpecial: boolean\n }>(r),\n ),\n}\n\n/** 日志端点用的参数名是 StartTime/EndTime;拆分与补 23:59:59 的理由见 dayRange。 */\nfunction splitRange(range?: [string, string] | null) {\n const { start, end } = dayRange(range)\n return { StartTime: start, EndTime: end }\n}\n\n// 日志查询:登录 / 操作 / 异常三类日志各自的分页与清空;操作日志另支持导出 xlsx。\nexport const logApi = {\n /** 登录日志分页;账号模糊 + 成败 + 时间范围。 */\n loginPage: (params: {\n page: number\n pageSize: number\n account?: string\n success?: boolean\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/login/page', {\n params: {\n query: {\n ...pageParams(params),\n Account: params.account,\n Success: params.success,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysLoginLog>(r)),\n /** 清空登录日志(硬删,不可恢复)。 */\n loginClear: () => client.DELETE('/api/v1/sys/log/login', {}).then(r => unwrap<boolean>(r)),\n /** 操作日志分页;操作名模糊 + 成败 + 操作人(精确)+ 接口路径(模糊)+ 时间范围——审计要能答\"谁在什么时候干了什么\"。 */\n opPage: (params: {\n page: number\n pageSize: number\n title?: string\n success?: boolean\n operatorId?: number\n path?: string\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/op/page', {\n params: {\n query: {\n ...pageParams(params),\n Title: params.title,\n Success: params.success,\n OperatorId: params.operatorId,\n Path: params.path,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysOpLog>(r)),\n /** 清空操作日志(硬删,不可恢复)。 */\n opClear: () => client.DELETE('/api/v1/sys/log/op', {}).then(r => unwrap<boolean>(r)),\n /**\n * 导出操作日志 xlsx。筛选与 opPage 同源 + `columns` 逗号分隔列 Key。\n * 返回 blob,不进信封。\n */\n opExport: (params: {\n title?: string\n success?: boolean\n operatorId?: number\n path?: string\n createTime?: [string, string] | null\n columns?: string\n }) =>\n client\n .GET('/api/v1/sys/log/op/export', {\n timeout: LONG_TIMEOUT_MS,\n params: {\n query: {\n Title: params.title,\n Success: params.success,\n OperatorId: params.operatorId,\n Path: params.path,\n ...splitRange(params.createTime),\n columns: params.columns,\n },\n },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n /** 异常日志分页;接口路径模糊 + 异常类型模糊 + 时间范围。 */\n exceptionPage: (params: {\n page: number\n pageSize: number\n path?: string\n exceptionType?: string\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/exception/page', {\n params: {\n query: {\n ...pageParams(params),\n Path: params.path,\n ExceptionType: params.exceptionType,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysExceptionLog>(r)),\n /** 清空异常日志(硬删,不可恢复)。 */\n exceptionClear: () =>\n client.DELETE('/api/v1/sys/log/exception', {}).then(r => unwrap<boolean>(r)),\n}\n\n// 服务器监控:只读运行快照。\nexport const monitorApi = {\n /** 服务器运行快照(CPU/内存/磁盘/运行时;后端含一次约 500ms 的 CPU 采样)。 */\n server: () => client.GET('/api/v1/sys/monitor/server', {}).then(r => unwrap<ServerInfoOutput>(r)),\n}\n\n// 缓存管理:定向失效动作(只清不看——缓存含明文 OTP、键含 PII,故后端无键浏览/取值端点)。flush* 返回被清条数。\nexport const cacheApi = {\n /** 清全部用户的权限/数据范围缓存(返回被清用户数)。 */\n flushAuth: () => client.POST('/api/v1/sys/cache/flush-auth', {}).then(r => unwrap<number>(r)),\n /** 清全部字典项缓存(返回被清字典类型数)。 */\n flushDict: () => client.POST('/api/v1/sys/cache/flush-dict', {}).then(r => unwrap<number>(r)),\n /** 清全部系统配置缓存(返回被清配置项数)。 */\n flushConfig: () => client.POST('/api/v1/sys/cache/flush-config', {}).then(r => unwrap<number>(r)),\n /** 递增门户代际,令所有用户的门户菜单/模块缓存整体失效(返回新代际值)。 */\n rebuildPortal: () =>\n client.POST('/api/v1/sys/cache/rebuild-portal', {}).then(r => unwrap<number>(r)),\n}\n\n// 字典下拉数据源(公开只读):按类型编码取启用项,不含 id;喂 stores/dict 缓存,与 dictAdminApi 的管理端读取不能互换。\nexport const dictApi = {\n /** 按类型编码取字典项(服务端已按 sort 排序)。归一 int64 序列化噪音 → DictItem 投影,供 stores/dict 缓存消费。 */\n items: (typeCode: string) =>\n client\n .GET('/api/v1/sys/dict/items/{typeCode}', { params: { path: { typeCode } } })\n .then(r =>\n unwrap<{ label?: string; value?: string; sort?: number | string; enabled?: boolean }[]>(r),\n )\n .then(list =>\n list.map((i): DictItem => ({\n label: i.label ?? '',\n value: i.value ?? '',\n sort: Number(i.sort ?? 0),\n enabled: i.enabled ?? true,\n })),\n ),\n}\n\n// 字典管理端(受权限保护):类型 + 字典项 CRUD,含停用项、带 id;下拉展示走 dictApi,两者不能互相替代。\nexport const dictAdminApi = {\n /** 字典类型分页;搜索键 code/name → PascalCase Code/Name 查询参。 */\n typePage: (params: { page: number; pageSize: number; code?: string; name?: string }) =>\n client\n .GET('/api/v1/sys/dict/type/page', {\n params: { query: { ...pageParams(params), Code: params.code, Name: params.name } },\n })\n .then(r => toPage<SysDictType>(r)),\n typeAdd: (body: DictTypeInput) =>\n client.POST('/api/v1/sys/dict/type', { body }).then(r => unwrap<number>(r)),\n typeUpdate: (id: number, body: DictTypeInput) =>\n client\n .PUT('/api/v1/sys/dict/type/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n typeRemove: (id: number) =>\n client\n .DELETE('/api/v1/sys/dict/type/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除字典类型(各自级联删项)。 */\n typeBatchRemove: (ids: number[]) =>\n client\n .POST('/api/v1/sys/dict/type/batch-delete', { body: { ids } })\n .then(r => unwrap<boolean>(r)),\n /** 某类型下的字典项(管理端:含停用、带 id;非下拉缓存源)。ponytail: 拉一页 200(应用把 Api:MaxPageSize 调小时也不超限),字典项数量小,真超再分页。 */\n items: (typeCode: string) =>\n client\n .GET('/api/v1/sys/dict/item/page', {\n params: { query: { TypeCode: typeCode, Current: 1, Size: 200 } },\n })\n .then(r => unwrap<PagedList<SysDictItem>>(r))\n .then(p => p.items),\n itemAdd: (body: DictItemInput) =>\n client.POST('/api/v1/sys/dict/item', { body }).then(r => unwrap<number>(r)),\n itemUpdate: (id: number, body: DictItemInput) =>\n client\n .PUT('/api/v1/sys/dict/item/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n itemRemove: (id: number) =>\n client\n .DELETE('/api/v1/sys/dict/item/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除字典项。 */\n itemBatchRemove: (ids: number[]) =>\n client\n .POST('/api/v1/sys/dict/item/batch-delete', { body: { ids } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 文件管理:分页 / 上传 / 下载 / 删除,外加分片断点续传上传一整套。\nexport const fileApi = {\n /** 文件分页;搜索键 originalName → 后端 FileName 模糊过滤。 */\n page: (params: { page: number; pageSize: number; originalName?: string }) =>\n client\n .GET('/api/v1/sys/file/page', {\n params: { query: { ...pageParams(params), FileName: params.originalName } },\n })\n .then(r => toPage<SysFile>(r)),\n /** 上传单个文件:bodySerializer 建 FormData(字段名 file),openapi-fetch 对 FormData 不注入 json header,浏览器自动补 boundary(client.ts 无需改)。 */\n upload: (file: File) =>\n client\n .POST('/api/v1/sys/file/upload', {\n timeout: LONG_TIMEOUT_MS,\n body: { file: file as unknown as string },\n bodySerializer: body => {\n const fd = new FormData()\n fd.append('file', (body as unknown as { file: File }).file)\n return fd\n },\n })\n .then(r => unwrap<FileUploadOutput>(r)),\n /** 下载:parseAs blob 取原始字节(非信封,不套 unwrap);Bearer 由 client 拦截器自动带。 */\n download: (id: number) =>\n client\n .GET('/api/v1/sys/file/{id}/download', {\n timeout: LONG_TIMEOUT_MS,\n params: { path: { id } },\n parseAs: 'blob',\n })\n .then(r => {\n if (!r.response.ok)\n throw new ApiError(r.response.status, undefined, undefined, r.response.statusText)\n return r.data as Blob\n }),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/file/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量软删除文件记录(物理文件保留)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/file/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n // ── 分片 / 断点续传上传 ──\n /** 分片初始化:秒传探测 + 已收分片(断点续传)。 */\n chunkInit: (body: {\n fileHash: string\n fileName: string\n totalSize: number\n chunkCount: number\n }) => client.POST('/api/v1/sys/file/chunk/init', { body }).then(r => unwrap<ChunkInitOutput>(r)),\n /** 上传单个分片(multipart:uploadId + index + chunk),同 upload 用 bodySerializer 建 FormData。 */\n chunkUpload: (uploadId: string, index: number, chunk: Blob) =>\n client\n .POST('/api/v1/sys/file/chunk', {\n timeout: LONG_TIMEOUT_MS,\n body: { uploadId, index, chunk: chunk as unknown as string },\n bodySerializer: body => {\n const b = body as unknown as { uploadId: string; index: number; chunk: Blob }\n const fd = new FormData()\n fd.append('uploadId', b.uploadId)\n fd.append('index', String(b.index))\n fd.append('chunk', b.chunk)\n return fd\n },\n })\n .then(r => unwrap<boolean>(r)),\n /** 完成:触发服务端合并 + 哈希校验 + 三道关 + 落库。 */\n chunkComplete: (body: {\n uploadId: string\n fileHash: string\n fileName: string\n chunkCount: number\n }) =>\n client\n .POST('/api/v1/sys/file/chunk/complete', { timeout: LONG_TIMEOUT_MS, body })\n .then(r => unwrap<FileUploadOutput>(r)),\n}\n\n// 在线会话:只读分页 + 按 sessionId 强制下线。\nexport const sessionApi = {\n /** 在线会话分页(只读)。后端仅支持按 UserId 过滤,这里不带业务搜索。 */\n online: (params: { page: number; pageSize: number }) =>\n client\n .GET('/api/v1/sys/session/online', { params: { query: pageParams(params) } })\n .then(r => toPage<OnlineSessionItem>(r)),\n /** 强制下线:按 sessionId 踢会话。 */\n kick: (sessionId: string) =>\n client\n .DELETE('/api/v1/sys/session/{sessionId}', { params: { path: { sessionId } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 系统通知:管理端发布 / 撤回 + 用户端分页拉取 / 标记已读。\nexport const noticeApi = {\n // ── 管理端 ──\n /** 管理端分页(全量);搜索键 title/type → PascalCase 查询参。 */\n page: (params: { page: number; pageSize: number; title?: string; type?: number }) =>\n client\n .GET('/api/v1/sys/notice/page', {\n params: { query: { ...pageParams(params), Title: params.title, Type: params.type } },\n })\n .then(r => toPage<SysNotice>(r)),\n publish: (body: NoticePublishInput) =>\n client.POST('/api/v1/sys/notice', { body }).then(r => unwrap<number>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/notice/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n // ── 用户端(任何登录用户) ──\n /** 我的通知分页(含已读标记);onlyUnread 供\"未读\"页签用。 */\n mine: (params: { page: number; pageSize: number; onlyUnread?: boolean }) =>\n client\n .GET('/api/v1/sys/notice/mine', {\n params: { query: { ...pageParams(params), OnlyUnread: params.onlyUnread } },\n })\n .then(r => toPage<NoticeMineItem>(r)),\n /** 当前用户未读通知数(顶栏角标轮询)。 */\n unreadCount: () => client.GET('/api/v1/sys/notice/unread-count', {}).then(r => unwrap<number>(r)),\n markRead: (id: number) =>\n client\n .PUT('/api/v1/sys/notice/{id}/read', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n markAllRead: () => client.PUT('/api/v1/sys/notice/read-all', {}).then(r => unwrap<boolean>(r)),\n}\n\n// 菜单管理:菜单树 CRUD + 可授权路由清单(喂菜单表单「权限码」下拉)。\nexport const menuApi = {\n tree: () => client.GET('/api/v1/sys/menu/tree', {}).then(r => unwrap<MenuTreeNode[]>(r)),\n /** 可授权路由清单(后端 EndpointDataSource 实时算出,含消费方自建控制器);喂菜单表单「权限码」下拉,免手敲。 */\n routes: () =>\n client.GET('/api/v1/sys/menu/routes', {}).then(r => unwrap<PermissionRouteItem[]>(r)),\n add: (body: MenuInput) =>\n client.POST('/api/v1/sys/menu/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: MenuInput) =>\n client\n .PUT('/api/v1/sys/menu/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/menu/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// ── 定时任务 ──────────────────────────────\n\n// 定时任务:CRUD + 启停 / 手动执行一次 / cron 预览 / 处理器清单,外加执行记录查询、终止与监控仪表盘。\nexport const jobApi = {\n /** 任务分页;搜索键 name/status/handlerKind → PascalCase 查询参。行含全列,编辑表单直接用行数据。 */\n page: (params: {\n page: number\n pageSize: number\n name?: string\n status?: number\n handlerKind?: number\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/job/page', {\n params: {\n query: {\n ...pageParams(params),\n Name: params.name,\n Status: params.status,\n HandlerKind: params.handlerKind,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<SysJob>(r)),\n add: (body: JobInput) => client.POST('/api/v1/sys/job', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: JobInput) =>\n client\n .PUT('/api/v1/sys/job/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/job/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除(命中内置任务后端整批拒绝 47014)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/job/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 专用启停端点:true=恢复调度并重算下次执行时刻(顺带清连败计数),false=暂停。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/job/{id}/enabled', { params: { path: { id }, query: { enabled } } })\n .then(r => unwrap<boolean>(r)),\n /** 执行一次(收到请求的副本本机执行,不经选主、不影响调度节奏)。 */\n run: (id: number) =>\n client\n .POST('/api/v1/sys/job/{id}/run', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** cron 预览([ActiveSession] 任何登录用户可用;POST 因 cron 含 `? #` 走 query 有转义坑)。 */\n previewCron: (body: { cron: string; count?: number; from?: string | null }) =>\n client.POST('/api/v1/sys/job/preview-cron', { body }).then(r => unwrap<CronPreviewOutput>(r)),\n /** 已注册的编译处理器清单(表单下拉数据源,免手打 HandlerName)。 */\n handlers: () =>\n client.GET('/api/v1/sys/job/handlers', {}).then(r => unwrap<JobHandlersOutput>(r)),\n /**\n * 执行记录分页。startRange 是 SmartTable daterange 的 [开始, 结束] 日期串,\n * 拆成后端 StartFrom/StartTo,结束日补 23:59:59(同 splitRange 的理由,但参数名不同,不复用)。\n */\n logPage: (params: {\n page: number\n pageSize: number\n jobId?: number\n runStatus?: number\n startRange?: [string, string] | null\n fireInstanceId?: number\n }) =>\n client\n .GET('/api/v1/sys/job/log/page', {\n params: {\n query: {\n ...pageParams(params),\n JobId: params.jobId,\n RunStatus: params.runStatus,\n FireInstanceId: params.fireInstanceId,\n StartFrom: params.startRange?.[0] || undefined,\n StartTo: params.startRange?.[1] ? `${params.startRange[1]} 23:59:59` : undefined,\n },\n },\n })\n .then(r => toPage<SysJobLog>(r)),\n /** 终止一次执行(跨节点写终止旗标,目标节点最迟 KillPollSeconds 后停)。 */\n kill: (logId: number) =>\n client\n .POST('/api/v1/sys/job/log/{id}/kill', { params: { path: { id: logId } } })\n .then(r => unwrap<boolean>(r)),\n /** 清空执行记录(硬删;运行中的一律保留),返回删除行数。 */\n logClear: (body: { beforeDays?: number | null; jobId?: number | null }) =>\n client.POST('/api/v1/sys/job/log/clear', { body }).then(r => unwrap<number>(r)),\n /** 监控仪表盘(今日成败/在飞/趋势/即将执行/集群节点)。 */\n dashboard: () => client.GET('/api/v1/sys/job/dashboard', {}).then(r => unwrap<JobDashboard>(r)),\n}\n\n// ── 回收站 ────────────────────────────────────────────────────────\n\nexport interface RecycleBinItem {\n id: number\n name: string\n code: string | null\n deletedAt: string | null\n deletedBy: number | null\n}\n\nexport const recycleApi = {\n page: (type: string) => (params: { page: number; pageSize: number }) =>\n client\n .GET('/api/v1/sys/recycle/{type}/page', {\n params: { path: { type }, query: pageParams(params) },\n })\n .then(r => toPage<RecycleBinItem>(r)),\n restore: (type: string, id: number) =>\n client\n .POST('/api/v1/sys/recycle/{type}/{id}/restore', { params: { path: { type, id } } })\n .then(r => unwrap<boolean>(r)),\n purge: (type: string, id: number) =>\n client\n .DELETE('/api/v1/sys/recycle/{type}/{id}', { params: { path: { type, id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// ── AI 管理:厂商/模型 ────────────────────────────────────────────\n\nexport const aiProviderApi = {\n /** 厂商分页(含模型清单);搜索键 keyword/enabled → PascalCase 查询参。 */\n page: (params: { page: number; pageSize: number; keyword?: string; enabled?: boolean }) =>\n client\n .GET('/api/v1/sys/ai/provider/page', {\n params: {\n query: {\n ...pageParams(params),\n Keyword: params.keyword,\n Enabled: params.enabled,\n },\n },\n })\n .then(r => toPage<AiProviderView>(r)),\n get: (id: number) =>\n client\n .GET('/api/v1/sys/ai/provider/{id}', { params: { path: { id } } })\n .then(r => unwrap<AiProviderView>(r)),\n /** 厂商预置清单(协议/BaseUrl/鉴权方式/起步模型),新增抽屉选预设用。 */\n presets: () =>\n client.GET('/api/v1/sys/ai/provider/presets', {}).then(r => unwrap<AiProviderPreset[]>(r)),\n add: (body: AiProviderAddInput) =>\n client.POST('/api/v1/sys/ai/provider/add', { body }).then(r => unwrap<number>(r)),\n /** 更新入参没有 preset/protocol 字段——这两项创建后不可改,类型层面就不给改的机会。 */\n update: (id: number, body: AiProviderUpdateInput) =>\n client\n .PUT('/api/v1/sys/ai/provider/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n /** 启用时若未配置 Key 会被后端拒绝(49004),调用方按 StatusSwitch 模式处理失败回弹。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/ai/provider/{id}/enabled', { params: { path: { id }, query: { enabled } } })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/ai/provider/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 测试连接:用库里当前配置发一条最小对话;失败原因在返回体里,不抛异常。 */\n test: (id: number) =>\n client\n .POST('/api/v1/sys/ai/provider/{id}/test', { params: { path: { id } } })\n .then(r => unwrap<AiTestResult>(r)),\n}\n\n// ── AI 管理:用量统计 ────────────────────────────────────────────\n\ninterface AiUsageFilter {\n from: string\n to: string\n providerCode?: string\n model?: string\n scene?: string\n userId?: number\n}\n\nexport const aiUsageApi = {\n /** 区间总计 + 按维度分组聚合(groupBy 切换四个 Tab 共用这一个接口)。 */\n summary: (params: AiUsageFilter & { groupBy: AiUsageGroupBy }) =>\n client\n .GET('/api/v1/sys/ai/usage/summary', {\n params: {\n query: {\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n GroupBy: params.groupBy,\n },\n },\n })\n .then(r => unwrap<AiUsageSummary>(r)),\n /** 按天趋势;区间内无数据的日期后端已补 0,前端直接画连续折线。 */\n trend: (params: AiUsageFilter) =>\n client\n .GET('/api/v1/sys/ai/usage/trend', {\n params: {\n query: {\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n },\n },\n })\n .then(r => unwrap<AiUsageTrendPoint[]>(r)),\n /** 明细分页(不聚合);from/to 在这里是可选的(不筛日期就是全量分页)。 */\n page: (\n params: Omit<AiUsageFilter, 'from' | 'to'> & {\n page: number\n pageSize: number\n from?: string\n to?: string\n success?: boolean\n },\n ) =>\n client\n .GET('/api/v1/sys/ai/usage/page', {\n params: {\n query: {\n ...pageParams(params),\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n Success: params.success,\n },\n },\n })\n .then(r => toPage<SysAiUsageLog>(r)),\n}\n"],"names":["ApiError","code","msgKey","args","message","__publicField","unwrap","res","data","error","response","env","pd","callApi","method","url","body","request","client","r","pageParams","p","listQuery","dayRange","range","toPage","unwrapDownload","blob","ct","normalizePreview","raw","c","normalizeRow","e","normalizeCommit","toWireRows","rows","cells","k","v","authApi","mfaApi","highSensApi","id","externalAuthApi","runtime","ticket","pendingLink","dashboardApi","personalApi","moduleId","sessionId","menuPath","userApi","params","ids","newPassword","enabled","userId","upserts","removes","file","mapping","LONG_TIMEOUT_MS","b","fd","strategy","orgApi","positionApi","roleApi","roleId","menuIds","scopeType","customOrgIds","userIds","moduleApi","configApi","group","all","current","page","items","splitRange","start","end","logApi","monitorApi","cacheApi","dictApi","typeCode","list","dictAdminApi","fileApi","uploadId","index","chunk","sessionApi","noticeApi","menuApi","jobApi","_a","_b","logId","recycleApi","type","aiProviderApi","aiUsageApi"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/api/index.ts"],"sourcesContent":["// 平台内核 API + 给域模块复用的原语(unwrap/ApiError/pageParams/toPage/listQuery/dayRange)。\n// 应用的业务端点写在自己的 src/api/<域>.ts 里,从 smart-admin-web 导入这些原语与 createApiClient。\n// 这些原语是包的公开导出,包内没有调用方是设计如此,别当未使用代码清掉。\nimport { client, LONG_TIMEOUT_MS } from './client'\nimport { runtime } from '#/lib/runtime'\nimport type { components } from './schema'\nimport type {\n AddUserInput,\n AddUserOutput,\n AiProviderAddInput,\n AiProviderPreset,\n AiProviderUpdateInput,\n AiProviderView,\n AiTestResult,\n AiUsageGroupBy,\n AiUsageSummary,\n AiUsageTrendPoint,\n ChunkInitOutput,\n ConfigInput,\n CronPreviewOutput,\n DashboardSummary,\n DataScopeType,\n DictItem,\n DictItemInput,\n DictTypeInput,\n DuplicateStrategy,\n FileUploadOutput,\n ImportCommitResult,\n ImportPreview,\n ImportRow,\n JobDashboard,\n JobHandlersOutput,\n JobInput,\n LastLoginInfo,\n LoginOutput,\n ModuleInput,\n ModuleRow,\n MyModulesOutput,\n MySessionItem,\n NoticeMineItem,\n NoticePublishInput,\n NoticeType,\n OnlineSessionItem,\n OrgInput,\n OrgOption,\n PagedList,\n PermissionRouteItem,\n PositionInput,\n PositionOption,\n RoleInput,\n RoleOption,\n ServerInfoOutput,\n SysAiUsageLog,\n SysConfig,\n SysDictItem,\n SysDictType,\n SysExceptionLog,\n SysFile,\n SysJob,\n SysJobLog,\n SysLoginLog,\n SysNotice,\n SysOpLog,\n SysOrg,\n SysPosition,\n SysRole,\n SysRoleDataScope,\n UpdateUserInput,\n UserDetail,\n UserItem,\n UserMenuEffect,\n UserMenuEffective,\n UserMenuGrantItem,\n UserMenuGrantPageItem,\n UserMenuGrantStatus,\n UserMenuGrantUpsert,\n UserOption,\n UserProfile,\n UserShortcutItem,\n WorkbenchTodoSummary,\n} from '#/types/api'\nimport type { MenuInput, MenuNode, MenuTreeNode } from '#/types/menu'\nimport type { WatermarkSettings } from '#/lib/watermark'\n\n/** 业务错误(含后端 code / msgKey);视图 catch 后经 translateError 展示。 */\nexport class ApiError extends Error {\n code: number\n msgKey?: string\n args?: Record<string, unknown>\n constructor(code: number, msgKey?: string, args?: Record<string, unknown>, message?: string) {\n super(message ?? msgKey ?? `Error ${code}`)\n this.name = 'ApiError'\n this.code = code\n this.msgKey = msgKey\n this.args = args\n }\n}\n\ninterface Envelope {\n code?: number\n msgKey?: string\n args?: Record<string, unknown>\n message?: string\n data?: unknown\n}\n\n/**\n * 解包 openapi-fetch 结果,同时容忍两种形状:\n * - 2xx:body 是 Result<T> 信封;code!==0 抛 ApiError,否则返回 data.data。\n * - 非 2xx:enveloped(401/403/429)有 code → 抛带 code 的 ApiError;\n * ProblemDetails(400 校验 / 500)无 code → 抛 status + title/detail。\n */\nexport function unwrap<T>(res: { data?: unknown; error?: unknown; response: Response }): T {\n const { data, error, response } = res\n if (error !== undefined && error !== null) {\n const env = error as Envelope\n if (typeof env.code === 'number') {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n const pd = error as { title?: string; detail?: string }\n throw new ApiError(\n response.status,\n undefined,\n undefined,\n pd.title ?? pd.detail ?? response.statusText,\n )\n }\n const env = (data ?? {}) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n return env.data as T\n}\n\n/**\n * 按「方法 + 站内路径」调一个运行期才知道 url 的接口(通知动作按钮这类场景),\n * 走同一套中间件(令牌 / CSRF / 刷新重放 / 超时)与信封解包。url 必须是 /api/ 开头的站内路径,\n * 调用方先用 lib/noticeActions 的 classifyNoticeAction 把关。\n */\nexport function callApi<T = unknown>(\n method: 'GET' | 'POST',\n url: string,\n body?: unknown,\n): Promise<T> {\n // openapi-fetch 的 request 只认 schema 里的路径字面量;这里的 url 来自数据,类型上放开一次。\n const request = client.request as unknown as (\n m: string,\n u: string,\n init?: { body?: unknown },\n ) => Promise<{ data?: unknown; error?: unknown; response: Response }>\n return request(method, url, body === undefined ? undefined : { body }).then(r => unwrap<T>(r))\n}\n\n/**\n * 分页三件套复用(每个列表端点都重复):\n * - 前端 {page,pageSize} → 后端 record 属性 {Current,Size}(PascalCase;ASP.NET 绑定大小写不敏感但类型要 Pascal)。\n * `...pageParams(p)` 展进各端点自己的 PascalCase 过滤条件,查询对象仍逐端点强类型校验(不走 any)。\n * - 后端 PagedList<T>({current,size,total,items}) → SmartTable fetcher 契约的 {items,total}。\n *\n * 二者连同 unwrap/ApiError 一起从包入口导出,是<b>应用写自己 API 模块的接缝</b>:应用的 `src/api/<域>.ts`\n * 从 smart-admin-web 导入它们,分页端点就与内核端点同一套映射。包内没有别的调用方也必须留着,别当未使用导出清掉。\n */\nexport const pageParams = (p: { page: number; pageSize: number }) => ({\n Current: p.page,\n Size: p.pageSize,\n})\n\n/**\n * 「编号 + 名称 + 关键字 + 排序」这套列表参数是后端 CRUD 模板的默认产出,二十来个端点逐字重复。\n * 不带 Keyword 的端点用 `Omit<ListParams, 'keyword'>`,别把不存在的过滤条件写进签名骗调用方。\n */\nexport interface ListParams {\n page: number\n pageSize: number\n keyword?: string\n number?: string\n name?: string\n sortField?: string\n sortOrder?: string\n}\n\n/**\n * ListParams → 后端 PascalCase 查询串。\n * undefined 字段由 openapi-fetch 的 querySerializer 直接跳过,所以不带 keyword 的端点复用它也不会多发参数。\n */\nexport const listQuery = (p: ListParams) => ({\n ...pageParams(p),\n Keyword: p.keyword,\n Number: p.number,\n Name: p.name,\n SortField: p.sortField,\n SortOrder: p.sortOrder,\n})\n\n/**\n * SmartTable 的 daterange 控件回传 `[开始, 结束]`(YYYY-MM-DD),后端要拆成两个参数。\n * 结束日必须补 23:59:59,否则\"筛到今天\"会把今天已经发生的数据全部漏掉(纯日期串等价于当天 00:00:00)。\n * 各域 API 模块的参数名不同(XxxStart/XxxEnd),所以这里只回中性的 start/end 由调用方改名。\n */\nexport const dayRange = (range?: [string, string] | null) => {\n if (!range || range.length !== 2) return { start: undefined, end: undefined }\n return { start: range[0] || undefined, end: range[1] ? `${range[1]} 23:59:59` : undefined }\n}\n\nexport function toPage<T>(res: Parameters<typeof unwrap>[0]): { items: T[]; total: number } {\n const p = unwrap<PagedList<T>>(res)\n return { items: p.items, total: p.total }\n}\n\n/**\n * 下载 xlsx 等二进制:parseAs blob + 手查 ok(unwrap 假定 JSON 信封,接不了二进制)。\n * AdminExceptionFilter 对业务失败仍回 HTTP 200 + JSON 信封,故还要辨 content-type /\n * 是否以 `{` 开头,避免把错误信封当 xlsx 触发下载。\n *\n * 与 unwrap/pageParams/toPage 一样是<b>应用接缝</b>:应用 `src/api/<域>.ts` 的导出端点从 smart-admin-web 导入它,\n * 别在自己文件里再抄一份错误信封嗅探(抄漏一个分支就会把失败信封当 xlsx 存到用户磁盘上)。\n */\nexport async function unwrapDownload(res: {\n data?: unknown\n error?: unknown\n response: Response\n}): Promise<Blob> {\n const { data, error, response } = res\n if (!response.ok) {\n const env = (error ?? {}) as Envelope\n if (typeof env.code === 'number')\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n throw new ApiError(response.status, undefined, undefined, response.statusText)\n }\n const blob = data as Blob\n const ct = response.headers.get('content-type') ?? ''\n if (ct.includes('spreadsheet') || ct.includes('octet-stream')) return blob\n // 200 + application/json = 业务失败信封(导出行数超限等)\n if (ct.includes('json') || ct.includes('text/plain')) {\n const env = JSON.parse(await blob.text()) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n } else {\n // content-type 缺失时嗅探:xlsx 是 zip(`PK`),信封以 `{` 开头\n const head = new Uint8Array(await blob.slice(0, 1).arrayBuffer())\n if (head[0] === 0x7b /* { */) {\n const env = JSON.parse(await blob.text()) as Envelope\n if (typeof env.code === 'number' && env.code !== 0) {\n throw new ApiError(env.code, env.msgKey, env.args, env.message)\n }\n }\n }\n return blob\n}\n\n/**\n * 归一 ImportPreview:int64/int 序列化噪音 → number,缺省数组补齐。\n * 与 unwrap/unwrapDownload 一样是<b>应用接缝</b>:应用 `src/api/<域>.ts` 接自己的导入端点时从 smart-admin-web 导入它,\n * 别各自抄一份归一逻辑 —— 漏一个 Number() 就会让 ImportWizard 的错误计数错位。\n */\nexport function normalizePreview(raw: ImportPreview): ImportPreview {\n return {\n headers: raw.headers ?? [],\n mapping: raw.mapping ?? {},\n columns: (raw.columns ?? []).map(c => ({\n key: c.key,\n title: c.title,\n required: c.required,\n dictTypeCode: c.dictTypeCode,\n hint: c.hint,\n width: c.width != null ? Number(c.width) : undefined,\n })),\n rows: (raw.rows ?? []).map(normalizeRow),\n total: Number(raw.total ?? 0),\n errorRows: Number(raw.errorRows ?? 0),\n columnErrors: (raw.columnErrors ?? []).map(e => ({\n columnKey: e.columnKey,\n code: Number(e.code),\n args: e.args,\n })),\n }\n}\n\nfunction normalizeRow(r: ImportRow): ImportRow {\n return {\n index: Number(r.index ?? 0),\n cells: { ...r.cells },\n errors: (r.errors ?? []).map(e => ({\n columnKey: e.columnKey,\n code: Number(e.code),\n args: e.args,\n })),\n }\n}\n\nexport function normalizeCommit(raw: ImportCommitResult): ImportCommitResult {\n return {\n total: Number(raw.total ?? 0),\n inserted: Number(raw.inserted ?? 0),\n updated: Number(raw.updated ?? 0),\n skipped: Number(raw.skipped ?? 0),\n failed: Number(raw.failed ?? 0),\n failures: (raw.failures ?? []).map(normalizeRow),\n }\n}\n\n/**\n * 回传行:schema 把 cells 标成 `Record<string, string>`(无 null),而运行时/编辑态允许空。\n * 发送前把 null/undefined 收成 `''`,避免 openapi-fetch 类型卡死。\n * 同为应用接缝,见 normalizePreview 上的说明。\n */\nexport function toWireRows(rows: ImportRow[]) {\n return rows.map(r => {\n const cells: Record<string, string> = {}\n for (const [k, v] of Object.entries(r.cells ?? {})) cells[k] = v ?? ''\n return {\n index: r.index,\n cells,\n errors: r.errors.map(e => ({\n columnKey: e.columnKey,\n code: e.code,\n args: e.args as Record<string, never> | null | undefined,\n })),\n }\n })\n}\n\nexport const authApi = {\n login: (body: { account: string; password: string; captchaId?: string; captchaCode?: string }) =>\n client.POST('/api/v1/auth/login', { body }).then(r => unwrap<LoginOutput>(r)),\n logout: () => client.POST('/api/v1/auth/logout', {}).then(r => unwrap<boolean>(r)),\n captcha: () =>\n client\n .GET('/api/v1/auth/captcha', {})\n .then(r => unwrap<{ captchaId: string; svg: string; type?: string }>(r)),\n /** 短信二次验证:凭密码登录 40009 信令下发的挑战 Id + 短信码完成登录。 */\n smsChallengeLogin: (body: { challengeId: string; code: string }) =>\n client.POST('/api/v1/auth/login/sms', { body }).then(r => unwrap<LoginOutput>(r)),\n /** 短信二次验证:重发验证码(服务端冷却/日上限,过频抛 40008)。 */\n smsChallengeResend: (body: { challengeId: string }) =>\n client\n .POST('/api/v1/auth/login/sms/resend', { body })\n .then(r => unwrap<{ expiresSeconds: number; resendSeconds: number }>(r)),\n /** TOTP 二次验证完成登录(40018 / SSO totpChallenge);走 openapi-fetch → CSRF/credentials 中间件生效。 */\n totpChallengeLogin: (body: { challengeId: string; code: string }) =>\n client.POST('/api/v1/auth/login/totp', { body }).then(r => unwrap<LoginOutput>(r)),\n /** 短时再认证(高危写操作 40024 后由中间件唤起;窗口约 5 分钟)。 */\n reauth: (body: { method?: string; totpCode?: string; password?: string }) =>\n client.POST('/api/v1/auth/reauth', { body }).then(r => unwrap<void>(r)),\n /** 免密登录发码(图形验证码启用时须携带;响应不区分手机号是否存在,防枚举)。 */\n smsLoginSend: (body: { phone: string; captchaId?: string; captchaCode?: string }) =>\n client\n .POST('/api/v1/auth/sms/send', { body })\n .then(r => unwrap<{ expiresSeconds: number; resendSeconds: number }>(r)),\n /** 免密登录:手机号 + 短信码换令牌。 */\n smsLogin: (body: { phone: string; code: string }) =>\n client.POST('/api/v1/auth/sms/login', { body }).then(r => unwrap<LoginOutput>(r)),\n}\n\n/** TOTP 自助绑定 / 恢复 / 管理员清除(无邀请路径)。 */\nexport const mfaApi = {\n bindStart: (body: components['schemas']['TotpBindStartInput']) =>\n client\n .POST('/api/v1/auth/mfa/bind/start', { body })\n .then(r => unwrap<components['schemas']['TotpBindStartOutput']>(r)),\n bindComplete: (body: components['schemas']['TotpBindCompleteInput']) =>\n client\n .POST('/api/v1/auth/mfa/bind/complete', { body })\n .then(r => unwrap<components['schemas']['TotpBindCompleteOutput']>(r)),\n recovery: (body: components['schemas']['TotpRecoveryInput']) =>\n client.POST('/api/v1/auth/mfa/recovery', { body }).then(r => unwrap<void>(r)),\n clear: (body: components['schemas']['TotpClearMfaInput']) =>\n client.POST('/api/v1/sys/mfa/clear', { body }).then(r => unwrap<void>(r)),\n}\n\n/** 高敏权限自定义追加(内核默认只读;写操作须 reauth)。 */\nexport const highSensApi = {\n list: () =>\n client\n .GET('/api/v1/sys/mfa/high-sensitivity', {})\n .then(r => unwrap<components['schemas']['HighSensitivityPermissionList']>(r)),\n add: (body: components['schemas']['HighSensitivityPermissionInput']) =>\n client\n .POST('/api/v1/sys/mfa/high-sensitivity', { body })\n .then(r => unwrap<components['schemas']['HighSensitivityPermissionItem']>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/mfa/high-sensitivity/{id}', { params: { path: { id } } })\n .then(r => unwrap<void>(r)),\n}\n\nexport interface ExternalProvider {\n code: string\n displayName: string\n icon?: string | null\n}\n\n/** 管理端:全部已注册 provider(含已禁用)+ enabled / linkByAccount 两个运营开关。 */\nexport interface ExternalProviderAdmin extends ExternalProvider {\n enabled: boolean\n linkByAccount: boolean\n}\n\nexport interface ExternalBinding {\n provider: string\n displayName?: string | null\n boundAt: string\n}\n\n// 外部登录 / SSO。登录:providers 点亮按钮 → 顶层导航到 authorizeUrl(后端 302 跳 IdP)→ 回调页 exchange 换令牌。\n// 绑定(个人中心):bindStart 拿授权 URL 跳转 → 同一回调把外部身份绑到当前用户;bindings 查、unbind 解绑。\nexport const externalAuthApi = {\n /** 登录页可用的外部登录方式(启用的);空数组 = 不显 SSO 区。 */\n providers: () =>\n client.GET('/api/v1/auth/external/providers', {}).then(r => unwrap<ExternalProvider[]>(r)),\n /** 管理端全量列表(含已禁用);系统配置「第三方登录」Tab。 */\n providersAll: () =>\n client\n .GET('/api/v1/auth/external/providers/all', {})\n .then(r => unwrap<ExternalProviderAdmin[]>(r)),\n /** 发起某 provider 登录的 URL(顶层浏览器导航,不走 fetch —— 后端 302 跳 IdP)。 */\n authorizeUrl: (code: string) =>\n `${runtime.apiBase}/api/v1/auth/external/${encodeURIComponent(code)}/authorize`,\n /** 一次性票据换令牌(登录回调后);票据无效/过期/已用抛 40014。 */\n exchange: (ticket: string) =>\n client\n .POST('/api/v1/auth/external/exchange', { body: { ticket } })\n .then(r => unwrap<LoginOutput>(r)),\n /** 认领未绑定 SSO 的 pending-link(账密登录后);票据无效 40014,已被他人绑 40017。 */\n claimPendingLink: (pendingLink: string) =>\n client\n .POST('/api/v1/auth/external/pending-link/claim', { body: { pendingLink } })\n .then(r => unwrap<boolean>(r)),\n /** 我的外部账号绑定列表(个人中心)。 */\n bindings: () =>\n client.GET('/api/v1/auth/external/bindings', {}).then(r => unwrap<ExternalBinding[]>(r)),\n /** 发起绑定:返回授权 URL,前端跳转开始 OAuth 往返(回调把身份绑到当前用户)。 */\n bindStart: (code: string) =>\n client\n .POST('/api/v1/auth/external/{provider}/bind', { params: { path: { provider: code } } })\n .then(r => unwrap<{ authorizeUrl: string }>(r)),\n /** 解绑某 provider 的外部账号。 */\n unbind: (code: string) =>\n client\n .DELETE('/api/v1/auth/external/{provider}/binding', { params: { path: { provider: code } } })\n .then(r => unwrap<boolean>(r)),\n /** 管理端:类型目录 + 全部 provider 的配置状态(机密只回 hasValue 与尾四位)。「登录方式」页。 */\n catalog: () =>\n client.GET('/api/v1/sys/external-auth/providers', {}).then(r => unwrap<ExternalAuthCatalog>(r)),\n /** 新增或更新一条配置;机密留空 = 不改。需重新验证身份。 */\n saveProvider: (code: string, body: ExternalAuthProviderSaveInput) =>\n client\n .PUT('/api/v1/sys/external-auth/providers/{code}', { params: { path: { code } }, body })\n .then(r => unwrap<boolean>(r)),\n /** 清除配置(软删,不动用户已绑定的外部账号)。需重新验证身份。 */\n removeProvider: (code: string) =>\n client\n .DELETE('/api/v1/sys/external-auth/providers/{code}', { params: { path: { code } } })\n .then(r => unwrap<boolean>(r)),\n /** 连接测试:用表单里的值,机密留空取已保存的;不落库,失败原因在 checks 里。 */\n testProvider: (body: ExternalAuthProviderTestInput) =>\n client\n .POST('/api/v1/sys/external-auth/providers/test', { body })\n .then(r => unwrap<ExternalAuthTestResult>(r)),\n}\n\nexport type ExternalAuthCatalog = components['schemas']['ExternalAuthCatalogOutput']\nexport type ExternalAuthType = components['schemas']['ExternalAuthTypeView']\nexport type ExternalAuthField = components['schemas']['ExternalAuthFieldView']\nexport type ExternalAuthProvider = components['schemas']['ExternalAuthProviderView']\nexport type ExternalAuthProviderSaveInput = components['schemas']['ExternalAuthProviderSaveInput']\nexport type ExternalAuthProviderTestInput = components['schemas']['ExternalAuthProviderTestInput']\nexport type ExternalAuthTestResult = components['schemas']['ExternalAuthTestView']\nexport type ExternalAuthCheck = components['schemas']['ExternalAuthCheckView']\n\nexport const dashboardApi = {\n /** 工作台首页统计([ActiveSession]:任何登录用户可取,无需权限码)。 */\n summary: () => client.GET('/api/v1/dashboard/summary', {}).then(r => unwrap<DashboardSummary>(r)),\n}\n\nexport const personalApi = {\n modules: () => client.GET('/api/v1/personal/modules', {}).then(r => unwrap<MyModulesOutput>(r)),\n menu: (moduleId: number) =>\n client\n .GET('/api/v1/personal/menu', { params: { query: { moduleId } } })\n .then(r => unwrap<MenuNode[]>(r)),\n setDefaultModule: (moduleId: number) =>\n client\n .PUT('/api/v1/personal/default-module', { body: { moduleId } })\n .then(r => unwrap<boolean>(r)),\n profile: () => client.GET('/api/v1/personal/profile', {}).then(r => unwrap<UserProfile>(r)),\n /** 改自己的资料(全量替换语义:缺字段即置空,前端整表单提交)。 */\n updateProfile: (body: {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n }) => client.PUT('/api/v1/personal/profile', { body }).then(r => unwrap<boolean>(r)),\n /** 我的活跃会话列表(个人视角;isCurrent = 本次请求所用会话)。 */\n sessions: () => client.GET('/api/v1/personal/sessions', {}).then(r => unwrap<MySessionItem[]>(r)),\n /** 下线自己的某个会话;他人的/不存在的一律 42024(不区分,防探测)。 */\n kickSession: (sessionId: string) =>\n client\n .DELETE('/api/v1/personal/sessions/{sessionId}', { params: { path: { sessionId } } })\n .then(r => unwrap<boolean>(r)),\n updatePassword: (body: { oldPassword: string; newPassword: string }) =>\n client.PUT('/api/v1/personal/password', { body }).then(r => unwrap<boolean>(r)),\n /** 当前用户权限码集合(= 规范化路由);喂给 authStore.permissionCodes 驱动 v-auth。超管返回空集。 */\n permissions: () => client.GET('/api/v1/personal/permissions', {}).then(r => unwrap<string[]>(r)),\n /** 上一次成功登录的信息(排除本次);首次登录返回 null。 */\n lastLogin: () =>\n client.GET('/api/v1/personal/last-login', {}).then(r => unwrap<LastLoginInfo | null>(r)),\n /** 工作台待办摘要;内核默认恒空,消费方接入真实审批/工单系统后有数据。 */\n workbenchTodo: () =>\n client.GET('/api/v1/personal/workbench/todo', {}).then(r => unwrap<WorkbenchTodoSummary>(r)),\n /** 工作台快捷方式(置顶优先 + 高频自动补位,已按此排好序)。 */\n shortcuts: () =>\n client.GET('/api/v1/personal/shortcuts', {}).then(r => unwrap<UserShortcutItem[]>(r)),\n /** 置顶一个快捷方式(幂等)。 */\n pinShortcut: (menuPath: string) =>\n client\n .PUT('/api/v1/personal/shortcuts/pin', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n /** 取消置顶(幂等)。 */\n unpinShortcut: (menuPath: string) =>\n client\n .PUT('/api/v1/personal/shortcuts/unpin', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n /** 记一次快捷方式访问(高频自动补位用);失败静默,不是用户能感知的操作。 */\n recordShortcutVisit: (menuPath: string) =>\n client\n .POST('/api/v1/personal/shortcuts/visit', { body: { menuPath } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 用户管理:CRUD + 启停 / 重置密码 + xlsx 导入导出。\nexport const userApi = {\n /** 归一后端 PagedList<UserItem>({current,size,total,items}) → SmartTable fetcher 契约的 {items,total}。 */\n page: (params: {\n page: number\n pageSize: number\n account?: string\n name?: string\n orgId?: number\n roleId?: number\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/user/page', {\n // 查询参数名沿用后端 record 属性(PascalCase);ASP.NET 绑定大小写不敏感,类型要求 PascalCase。\n // roleId:角色反查(「这个角色有哪些人」/ 删角色前报人数)复用本端点,不另开接口。\n // sortField/sortOrder:SmartTable 排序;后端按实体列白名单校验(非法忽略回退默认),见 PagedListExtensions.OrderBySafe。\n params: {\n query: {\n ...pageParams(params),\n Account: params.account,\n Name: params.name,\n OrgId: params.orgId,\n RoleId: params.roleId,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<UserItem>(r)),\n /**\n * 选择器数据源(仅启用用户,只回 id / 姓名 / 账号):不占用户页权限码,没有「用户-查询」的角色也能选人。\n * keyword 同时匹配姓名与账号;范围同 page。人员选择器一律走它,不走 page。\n */\n options: (params: { page: number; pageSize: number; keyword?: string; orgId?: number }) =>\n client\n .GET('/api/v1/sys/user/options', {\n params: {\n query: { ...pageParams(params), Keyword: params.keyword, OrgId: params.orgId },\n },\n })\n .then(r => toPage<UserOption>(r)),\n /** 用户详情(含 roleIds,编辑回显 + 提交时原样带回避免清空角色)。 */\n detail: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}', { params: { path: { id } } })\n .then(r => unwrap<UserDetail>(r)),\n /** 新增用户;返回新 Id + 实际生效的初始口令(留空 password 时后端随机生成,不接住就没人知道这个号的密码)。 */\n add: (body: AddUserInput) =>\n client.POST('/api/v1/sys/user', { body }).then(r => unwrap<AddUserOutput>(r)),\n update: (id: number, body: UpdateUserInput) =>\n client\n .PUT('/api/v1/sys/user/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/user/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量软删除;集合含超管后端整体拒绝(SuperAdminProtected)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/user/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 重置密码;返回实际生效的初始密码(newPassword 留空 = 后端默认初始密码)。 */\n resetPassword: (id: number, newPassword?: string | null) =>\n client\n .PUT('/api/v1/sys/user/{id}/password', {\n params: { path: { id } },\n body: { newPassword: newPassword || null },\n })\n .then(r => unwrap<string>(r)),\n /** 专用启停端点(非全量 update)。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/user/{id}/enabled', { params: { path: { id } }, body: { enabled } })\n .then(r => unwrap<boolean>(r)),\n\n // ── 单独授权 ──\n\n /** 某用户的单独授权记录(授权菜单弹窗回显)。 */\n getMenuGrants: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}/menus', { params: { path: { id } } })\n .then(r => unwrap<UserMenuGrantItem[]>(r)),\n /** 某用户的有效权限与来源:能否授、能否编辑及原因、委派最长天数、模块清单,一次取齐。 */\n getEffectiveMenus: (id: number) =>\n client\n .GET('/api/v1/sys/user/{id}/menus/effective', { params: { path: { id } } })\n .then(r => unwrap<UserMenuEffective>(r)),\n /** 按变更集保存单独授权:没提到的记录原样保留。 */\n setMenuGrants: (userId: number, upserts: UserMenuGrantUpsert[], removes: number[]) =>\n client\n .PUT('/api/v1/sys/user/menu', { body: { userId, upserts, removes } })\n .then(r => unwrap<boolean>(r)),\n /** 单独授权一览:分页 + 筛选(用户 / 授权人模糊,效果、状态精确)。 */\n menuGrantPage: (params: {\n page: number\n pageSize: number\n user?: string\n grantor?: string\n effect?: UserMenuEffect\n status?: UserMenuGrantStatus\n }) =>\n client\n .GET('/api/v1/sys/user/menu-grants/page', {\n params: {\n query: {\n ...pageParams(params),\n User: params.user,\n Grantor: params.grantor,\n Effect: params.effect,\n Status: params.status,\n },\n },\n })\n .then(r => toPage<UserMenuGrantPageItem>(r)),\n\n // ── 导入 / 导出 ──\n\n /** 下载用户导入模板(xlsx)。[ActiveSession],无需独立权限码。 */\n importTemplate: () =>\n client\n .GET('/api/v1/sys/user/import/template', { parseAs: 'blob' })\n .then(r => unwrapDownload(r)),\n\n /**\n * 上传 xlsx 预览校验。multipart:`file` + 可选 `mapping`(JSON 字符串:表头→列 Key)。\n * bodySerializer 建 FormData(与 fileApi.upload 同型)。\n */\n importPreview: (file: File, mapping?: Record<string, string>) =>\n client\n .POST('/api/v1/sys/user/import/preview', {\n timeout: LONG_TIMEOUT_MS,\n body: {\n file: file as unknown as string,\n mapping: mapping ? JSON.stringify(mapping) : undefined,\n },\n bodySerializer: body => {\n const b = body as unknown as { file: File; mapping?: string }\n const fd = new FormData()\n fd.append('file', b.file)\n if (b.mapping) fd.append('mapping', b.mapping)\n return fd\n },\n })\n .then(r => normalizePreview(unwrap<ImportPreview>(r))),\n\n /** 对前端改过的行重新校验(不碰文件)。 */\n importValidate: (rows: ImportRow[]) =>\n client\n .POST('/api/v1/sys/user/import/validate', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows) },\n })\n .then(r => normalizePreview(unwrap<ImportPreview>(r))),\n\n /** 下载错误报告 xlsx(原列 +「错误原因」列)。 */\n importErrorReport: (rows: ImportRow[]) =>\n client\n .POST('/api/v1/sys/user/import/error-report', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows) },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n\n /** 按策略提交导入(部分提交:有错行跳过;服务端重校验,不信任前端 Errors)。 */\n importCommit: (rows: ImportRow[], strategy: DuplicateStrategy = 0) =>\n client\n .POST('/api/v1/sys/user/import/commit', {\n timeout: LONG_TIMEOUT_MS,\n body: { rows: toWireRows(rows), strategy },\n })\n .then(r => normalizeCommit(unwrap<ImportCommitResult>(r))),\n\n /**\n * 导出用户 xlsx。筛选条件与列表同源(Account/Name/OrgId/RoleId…)+ `columns` 逗号分隔列 Key。\n * 返回 blob,不进信封。\n */\n export: (params: {\n account?: string\n name?: string\n orgId?: number\n roleId?: number\n enabled?: boolean\n sortField?: string\n sortOrder?: string\n /** 逗号分隔列 Key;缺省 = 档案 DefaultSelected */\n columns?: string\n }) =>\n client\n .GET('/api/v1/sys/user/export', {\n timeout: LONG_TIMEOUT_MS,\n params: {\n query: {\n Account: params.account,\n Name: params.name,\n OrgId: params.orgId,\n RoleId: params.roleId,\n Enabled: params.enabled,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n columns: params.columns,\n },\n },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n}\n\n// 机构管理:树形机构 CRUD + 子树复制,list 平铺返回由前端 buildTree 拼树。\nexport const orgApi = {\n /** 全部机构(平铺,按 Sort、Id 排序)。前端 buildTree 拼树。下拉 / 树表复用。 */\n list: () => client.GET('/api/v1/sys/org/list', {}).then(r => unwrap<SysOrg[]>(r)),\n /** 选择器数据源(平铺 id / parentId / name,范围同 list):不占机构页权限码。机构下拉 / 树选择一律走它,不走 list。 */\n options: () => client.GET('/api/v1/sys/org/options', {}).then(r => unwrap<OrgOption[]>(r)),\n add: (body: OrgInput) =>\n client.POST('/api/v1/sys/org/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: OrgInput) =>\n client\n .PUT('/api/v1/sys/org/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/org/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 复制机构子树(整支克隆挂到源节点同级),返回新根 Id。 */\n copy: (id: number, body?: { name?: string }) =>\n client\n .POST('/api/v1/sys/org/{id}/copy', { params: { path: { id } }, body: body })\n .then(r => unwrap<number>(r)),\n}\n\n// 职位管理:普通 CRUD;岗位与机构无关联。\nexport const positionApi = {\n /** 职位分页;搜索键 name → PascalCase Name;sortField/sortOrder → 后端安全排序。下拉(拉大页)/ SmartTable 复用。 */\n page: (params: {\n page: number\n pageSize: number\n name?: string\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/position/page', {\n params: {\n query: {\n ...pageParams(params),\n Name: params.name,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<SysPosition>(r)),\n /** 选择器数据源(全部职位,按排序,只回 id / name):不占职位页权限码。 */\n options: () =>\n client.GET('/api/v1/sys/position/options', {}).then(r => unwrap<PositionOption[]>(r)),\n add: (body: PositionInput) =>\n client.POST('/api/v1/sys/position/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: PositionInput) =>\n client\n .PUT('/api/v1/sys/position/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/position/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 角色管理:CRUD + 菜单授权 / 数据范围 / 关联用户三块设置。\nexport const roleApi = {\n /** 角色分页;搜索键 name → PascalCase Name。列表用 + 用户/授权页拉一大页当下拉源。 */\n page: (params: { page: number; pageSize: number; name?: string }) =>\n client\n .GET('/api/v1/sys/role/page', {\n params: { query: { ...pageParams(params), Name: params.name } },\n })\n .then(r => toPage<SysRole>(r)),\n /** 选择器数据源(仅启用角色,按排序,只回 id / name):不占角色页权限码。 */\n options: () => client.GET('/api/v1/sys/role/options', {}).then(r => unwrap<RoleOption[]>(r)),\n add: (body: RoleInput) =>\n client.POST('/api/v1/sys/role/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: RoleInput) =>\n client\n .PUT('/api/v1/sys/role/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/role/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除角色(各自级联清关联)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/role/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 某角色当前授予的菜单 Id 集合(授权抽屉回显)。 */\n getMenus: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/menus', { params: { path: { id } } })\n .then(r => unwrap<number[]>(r)),\n /** 全量设置角色授予的菜单(空数组 = 收回全部)。 */\n setMenus: (roleId: number, menuIds: number[]) =>\n client\n .PUT('/api/v1/sys/role/menu', { body: { roleId, menuIds } })\n .then(r => unwrap<boolean>(r)),\n /** 某角色的数据范围配置(未配置返回 null)。 */\n getDataScope: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/datascope', { params: { path: { id } } })\n .then(r => unwrap<SysRoleDataScope | null>(r)),\n /** 设置角色数据范围;customOrgIds 仅 scopeType=Custom(5)时有意义。 */\n setDataScope: (roleId: number, scopeType: DataScopeType, customOrgIds?: number[]) =>\n client\n .PUT('/api/v1/sys/role/datascope', { body: { roleId, scopeType, customOrgIds } })\n .then(r => unwrap<boolean>(r)),\n /** 某角色当前关联的用户 Id 集合(授权用户抽屉回显)。 */\n getUsers: (id: number) =>\n client\n .GET('/api/v1/sys/role/{id}/users', { params: { path: { id } } })\n .then(r => unwrap<number[]>(r)),\n /** 全量设置角色关联的用户(空数组 = 收回全部)。 */\n setUsers: (roleId: number, userIds: number[]) =>\n client\n .PUT('/api/v1/sys/role/users', { body: { roleId, userIds } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 应用(模块)管理:CRUD,门户多应用切换的应用清单来源。\nexport const moduleApi = {\n list: () => client.GET('/api/v1/sys/module/list', {}).then(r => unwrap<ModuleRow[]>(r)),\n add: (body: ModuleInput) =>\n client.POST('/api/v1/sys/module/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: ModuleInput) =>\n client\n .PUT('/api/v1/sys/module/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/module/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 系统配置:key/value 分页 CRUD + 按分组批量取/存(结构化表单用)+ 站点信息 / 密码策略两个匿名可读端点。\nexport const configApi = {\n /** 归一后端 PagedList<SysConfig> → SmartTable {items,total};搜索键 configKey/name/groupCode → PascalCase 查询参。 */\n page: (params: {\n page: number\n pageSize: number\n configKey?: string\n name?: string\n groupCode?: string\n excludedGroupCodes?: string[]\n excludedKeys?: string[]\n }) =>\n client\n .GET('/api/v1/sys/config/page', {\n params: {\n query: {\n ...pageParams(params),\n ConfigKey: params.configKey,\n Name: params.name,\n GroupCode: params.groupCode,\n ExcludedGroupCodes: params.excludedGroupCodes,\n ExcludedKeys: params.excludedKeys,\n },\n },\n })\n .then(r => toPage<SysConfig>(r)),\n add: (body: ConfigInput) =>\n client.POST('/api/v1/sys/config', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: ConfigInput) =>\n client\n .PUT('/api/v1/sys/config/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/config/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /**\n * 取某分组下全部配置(完整行,含 id/key/value),供分类配置中心结构化表单回填。\n * 逐页取全:结构化表单按键回写,漏取的字段会拿默认值把库里的真实值覆盖掉。\n */\n listByGroup: async (group: string) => {\n const all: SysConfig[] = []\n for (let current = 1; ; current++) {\n const page = await client\n .GET('/api/v1/sys/config/page', {\n params: { query: { Current: current, Size: 100, GroupCode: group } },\n })\n .then(r => unwrap<PagedList<SysConfig>>(r))\n all.push(...page.items)\n if (page.items.length === 0 || all.length >= page.total) return all\n }\n },\n /** 批量按键回写配置值(结构化表单保存);仅更新已存在键,未知键后端忽略。 */\n saveBatch: (items: { configKey: string; configValue?: string | null }[]) =>\n client.PUT('/api/v1/sys/config/batch', { body: items }).then(r => unwrap<boolean>(r)),\n /**\n * 上传站点 Logo(只收 PNG/JPG/WEBP、1 MB 以内,不受全局上传白名单约束)。\n * 返回的 viewUrl 是签名直链,写进 sys.site.logo 随批量保存生效。FormData 写法同 fileApi.upload。\n */\n uploadLogo: (file: File) =>\n client\n .POST('/api/v1/sys/config/logo', {\n timeout: LONG_TIMEOUT_MS,\n body: { file: file as unknown as string },\n bodySerializer: body => {\n const fd = new FormData()\n fd.append('file', (body as unknown as { file: File }).file)\n return fd\n },\n })\n .then(r => unwrap<FileUploadOutput>(r)),\n /** 站点信息(匿名可读:站点标题/副标题/版权等品牌展示白名单)。 */\n siteInfo: () =>\n client.GET('/api/v1/sys/config/site', {}).then(r =>\n unwrap<{\n title?: string | null\n subtitle?: string | null\n copyright?: string | null\n copyrightUrl?: string | null\n logo?: string | null\n loginHero?: Record<\n string,\n {\n headline?: string | null\n highlight?: string | null\n features?: string[] | null\n }\n > | null\n showFeatures?: boolean | null\n captchaEnabled?: boolean\n smsLoginEnabled?: boolean\n watermark?: Partial<Record<keyof WatermarkSettings, unknown>> | null\n }>(r),\n ),\n /** 当前生效密码策略(任何登录用户可读);改密页据此展示真实规则清单,免配置读权限。 */\n passwordPolicy: () =>\n client.GET('/api/v1/sys/config/password-policy', {}).then(r =>\n unwrap<{\n minLength: number\n requireUpper: boolean\n requireLower: boolean\n requireDigit: boolean\n requireSpecial: boolean\n }>(r),\n ),\n}\n\n/** 日志端点用的参数名是 StartTime/EndTime;拆分与补 23:59:59 的理由见 dayRange。 */\nfunction splitRange(range?: [string, string] | null) {\n const { start, end } = dayRange(range)\n return { StartTime: start, EndTime: end }\n}\n\n// 日志查询:登录 / 操作 / 异常三类日志各自的分页与清空;操作日志另支持导出 xlsx。\nexport const logApi = {\n /** 登录日志分页;账号模糊 + 成败 + 时间范围。 */\n loginPage: (params: {\n page: number\n pageSize: number\n account?: string\n success?: boolean\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/login/page', {\n params: {\n query: {\n ...pageParams(params),\n Account: params.account,\n Success: params.success,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysLoginLog>(r)),\n /** 清空登录日志(硬删,不可恢复)。 */\n loginClear: () => client.DELETE('/api/v1/sys/log/login', {}).then(r => unwrap<boolean>(r)),\n /** 操作日志分页;操作名模糊 + 成败 + 操作人(精确)+ 接口路径(模糊)+ 时间范围——审计要能答\"谁在什么时候干了什么\"。 */\n opPage: (params: {\n page: number\n pageSize: number\n title?: string\n success?: boolean\n operatorId?: number\n path?: string\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/op/page', {\n params: {\n query: {\n ...pageParams(params),\n Title: params.title,\n Success: params.success,\n OperatorId: params.operatorId,\n Path: params.path,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysOpLog>(r)),\n /** 清空操作日志(硬删,不可恢复)。 */\n opClear: () => client.DELETE('/api/v1/sys/log/op', {}).then(r => unwrap<boolean>(r)),\n /**\n * 导出操作日志 xlsx。筛选与 opPage 同源 + `columns` 逗号分隔列 Key。\n * 返回 blob,不进信封。\n */\n opExport: (params: {\n title?: string\n success?: boolean\n operatorId?: number\n path?: string\n createTime?: [string, string] | null\n columns?: string\n }) =>\n client\n .GET('/api/v1/sys/log/op/export', {\n timeout: LONG_TIMEOUT_MS,\n params: {\n query: {\n Title: params.title,\n Success: params.success,\n OperatorId: params.operatorId,\n Path: params.path,\n ...splitRange(params.createTime),\n columns: params.columns,\n },\n },\n parseAs: 'blob',\n })\n .then(r => unwrapDownload(r)),\n /** 异常日志分页;接口路径模糊 + 异常类型模糊 + 时间范围。 */\n exceptionPage: (params: {\n page: number\n pageSize: number\n path?: string\n exceptionType?: string\n createTime?: [string, string] | null\n }) =>\n client\n .GET('/api/v1/sys/log/exception/page', {\n params: {\n query: {\n ...pageParams(params),\n Path: params.path,\n ExceptionType: params.exceptionType,\n ...splitRange(params.createTime),\n },\n },\n })\n .then(r => toPage<SysExceptionLog>(r)),\n /** 清空异常日志(硬删,不可恢复)。 */\n exceptionClear: () =>\n client.DELETE('/api/v1/sys/log/exception', {}).then(r => unwrap<boolean>(r)),\n}\n\n// 服务器监控:只读运行快照。\nexport const monitorApi = {\n /** 服务器运行快照(CPU/内存/磁盘/运行时;后端含一次约 500ms 的 CPU 采样)。 */\n server: () => client.GET('/api/v1/sys/monitor/server', {}).then(r => unwrap<ServerInfoOutput>(r)),\n}\n\n// 缓存管理:定向失效动作(只清不看——缓存含明文 OTP、键含 PII,故后端无键浏览/取值端点)。flush* 返回被清条数。\nexport const cacheApi = {\n /** 清全部用户的权限/数据范围缓存(返回被清用户数)。 */\n flushAuth: () => client.POST('/api/v1/sys/cache/flush-auth', {}).then(r => unwrap<number>(r)),\n /** 清全部字典项缓存(返回被清字典类型数)。 */\n flushDict: () => client.POST('/api/v1/sys/cache/flush-dict', {}).then(r => unwrap<number>(r)),\n /** 清全部系统配置缓存(返回被清配置项数)。 */\n flushConfig: () => client.POST('/api/v1/sys/cache/flush-config', {}).then(r => unwrap<number>(r)),\n /** 递增门户代际,令所有用户的门户菜单/模块缓存整体失效(返回新代际值)。 */\n rebuildPortal: () =>\n client.POST('/api/v1/sys/cache/rebuild-portal', {}).then(r => unwrap<number>(r)),\n}\n\n// 字典下拉数据源(公开只读):按类型编码取启用项,不含 id;喂 stores/dict 缓存,与 dictAdminApi 的管理端读取不能互换。\nexport const dictApi = {\n /** 按类型编码取字典项(服务端已按 sort 排序)。归一 int64 序列化噪音 → DictItem 投影,供 stores/dict 缓存消费。 */\n items: (typeCode: string) =>\n client\n .GET('/api/v1/sys/dict/items/{typeCode}', { params: { path: { typeCode } } })\n .then(r =>\n unwrap<{ label?: string; value?: string; sort?: number | string; enabled?: boolean }[]>(r),\n )\n .then(list =>\n list.map((i): DictItem => ({\n label: i.label ?? '',\n value: i.value ?? '',\n sort: Number(i.sort ?? 0),\n enabled: i.enabled ?? true,\n })),\n ),\n}\n\n// 字典管理端(受权限保护):类型 + 字典项 CRUD,含停用项、带 id;下拉展示走 dictApi,两者不能互相替代。\nexport const dictAdminApi = {\n /** 字典类型分页;搜索键 code/name → PascalCase Code/Name 查询参。 */\n typePage: (params: { page: number; pageSize: number; code?: string; name?: string }) =>\n client\n .GET('/api/v1/sys/dict/type/page', {\n params: { query: { ...pageParams(params), Code: params.code, Name: params.name } },\n })\n .then(r => toPage<SysDictType>(r)),\n typeAdd: (body: DictTypeInput) =>\n client.POST('/api/v1/sys/dict/type', { body }).then(r => unwrap<number>(r)),\n typeUpdate: (id: number, body: DictTypeInput) =>\n client\n .PUT('/api/v1/sys/dict/type/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n typeRemove: (id: number) =>\n client\n .DELETE('/api/v1/sys/dict/type/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除字典类型(各自级联删项)。 */\n typeBatchRemove: (ids: number[]) =>\n client\n .POST('/api/v1/sys/dict/type/batch-delete', { body: { ids } })\n .then(r => unwrap<boolean>(r)),\n /** 某类型下的字典项(管理端:含停用、带 id;非下拉缓存源)。ponytail: 拉一页 200(应用把 Api:MaxPageSize 调小时也不超限),字典项数量小,真超再分页。 */\n items: (typeCode: string) =>\n client\n .GET('/api/v1/sys/dict/item/page', {\n params: { query: { TypeCode: typeCode, Current: 1, Size: 200 } },\n })\n .then(r => unwrap<PagedList<SysDictItem>>(r))\n .then(p => p.items),\n itemAdd: (body: DictItemInput) =>\n client.POST('/api/v1/sys/dict/item', { body }).then(r => unwrap<number>(r)),\n itemUpdate: (id: number, body: DictItemInput) =>\n client\n .PUT('/api/v1/sys/dict/item/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n itemRemove: (id: number) =>\n client\n .DELETE('/api/v1/sys/dict/item/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除字典项。 */\n itemBatchRemove: (ids: number[]) =>\n client\n .POST('/api/v1/sys/dict/item/batch-delete', { body: { ids } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 文件管理:分页 / 上传 / 下载 / 删除,外加分片断点续传上传一整套。\nexport const fileApi = {\n /** 文件分页;搜索键 originalName → 后端 FileName 模糊过滤。 */\n page: (params: { page: number; pageSize: number; originalName?: string }) =>\n client\n .GET('/api/v1/sys/file/page', {\n params: { query: { ...pageParams(params), FileName: params.originalName } },\n })\n .then(r => toPage<SysFile>(r)),\n /** 上传单个文件:bodySerializer 建 FormData(字段名 file),openapi-fetch 对 FormData 不注入 json header,浏览器自动补 boundary(client.ts 无需改)。 */\n upload: (file: File) =>\n client\n .POST('/api/v1/sys/file/upload', {\n timeout: LONG_TIMEOUT_MS,\n body: { file: file as unknown as string },\n bodySerializer: body => {\n const fd = new FormData()\n fd.append('file', (body as unknown as { file: File }).file)\n return fd\n },\n })\n .then(r => unwrap<FileUploadOutput>(r)),\n /** 下载:parseAs blob 取原始字节(非信封,不套 unwrap);Bearer 由 client 拦截器自动带。 */\n download: (id: number) =>\n client\n .GET('/api/v1/sys/file/{id}/download', {\n timeout: LONG_TIMEOUT_MS,\n params: { path: { id } },\n parseAs: 'blob',\n })\n .then(r => {\n if (!r.response.ok)\n throw new ApiError(r.response.status, undefined, undefined, r.response.statusText)\n return r.data as Blob\n }),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/file/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量软删除文件记录(物理文件保留)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/file/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n // ── 分片 / 断点续传上传 ──\n /** 分片初始化:秒传探测 + 已收分片(断点续传)。 */\n chunkInit: (body: {\n fileHash: string\n fileName: string\n totalSize: number\n chunkCount: number\n }) => client.POST('/api/v1/sys/file/chunk/init', { body }).then(r => unwrap<ChunkInitOutput>(r)),\n /** 上传单个分片(multipart:uploadId + index + chunk),同 upload 用 bodySerializer 建 FormData。 */\n chunkUpload: (uploadId: string, index: number, chunk: Blob) =>\n client\n .POST('/api/v1/sys/file/chunk', {\n timeout: LONG_TIMEOUT_MS,\n body: { uploadId, index, chunk: chunk as unknown as string },\n bodySerializer: body => {\n const b = body as unknown as { uploadId: string; index: number; chunk: Blob }\n const fd = new FormData()\n fd.append('uploadId', b.uploadId)\n fd.append('index', String(b.index))\n fd.append('chunk', b.chunk)\n return fd\n },\n })\n .then(r => unwrap<boolean>(r)),\n /** 完成:触发服务端合并 + 哈希校验 + 三道关 + 落库。 */\n chunkComplete: (body: {\n uploadId: string\n fileHash: string\n fileName: string\n chunkCount: number\n }) =>\n client\n .POST('/api/v1/sys/file/chunk/complete', { timeout: LONG_TIMEOUT_MS, body })\n .then(r => unwrap<FileUploadOutput>(r)),\n}\n\n// 在线会话:只读分页 + 按 sessionId 强制下线。\nexport const sessionApi = {\n /** 在线会话分页(只读)。后端仅支持按 UserId 过滤,这里不带业务搜索。 */\n online: (params: { page: number; pageSize: number }) =>\n client\n .GET('/api/v1/sys/session/online', { params: { query: pageParams(params) } })\n .then(r => toPage<OnlineSessionItem>(r)),\n /** 强制下线:按 sessionId 踢会话。 */\n kick: (sessionId: string) =>\n client\n .DELETE('/api/v1/sys/session/{sessionId}', { params: { path: { sessionId } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 系统通知:管理端发布 / 撤回 + 用户端分页拉取 / 标记已读。\nexport const noticeApi = {\n // ── 管理端 ──\n /** 管理端分页(全量);搜索键 title/type → PascalCase 查询参。 */\n page: (params: { page: number; pageSize: number; title?: string; type?: number }) =>\n client\n .GET('/api/v1/sys/notice/page', {\n params: { query: { ...pageParams(params), Title: params.title, Type: params.type } },\n })\n .then(r => toPage<SysNotice>(r)),\n publish: (body: NoticePublishInput) =>\n client.POST('/api/v1/sys/notice', { body }).then(r => unwrap<number>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/notice/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n // ── 用户端(任何登录用户) ──\n /** 我的通知分页(含已读标记);onlyUnread 供\"未读\"页签用,types 供铃铛页签用。 */\n mine: (params: { page: number; pageSize: number; onlyUnread?: boolean; types?: NoticeType[] }) =>\n client\n .GET('/api/v1/sys/notice/mine', {\n params: {\n query: { ...pageParams(params), OnlyUnread: params.onlyUnread, Types: params.types },\n },\n })\n .then(r => toPage<NoticeMineItem>(r)),\n /** 当前用户未读通知数(顶栏角标轮询);带 types 只数这几种类型。 */\n unreadCount: (types?: NoticeType[]) =>\n client\n .GET('/api/v1/sys/notice/unread-count', { params: { query: { Types: types } } })\n .then(r => unwrap<number>(r)),\n markRead: (id: number) =>\n client\n .PUT('/api/v1/sys/notice/{id}/read', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 全部标为已读;带 types 只标这几种类型。 */\n markAllRead: (types?: NoticeType[]) =>\n client\n .PUT('/api/v1/sys/notice/read-all', { params: { query: { Types: types } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// 菜单管理:菜单树 CRUD + 可授权路由清单(喂菜单表单「权限码」下拉)。\nexport const menuApi = {\n tree: () => client.GET('/api/v1/sys/menu/tree', {}).then(r => unwrap<MenuTreeNode[]>(r)),\n /** 可授权路由清单(后端 EndpointDataSource 实时算出,含消费方自建控制器);喂菜单表单「权限码」下拉,免手敲。 */\n routes: () =>\n client.GET('/api/v1/sys/menu/routes', {}).then(r => unwrap<PermissionRouteItem[]>(r)),\n add: (body: MenuInput) =>\n client.POST('/api/v1/sys/menu/add', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: MenuInput) =>\n client\n .PUT('/api/v1/sys/menu/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/menu/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// ── 定时任务 ──────────────────────────────\n\n// 定时任务:CRUD + 启停 / 手动执行一次 / cron 预览 / 处理器清单,外加执行记录查询、终止与监控仪表盘。\nexport const jobApi = {\n /** 任务分页;搜索键 name/status/handlerKind → PascalCase 查询参。行含全列,编辑表单直接用行数据。 */\n page: (params: {\n page: number\n pageSize: number\n name?: string\n status?: number\n handlerKind?: number\n sortField?: string\n sortOrder?: string\n }) =>\n client\n .GET('/api/v1/sys/job/page', {\n params: {\n query: {\n ...pageParams(params),\n Name: params.name,\n Status: params.status,\n HandlerKind: params.handlerKind,\n SortField: params.sortField,\n SortOrder: params.sortOrder,\n },\n },\n })\n .then(r => toPage<SysJob>(r)),\n add: (body: JobInput) => client.POST('/api/v1/sys/job', { body }).then(r => unwrap<number>(r)),\n update: (id: number, body: JobInput) =>\n client\n .PUT('/api/v1/sys/job/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/job/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 批量删除(命中内置任务后端整批拒绝 47014)。 */\n batchRemove: (ids: number[]) =>\n client.POST('/api/v1/sys/job/batch-delete', { body: { ids } }).then(r => unwrap<boolean>(r)),\n /** 专用启停端点:true=恢复调度并重算下次执行时刻(顺带清连败计数),false=暂停。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/job/{id}/enabled', { params: { path: { id }, query: { enabled } } })\n .then(r => unwrap<boolean>(r)),\n /** 执行一次(收到请求的副本本机执行,不经选主、不影响调度节奏)。 */\n run: (id: number) =>\n client\n .POST('/api/v1/sys/job/{id}/run', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** cron 预览([ActiveSession] 任何登录用户可用;POST 因 cron 含 `? #` 走 query 有转义坑)。 */\n previewCron: (body: { cron: string; count?: number; from?: string | null }) =>\n client.POST('/api/v1/sys/job/preview-cron', { body }).then(r => unwrap<CronPreviewOutput>(r)),\n /** 已注册的编译处理器清单(表单下拉数据源,免手打 HandlerName)。 */\n handlers: () =>\n client.GET('/api/v1/sys/job/handlers', {}).then(r => unwrap<JobHandlersOutput>(r)),\n /**\n * 执行记录分页。startRange 是 SmartTable daterange 的 [开始, 结束] 日期串,\n * 拆成后端 StartFrom/StartTo,结束日补 23:59:59(同 splitRange 的理由,但参数名不同,不复用)。\n */\n logPage: (params: {\n page: number\n pageSize: number\n jobId?: number\n runStatus?: number\n startRange?: [string, string] | null\n fireInstanceId?: number\n }) =>\n client\n .GET('/api/v1/sys/job/log/page', {\n params: {\n query: {\n ...pageParams(params),\n JobId: params.jobId,\n RunStatus: params.runStatus,\n FireInstanceId: params.fireInstanceId,\n StartFrom: params.startRange?.[0] || undefined,\n StartTo: params.startRange?.[1] ? `${params.startRange[1]} 23:59:59` : undefined,\n },\n },\n })\n .then(r => toPage<SysJobLog>(r)),\n /** 终止一次执行(跨节点写终止旗标,目标节点最迟 KillPollSeconds 后停)。 */\n kill: (logId: number) =>\n client\n .POST('/api/v1/sys/job/log/{id}/kill', { params: { path: { id: logId } } })\n .then(r => unwrap<boolean>(r)),\n /** 清空执行记录(硬删;运行中的一律保留),返回删除行数。 */\n logClear: (body: { beforeDays?: number | null; jobId?: number | null }) =>\n client.POST('/api/v1/sys/job/log/clear', { body }).then(r => unwrap<number>(r)),\n /** 监控仪表盘(今日成败/在飞/趋势/即将执行/集群节点)。 */\n dashboard: () => client.GET('/api/v1/sys/job/dashboard', {}).then(r => unwrap<JobDashboard>(r)),\n}\n\n// ── 回收站 ────────────────────────────────────────────────────────\n\nexport interface RecycleBinItem {\n id: number\n name: string\n code: string | null\n deletedAt: string | null\n deletedBy: number | null\n}\n\nexport const recycleApi = {\n page: (type: string) => (params: { page: number; pageSize: number }) =>\n client\n .GET('/api/v1/sys/recycle/{type}/page', {\n params: { path: { type }, query: pageParams(params) },\n })\n .then(r => toPage<RecycleBinItem>(r)),\n restore: (type: string, id: number) =>\n client\n .POST('/api/v1/sys/recycle/{type}/{id}/restore', { params: { path: { type, id } } })\n .then(r => unwrap<boolean>(r)),\n purge: (type: string, id: number) =>\n client\n .DELETE('/api/v1/sys/recycle/{type}/{id}', { params: { path: { type, id } } })\n .then(r => unwrap<boolean>(r)),\n}\n\n// ── AI 管理:厂商/模型 ────────────────────────────────────────────\n\nexport const aiProviderApi = {\n /** 厂商分页(含模型清单);搜索键 keyword/enabled → PascalCase 查询参。 */\n page: (params: { page: number; pageSize: number; keyword?: string; enabled?: boolean }) =>\n client\n .GET('/api/v1/sys/ai/provider/page', {\n params: {\n query: {\n ...pageParams(params),\n Keyword: params.keyword,\n Enabled: params.enabled,\n },\n },\n })\n .then(r => toPage<AiProviderView>(r)),\n get: (id: number) =>\n client\n .GET('/api/v1/sys/ai/provider/{id}', { params: { path: { id } } })\n .then(r => unwrap<AiProviderView>(r)),\n /** 厂商预置清单(协议/BaseUrl/鉴权方式/起步模型),新增抽屉选预设用。 */\n presets: () =>\n client.GET('/api/v1/sys/ai/provider/presets', {}).then(r => unwrap<AiProviderPreset[]>(r)),\n add: (body: AiProviderAddInput) =>\n client.POST('/api/v1/sys/ai/provider/add', { body }).then(r => unwrap<number>(r)),\n /** 更新入参没有 preset/protocol 字段——这两项创建后不可改,类型层面就不给改的机会。 */\n update: (id: number, body: AiProviderUpdateInput) =>\n client\n .PUT('/api/v1/sys/ai/provider/{id}', { params: { path: { id } }, body })\n .then(r => unwrap<boolean>(r)),\n /** 启用时若未配置 Key 会被后端拒绝(49004),调用方按 StatusSwitch 模式处理失败回弹。 */\n setEnabled: (id: number, enabled: boolean) =>\n client\n .PUT('/api/v1/sys/ai/provider/{id}/enabled', { params: { path: { id }, query: { enabled } } })\n .then(r => unwrap<boolean>(r)),\n remove: (id: number) =>\n client\n .DELETE('/api/v1/sys/ai/provider/{id}', { params: { path: { id } } })\n .then(r => unwrap<boolean>(r)),\n /** 测试连接:用库里当前配置发一条最小对话;失败原因在返回体里,不抛异常。 */\n test: (id: number) =>\n client\n .POST('/api/v1/sys/ai/provider/{id}/test', { params: { path: { id } } })\n .then(r => unwrap<AiTestResult>(r)),\n}\n\n// ── AI 管理:用量统计 ────────────────────────────────────────────\n\ninterface AiUsageFilter {\n from: string\n to: string\n providerCode?: string\n model?: string\n scene?: string\n userId?: number\n}\n\nexport const aiUsageApi = {\n /** 区间总计 + 按维度分组聚合(groupBy 切换四个 Tab 共用这一个接口)。 */\n summary: (params: AiUsageFilter & { groupBy: AiUsageGroupBy }) =>\n client\n .GET('/api/v1/sys/ai/usage/summary', {\n params: {\n query: {\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n GroupBy: params.groupBy,\n },\n },\n })\n .then(r => unwrap<AiUsageSummary>(r)),\n /** 按天趋势;区间内无数据的日期后端已补 0,前端直接画连续折线。 */\n trend: (params: AiUsageFilter) =>\n client\n .GET('/api/v1/sys/ai/usage/trend', {\n params: {\n query: {\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n },\n },\n })\n .then(r => unwrap<AiUsageTrendPoint[]>(r)),\n /** 明细分页(不聚合);from/to 在这里是可选的(不筛日期就是全量分页)。 */\n page: (\n params: Omit<AiUsageFilter, 'from' | 'to'> & {\n page: number\n pageSize: number\n from?: string\n to?: string\n success?: boolean\n },\n ) =>\n client\n .GET('/api/v1/sys/ai/usage/page', {\n params: {\n query: {\n ...pageParams(params),\n From: params.from,\n To: params.to,\n ProviderCode: params.providerCode,\n Model: params.model,\n Scene: params.scene,\n UserId: params.userId,\n Success: params.success,\n },\n },\n })\n .then(r => toPage<SysAiUsageLog>(r)),\n}\n"],"names":["ApiError","code","msgKey","args","message","__publicField","unwrap","res","data","error","response","env","pd","callApi","method","url","body","request","client","r","pageParams","p","listQuery","dayRange","range","toPage","unwrapDownload","blob","ct","normalizePreview","raw","c","normalizeRow","e","normalizeCommit","toWireRows","rows","cells","k","v","authApi","mfaApi","highSensApi","id","externalAuthApi","runtime","ticket","pendingLink","dashboardApi","personalApi","moduleId","sessionId","menuPath","userApi","params","ids","newPassword","enabled","userId","upserts","removes","file","mapping","LONG_TIMEOUT_MS","b","fd","strategy","orgApi","positionApi","roleApi","roleId","menuIds","scopeType","customOrgIds","userIds","moduleApi","configApi","group","all","current","page","items","splitRange","start","end","logApi","monitorApi","cacheApi","dictApi","typeCode","list","dictAdminApi","fileApi","uploadId","index","chunk","sessionApi","noticeApi","types","menuApi","jobApi","_a","_b","logId","recycleApi","type","aiProviderApi","aiUsageApi"],"mappings":"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"}
|