Files
leaudit-platform-backend/docs/superpowers/plans/2026-05-23-business-entry-ux-optimization.md
2026-05-25 09:50:01 +08:00

653 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 业务入口与业务类型交互优化实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 把当前“入口模块管理 + 文档类型管理 + 规则分组 + 上传”的用户理解成本降下来,让用户按“业务入口、业务大类、业务类型、规则”完成配置,而不是理解 `entry_module_id/type_id/group_id`
**Architecture:** 不改后端核心数据模型,不自动创建业务大类或业务类型。前端做语义重构和交互包装:入口模块页只选择已有业务范围;业务类型管理页负责维护大类/类型;上传页保留两级选择但改成业务语言;规则分组页继续承接规则绑定。
**Tech Stack:** Next.js App Router、React、现有 `Card/Button/FormSelect/Table/Toast` 组件、现有 CSS 变量、FastAPI 现有入口模块/文档类型/规则分组接口、Playwright UI 验收。
---
## 一、设计结论
### 1.1 用户语义
统一使用下面这套用户可理解的语言:
```text
业务入口 = 首页工作台,对应 leaudit_entry_modules
业务大类 = 上传第一步选择,对应一级分组/当前文档类型大类
业务类型 = 上传第二步选择,对应二级分组/运行子类型
规则配置 = 给业务类型绑定规则集
```
前端不再重点暴露这些技术词:
```text
入口模块绑定文档类型
一级分组
二级分组
document_type_id
group_id
entry_module_id
```
技术词可以保留在调试信息、接口字段、开发文档里,但不能作为普通后台用户的主要操作语言。
### 1.2 业务边界
入口模块新建/编辑页只允许选择已有业务范围:
```text
不能在入口模块页自动创建业务大类
不能在入口模块页自动创建业务类型
不能在入口模块页自动创建规则绑定
```
如果用户找不到业务类型,页面只做引导:
```text
未找到需要的业务类型?请先到“业务类型管理”维护。
```
### 1.3 最终操作链路
```text
1. 业务类型管理:维护业务大类和业务类型
2. 业务入口管理:创建入口,选择菜单、租户、业务范围
3. 规则配置:给业务类型绑定规则集
4. 上传页:选择业务大类、业务类型,上传文件
5. 文档列表/评查:按入口、租户、大类、类型过滤和命中规则
```
## 二、UI 风格约束
所有新增 UI 必须和当前系统保持一致:
```text
继续使用现有 Card、Button、FormSelect、Table、Toast
继续使用现有 ant-btn / ant-btn-primary 按钮风格
继续使用绿色主色 #00684a
继续使用 var(--color-primary-text)、var(--color-primary-text-muted)、var(--color-primary-border-soft)、var(--color-primary-surface)
继续使用当前后台页面 24px 外边距、Card 容器、表格、圆角、阴影风格
继续沿用当前入口模块、文档类型、规则分组页面的表单布局
```
禁止:
```text
不要引入新的 UI 框架
不要重做视觉体系
不要大面积渐变、特殊字体、花哨动效
不要把入口模块管理页做成和系统其他管理页不一致的风格
不要改变现有按钮颜色体系
```
## 三、页面信息架构调整
### 3.1 菜单命名
建议调整左侧菜单文案:
```text
文档类型 -> 业务类型
入口模块 -> 业务入口
规则分组 -> 规则配置
```
如果担心一次改名影响用户习惯,可以第一阶段使用过渡文案:
```text
业务类型(原文档类型)
业务入口(原入口模块)
规则配置
```
### 3.2 页面职责
```text
业务入口管理:配置工作台、菜单、租户、业务范围
业务类型管理:维护业务大类和业务类型,不绑定规则集
规则配置:给业务类型绑定规则集
上传文档:选择业务大类和业务类型后上传
```
## 四、入口模块管理 UI 方案
### 4.1 列表页优化
文件:
```text
legal-platform-frontend/app/(audit)/entry-modules/EntryModulesClient.tsx
legal-platform-frontend/styles/pages/entry-modules.css
```
列表页保留现有表格风格,但字段改成业务可读:
```text
入口名称
工作台类型
适用租户
业务范围
功能菜单
状态
操作
```
业务范围列显示摘要:
```text
合同 3 个类型 / 公文 2 个类型
```
如果接口暂时没有业务范围摘要,第一阶段先显示:
```text
已配置业务范围
未配置业务范围
```
操作按钮:
```text
编辑入口
配置业务范围
预览入口
删除/停用
```
权限仍走现有 RBAC
```text
entry_module:list:read
entry_module:create:write
entry_module:update:write
entry_module:delete:delete
entry_module:image:write
```
### 4.2 新建/编辑页改成 4 步向导
文件:
```text
legal-platform-frontend/app/(audit)/entry-modules/new/EntryModuleNewClient.tsx
legal-platform-frontend/styles/pages/entry-modules.css
```
页面顶部增加步骤条:
```text
1 基础信息 -> 2 功能菜单 -> 3 适用租户 -> 4 业务范围
```
步骤条只控制页面分区滚动/显示,不做复杂路由拆分。保存仍然是一个表单整体提交。
#### Step 1 基础信息
字段:
```text
入口名称
入口描述
Logo
跳转入口
```
跳转入口不要直接展示裸路径作为主选项,改成业务文案:
```text
通用文档评查(/documents
内部公文评查(/govdoc/audits
交叉评查(/cross-checking
```
保存时仍提交原 `route_path`
#### Step 2 功能菜单
把菜单模板做成当前系统风格的轻量卡片:
```text
通用文档评查
合同工作台
公文工作台
交叉评查
自定义工作台
```
选中模板后自动带出默认功能。
功能勾选默认折叠为“高级功能设置”,避免用户一进来看到一大堆 checkbox。
高级区域展开后显示现有功能勾选:
```text
首页
文件上传
文档列表
规则管理
规则分组
模板搜索
模板列表
公文列表
公文上传
交叉评查
创建任务
评查任务列表
使用统计
```
#### Step 3 适用租户
保持 checkbox,但分组显示:
```text
公共
PUBLIC
地区租户
云浮
揭阳
梅州
```
提示文案:
```text
未勾选的租户首页不会看到该业务入口。
```
#### Step 4 业务范围
标题:
```text
这个入口可以处理哪些业务?
```
交互:
```text
[ ] 合同
[ ] 建设工程合同
[ ] 买卖合同
[ ] 租赁合同
[ ] 公文
[ ] 请示
[ ] 通知
[ ] 会议纪要
```
规则:
```text
勾选业务大类 = 勾选其下全部业务类型
取消某个业务类型 = 当前入口不包含这个类型
只允许选择已有业务大类和业务类型
不自动创建业务大类和业务类型
```
右侧摘要:
```text
已选择 2 个业务大类,5 个业务类型
上传页将只显示这些业务范围
文档列表将只显示这些业务范围
规则配置将只显示这些业务范围
```
空状态:
```text
暂无可选业务类型
请先到“业务类型管理”维护业务大类和业务类型
[去业务类型管理]
```
### 4.3 业务范围接口策略
第一阶段优先复用现有接口:
```text
GET /api/v3/document-type-roots?entry_module_id=...
GET /api/evaluation-point-groups?entry_module_id=...
GET /api/evaluation-point-groups/by-document-types
```
如果现有接口难以一次返回完整树,再新增轻量聚合接口:
```text
GET /api/entry-modules/{id}/business-scope-options
PUT /api/entry-modules/{id}/business-scope
```
返回结构建议:
```json
{
"roots": [
{
"id": 1,
"name": "合同",
"code": "root.contract",
"selected": true,
"children": [
{
"groupId": 101,
"documentTypeId": 11,
"name": "建设工程合同",
"code": "contract.construction",
"selected": true
}
]
}
]
}
```
保存结构建议:
```json
{
"selectedGroupIds": [101, 102, 201]
}
```
注意:
```text
这里保存的是入口可用业务范围,不创建新业务类型。
```
## 五、业务类型管理 UI 方案
### 5.1 页面改名和说明
文件:
```text
legal-platform-frontend/app/(audit)/document-types/DocumentTypesIndexClient.tsx
legal-platform-frontend/app/(audit)/document-types/new/DocumentTypesNewClient.tsx
legal-platform-frontend/styles/pages/document-types_index.css
legal-platform-frontend/styles/pages/document-types_new.css
```
页面标题:
```text
业务类型管理
```
顶部说明:
```text
这里维护系统可用的业务大类和业务类型。
业务大类用于上传时第一步选择。
业务类型用于上传时第二步选择,并用于绑定规则集。
```
### 5.2 列表页展示
当前表格保留,但列名改成:
```text
编码
业务大类
所属业务入口
业务类型数量
已绑定规则集
状态
操作
```
“一级文档类型”“一级分组”“二级分组”这些词从主表格文案里去掉。
### 5.3 新建/编辑页文案
当前页先只维护业务大类,不让用户误会它会自动创建运行类型。
标题:
```text
新建业务大类
编辑业务大类
```
说明:
```text
业务大类是上传时第一步选择,例如合同、公文、案卷。具体业务类型请在规则配置中维护。
```
如果后续要把业务类型维护也放到这里,需要单独设计二级列表,不和本轮混在一起。
## 六、上传页 UI 方案
文件:
```text
legal-platform-frontend/app/(audit)/files/upload/FilesUploadClient.tsx
legal-platform-frontend/styles/pages/files_upload.css
```
上传页保留两级选择,但统一文案:
```text
业务大类
业务类型
```
选择逻辑:
```text
先按当前入口模块过滤业务大类
选择业务大类后,只显示当前入口允许的业务类型
```
默认规则:
```text
当前入口只有一个业务大类 -> 默认选中并展示提示
当前业务大类只有一个业务类型 -> 默认选中并展示提示
```
提示:
```text
当前业务入口:合同评查
上传文件将归属到所选业务大类和业务类型。
```
提交字段不变:
```text
entryModuleId
typeId
groupId
tenantCode
```
## 七、规则配置页 UI 方案
文件:
```text
legal-platform-frontend/app/(audit)/rule-groups/RuleGroupsClient.tsx
legal-platform-frontend/styles/pages/rule-groups_index.css
```
文案调整:
```text
规则分组 -> 规则配置
一级分组 -> 业务大类
二级分组 -> 业务类型
绑定规则集 -> 配置评查规则
```
操作规则不变:
```text
业务大类不能绑定规则集
业务类型才可以绑定规则集
```
按钮文案:
```text
新增一级分组 -> 新增业务大类
新增二级分组 -> 新增业务类型
绑定规则集 -> 配置规则
```
## 八、实施任务清单
### 8.1 准备和基线
- [x] 执行 `./leaudit.sh status`,确认后端、前端、Worker、Beat 运行。
- [ ] 使用 Playwright 登录 `000/admin06111` 截取当前入口模块、文档类型、上传、规则分组页面现状。
- [ ] 记录当前主要入口 URL`/entry-modules``/entry-modules/new``/document-types``/files/upload``/rule-groups`
### 8.2 入口模块列表页优化
- [x] 修改 `EntryModulesClient.tsx` 页面标题和文案:`入口模块管理` 改为 `业务入口管理`
- [x] 修改列表列名,隐藏或弱化技术字段。
- [x] 增加功能菜单摘要展示,沿用现有 tag/badge 风格。
- [x] 增加业务范围摘要占位,接口未完成前显示 `待配置``已配置`
- [ ] 跑 Playwright 验证列表页没有布局溢出,按钮权限仍正确。
### 8.3 入口模块新建/编辑页 4 步向导
- [x]`EntryModuleNewClient.tsx` 增加步骤条状态。
- [x] 把现有基础字段移动到 `基础信息` 分区。
- [x]`route_path` 下拉改成业务文案 + 路径说明。
- [x] 把菜单模板改成模板卡片,选中后仍更新 `menu_profile/features`
- [x] 把功能勾选移动到 `高级功能设置` 折叠区。
- [x] 把租户勾选拆成 `公共``地区租户` 两组。
- [x] 增加 `业务范围` 分区,先展示只读/占位状态和跳转 `业务类型管理` 按钮。
- [x] 保持提交 payload 字段不变:`name/description/route_path/menu_profile/features/tenants`
- [x] 跑 TypeScript 检查。
- [ ] 跑 Playwright 验证新建、编辑、权限只读、Logo 上传入口不破坏。
### 8.4 业务范围选择器接入
- [x] 新增前端组件 `BusinessScopeSelector`,放在入口模块页面附近,复用现有 checkbox、Card、empty state 风格。
- [x] 优先用现有文档类型/规则分组接口组装业务大类和业务类型树。
- [ ] 如果现有接口不足,补后端聚合接口 `business-scope-options`
- [x] 选择器支持勾选大类自动勾选子类型。
- [x] 选择器支持右侧摘要:大类数、业务类型数。
- [x] 保存时只保存已有业务类型范围,不创建新大类/类型。
- [ ] 跑 Playwright 验证入口编辑页业务范围选择、保存、回显。
### 8.5 业务类型管理文案优化
- [x] 修改 `DocumentTypesIndexClient.tsx` 标题为 `业务大类管理`
- [x] 修改表格列名:业务大类、所属业务入口、业务类型数量、已绑定规则集。
- [x] 修改空状态文案。
- [x] 修改 `DocumentTypesNewClient.tsx` 标题为 `新建业务大类/编辑业务大类`
- [x] 修改说明文案,强调这里维护上传第一步的业务大类。
- [x] 修改 `document-types/page.tsx``document-types/new/page.tsx` metadata,避免浏览器标题继续显示文档类型。
- [x] 修改面包屑 `文档类型管理/新建文档类型``业务大类管理/新建业务大类`
- [x] 修改侧栏 fallback 菜单 `文档类型``业务大类管理`
- [x] 修改上传失败诊断文案中的 `文档类型管理/当前文档类型``业务大类管理/当前业务大类`
- [x] 保持现有创建/编辑接口字段不变。
- [ ] 跑 Playwright 验证新建和编辑页字段仍能保存。
### 8.6 上传页交互文案优化
- [x] 修改上传页选择项文案:`文档类型` 改为 `业务大类`
- [x] 修改子类型选择项文案:`子类型/二级分组` 改为 `业务类型`
- [x] 当前入口只有一个业务大类时自动选中并展示提示。
- [x] 当前业务大类只有一个业务类型时自动选中并展示提示。
- [x] 保持提交字段 `entryModuleId/typeId/groupId/tenantCode` 不变。
- [ ] 跑 Playwright 真实上传表单测试,确认字段落库正确。
### 8.7 规则配置页文案优化
- [x] 修改页面标题:`规则分组` 改为 `规则配置`
- [x] 修改树节点文案:一级分组显示为业务大类,二级分组显示为业务类型。
- [x] 修改按钮文案:新增业务大类、新增业务类型、配置规则。
- [x] 一级节点不显示配置规则入口。
- [x] 二级节点显示配置规则入口。
- [x] 跑 Playwright 验证规则配置页业务文案、业务大类/业务类型行展示和二级配置入口可见。
### 8.8 权限和多租户回归
- [ ] 验证没有 `entry_module:list:read` 不显示业务入口管理菜单。
- [ ] 验证没有 `entry_module:create:write` 不显示新建业务入口按钮。
- [ ] 验证没有 `entry_module:update:write` 编辑页不可保存业务入口。
- [ ] 验证没有 `entry_module:image:write` 不可上传入口 Logo。
- [ ] 验证云浮、揭阳、梅州租户只看到自己或 `PUBLIC` 入口。
### 8.9 最终验收
- [x] `legal-platform-frontend` 下运行 `npx tsc --noEmit --pretty false`
- [x] 运行目标 eslint,要求 `0 error`
- [x] 使用 Playwright 跑入口模块编辑页:业务范围步骤、业务范围摘要、业务大类列表/空状态回显。
- [ ] 使用 Playwright 跑上传页:业务大类、业务类型选择和真实提交。
- [x] 使用 Playwright 跑规则配置页:业务大类/业务类型树、一级不显示配置入口、二级显示配置入口。
- [ ] 更新 `docs/superpowers/plans/2026-05-23-entry-module-menu-profile-multitenant-refactor.md` 执行记录。
### 8.10 执行记录 2026-05-23
- [x] 新增业务入口 UI helper`legal-platform-frontend/lib/business-entry/business-entry-ui.ts`,统一维护工作台入口文案、菜单模板文案、功能菜单摘要。
- [x] 新增单测:`legal-platform-frontend/tests/govdoc-audit/business-entry-ui.test.mts`,覆盖路由业务文案、模板文案、功能摘要。
- [x] 使用 TDD 跑红灯:helper 缺失时测试失败,随后实现 helper 并通过。
- [x] 优化业务入口列表页:标题、说明、列名、工作台入口、工作台类型、业务范围占位、功能菜单摘要改为业务语义。
- [x] 列表页 Logo 预览从 `<img>` 改为 `next/image`,目标 eslint 无 warning。
- [x] 优化业务入口新建/编辑页:增加 `基础信息/功能菜单/适用租户/业务范围` 四步结构。
- [x] 工作台入口下拉改为 `通用文档评查/内部公文评查/交叉评查`,保存仍使用原始 `route_path`
- [x] 菜单模板改为卡片选择,功能勾选移动到 `高级功能设置` 折叠区域。
- [x] 租户选择拆成 `公共``地区租户` 两组。
- [x] 业务范围先做占位和跳转 `业务类型管理`,不自动创建、不保存业务范围,避免破坏现有接口。
- [x] 验证:`node --test --experimental-strip-types tests/govdoc-audit/business-entry-ui.test.mts` 结果 `5 pass / 0 fail`
- [x] 验证:目标 eslint 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 新增业务分类 UI helper`legal-platform-frontend/lib/business-entry/business-taxonomy-ui.ts`,统一维护 `业务大类/业务类型` 标签和上传必填提示。
- [x] 新增单测:`legal-platform-frontend/tests/govdoc-audit/business-taxonomy-ui.test.mts`,覆盖业务大类/业务类型文案。
- [x] 优化业务类型管理列表页:标题、说明、列名、空状态统一为业务语义。
- [x] 优化业务大类新建/编辑页:把 `一级文档类型/入口模块/二级分组/评查点分组` 主文案替换为 `业务大类/业务入口/业务类型/规则配置`
- [x] 优化上传页:选择卡片改为 `选择业务范围`,两级选择改为 `业务大类/业务类型`,错误提示和说明同步改为业务语义。
- [x] 验证:`node --test --experimental-strip-types tests/govdoc-audit/business-taxonomy-ui.test.mts tests/govdoc-audit/business-entry-ui.test.mts` 结果 `7 pass / 0 fail`
- [x] 验证:业务类型管理和上传页目标 eslint 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 优化规则配置页:页面标题、指标卡、说明条、筛选项、业务大类/业务类型树、配置弹窗、删除确认和 toast 统一改成业务语义。
- [x] 规则配置页保持接口和 payload 不变,仅替换用户可见文案;业务大类仍不显示配置规则入口,业务类型显示 `配置规则`
- [x] 修复规则配置页目标 eslint 的 hook dependency warning:把规则预览加载改为稳定 `useCallback` + ref 读取状态。
- [x] 验证:`npx eslint app/\(audit\)/rule-groups/RuleGroupsClient.tsx --max-warnings=0` 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 新增业务范围 helper`legal-platform-frontend/lib/business-entry/business-scope-ui.ts`,覆盖选择摘要和保存差异计算。
- [x] 新增业务范围 API 封装:复用 `GET /api/v3/document-type-roots``GET /api/rule-groups/tree``PUT /api/v3/document-type-roots/{id}`
- [x] 入口模块新建/编辑页接入业务范围选择器:用户勾选业务大类,下属业务类型只读展示;保存只更新业务大类归属,不自动创建业务大类或业务类型。
- [x] 验证:`node --test --experimental-strip-types tests/business-entry/business-scope-ui.test.mts tests/govdoc-audit/business-taxonomy-ui.test.mts tests/govdoc-audit/business-entry-ui.test.mts` 结果 `9 pass / 0 fail`
- [x] 验证:`npx eslint app/\(audit\)/entry-modules/new/EntryModuleNewClient.tsx lib/business-entry/business-scope-ui.ts --max-warnings=0` 结果 `0 error / 0 warning`
- [x] 验证:`npx eslint lib/api/legacy/entry-modules/business-scope.ts --no-warn-ignored --max-warnings=0` 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 修正遗漏的文档类型管理外露文案:页面 metadata、面包屑、侧栏 fallback、上传失败诊断统一改成 `业务大类管理/新建业务大类/业务大类`
- [x] 新增面包屑回归测试:`business category management breadcrumb uses business wording`
- [x] 验证:`node --test --experimental-strip-types tests/govdoc-audit/home-routing.test.mts tests/govdoc-audit/business-taxonomy-ui.test.mts` 结果 `12 pass / 0 fail`
- [x] 验证:目标 eslint 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 定位并修复 `/rule-groups` 服务端路由守卫误拦截:后端 RBAC 权限树当前返回 `/rules` 且聚合了 `evaluation_group:*` 权限,但未返回 `/rule-groups` 路由;布局只按 route path 放行导致跳转 `/home?error=insufficient_permissions`
- [x] 新增 `isRouteAllowedByBusinessPermission`:仅当访问 `/rule-groups` 且用户拥有 `evaluation_group:*` 权限时放行,避免扩大其他路由访问范围。
- [x] 新增路由守卫单测:`route guard allows rule configuration when user has evaluation group permissions`,先红灯后实现,最终通过。
- [x] Playwright 真实账号 `000/admin06111` 验收:`node /tmp/leaudit-business-entry-ux-smoke.js` 通过,结果 `scopeItems=38 / rootRows=37 / childRows=58 / errorCount=0`
- [x] 验证:`node --test --experimental-strip-types tests/business-entry/business-scope-ui.test.mts tests/govdoc-audit/business-taxonomy-ui.test.mts tests/govdoc-audit/business-entry-ui.test.mts tests/govdoc-audit/route-access.test.mts` 结果 `16 pass / 0 fail`
- [x] 验证:`npx eslint app/\(audit\)/layout.tsx lib/auth/route-access.ts tests/govdoc-audit/route-access.test.mts app/\(audit\)/entry-modules/new/EntryModuleNewClient.tsx app/\(audit\)/rule-groups/RuleGroupsClient.tsx lib/business-entry/business-scope-ui.ts --max-warnings=0` 结果 `0 error / 0 warning`
- [x] 验证:`npx tsc --noEmit --pretty false` 通过。
- [x] 环境说明:本轮 `./leaudit.sh start/restart` 在当前工具会话里出现启动后进程立即消失的现象;为完成 Playwright 验收,临时用同等命令在 PTY 会话中启动后端 `.venv/bin/python run.py` 和前端 `npm run dev:dev`
## 九、风险控制
- [ ] 第一阶段优先改文案和页面组织,不改数据库。
- [ ] 入口模块页不自动创建业务大类/业务类型,避免隐式脏数据。
- [ ] 上传页保留两级选择,避免用户传错类型。
- [ ] 所有菜单生成仍经过 RBAC 权限过滤。
- [ ] 所有入口范围仍经过租户过滤。
- [ ] Playwright 真实验收前先完成 UI 交互优化,避免测试脚本固化错误交互。