Files
leaudit-platform-backend/docs/HANDOFF.md
T
2026-04-30 14:31:53 +08:00

232 lines
10 KiB
Markdown
Raw 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.
# 开发交接文档 — leaudit-platform 前后端
> 本会话时间:2026-04-29 ~ 2026-04-30
> 工作目录:`/home/wren-dev/Porject/leaudit-platform/`
---
## 仓库信息
| 项目 | 路径 | 分支 | Remote |
|------|------|------|--------|
| **后端** | `/home/wren-dev/Porject/leaudit-platform/` | `main` | **无**(需配置) |
| **前端** | `/home/wren-dev/Porject/leaudit-platform/new_doc_review/` | `wren` | `http://git.7bm.co:1024/jande/new_doc_review.git` |
后端未推送(无 remote),前端 `wren` 分支领先 origin 7 个提交。
---
## 数据库
| 项 | 值 |
|------|-----|
| Host | `nas.7bm.co:54302` |
| 用户 | `docauditai_admin` |
| 密码 | `zhfw*123*` |
| 数据库 | `leaudit_platform` |
---
## 一、已完成的工作
### 1. 首页入口模块 RBAC 过滤修复
**问题**`内部公文` 入口模块配置存在(id=3, path=/home),但首页不显示。
**根因**`HomeServiceImpl` 做二次过滤——入口模块的 targetPath 必须匹配用户有路由权限的路径。`provincial_admin``role_route` 里没有 `/home`
**修复**:插入 `role_route` — role_id=2, route_id=10 (/home), permission='RW', status=1。
**后端提交**`19c70d2`
### 2. 首页地区过滤修正
**问题**`provincial_admin` 跳过了入口模块的 areas 地区过滤,导致取消地区后仍可见。
**修复**`homeServiceImpl.py``bypass_area` 逻辑从包含 `provincial_admin` 改为只包含 `super_admin`
**后端提交**`c16bb84`
### 3. 细粒度权限执行
**问题**:后端 `_assertManagePermission` 只检查用户是否属于 super_admin/provincial_admin/admin(粗粒度),不检查具体的 `rbac:roles:create` 等细粒度权限。
**修复**
- 新增 `_assertPermission(CurrentUserId, PermissionKey)` 方法
- 所有 RBAC 管理端点补全细粒度权限检查:
- `CreateRole``rbac:roles:create`
- `UpdateRole``rbac:roles:update`
- `DeleteRole``rbac:roles:delete`
- `ListRoles/GetRoleRoutes/GetRolePermissions``rbac:roles:read`
- `ListUsers/ListRoleUsers/GetUserRoles``rbac:users:read`
- `AssignUserRoles/RevokeUserRole``rbac:user_roles:write`
- `UpdateRoleRoutes``rbac:role_routes:write`
- `SaveRolePermissions``rbac:role_permissions:write`
- `GetRoutePermissions``rbac:permissions:read`
- `super_admin` 自动跳过细粒度权限检查
- 数据库给 `provincial_admin` (role_id=2) 和 `admin` (role_id=3) 补充了缺失的权限点
**后端提交**`33255e8`, `b6d7f15`
### 4. 统一异常处理
**问题**`LeauditException` 没有注册 FastAPI exception handler,所有业务异常都变成 500。
**修复**`app.py` 新增 `@app.exception_handler(BusinessException)`,返回带状态码的 JSON。
**后端提交**`292b187`
### 5. 403 错误信息中文化
**问题**403 返回 `"缺少权限: rbac:roles:delete"` 显示的是 permission key。
**修复**`_assertPermission``permissions` 表的 `display_name`,改为显示 `"缺少「删除角色」权限"`
**后端提交**`ab31c80`
**前端**axios 拦截器不再硬编码 `"无权限"`,改为透传后端的具体消息。`frontendJWT` 改为 `canEdit`,包含 `provincial_admin` + `admin` 两个角色。
**前端提交**`185f55c`, `e2ae791`
### 6. 上传页 PostgREST 依赖替换
**问题**:上传页 loader 里 `getTodayDocuments``getDocumentTypes``getQueueStatus` 调 PostgREST 返回 404。
**后端新增**
- `GET /api/document-types` — 文档类型列表
- `GET /api/documents/list` 新增 `userId``dateFrom``dateTo` 过滤参数
- `GET /api/v2/system/queue/status` — 队列状态(查询 `leaudit_documents``processing_status` 统计)
**后端提交**`8f307ae`, `9e1b7a6`, `e6e129c`
**前端**
- `getDocumentTypes()``GET /api/document-types`
- `getTodayDocuments()``GET /api/documents/list?userId=&dateFrom=`
- `getQueueStatus()` → 404 时返回空状态不报错
**前端提交**`dd249cc`
### 7. 上传接口对齐
**问题**:前端上传 `POST ${UPLOAD_URL}/upload` 用的是嵌套 JSON 的 `upload_info` 格式,与新后端 `POST /api/upload` 的扁平 `multipart/form-data` 不兼容。
**修复**
- `uploadDocumentToServer()` 重写,用扁平 FormDatatypeId, region, fileRole, createdBy, autoRun, speed
- `handleFileUpload()` 适配:从 `userInfo.area``region`,从 `Priority` 枚举映射 `speed`
- 响应类型从 `FileUploadResponse` 改为 `UploadResult``documentId` 替代 `result.id`
**前端提交**`73fd861`
### 8. 文档类型 CRUD 后端
**新增端点**
```
POST /api/document-types 创建(含 rule_set_ids 自动绑定)
PUT /api/document-types/{id} 更新(rule_set_ids 全量替换)
DELETE /api/document-types/{id} 软删除(级联解绑 rule_type_bindings
GET /api/document-types/{id} 详情
GET /api/document-types 列表(扩展字段:description, entryModuleId, isEnabled, ruleSetIds
```
**关键实现**
- `DocumentTypeItemVO` 新增 `description`, `entryModuleId`, `isEnabled`, `ruleSetIds`
- `DocumentTypeCreateDTO` / `DocumentTypeUpdateDTO` 支持 `ruleSetIds` 传入
- 创建/更新时自动调用 `_syncRuleBindings()` 全量替换 `leaudit_rule_type_bindings`
- 软删除级联清理 bindings
**后端提交**`52c2bed`
### 9. 文档类型管理前端页面
**文件**
- `app/api/document-types/document-types.ts` — 重写,调用新后端 `/api/document-types` + `/api/rule-sets`
- `app/routes/document-types._index.tsx` — 列表页(编码、名称、入口模块、规则集数量、状态)
- `app/routes/document-types.new.tsx` — 新建/编辑页(编码、名称、描述、入口模块下拉、规则集多选)
**前端提交**`81c5e98`, `477bcaf`
### 10. 文档类型路由注册
**修复**
- `_MANAGEABLE_ROUTE_BLUEPRINTS` 添加 `/document-types` 路由
- `_MANAGEABLE_PERMISSION_BLUEPRINTS` 添加 `doc_type:*` 权限定义
- `_MINIMAL_VISIBLE_ROUTE_PREFIXES` 添加 `/document-types`(关键!)
- `_PERMISSION_PREFIXES_BY_PATH` 添加 `/document-types``["doc_type:"]`
- 数据库 `sys_routes``role_route` 已补 `/document-types`
**后端提交**`283c822`, `acdcfeb`
---
## 二、关键代码位置速查
### 后端
| 功能 | 文件 |
|------|------|
| 异常处理 | `fastapi_admin/app.py:67-76` |
| 权限检查 | `rbacAdminServiceImpl.py:571-606` (`_assertPermission`) |
| 用户上下文 | `rbacAdminServiceImpl.py:608-620` (`_getCurrentUserContext`) |
| 文档上传 | `documentServiceImpl.py:44-246` (`Upload`) |
| 文档列表 | `documentServiceImpl.py:248-443` (`ListDocuments`) |
| 文档类型 CRUD | `documentServiceImpl.py:477-560` |
| 文档类型列表 | `documentController.py:87-130` |
| 队列状态 | `documentController.py:135-180` |
| 路由可见白名单 | `rbacServiceImpl.py:21-29` (`_MINIMAL_VISIBLE_ROUTE_PREFIXES`) |
| 权限前缀映射 | `rbacServiceImpl.py:539-550` (`_PERMISSION_PREFIXES_BY_PATH`) |
| 首页地区过滤 | `homeServiceImpl.py:39` (`bypass_area`) |
| 首页路由过滤 | `homeServiceImpl.py:91-108` |
### 前端
| 功能 | 文件 |
|------|------|
| 上传 API | `app/api/files/files-upload.ts` |
| 文档类型 API | `app/api/document-types/document-types.ts` |
| 上传页面 | `app/routes/files.upload.tsx` |
| 文档类型列表 | `app/routes/document-types._index.tsx` |
| 文档类型编辑 | `app/routes/document-types.new.tsx` |
| 403 拦截器 | `app/api/axios-client.ts:183-190` |
### 数据库关键表
| 表 | 用途 |
|----|------|
| `leaudit_document_types` | 文档类型(20 条种子数据) |
| `leaudit_rule_type_bindings` | 文档类型→规则集绑定 |
| `leaudit_rule_sets` | 规则集 |
| `leaudit_documents` | 文档(含版本管理) |
| `leaudit_document_files` | 文档文件 |
| `role_permissions` | 角色细粒度权限 |
| `role_route` | 角色路由授权 |
| `sys_routes` | 系统路由定义 |
---
## 三、未完成 / 待做
### 高优先级
1. **上传端到端验证** — 上传接口已重写但未实际测试。需在前端上传一份文件,确认 `POST /api/upload` 返回正确、文件入 MinIO、`leaudit_documents` 有记录。
2. **附件上传**`appendContractAttachments``uploadContractTemplate` 仍调用旧 API,后端无对应接口。需新增:
- `POST /api/documents/{id}/attachments`fileRole=attachment
- `POST /api/documents/{id}/template`fileRole=template
3. **文档列表字段精简**`documents.ts``LeauditListItem → DocumentUI` 有 80 行映射代码(`mapLeauditDocToAuditStatus``mapProcessingStatusToFileStatus` 等)。建议逐步直接消费新后端字段名。
### 中优先级
4. **文档 CRUD 补全** — 后端缺:
- `DELETE /api/documents/{id}` — 软删除
- `PUT /api/documents/{id}` — 更新元数据(备注、测试标记)
- `GET /api/documents/{id}` — 文档详情
5. **文档类型管理页 CSS**`document-types._index.tsx` 用了 `.data-table``.tag``.status-badge` 等类名,需要检查 `document-types_index.css` 是否包含这些样式,或改用现有组件(如 `Table`)。
6. **前端 role-permissions 页面权限 UI** — 规则集绑定已改为 `ruleSetIds`(替代老系统的 `group_ids`),但 role-permissions 页面显示的权限分组文案可能需要更新。
### 低优先级
7. **规则集选择器优化** — 当前新建/编辑文档类型页以 checkbox 列表展示所有规则集。规则集数量增长后需要加搜索/分组。
8. **队列状态接口完善** — 当前 `/api/v2/system/queue/status` 只查了数据库的 `processing_status`,未接入 Celery 实时队列深度。后续可以调 Celery inspect API 补充 `pending_tasks` / `processing_tasks`
9. **后端推送** — 后端仓库无 git remote,需要配置后推送。
10. **旧 PostgREST 完全清理** — 确认无其他 PostgREST 调用后移除旧 RPC 函数。
---
## 四、当前用户/角色状态
| 角色 | role_key | ID | 用户数 |
|------|----------|-----|--------|
| 系统超级管理员 | super_admin | 1 | 0 |
| 省级管理员 | provincial_admin | 2 | 1 (id=5, username=admin, area=梅州) |
| 地区管理员 | admin | 3 | 4 (揭阳惠来烟草, 梅州烟草, 云浮烟草, 潮州烟草) |
| 普通用户 | common | 4 | ~200 (000... 用户) |
省级管理员 (id=5) 拥有所有权限点,包括新增的 `doc_type:*`(通过 `_ensureAdminSeeds` 自动补种)。