UX 缺陷修复: - 校验失败不再卡死弹窗按钮(Users/Roles/Bills) - 押金收取/批量收取/添加分期防重复提交;切换房型重置勾选 - AI 表单/批量确认不再出现"假成功" - Dashboard 各数据模块独立加载,单接口失败不再整页清零 - 房间可视化加载失败显示错误态而非永久转圈 - 学生编辑表单回填前重置,避免字段残留污染 - 覆盖式导入增加二次确认;恢复默认考勤时段确认并同步表单 - 金数据匹配关闭前确认,同步中禁止误关 体验提升: - 新增统一 QueryErrorState/QueryEmpty,20+ 页面加载失败显示错误态与重试 - 全局 ErrorBoundary + RouteKeeper 逐页兜底 - 新增 usePageVisible/useVisibleRefetch,保活页面切回自动刷新数据 - 新增首次登录角色引导 RoleTour 与业务闭环 NextStepHint 引导卡 - 重构 A2UI:useSubmissionState/useXCardSurface 收敛状态与命令生命周期, ArtifactErrorBoundary 渲染降级,图表空数据占位 - AI 助手欢迎语与建议话术按角色定制,会话列表空态引导 - 更新 a2ui-contract.md 契约文档说明实现现状
70 lines
2.9 KiB
TypeScript
70 lines
2.9 KiB
TypeScript
import { getRoleDomains } from '../../auth/menu-policy';
|
|
|
|
/**
|
|
* 按用户角色生成 AI 助手欢迎语,引导用户使用与其岗位匹配的业务闭环。
|
|
* 优先级:教师 > 住宿运营 > 教务 > 教室运营 > 系统/超管 > 兜底。
|
|
*/
|
|
export function welcomeDescription(roles: readonly string[], permissions: readonly string[]): string {
|
|
const domains = getRoleDomains(roles, permissions);
|
|
|
|
if (domains.has('teacher')) {
|
|
return '我可以帮你查询今日课程、拉取钉钉考勤、查看排课。课程开始后就能看到打卡结果。';
|
|
}
|
|
if (domains.has('accommodation')) {
|
|
return '我可以帮你完成「宿舍档案 → 学生 → 入住 → 费用 → 账单」的住宿计费闭环,先告诉我你手头有什么数据。';
|
|
}
|
|
if (domains.has('academic')) {
|
|
return '我可以帮你完成「学生档案 → 分班 → 排课 → 考勤」的教学闭环,支持 Excel 批量导入与预览确认。';
|
|
}
|
|
if (domains.has('classroom')) {
|
|
return '我可以帮你管理教室排期与租赁订单,查询占用情况,避免时间冲突。';
|
|
}
|
|
if (domains.has('system') || domains.has('super')) {
|
|
return '我是恭学 AI 助手。我可以查询经营数据、管理业务数据、生成批量导入预览——所有写操作都会先经你确认。';
|
|
}
|
|
return '我会在你的权限范围内查询数据,也能通过表单帮你录入学生等业务信息。';
|
|
}
|
|
|
|
/**
|
|
* 与角色匹配的业务闭环引导示例(用于 Prompts 建议话术)。
|
|
* 返回空数组表示当前角色无匹配示例。
|
|
*/
|
|
export function workflowPromptExamples(
|
|
roles: readonly string[],
|
|
permissions: readonly string[],
|
|
): { label: string; description: string }[] {
|
|
const domains = getRoleDomains(roles, permissions);
|
|
const examples: { label: string; description: string }[] = [];
|
|
|
|
if (domains.has('academic')) {
|
|
examples.push(
|
|
{ label: '帮我从 Excel 导入学生并完成分班', description: '教学闭环' },
|
|
{ label: '查一下这周有哪些班级还没排课', description: '教学闭环' },
|
|
);
|
|
}
|
|
if (domains.has('accommodation')) {
|
|
examples.push(
|
|
{ label: '帮我从 Excel 导入学生并安排入住', description: '住宿计费闭环' },
|
|
{ label: '查一下本月还没生成账单的入住学生', description: '住宿计费闭环' },
|
|
);
|
|
}
|
|
if (domains.has('classroom')) {
|
|
examples.push(
|
|
{ label: '查一下这间教室本周的占用情况', description: '教室运营' },
|
|
);
|
|
}
|
|
if (domains.has('teacher')) {
|
|
examples.push(
|
|
{ label: '今天我有哪几节课?', description: '今日教学' },
|
|
);
|
|
}
|
|
if (domains.has('system') || domains.has('super')) {
|
|
examples.push(
|
|
{ label: '看一下本月的经营概览', description: '数据面板' },
|
|
{ label: '帮我梳理宿舍计费的完整流程', description: '业务流程' },
|
|
);
|
|
}
|
|
|
|
return examples;
|
|
}
|