smart-admin-web 10.12.1 → 10.13.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.
Files changed (50) hide show
  1. package/dist/api/index.d.ts +28 -1
  2. package/dist/api/index.js +65 -38
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +769 -3
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/composables/useModule.js +35 -27
  7. package/dist/composables/useModule.js.map +1 -1
  8. package/dist/index.js +250 -249
  9. package/dist/layouts/AppHeader.vue.js +1 -1
  10. package/dist/layouts/AppHeader2.vue.js +306 -292
  11. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  12. package/dist/lib/runtime.js +1 -1
  13. package/dist/locales/en-US.d.ts +49 -1
  14. package/dist/locales/en-US.js +50 -2
  15. package/dist/locales/en-US.js.map +1 -1
  16. package/dist/locales/zh-CN.d.ts +49 -1
  17. package/dist/locales/zh-CN.js +50 -2
  18. package/dist/locales/zh-CN.js.map +1 -1
  19. package/dist/router/index.js +18 -13
  20. package/dist/router/index.js.map +1 -1
  21. package/dist/router/viewRegistry.js +1 -1
  22. package/dist/router/viewRegistry.js.map +1 -1
  23. package/dist/stores/user.d.ts +6 -1
  24. package/dist/stores/user.js.map +1 -1
  25. package/dist/style.css +1 -1
  26. package/dist/types/api.d.ts +59 -0
  27. package/dist/types/api.js.map +1 -1
  28. package/dist/views/dashboard/ShortcutPicker.vue.d.ts +16 -0
  29. package/dist/views/dashboard/ShortcutPicker.vue.js +8 -0
  30. package/dist/views/dashboard/ShortcutPicker.vue.js.map +1 -0
  31. package/dist/views/dashboard/ShortcutPicker2.vue.js +86 -0
  32. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -0
  33. package/dist/views/dashboard/biz.vue.js +2 -2
  34. package/dist/views/dashboard/biz2.vue.js +265 -93
  35. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  36. package/dist/views/dashboard/onlineDuration.d.ts +5 -0
  37. package/dist/views/dashboard/onlineDuration.js +8 -0
  38. package/dist/views/dashboard/onlineDuration.js.map +1 -0
  39. package/dist/views/dashboard/shortcutGroups.d.ts +18 -0
  40. package/dist/views/dashboard/shortcutGroups.js +19 -0
  41. package/dist/views/dashboard/shortcutGroups.js.map +1 -0
  42. package/dist/views/system/tenant/index.vue.d.ts +3 -0
  43. package/dist/views/system/tenant/index.vue.js +8 -0
  44. package/dist/views/system/tenant/index.vue.js.map +1 -0
  45. package/dist/views/system/tenant/index2.vue.js +366 -0
  46. package/dist/views/system/tenant/index2.vue.js.map +1 -0
  47. package/dist/views/system/user/index.vue.js +2 -2
  48. package/dist/views/system/user/index2.vue.js +281 -211
  49. package/dist/views/system/user/index2.vue.js.map +1 -1
  50. package/package.json +1 -1
@@ -1667,6 +1667,108 @@ export interface paths {
1667
1667
  patch?: never;
1668
1668
  trace?: never;
1669
1669
  };
1670
+ "/api/v1/personal/last-login": {
1671
+ parameters: {
1672
+ query?: never;
1673
+ header?: never;
1674
+ path?: never;
1675
+ cookie?: never;
1676
+ };
1677
+ /** 看自己上一次成功登录的信息(排除本次);首次登录返回 null。 */
1678
+ get: operations["Personal_GetLastLogin"];
1679
+ put?: never;
1680
+ post?: never;
1681
+ delete?: never;
1682
+ options?: never;
1683
+ head?: never;
1684
+ patch?: never;
1685
+ trace?: never;
1686
+ };
1687
+ "/api/v1/personal/workbench/todo": {
1688
+ parameters: {
1689
+ query?: never;
1690
+ header?: never;
1691
+ path?: never;
1692
+ cookie?: never;
1693
+ };
1694
+ /** 看自己的工作台待办摘要。内核默认恒空,消费方接入真实审批/工单系统后有数据。 */
1695
+ get: operations["Personal_GetWorkbenchTodo"];
1696
+ put?: never;
1697
+ post?: never;
1698
+ delete?: never;
1699
+ options?: never;
1700
+ head?: never;
1701
+ patch?: never;
1702
+ trace?: never;
1703
+ };
1704
+ "/api/v1/personal/shortcuts": {
1705
+ parameters: {
1706
+ query?: never;
1707
+ header?: never;
1708
+ path?: never;
1709
+ cookie?: never;
1710
+ };
1711
+ /** 看自己的工作台快捷方式(置顶优先 + 高频自动补位)。 */
1712
+ get: operations["Personal_GetShortcuts"];
1713
+ put?: never;
1714
+ post?: never;
1715
+ delete?: never;
1716
+ options?: never;
1717
+ head?: never;
1718
+ patch?: never;
1719
+ trace?: never;
1720
+ };
1721
+ "/api/v1/personal/shortcuts/pin": {
1722
+ parameters: {
1723
+ query?: never;
1724
+ header?: never;
1725
+ path?: never;
1726
+ cookie?: never;
1727
+ };
1728
+ get?: never;
1729
+ /** 置顶一个快捷方式(幂等)。 */
1730
+ put: operations["Personal_PinShortcut"];
1731
+ post?: never;
1732
+ delete?: never;
1733
+ options?: never;
1734
+ head?: never;
1735
+ patch?: never;
1736
+ trace?: never;
1737
+ };
1738
+ "/api/v1/personal/shortcuts/unpin": {
1739
+ parameters: {
1740
+ query?: never;
1741
+ header?: never;
1742
+ path?: never;
1743
+ cookie?: never;
1744
+ };
1745
+ get?: never;
1746
+ /** 取消置顶(幂等)。 */
1747
+ put: operations["Personal_UnpinShortcut"];
1748
+ post?: never;
1749
+ delete?: never;
1750
+ options?: never;
1751
+ head?: never;
1752
+ patch?: never;
1753
+ trace?: never;
1754
+ };
1755
+ "/api/v1/personal/shortcuts/visit": {
1756
+ parameters: {
1757
+ query?: never;
1758
+ header?: never;
1759
+ path?: never;
1760
+ cookie?: never;
1761
+ };
1762
+ get?: never;
1763
+ put?: never;
1764
+ /** 记一次快捷方式访问(高频自动补位用)。前端静默调用,不挂操作日志——每次导航都会打,不是有意义的审计事件。 */
1765
+ post: operations["Personal_RecordShortcutVisit"];
1766
+ delete?: never;
1767
+ options?: never;
1768
+ head?: never;
1769
+ patch?: never;
1770
+ trace?: never;
1771
+ };
1670
1772
  "/api/v1/ping": {
1671
1773
  parameters: {
1672
1774
  query?: never;
@@ -2278,6 +2380,54 @@ export interface paths {
2278
2380
  patch?: never;
2279
2381
  trace?: never;
2280
2382
  };
2383
+ "/api/v1/sys/tenant/page": {
2384
+ parameters: {
2385
+ query?: never;
2386
+ header?: never;
2387
+ path?: never;
2388
+ cookie?: never;
2389
+ };
2390
+ get: operations["Tenant_Page"];
2391
+ put?: never;
2392
+ post?: never;
2393
+ delete?: never;
2394
+ options?: never;
2395
+ head?: never;
2396
+ patch?: never;
2397
+ trace?: never;
2398
+ };
2399
+ "/api/v1/sys/tenant/{id}": {
2400
+ parameters: {
2401
+ query?: never;
2402
+ header?: never;
2403
+ path?: never;
2404
+ cookie?: never;
2405
+ };
2406
+ get: operations["Tenant_Get"];
2407
+ put: operations["Tenant_Update"];
2408
+ post?: never;
2409
+ delete: operations["Tenant_Delete"];
2410
+ options?: never;
2411
+ head?: never;
2412
+ patch?: never;
2413
+ trace?: never;
2414
+ };
2415
+ "/api/v1/sys/tenant/add": {
2416
+ parameters: {
2417
+ query?: never;
2418
+ header?: never;
2419
+ path?: never;
2420
+ cookie?: never;
2421
+ };
2422
+ get?: never;
2423
+ put?: never;
2424
+ post: operations["Tenant_Add"];
2425
+ delete?: never;
2426
+ options?: never;
2427
+ head?: never;
2428
+ patch?: never;
2429
+ trace?: never;
2430
+ };
2281
2431
  "/api/v1/sys/user/page": {
2282
2432
  parameters: {
2283
2433
  query?: never;
@@ -2591,7 +2741,12 @@ export interface components {
2591
2741
  remark: null | string;
2592
2742
  models: components["schemas"]["AiModelInput"][];
2593
2743
  };
2594
- /** @description AI 厂商预置项:协议 / Base URL / 鉴权方式由预设带出,运维只填 Key(见 docs/plans/ai-management.md §6)。 */
2744
+ /**
2745
+ * @description AI 厂商预置项:协议 / Base URL / 鉴权方式由预设带出,运维只填 Key(见 docs/plans/ai-management.md §6)。
2746
+ * bool AiProviderPreset.SupportsJsonSchema 是否支持 OpenAI 的 json_schema 严格结构化输出(`response_format.type == "json_schema"`);
2747
+ * 只对 Protocol == "openai" 的厂商有意义,默认 true。标记为 false 的厂商收到该字段时不会报错,只会静默忽略约束按自由文本
2748
+ * 作答——AiChatClient 据此在请求携带 ResponseSchema 时提前拒绝,不把一个对方读不懂的字段透传过去。
2749
+ */
2595
2750
  AiProviderPreset: {
2596
2751
  code: string;
2597
2752
  name: string;
@@ -2599,6 +2754,8 @@ export interface components {
2599
2754
  baseUrl: string;
2600
2755
  authScheme: string;
2601
2756
  models: components["schemas"]["AiModelPreset"][];
2757
+ /** @default true */
2758
+ supportsJsonSchema: boolean;
2602
2759
  };
2603
2760
  /**
2604
2761
  * @description AI 厂商编辑入参。<b>没有</b>`Preset`/`Protocol` 字段——这两项创建后不可改,入参类型层面就不给改的机会。
@@ -3303,6 +3460,13 @@ export interface components {
3303
3460
  /** Format: date-time */
3304
3461
  nextRunTime: string;
3305
3462
  };
3463
+ /** @description 上一次成功登录的信息(时间/IP/UA)。 */
3464
+ LastLoginOutput: {
3465
+ /** Format: date-time */
3466
+ time?: string;
3467
+ ip?: null | string;
3468
+ userAgent?: null | string;
3469
+ };
3306
3470
  /** @description 登录入参。验证码字段在 `Security:Captcha:Enabled` 关闭时可不传(默认关)。 */
3307
3471
  LoginInput: {
3308
3472
  /** @description 登录账号 */
@@ -4039,6 +4203,34 @@ export interface components {
4039
4203
  /** @description 当前页数据 */
4040
4204
  items?: components["schemas"]["SysRole"][];
4041
4205
  };
4206
+ /**
4207
+ * @description 分页结果模型——所有分页查询的统一返回。ORM 中立(放 Core),
4208
+ * SqlSugar 侧的 `ToPagedListAsync` 扩展负责把查询物化成它。
4209
+ */
4210
+ PagedListOfSysTenant: {
4211
+ /**
4212
+ * Format: int32
4213
+ * @description 当前页码(从 1 起)
4214
+ */
4215
+ current?: number | string;
4216
+ /**
4217
+ * Format: int32
4218
+ * @description 每页条数
4219
+ */
4220
+ size?: number | string;
4221
+ /**
4222
+ * Format: int32
4223
+ * @description 总记录数
4224
+ */
4225
+ total?: number | string;
4226
+ /**
4227
+ * Format: int32
4228
+ * @description 总页数(向上取整;Size 为 0 时为 0)
4229
+ */
4230
+ pages?: number | string;
4231
+ /** @description 当前页数据 */
4232
+ items?: components["schemas"]["SysTenant"][];
4233
+ };
4042
4234
  /**
4043
4235
  * @description 分页结果模型——所有分页查询的统一返回。ORM 中立(放 Core),
4044
4236
  * SqlSugar 侧的 `ToPagedListAsync` 扩展负责把查询物化成它。
@@ -4786,6 +4978,28 @@ export interface components {
4786
4978
  /** @description 业务数据载荷 */
4787
4979
  data?: null | components["schemas"]["SysOrg"][];
4788
4980
  };
4981
+ /**
4982
+ * @description 统一返回模型——所有接口的响应外壳。
4983
+ * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
4984
+ * Message 是后端兜底文案(非浏览器调用方降级用,浏览器端应忽略它);Data 为业务载荷。<example>
4985
+ * 成功:`{ "code": 0, "msgKey": "common.success", "data": {...} }`<br />
4986
+ * 失败:`{ "code": 40001, "msgKey": "error.auth.passwordWrong", "args": {}, "message": "...", "data": null }`</example>
4987
+ */
4988
+ ResultOfIReadOnlyListOfUserShortcutItem: {
4989
+ /**
4990
+ * Format: int32
4991
+ * @description 业务码,0 为成功,其余见 ErrorCode 分段
4992
+ */
4993
+ code?: number | string;
4994
+ /** @description 语义键(前端 i18n 语言包的键),如 `error.auth.passwordWrong` */
4995
+ msgKey?: null | string;
4996
+ /** @description 文案插值参数,与语言包模板占位符对应;无参数时为 null(序列化省略) */
4997
+ args?: null | Record<string, never>;
4998
+ /** @description 兜底文案(仅降级用途,浏览器端一律走 MsgKey 翻译) */
4999
+ message?: null | string;
5000
+ /** @description 业务数据载荷 */
5001
+ data?: null | components["schemas"]["UserShortcutItem"][];
5002
+ };
4789
5003
  /**
4790
5004
  * @description 统一返回模型——所有接口的响应外壳。
4791
5005
  * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
@@ -4828,6 +5042,27 @@ export interface components {
4828
5042
  message?: null | string;
4829
5043
  data?: null | components["schemas"]["JobHandlersOutput"];
4830
5044
  };
5045
+ /**
5046
+ * @description 统一返回模型——所有接口的响应外壳。
5047
+ * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
5048
+ * Message 是后端兜底文案(非浏览器调用方降级用,浏览器端应忽略它);Data 为业务载荷。<example>
5049
+ * 成功:`{ "code": 0, "msgKey": "common.success", "data": {...} }`<br />
5050
+ * 失败:`{ "code": 40001, "msgKey": "error.auth.passwordWrong", "args": {}, "message": "...", "data": null }`</example>
5051
+ */
5052
+ ResultOfLastLoginOutput: {
5053
+ /**
5054
+ * Format: int32
5055
+ * @description 业务码,0 为成功,其余见 ErrorCode 分段
5056
+ */
5057
+ code?: number | string;
5058
+ /** @description 语义键(前端 i18n 语言包的键),如 `error.auth.passwordWrong` */
5059
+ msgKey?: null | string;
5060
+ /** @description 文案插值参数,与语言包模板占位符对应;无参数时为 null(序列化省略) */
5061
+ args?: null | Record<string, never>;
5062
+ /** @description 兜底文案(仅降级用途,浏览器端一律走 MsgKey 翻译) */
5063
+ message?: null | string;
5064
+ data?: null | components["schemas"]["LastLoginOutput"];
5065
+ };
4831
5066
  /**
4832
5067
  * @description 统一返回模型——所有接口的响应外壳。
4833
5068
  * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
@@ -5274,6 +5509,27 @@ export interface components {
5274
5509
  message?: null | string;
5275
5510
  data?: null | components["schemas"]["PagedListOfSysRole"];
5276
5511
  };
5512
+ /**
5513
+ * @description 统一返回模型——所有接口的响应外壳。
5514
+ * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
5515
+ * Message 是后端兜底文案(非浏览器调用方降级用,浏览器端应忽略它);Data 为业务载荷。<example>
5516
+ * 成功:`{ "code": 0, "msgKey": "common.success", "data": {...} }`<br />
5517
+ * 失败:`{ "code": 40001, "msgKey": "error.auth.passwordWrong", "args": {}, "message": "...", "data": null }`</example>
5518
+ */
5519
+ ResultOfPagedListOfSysTenant: {
5520
+ /**
5521
+ * Format: int32
5522
+ * @description 业务码,0 为成功,其余见 ErrorCode 分段
5523
+ */
5524
+ code?: number | string;
5525
+ /** @description 语义键(前端 i18n 语言包的键),如 `error.auth.passwordWrong` */
5526
+ msgKey?: null | string;
5527
+ /** @description 文案插值参数,与语言包模板占位符对应;无参数时为 null(序列化省略) */
5528
+ args?: null | Record<string, never>;
5529
+ /** @description 兜底文案(仅降级用途,浏览器端一律走 MsgKey 翻译) */
5530
+ message?: null | string;
5531
+ data?: null | components["schemas"]["PagedListOfSysTenant"];
5532
+ };
5277
5533
  /**
5278
5534
  * @description 统一返回模型——所有接口的响应外壳。
5279
5535
  * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
@@ -5548,6 +5804,27 @@ export interface components {
5548
5804
  message?: null | string;
5549
5805
  data?: null | components["schemas"]["SysRoleDataScope"];
5550
5806
  };
5807
+ /**
5808
+ * @description 统一返回模型——所有接口的响应外壳。
5809
+ * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
5810
+ * Message 是后端兜底文案(非浏览器调用方降级用,浏览器端应忽略它);Data 为业务载荷。<example>
5811
+ * 成功:`{ "code": 0, "msgKey": "common.success", "data": {...} }`<br />
5812
+ * 失败:`{ "code": 40001, "msgKey": "error.auth.passwordWrong", "args": {}, "message": "...", "data": null }`</example>
5813
+ */
5814
+ ResultOfSysTenant: {
5815
+ /**
5816
+ * Format: int32
5817
+ * @description 业务码,0 为成功,其余见 ErrorCode 分段
5818
+ */
5819
+ code?: number | string;
5820
+ /** @description 语义键(前端 i18n 语言包的键),如 `error.auth.passwordWrong` */
5821
+ msgKey?: null | string;
5822
+ /** @description 文案插值参数,与语言包模板占位符对应;无参数时为 null(序列化省略) */
5823
+ args?: null | Record<string, never>;
5824
+ /** @description 兜底文案(仅降级用途,浏览器端一律走 MsgKey 翻译) */
5825
+ message?: null | string;
5826
+ data?: null | components["schemas"]["SysTenant"];
5827
+ };
5551
5828
  /**
5552
5829
  * @description 统一返回模型——所有接口的响应外壳。
5553
5830
  * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
@@ -5590,6 +5867,27 @@ export interface components {
5590
5867
  message?: null | string;
5591
5868
  data?: null | components["schemas"]["UserProfile"];
5592
5869
  };
5870
+ /**
5871
+ * @description 统一返回模型——所有接口的响应外壳。
5872
+ * 字段分工:Code 给机器判断;MsgKey+Args 给前端 i18n 渲染;
5873
+ * Message 是后端兜底文案(非浏览器调用方降级用,浏览器端应忽略它);Data 为业务载荷。<example>
5874
+ * 成功:`{ "code": 0, "msgKey": "common.success", "data": {...} }`<br />
5875
+ * 失败:`{ "code": 40001, "msgKey": "error.auth.passwordWrong", "args": {}, "message": "...", "data": null }`</example>
5876
+ */
5877
+ ResultOfWorkbenchTodoSummary: {
5878
+ /**
5879
+ * Format: int32
5880
+ * @description 业务码,0 为成功,其余见 ErrorCode 分段
5881
+ */
5882
+ code?: number | string;
5883
+ /** @description 语义键(前端 i18n 语言包的键),如 `error.auth.passwordWrong` */
5884
+ msgKey?: null | string;
5885
+ /** @description 文案插值参数,与语言包模板占位符对应;无参数时为 null(序列化省略) */
5886
+ args?: null | Record<string, never>;
5887
+ /** @description 兜底文案(仅降级用途,浏览器端一律走 MsgKey 翻译) */
5888
+ message?: null | string;
5889
+ data?: null | components["schemas"]["WorkbenchTodoSummary"];
5890
+ };
5593
5891
  /** @description 角色新增/编辑入参(增改共用同一份字段)。 */
5594
5892
  RoleInput: {
5595
5893
  /** @description 角色名称 */
@@ -5706,6 +6004,10 @@ export interface components {
5706
6004
  /** @description 关联的用户 Id 列表(全量替换;空列表 = 收回全部) */
5707
6005
  userIds?: (number | string)[];
5708
6006
  };
6007
+ /** @description 快捷方式操作的请求体——菜单路由 path 本身带斜杠,只能走 body,不能塞进路由段。 */
6008
+ ShortcutMenuPathInput: {
6009
+ menuPath: string;
6010
+ };
5709
6011
  /** @description 站点信息(匿名可读的展示类配置白名单;登录前/无配置读权限的用户也能取)。 */
5710
6012
  SiteInfoOutput: {
5711
6013
  /** @description 站点标题(浏览器标题/登录页展示名) */
@@ -5971,6 +6273,14 @@ export interface components {
5971
6273
  operatorName?: null | string;
5972
6274
  ip?: null | string;
5973
6275
  userAgent?: null | string;
6276
+ /**
6277
+ * Format: int64
6278
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6279
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6280
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6281
+ * 存量行,稳态下不该有活的这类行。
6282
+ */
6283
+ tenantId?: null | number | string;
5974
6284
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
5975
6285
  isDelete?: boolean;
5976
6286
  /**
@@ -6021,6 +6331,14 @@ export interface components {
6021
6331
  sizeBytes?: number | string;
6022
6332
  /** @description 内容 SHA-256(hex,小写);分片上传落库,供「秒传」按内容去重。单文件上传暂不计算(留 null)。 */
6023
6333
  hash?: null | string;
6334
+ /**
6335
+ * Format: int64
6336
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6337
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6338
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6339
+ * 存量行,稳态下不该有活的这类行。
6340
+ */
6341
+ tenantId?: null | number | string;
6024
6342
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6025
6343
  isDelete?: boolean;
6026
6344
  /**
@@ -6208,9 +6526,12 @@ export interface components {
6208
6526
  nodeInstanceId?: string;
6209
6527
  /** @description 跨节点终止旗标:kill 端点置 true,执行侧每 KillPollSeconds 轮询自己这行 */
6210
6528
  killRequested?: boolean;
6211
- /** @description 处理器输出(截 8KB;HTTP 响应体截 Http.MaxResponseLogBytes) */
6529
+ /**
6530
+ * @description 处理器输出;超过 int AdminJobsOptions.MaxMessageChars(字符数,≤0 不限)按「保留开头 + 结尾,截中间」
6531
+ * 截断,断点处留标记(HTTP 响应体截断走独立的 int AdminJobsHttpOptions.MaxResponseLogBytes)。
6532
+ */
6212
6533
  messageText?: null | string;
6213
- /** @description 失败异常信息(截 8KB) */
6534
+ /** @description 失败异常信息;截断规则同 string? SysJobLog.MessageText(共用 int AdminJobsOptions.MaxMessageChars)。 */
6214
6535
  errorText?: null | string;
6215
6536
  /**
6216
6537
  * Format: date-time
@@ -6261,6 +6582,14 @@ export interface components {
6261
6582
  userAgent?: null | string;
6262
6583
  /** @description 用户姓名——非持久化,分页时按 long? SysLoginLog.UserId 批量回填(失败/账号不存在的行为 null,前端回落账号)。 */
6263
6584
  name?: null | string;
6585
+ /**
6586
+ * Format: int64
6587
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6588
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6589
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6590
+ * 存量行,稳态下不该有活的这类行。
6591
+ */
6592
+ tenantId?: null | number | string;
6264
6593
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6265
6594
  isDelete?: boolean;
6266
6595
  /**
@@ -6356,6 +6685,14 @@ export interface components {
6356
6685
  * 可空:旧行 NULL,即"没有动作",不需要迁移。
6357
6686
  */
6358
6687
  actionsJson?: null | string;
6688
+ /**
6689
+ * Format: int64
6690
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6691
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6692
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6693
+ * 存量行,稳态下不该有活的这类行。
6694
+ */
6695
+ tenantId?: null | number | string;
6359
6696
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6360
6697
  isDelete?: boolean;
6361
6698
  /**
@@ -6423,6 +6760,14 @@ export interface components {
6423
6760
  operatorName?: null | string;
6424
6761
  ip?: null | string;
6425
6762
  userAgent?: null | string;
6763
+ /**
6764
+ * Format: int64
6765
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6766
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6767
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6768
+ * 存量行,稳态下不该有活的这类行。
6769
+ */
6770
+ tenantId?: null | number | string;
6426
6771
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6427
6772
  isDelete?: boolean;
6428
6773
  /**
@@ -6469,6 +6814,14 @@ export interface components {
6469
6814
  /** Format: int32 */
6470
6815
  sort?: number | string;
6471
6816
  enabled?: boolean;
6817
+ /**
6818
+ * Format: int64
6819
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6820
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6821
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6822
+ * 存量行,稳态下不该有活的这类行。
6823
+ */
6824
+ tenantId?: null | number | string;
6472
6825
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6473
6826
  isDelete?: boolean;
6474
6827
  /**
@@ -6509,6 +6862,14 @@ export interface components {
6509
6862
  /** Format: int32 */
6510
6863
  sort?: number | string;
6511
6864
  enabled?: boolean;
6865
+ /**
6866
+ * Format: int64
6867
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6868
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6869
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6870
+ * 存量行,稳态下不该有活的这类行。
6871
+ */
6872
+ tenantId?: null | number | string;
6512
6873
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6513
6874
  isDelete?: boolean;
6514
6875
  /**
@@ -6557,6 +6918,14 @@ export interface components {
6557
6918
  * ADD 无 DEFAULT 的 NOT NULL 列(同 bool SysUser.ForceTotp 的成法)。
6558
6919
  */
6559
6920
  isDelegatable?: null | boolean;
6921
+ /**
6922
+ * Format: int64
6923
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6924
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6925
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6926
+ * 存量行,稳态下不该有活的这类行。
6927
+ */
6928
+ tenantId?: null | number | string;
6560
6929
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6561
6930
  isDelete?: boolean;
6562
6931
  /**
@@ -6595,6 +6964,14 @@ export interface components {
6595
6964
  scopeType?: components["schemas"]["DataScopeType"];
6596
6965
  /** @description 自定义机构 Id 列表(逗号分隔),仅 DataScopeType.Custom 时使用。 */
6597
6966
  customOrgIds?: string;
6967
+ /**
6968
+ * Format: int64
6969
+ * @description 所属租户 Id。插入时由审计 AOP 从租户上下文自动填充。为 null <b>不是</b>"不受租户隔离约束"——
6970
+ * 硬化后的过滤器谓词显式要求 `currentUser.TenantId != null`,null 行对任何调用者(含无租户上下文的
6971
+ * 系统调用者)都恒不可见。null 只表示"还没回填":老库升级补列后、`TenantBackfillHook` 尚未处理过的
6972
+ * 存量行,稳态下不该有活的这类行。
6973
+ */
6974
+ tenantId?: null | number | string;
6598
6975
  /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
6599
6976
  isDelete?: boolean;
6600
6977
  /**
@@ -6623,6 +7000,87 @@ export interface components {
6623
7000
  */
6624
7001
  id?: number | string;
6625
7002
  };
7003
+ /**
7004
+ * @description 租户表——隔离边界的根,自己不实现 ITenantScoped(不自我引用)。新表,首次建表可直接 NOT NULL,
7005
+ * 不受"已有表加列必须可空"约束。
7006
+ */
7007
+ SysTenant: {
7008
+ code?: string;
7009
+ name?: string;
7010
+ contactName?: null | string;
7011
+ contactPhone?: null | string;
7012
+ /** Format: date-time */
7013
+ expireTime?: null | string;
7014
+ /** @description 二期预留,一期恒为 Shared;TenantService 对 Standalone 写入一律拒绝。 */
7015
+ isolationMode?: components["schemas"]["TenantIsolationMode"];
7016
+ /** @description 二期预留:对应 SqlSugar ConfigId,只路由消费方业务库连接,不影响内核自身数据。一期恒为空。 */
7017
+ connectionConfigId?: null | string;
7018
+ enabled?: boolean;
7019
+ remark?: null | string;
7020
+ /** @description 软删除标记;`true` 即被全局查询过滤器排除,可经 `RestoreAsync` 恢复。 */
7021
+ isDelete?: boolean;
7022
+ /**
7023
+ * Format: date-time
7024
+ * @description 创建时间;插入时由审计 AOP 自动填充。
7025
+ */
7026
+ createTime?: string;
7027
+ /**
7028
+ * Format: int64
7029
+ * @description 创建人用户 Id;插入时由审计 AOP 从当前登录用户填充,系统写入为 null。
7030
+ */
7031
+ createUserId?: null | number | string;
7032
+ /**
7033
+ * Format: date-time
7034
+ * @description 最后更新时间;每次更新由审计 AOP 自动刷新。
7035
+ */
7036
+ updateTime?: null | string;
7037
+ /**
7038
+ * Format: int64
7039
+ * @description 最后更新人用户 Id;每次更新由审计 AOP 从当前登录用户填充。
7040
+ */
7041
+ updateUserId?: null | number | string;
7042
+ /**
7043
+ * Format: int64
7044
+ * @description 主键(雪花 ID;种子数据可用固定小整数)。插入时为 0 则由审计 AOP 自动生成。
7045
+ */
7046
+ id?: number | string;
7047
+ };
7048
+ /**
7049
+ * @description 租户创建入参:在编辑字段基础上,额外携带该租户第一个管理员账号的凭据——
7050
+ * 新租户必须带着能登录的管理员一起出生,否则平台管理员建完之后没人能进去继续配置。
7051
+ */
7052
+ TenantCreateInput: {
7053
+ adminAccount?: string;
7054
+ adminPassword?: string;
7055
+ code?: string;
7056
+ name?: string;
7057
+ contactName?: null | string;
7058
+ contactPhone?: null | string;
7059
+ /** Format: date-time */
7060
+ expireTime?: null | string;
7061
+ isolationMode?: components["schemas"]["TenantIsolationMode"];
7062
+ enabled?: boolean;
7063
+ remark?: null | string;
7064
+ };
7065
+ /** @description 租户编辑入参(更新用;不含初始管理员字段——那是创建独有的一次性动作)。 */
7066
+ TenantInput: {
7067
+ code?: string;
7068
+ name?: string;
7069
+ contactName?: null | string;
7070
+ contactPhone?: null | string;
7071
+ /** Format: date-time */
7072
+ expireTime?: null | string;
7073
+ isolationMode?: components["schemas"]["TenantIsolationMode"];
7074
+ enabled?: boolean;
7075
+ remark?: null | string;
7076
+ };
7077
+ /**
7078
+ * @description 租户的数据隔离模式。一期只支持 TenantIsolationMode.Shared;TenantIsolationMode.Standalone 是二期"混合模式"的预留值,
7079
+ * 一期 `TenantService` 会拒绝写入(见 `ErrorCode.TenantIsolationModeNotSupported`)。
7080
+ * 二期即便某租户选了 Standalone,内核自身的机构/用户/角色/菜单授权数据仍然留在共享主库,只有消费方
7081
+ * 自己的业务表会路由到独立连接串——对应 SqlSugar 官方"基础信息库 + 业务库"的划分,见设计文档 §8。
7082
+ */
7083
+ TenantIsolationMode: number;
6626
7084
  /** @description 绑定完成入参:挑战 + 当前 Authenticator 动态口令。 */
6627
7085
  TotpBindCompleteInput: {
6628
7086
  /** @description string TotpBindStartOutput.BindChallengeId */
@@ -6791,6 +7249,10 @@ export interface components {
6791
7249
  orgName?: null | string;
6792
7250
  /** @description 职位名称(已删/未分配则为 null) */
6793
7251
  positionName?: null | string;
7252
+ /** Format: int64 */
7253
+ tenantId?: null | number | string;
7254
+ /** @description 所属租户名称(已删则为 null)。前端只读展示,不参与任何切换交互(spec §6.3)。 */
7255
+ tenantName?: null | string;
6794
7256
  nickname?: null | string;
6795
7257
  phone?: null | string;
6796
7258
  email?: null | string;
@@ -6800,6 +7262,26 @@ export interface components {
6800
7262
  avatar?: null | string;
6801
7263
  isSuperAdmin: boolean;
6802
7264
  };
7265
+ UserShortcutItem: {
7266
+ menuPath?: string;
7267
+ pinned?: boolean;
7268
+ title?: string;
7269
+ icon?: null | string;
7270
+ };
7271
+ WorkbenchTodoItem: {
7272
+ /** Format: int64 */
7273
+ id?: number | string;
7274
+ title?: string;
7275
+ description?: null | string;
7276
+ url?: null | string;
7277
+ /** Format: date-time */
7278
+ createTime?: string;
7279
+ };
7280
+ WorkbenchTodoSummary: {
7281
+ /** Format: int32 */
7282
+ totalCount?: number | string;
7283
+ items?: components["schemas"]["WorkbenchTodoItem"][];
7284
+ };
6803
7285
  };
6804
7286
  responses: never;
6805
7287
  parameters: never;
@@ -9695,6 +10177,156 @@ export interface operations {
9695
10177
  };
9696
10178
  };
9697
10179
  };
10180
+ Personal_GetLastLogin: {
10181
+ parameters: {
10182
+ query?: never;
10183
+ header?: never;
10184
+ path?: never;
10185
+ cookie?: never;
10186
+ };
10187
+ requestBody?: never;
10188
+ responses: {
10189
+ /** @description OK */
10190
+ 200: {
10191
+ headers: {
10192
+ [name: string]: unknown;
10193
+ };
10194
+ content: {
10195
+ "text/plain": components["schemas"]["ResultOfLastLoginOutput"];
10196
+ "application/json": components["schemas"]["ResultOfLastLoginOutput"];
10197
+ "text/json": components["schemas"]["ResultOfLastLoginOutput"];
10198
+ };
10199
+ };
10200
+ };
10201
+ };
10202
+ Personal_GetWorkbenchTodo: {
10203
+ parameters: {
10204
+ query?: never;
10205
+ header?: never;
10206
+ path?: never;
10207
+ cookie?: never;
10208
+ };
10209
+ requestBody?: never;
10210
+ responses: {
10211
+ /** @description OK */
10212
+ 200: {
10213
+ headers: {
10214
+ [name: string]: unknown;
10215
+ };
10216
+ content: {
10217
+ "text/plain": components["schemas"]["ResultOfWorkbenchTodoSummary"];
10218
+ "application/json": components["schemas"]["ResultOfWorkbenchTodoSummary"];
10219
+ "text/json": components["schemas"]["ResultOfWorkbenchTodoSummary"];
10220
+ };
10221
+ };
10222
+ };
10223
+ };
10224
+ Personal_GetShortcuts: {
10225
+ parameters: {
10226
+ query?: never;
10227
+ header?: never;
10228
+ path?: never;
10229
+ cookie?: never;
10230
+ };
10231
+ requestBody?: never;
10232
+ responses: {
10233
+ /** @description OK */
10234
+ 200: {
10235
+ headers: {
10236
+ [name: string]: unknown;
10237
+ };
10238
+ content: {
10239
+ "text/plain": components["schemas"]["ResultOfIReadOnlyListOfUserShortcutItem"];
10240
+ "application/json": components["schemas"]["ResultOfIReadOnlyListOfUserShortcutItem"];
10241
+ "text/json": components["schemas"]["ResultOfIReadOnlyListOfUserShortcutItem"];
10242
+ };
10243
+ };
10244
+ };
10245
+ };
10246
+ Personal_PinShortcut: {
10247
+ parameters: {
10248
+ query?: never;
10249
+ header?: never;
10250
+ path?: never;
10251
+ cookie?: never;
10252
+ };
10253
+ requestBody: {
10254
+ content: {
10255
+ "application/json": components["schemas"]["ShortcutMenuPathInput"];
10256
+ "text/json": components["schemas"]["ShortcutMenuPathInput"];
10257
+ "application/*+json": components["schemas"]["ShortcutMenuPathInput"];
10258
+ };
10259
+ };
10260
+ responses: {
10261
+ /** @description OK */
10262
+ 200: {
10263
+ headers: {
10264
+ [name: string]: unknown;
10265
+ };
10266
+ content: {
10267
+ "text/plain": components["schemas"]["ResultOfboolean"];
10268
+ "application/json": components["schemas"]["ResultOfboolean"];
10269
+ "text/json": components["schemas"]["ResultOfboolean"];
10270
+ };
10271
+ };
10272
+ };
10273
+ };
10274
+ Personal_UnpinShortcut: {
10275
+ parameters: {
10276
+ query?: never;
10277
+ header?: never;
10278
+ path?: never;
10279
+ cookie?: never;
10280
+ };
10281
+ requestBody: {
10282
+ content: {
10283
+ "application/json": components["schemas"]["ShortcutMenuPathInput"];
10284
+ "text/json": components["schemas"]["ShortcutMenuPathInput"];
10285
+ "application/*+json": components["schemas"]["ShortcutMenuPathInput"];
10286
+ };
10287
+ };
10288
+ responses: {
10289
+ /** @description OK */
10290
+ 200: {
10291
+ headers: {
10292
+ [name: string]: unknown;
10293
+ };
10294
+ content: {
10295
+ "text/plain": components["schemas"]["ResultOfboolean"];
10296
+ "application/json": components["schemas"]["ResultOfboolean"];
10297
+ "text/json": components["schemas"]["ResultOfboolean"];
10298
+ };
10299
+ };
10300
+ };
10301
+ };
10302
+ Personal_RecordShortcutVisit: {
10303
+ parameters: {
10304
+ query?: never;
10305
+ header?: never;
10306
+ path?: never;
10307
+ cookie?: never;
10308
+ };
10309
+ requestBody: {
10310
+ content: {
10311
+ "application/json": components["schemas"]["ShortcutMenuPathInput"];
10312
+ "text/json": components["schemas"]["ShortcutMenuPathInput"];
10313
+ "application/*+json": components["schemas"]["ShortcutMenuPathInput"];
10314
+ };
10315
+ };
10316
+ responses: {
10317
+ /** @description OK */
10318
+ 200: {
10319
+ headers: {
10320
+ [name: string]: unknown;
10321
+ };
10322
+ content: {
10323
+ "text/plain": components["schemas"]["ResultOfboolean"];
10324
+ "application/json": components["schemas"]["ResultOfboolean"];
10325
+ "text/json": components["schemas"]["ResultOfboolean"];
10326
+ };
10327
+ };
10328
+ };
10329
+ };
9698
10330
  Ping_Ping: {
9699
10331
  parameters: {
9700
10332
  query?: never;
@@ -10755,6 +11387,140 @@ export interface operations {
10755
11387
  };
10756
11388
  };
10757
11389
  };
11390
+ Tenant_Page: {
11391
+ parameters: {
11392
+ query?: {
11393
+ Name?: string;
11394
+ Current?: number | string;
11395
+ Size?: number | string;
11396
+ SortField?: string;
11397
+ SortOrder?: string;
11398
+ };
11399
+ header?: never;
11400
+ path?: never;
11401
+ cookie?: never;
11402
+ };
11403
+ requestBody?: never;
11404
+ responses: {
11405
+ /** @description OK */
11406
+ 200: {
11407
+ headers: {
11408
+ [name: string]: unknown;
11409
+ };
11410
+ content: {
11411
+ "text/plain": components["schemas"]["ResultOfPagedListOfSysTenant"];
11412
+ "application/json": components["schemas"]["ResultOfPagedListOfSysTenant"];
11413
+ "text/json": components["schemas"]["ResultOfPagedListOfSysTenant"];
11414
+ };
11415
+ };
11416
+ };
11417
+ };
11418
+ Tenant_Get: {
11419
+ parameters: {
11420
+ query?: never;
11421
+ header?: never;
11422
+ path: {
11423
+ id: number | string;
11424
+ };
11425
+ cookie?: never;
11426
+ };
11427
+ requestBody?: never;
11428
+ responses: {
11429
+ /** @description OK */
11430
+ 200: {
11431
+ headers: {
11432
+ [name: string]: unknown;
11433
+ };
11434
+ content: {
11435
+ "text/plain": components["schemas"]["ResultOfSysTenant"];
11436
+ "application/json": components["schemas"]["ResultOfSysTenant"];
11437
+ "text/json": components["schemas"]["ResultOfSysTenant"];
11438
+ };
11439
+ };
11440
+ };
11441
+ };
11442
+ Tenant_Update: {
11443
+ parameters: {
11444
+ query?: never;
11445
+ header?: never;
11446
+ path: {
11447
+ id: number | string;
11448
+ };
11449
+ cookie?: never;
11450
+ };
11451
+ requestBody: {
11452
+ content: {
11453
+ "application/json": components["schemas"]["TenantInput"];
11454
+ "text/json": components["schemas"]["TenantInput"];
11455
+ "application/*+json": components["schemas"]["TenantInput"];
11456
+ };
11457
+ };
11458
+ responses: {
11459
+ /** @description OK */
11460
+ 200: {
11461
+ headers: {
11462
+ [name: string]: unknown;
11463
+ };
11464
+ content: {
11465
+ "text/plain": components["schemas"]["ResultOfboolean"];
11466
+ "application/json": components["schemas"]["ResultOfboolean"];
11467
+ "text/json": components["schemas"]["ResultOfboolean"];
11468
+ };
11469
+ };
11470
+ };
11471
+ };
11472
+ Tenant_Delete: {
11473
+ parameters: {
11474
+ query?: never;
11475
+ header?: never;
11476
+ path: {
11477
+ id: number | string;
11478
+ };
11479
+ cookie?: never;
11480
+ };
11481
+ requestBody?: never;
11482
+ responses: {
11483
+ /** @description OK */
11484
+ 200: {
11485
+ headers: {
11486
+ [name: string]: unknown;
11487
+ };
11488
+ content: {
11489
+ "text/plain": components["schemas"]["ResultOfboolean"];
11490
+ "application/json": components["schemas"]["ResultOfboolean"];
11491
+ "text/json": components["schemas"]["ResultOfboolean"];
11492
+ };
11493
+ };
11494
+ };
11495
+ };
11496
+ Tenant_Add: {
11497
+ parameters: {
11498
+ query?: never;
11499
+ header?: never;
11500
+ path?: never;
11501
+ cookie?: never;
11502
+ };
11503
+ requestBody: {
11504
+ content: {
11505
+ "application/json": components["schemas"]["TenantCreateInput"];
11506
+ "text/json": components["schemas"]["TenantCreateInput"];
11507
+ "application/*+json": components["schemas"]["TenantCreateInput"];
11508
+ };
11509
+ };
11510
+ responses: {
11511
+ /** @description OK */
11512
+ 200: {
11513
+ headers: {
11514
+ [name: string]: unknown;
11515
+ };
11516
+ content: {
11517
+ "text/plain": components["schemas"]["ResultOflong"];
11518
+ "application/json": components["schemas"]["ResultOflong"];
11519
+ "text/json": components["schemas"]["ResultOflong"];
11520
+ };
11521
+ };
11522
+ };
11523
+ };
10758
11524
  User_Page: {
10759
11525
  parameters: {
10760
11526
  query?: {