Web 设置与配置 — CUJ 关键用户旅程

Settings, Permissions, RBAC, App Config & Hierarchy | 更新时间: 2026-02-08

TOUCHES (Pages): admin/settings/page.tsx, admin/settings/time-clock/page.tsx, admin/permissions/roles/page.tsx, admin/permissions/job-titles/page.tsx, admin/permissions/audit/page.tsx, admin/sync-config/page.tsx, admin/schedules/page.tsx, admin/developer-settings/page.tsx, admin/terminals/page.tsx, admin/checkin/config/page.tsx, admin/checkin/stats/page.tsx, settings/page.tsx, chat-test/page.tsx, voice-test/page.tsx

TOUCHES (Components): SettingValueInput.tsx, BatchSettingModal.tsx, GuestWelcomeSettings.tsx, BrandingSection.tsx, FeatureTogglesSection.tsx, HomeLayoutEditor.tsx, HeroBannerManager.tsx, EmployeeThemeSettings.tsx, SettingsForm.tsx (TimeClock), SyncTriggerModal.tsx, CategoryManagementModal.tsx, WeeklyTemplateModal.tsx, GenerateScheduleModal.tsx, AutoScheduleConfigPanel.tsx, WelcomeMessageEditor.tsx, PromoConfig.tsx, AddTerminalModal.tsx, UserPreferencesPanel.tsx

TOUCHES (Hooks/Stores): useSettings.ts, useBookingConfig.ts, useCheckinConfig.ts, useScheduleTemplate.ts

TOUCHES (Backend): api/settings.js, api/admin/roles.js, api/admin/job-titles.js, api/admin/job-title-permissions.js, api/admin/audit.js, api/sync-config.js, api/checkin-config.js, api/booking-config.js, api/messaging-config.js, api/time-clock.js (settings endpoints)

目录

CUJ 总览与优先级矩阵

范围界定:本文档仅覆盖"设置与配置"相关功能。 门店/服务 CRUD → CUJ-L · 平台管理/监控/Feature Flag → CUJ-N · 消息推送终端用户体验 → CUJ-I
CUJ优先级描述触发角色业务价值E2E 状态
J1 P0 角色与权限管理 super_admin 安全性 — RBAC 细粒度控制 已覆盖
J2 P0 通用业务设置 admin+ 基础运营 — 时区/货币/税率 已覆盖
J3 P0 预约与预订配置 admin+ 核心流程 — 预约规则定义 已覆盖
J4 P1 打卡系统设置 admin+ 人事管理 — 考勤规则定义 已覆盖
J5 P1 Guest App 品牌与功能配置 admin+ 品牌形象 — 客户端定制 部分覆盖
J6 P1 签到终端配置 admin+ 到店体验 — Kiosk 行为定制 部分覆盖
J7 P2 同步与数据源配置 super_admin 数据管理 — 外部系统集成 未覆盖
J8 P1 排班模板管理 admin+ 效率 — 自动化排班 部分覆盖
J9 P2 审计日志与合规 admin+ 合规 — 操作可追溯 部分覆盖
J10 P2 用户级偏好设置 所有用户 体验 — 个人化定制 未覆盖
J11 P3 开发者工具 platform_superadmin 运维 — 调试/测试工具 未覆盖

设置层级架构

四级设置继承模型

flowchart TD
    P["Platform 平台级"] --> T["Tenant 租户级"]
    T --> S["Store 门店级"]
    S --> U["User 用户级"]

    P -.- P1["系统默认值, 由平台管理员设定"]
    T -.- T1["租户级覆盖, All Stores 作用域"]
    S -.- S1["门店级覆盖, 仅影响单个门店"]
    U -.- U1["用户偏好, 仅影响当前用户"]

    style P fill:#c62828,stroke:#b71c1c,color:#fff
    style T fill:#e65100,stroke:#bf360c,color:#fff
    style S fill:#1565c0,stroke:#0d47a1,color:#fff
    style U fill:#455a64,stroke:#37474f,color:#fff
继承规则:子级未设置时,自动继承父级值。子级显式设置后覆盖父级。 is_overridable: false 的设置只能在 min_scope 及以上级别修改。

设置值类型与 SettingValueInput 组件

value_typeUI 渲染示例设置
string文本输入框business_name, subdomain
number数字输入框 (min/max)tax_rate, advance_booking_days
boolean开关 Togglesms_enabled, auto_assign
enum下拉选择框timezone, currency, date_format
jsonJSON 编辑器 / 专用组件welcome_screens, home_layout
color颜色选择器 (inputType: 'color')theme_primary_color

设置分类总览

类别 (category)关键设置项最低作用域
generaltimezone, currency, tax_rate, tax_included, date_format, time_format, week_starts_on, business_nametenant
bookingadvance_booking_days, cancellation_hours, buffer_minutes, no_show_policy, self_booking, notificationsstore
tipsdefault_commission_rate, distribution_method, job_title_overridesstore
guest_appbranding.*, features.*, welcome.*, home.*, hero_bannerstenant
employee_apptheme.primary_colortenant
time_clockpin_enabled, click_enabled, late_tolerance, early_leave_alert, makeup_max_per_weekstore
checkinwalkin, qr_checkin, phone_checkin, auto_assign, idle_timeout, notification_soundstore
messagingemail_provider (SES/Resend), sms_provider (Twilio/Telnyx), verified_senderstenant

CUJ-J1: 角色与权限管理

P0 安全性 — RBAC 细粒度权限控制

用户流程

flowchart TD
    A["导航到 /admin/permissions"] --> B{"选择子页面"}
    B -->|"角色"| C["/admin/permissions/roles"]
    C --> C1["系统角色列表 + 自定义角色"]
    C1 --> C2{"操作?"}
    C2 -->|"新建"| C3["填写: 名称, 描述, 级别, 作用域"]
    C3 --> C4["按分类勾选权限项"]
    C4 --> C5["保存"]
    C2 -->|"编辑"| C4
    C2 -->|"删除"| C6["确认删除自定义角色"]
    B -->|"职位"| D["/admin/permissions/job-titles"]
    D --> D1["选择门店"]
    D1 --> D2["职位列表: code, display_name, level"]
    D2 --> D3{"操作?"}
    D3 -->|"新建"| D4["填写: code, 名称, 描述, 佣金率, 是否可提供服务"]
    D3 -->|"配置权限"| D5["关联角色到职位"]
    B -->|"审计"| E["/admin/permissions/audit"]

    style C fill:#2196F3,stroke:#1565C0,color:#fff
    style D fill:#4CAF50,stroke:#388E3C,color:#fff
    style E fill:#FF9800,stroke:#F57C00,color:#fff

权限定义结构

权限格式说明示例
resource:action基于资源-动作对appointments:create
分类展示按功能模块分组Appointments, Reports, Employees...
级别view / managereports:view vs reports:manage
作用域global / storeglobal 角色对所有门店生效
系统角色(不可删除): platform_superadmin · super_admin · admin · manager · employee · guest
超级管理员角色自动跳过数据库权限检查。

BDD 场景

场景 J1.1: 创建自定义角色并分配权限

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/permissions/roles
When 点击"新建角色"
  And 填写名称 "Senior Technician", 级别 3, 作用域 "global"
  And 在 Appointments 分类勾选 appointments:create, appointments:update
  And 在 Reports 分类勾选 reports:view
  And 保存
Then 自定义角色出现在角色列表
  And 被分配该角色的员工可以创建预约和查看报表
  And 无法执行 employees:delete 等未授权操作

测试: role-management.spec.ts

场景 J1.2: 权限不足时的访问阻止

Given 用户已登录且无 reports:view 权限(无对应范围 scope)
When 尝试访问 /reports
Then 显示"权限不足"提示页面
  And 侧边栏不渲染 Reports 菜单项

测试: full-flow/07-rbac.spec.ts

场景 J1.3: 职位管理与角色关联

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/permissions/job-titles 选择门店 A
When 创建职位 "Nail Artist", 佣金率 60%, can_provide_service = true
  And 关联 "Senior Technician" 角色
Then 门店 A 的员工可以被分配 "Nail Artist" 职位
  And 分配后自动获得 "Senior Technician" 角色的所有权限

测试: role-management.spec.ts (职位部分)

场景 J1.4: 全量权限切换

Given 用户已登录并拥有对应功能所需权限与范围(scope),编辑某角色的权限
When 点击某个权限分类的 "Full Access" 开关
Then 该分类下所有权限项被勾选
  And 再次点击取消全部

测试: role-management.spec.ts

CUJ-J2: 通用业务设置

P0 基础运营 — 区域化、财务、租户配置

设置页面结构

flowchart TD
    A["导航到 /admin/settings"] --> B["作用域选择器"]
    B -->|"All Stores"| C["租户级设置"]
    B -->|"选择具体门店"| D["门店级设置 (覆盖)"]
    C --> E{"Tab 选择"}
    D --> E
    E -->|"General"| F["区域/财务设置"]
    E -->|"Appointments"| G["→ CUJ-J3"]
    E -->|"Tips"| H["小费配置"]
    E -->|"Guest App"| I["→ CUJ-J5"]
    E -->|"Employee App"| J["Employee 主题"]

    style B fill:#FF9800,stroke:#F57C00,color:#fff
    style F fill:#2196F3,stroke:#1565C0,color:#fff

General Tab 设置项

设置项类型作用域说明
timezoneenumtenant时区 (America/New_York 等)
currencyenumtenant货币 (USD, CNY 等)
tax_ratenumberstore税率百分比 (0-100)
tax_includedbooleanstore价格是否含税
date_formatenumtenant日期格式 (MM/DD/YYYY 等)
time_formatenumtenant12h / 24h
week_starts_onenumtenant周起始日 (Sunday/Monday)
business_namestringtenant企业名称
tenant_subdomainstringtenant租户子域名

Tips Tab 设置项

设置项说明
default_commission_rate门店默认小费佣金率(如 100% = 技师全拿)
distribution_method分配方式
job_title_overrides按职位覆盖佣金率(如 Manager 80%)

BDD 场景

场景 J2.1: 修改租户级区域设置

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/settings,作用域为 "All Stores"
When 在 General tab 将 timezone 改为 "America/Los_Angeles"
  And 将 currency 改为 "USD"
  And 保存
Then 所有门店的时区和货币更新
  And 预约时间显示使用新时区
  And 价格显示使用 $ 符号

测试: settings-hierarchy.spec.ts

场景 J2.2: 门店级税率覆盖

Given 租户级 tax_rate = 8.875%
When 用户选择门店 "Brooklyn Store"
  And 将 tax_rate 改为 8.0%
  And 保存
Then Brooklyn Store 使用 8.0% 税率
  And 其他门店仍使用 8.875%(继承租户级)
  And 该设置项显示"已覆盖"标记

测试: settings-hierarchy.spec.ts

场景 J2.3: 小费佣金按职位覆盖

Given 门店默认小费佣金率为 100%
When 用户在 Tips tab 为 "Manager" 职位设置 80% 佣金率
Then Manager 职位的员工小费按 80% 分配
  And 其他职位仍按 100% 分配

测试: 部分覆盖

CUJ-J3: 预约与预订配置

P0 核心流程 — 预约规则与通知配置

Appointments/Booking Tab 设置项

设置项类型作用域说明
advance_booking_daysnumberstore最多可提前多少天预约
cancellation_hoursnumberstore取消截止时间(提前小时数)
buffer_minutesnumberstore预约间隔缓冲时间
no_show_policyenumstore未到场策略 (none/charge/block)
self_booking_enabledbooleanstore是否允许客户自助预约
sms_notification_enabledbooleanstore短信提醒开关
email_notification_enabledbooleanstore邮件提醒开关
booking_linkstringstore自动生成的预约链接

BDD 场景

场景 J3.1: 配置预约规则

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/settings Appointments tab
When 设置提前预约天数为 30 天
  And 设置取消截止时间为 24 小时
  And 设置缓冲时间为 15 分钟
  And 保存
Then 在线预约只能选择未来 30 天内的日期
  And 客户只能在 24 小时前取消
  And 相邻预约间自动插入 15 分钟缓冲

测试: settings-hierarchy.spec.ts

场景 J3.2: 生成并分享预约链接

Given 用户已登录并拥有对应功能所需权限与范围(scope),在预约配置中启用了自助预约
When 点击"生成预约链接"
Then 系统生成该门店的公开预约 URL
  And 管理员可以复制/分享链接
  And 客户通过链接可以直接进入预约流程

测试: 部分覆盖

场景 J3.3: 门店级预约配置覆盖租户级

Given 租户级取消截止时间为 24 小时
When 用户为 VIP 门店设置取消截止时间为 2 小时
Then VIP 门店客户可在 2 小时前取消
  And 普通门店仍为 24 小时

测试: settings-hierarchy.spec.ts

CUJ-J4: 打卡系统设置

P1 人事管理 — 考勤规则与打卡方式配置

设置页面

路径: /admin/settings/time-clock
组件: SettingsForm (from @/components/TimeClock/SettingsForm)
API: GET/PUT /api/time-clock/settings (tenant) 或 /api/time-clock/settings/:centerId (store)
设置项类型说明
pin_enabledboolean启用 PIN 码打卡
click_enabledboolean启用一键打卡
late_tolerance_minutesnumber迟到容忍时间(分钟)
early_leave_alert_minutesnumber早退提醒阈值(分钟)
reminder_enabledboolean打卡提醒开关
reminder_before_minutesnumber提前多少分钟提醒
makeup_max_per_weeknumber每周补卡上限次数

BDD 场景

场景 J4.1: 配置门店打卡方式

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/settings/time-clock 选择门店 A
When 启用 PIN 码打卡, 禁用一键打卡
  And 设置迟到容忍为 5 分钟
  And 设置每周补卡上限为 2 次
  And 保存
Then 门店 A 员工只能使用 PIN 码打卡
  And 迟到 5 分钟内不标记为迟到
  And 超过 2 次补卡时系统拒绝

测试: time-clock.spec.ts

场景 J4.2: 租户默认 vs 门店覆盖

Given 租户默认: PIN + Click 均启用, 迟到容忍 10 分钟
When 用户仅为门店 B 修改迟到容忍为 0 分钟(严格模式)
Then 门店 B 迟到即标记
  And 其他门店仍使用 10 分钟容忍

测试: time-clock.spec.ts

CUJ-J5: Guest App 品牌与功能配置

P1 品牌形象 — 客户端 App 的外观和功能定制

Guest App Tab 子模块

flowchart TD
    A["Admin Settings → Guest App Tab"] --> B{"子模块"}
    B --> C["Branding 品牌"]
    B --> D["Welcome 欢迎页"]
    B --> E["Features 功能开关"]
    B --> F["Home Layout 首页布局"]
    B --> G["Hero Banner 轮播图"]

    C --> C1["App 名称 / Logo / 主题色"]
    D --> D1["欢迎页媒体轮播管理"]
    E --> E1["价格/技师选择/礼品卡/忠诚度 开关"]
    F --> F1["首页模块排序与显示"]
    G --> G1["首页轮播图 CRUD"]

    style C fill:#C89B3C,stroke:#a67c00,color:#fff
    style D fill:#C89B3C,stroke:#a67c00,color:#fff
    style E fill:#C89B3C,stroke:#a67c00,color:#fff
    style F fill:#C89B3C,stroke:#a67c00,color:#fff
    style G fill:#C89B3C,stroke:#a67c00,color:#fff

BDD 场景

场景 J5.1: 自定义 Guest App 品牌

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/settings Guest App tab → Branding
When 修改 App 名称为 "Luxury Nails"
  And 上传新 Logo
  And 设置主题色为 #C89B3C(金色)
  And 保存
Then Guest App 标题栏显示 "Luxury Nails"
  And 启动画面使用新 Logo
  And App 主题色变为金色

测试: 部分覆盖

场景 J5.2: 管理欢迎页媒体

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 Guest App tab → Welcome
When 上传 3 张欢迎页 GIF/图片
  And 拖拽调整顺序
  And 删除第 2 张
  And 保存
Then Guest App 欢迎页显示 2 张媒体
  And 按新顺序轮播

测试: 未覆盖

场景 J5.3: 控制 Guest App 功能开关

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 Guest App tab → Features
When 关闭"显示价格"开关
  And 关闭"礼品卡"功能
  And 保存
Then Guest App 不显示服务价格
  And Guest App 首页和菜单隐藏礼品卡入口

测试: 未覆盖

CUJ-J6: 签到终端配置

P1 到店体验 — Kiosk 签到行为定制

路径: /admin/checkin/config
API: GET/PUT /api/checkin-config/:store_id
关联: Kiosk App 会读取这些配置 → Kiosk CUJ

BDD 场景

场景 J6.1: 配置签到终端功能

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/checkin/config 选择门店
When 设置欢迎语 (中英双语)
  And 启用 Walk-in 签到, 启用手机号签到
  And 启用自动分配技师, 启用通知声音
  And 设置空闲超时为 60 秒
  And 保存
Then 该门店的 Kiosk 终端使用新配置
  And 空闲 60 秒后自动回到欢迎页

测试: 部分覆盖

场景 J6.2: 配置促销内容

Given 用户已登录并拥有对应功能所需权限与范围(scope),在签到终端配置页
When 在 Promo 区域设置促销图片和文字
Then Kiosk 终端空闲时显示促销内容

测试: 未覆盖

场景 J6.3: 终端设备管理

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/terminals
When 点击"添加终端"
  And 填写终端名称、序列号、型号
  And 保存
Then 新终端出现在列表中
  And 状态为 active

测试: 未覆盖

CUJ-J7: 同步与数据源配置

P2 数据管理 — 外部系统集成同步控制

注意:同步功能是 Zenoti 迁移遗留。随着系统独立性提升 (008-zenoti-independence),此功能将逐步弱化。新租户可能不需要配置同步。

同步配置结构

实体类型方向选项说明
guestsread / write / both / off客户数据同步
appointmentsread / write / both / off预约数据同步
servicesread / write / both / off服务项目同步
employeesread / write / both / off员工数据同步
schedulesread / write / both / off排班数据同步

BDD 场景

场景 J7.1: 调整同步方向

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/sync-config
When 将 guests 同步方向从 "both" 改为 "read"
  And 将 appointments 同步改为 "off"
  And 保存
Then 系统只从外部读取客户数据,不回写
  And 预约数据完全独立,不再同步

测试: 未覆盖

场景 J7.2: 应用预设配置

Given 用户已登录并拥有对应功能所需权限与范围(scope),在同步配置页
When 选择预设 "Independent Mode"(全部 off)
Then 所有实体类型同步方向设为 off
  And 系统完全独立运行

测试: 未覆盖

场景 J7.3: 查看同步队列状态

Given 同步配置页面已加载
When 查看队列状态面板
Then 显示: 待处理数量、失败数量
  And 可以重试失败的同步任务

测试: 未覆盖

CUJ-J8: 排班模板管理

P1 效率 — 模板化排班与自动生成

路径: /admin/schedules
Spec: 026-weekly-schedule-templates
组件: WeeklyTemplateModal, GenerateScheduleModal, AutoScheduleConfigPanel

BDD 场景

场景 J8.1: 创建周排班模板

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/schedules
When 点击"模板管理" → "新建模板"
  And 为每周一至周六设置班次 (9:00-18:00)
  And 周日设为休息
  And 保存为 "Standard Week"
Then 模板保存成功
  And 可在生成排班时选择此模板

测试: 部分覆盖

场景 J8.2: 从模板自动生成排班

Given 已有 "Standard Week" 模板
When 点击"自动生成"
  And 选择员工范围(全部 / 指定门店)
  And 选择日期范围(下周一至周日)
  And 选择模板 "Standard Week"
  And 确认生成
Then 系统为选定员工生成下周排班
  And 排班日历显示新排班
  And 可以手动微调个别排班

测试: 部分覆盖

CUJ-J9: 审计日志与合规

P2 合规 — 权限变更操作追溯

路径: /admin/permissions/audit
API: GET /api/admin/audit/permissions (带筛选参数)

筛选维度

筛选器选项
操作类型 (action)create, update, delete, assign
目标类型 (target_type)role, permission, user_role
操作人文本搜索
时间范围日期区间选择器

BDD 场景

场景 J9.1: 查看权限变更历史

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/permissions/audit
When 筛选操作类型为 "update"
  And 目标类型为 "role"
  And 时间范围为最近 7 天
Then 显示所有角色权限修改记录
  And 每条记录包含: 操作人、动作、详情、时间戳

测试: 部分覆盖

场景 J9.2: 导出审计日志

Given 审计日志列表已加载(有筛选条件)
When 点击"导出 CSV"
Then 下载包含当前筛选结果的 CSV 文件
  And 文件包含: 时间、操作人、动作、目标、详情

测试: 未覆盖

场景 J9.3: 审计统计概览

Given 审计日志页面已加载
When 查看统计面板
Then 显示操作类型分布图
  And 显示最活跃的操作人排名

测试: 未覆盖

CUJ-J10: 用户级偏好设置

P2 体验 — 个人化定制

路径: /settings(注意不是 /admin/settings
Tab: Preferences / Profile / Notifications / Advanced
作用域: 仅影响当前登录用户

BDD 场景

场景 J10.1: 修改个人偏好

Given 任意已登录用户在 /settings
When 在 Preferences tab 修改语言为 "中文"
  And 修改日期格式为 "YYYY-MM-DD"
  And 保存
Then 界面语言切换为中文
  And 日期显示使用新格式
  And 不影响其他用户

测试: 未覆盖

场景 J10.2: 通知偏好设置

Given 用户在 /settings Notifications tab
When 关闭"邮件通知"
  And 保留"短信通知"开启
Then 该用户不再收到邮件通知
  And 仍收到短信通知

测试: 未覆盖

CUJ-J11: 开发者工具

P3 运维 — 调试与测试工具

权限限制:platform_superadmin 可见。包含数据库切换等高危操作。

BDD 场景

场景 J11.1: 数据库环境切换

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /admin/developer-settings
When 查看当前数据库连接信息
  And 点击"测试连接"
Then 显示连接状态 (成功/失败)
  And 显示数据库版本和延迟信息

测试: developer-settings.spec.ts

场景 J11.2: 手动触发数据同步

Given 用户已登录并拥有对应功能所需权限与范围(scope),在开发者设置页
When 在 Employee Sync 区域选择同步模式 "full"
  And 点击"立即同步"
Then 显示同步进度
  And 完成后显示同步结果(新增/更新/跳过/失败数量)

测试: developer-settings.spec.ts

场景 J11.3: AI 聊天/语音测试

Given 用户已登录并拥有对应功能所需权限与范围(scope),在 /chat-test/voice-test
When 选择测试场景并发送消息/发起呼叫
Then AI 助手返回场景对应的回复
  And 显示交互历史和调试信息

测试: 未覆盖

跨模块依赖

本模块 CUJ依赖模块关系描述
J1 权限 CUJ-A (Auth) 认证后根据角色权限渲染侧边栏和路由守卫
J3 预约配置 CUJ-G (Booking) advance_booking_days、cancellation_hours 直接影响在线预约流程
J3 预约配置 CUJ-B (Appointments) buffer_minutes 影响预约时段计算
J4 打卡设置 CUJ-D (Employees) 打卡方式和容忍规则影响员工出勤记录
J5 Guest App Guest App CUJ 品牌/功能开关直接控制 Guest App 行为
J6 签到终端 Kiosk App CUJ checkin-config 控制 Kiosk App 行为
J8 排班模板 CUJ-D (Employees) 模板生成排班影响员工日程和可预约时段
J2 通用设置 CUJ-F (Payments) tax_rate, currency 影响支付计算和发票展示

业务规则

  1. 设置继承:子级未显式设置时,自动继承父级值。User > Store > Tenant > Platform。
  2. 不可覆盖设置:is_overridable: false 的设置只能在 min_scope 或更高级别修改。
  3. 系统角色保护:6 个系统角色(platform_superadmin 到 guest)不可删除、不可修改名称。权限可调整。
  4. 超管自动跳过权限:platform_superadminsuper_adminsuperadmin 自动跳过数据库权限检查。
  5. 权限即时生效:角色权限修改后,所有持有该角色的用户下次请求即生效(无需重新登录)。
  6. 审计不可篡改:审计日志只能查看和导出,不能编辑或删除。
  7. 消息通道降级:messaging-config 中主供应商不可用时,自动切换到备选供应商(SES↔Resend, Twilio↔Telnyx),由熔断器控制。
  8. 同步方向约束:sync-config 变更后,已在队列中的任务不受影响,仅影响新任务。
  9. 门店级打卡独立:每个门店的 time-clock 设置完全独立,不存在全局覆盖。租户级只是默认值。