1. PostgREST 使用情况分析文档 - PostgREST使用情况-后端API替代建议.md: 完整的迁移建议和优先级分析 - PostgREST实际使用清单.md: 当前使用的 PostgREST 接口清单 - PostgREST未使用函数清单.md: 已封装但未使用的函数列表 - PostgREST请求模块清单.md: 所有请求模块的使用情况 2. 删除操作延迟确认功能实施文档 - 功能设计和实现细节 - 使用示例和最佳实践 - 技术实现说明 这些文档用于: - 追踪 PostgREST 到 FastAPI 的迁移进度 - 指导后续的接口迁移工作 - 记录 UI 改进的实施细节 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
39 KiB
PostgREST 使用情况及后端 API 替代建议
本文档详细列出所有正在使用的 PostgREST 请求 排除"评查点详情"相关的必须保留功能 标注建议改为后端 API 的模块
更新时间: 2025-11-25
📋 图例说明
| 标记 | 含义 |
|---|---|
| 🔄 | 强烈建议改为后端 API |
| ⚠️ | 建议评估是否改为后端 API |
| ✅ | 保留 PostgREST(技术原因或低优先级) |
| 🔒 | 必须保留 PostgREST(评查点详情相关) |
目录
1. 认证服务
文件: app/api/login/auth.server.ts
1.1 用户信息同步 - saveUserInfo()
| 项目 | 内容 |
|---|---|
| 函数 | saveUserInfo() |
| 行号 | 551-681 |
| PostgREST 操作 | postgrestGet + postgrestPut / postgrestPost |
| 表名 | sso_users |
| 功能 | OAuth 登录后将用户信息同步到本地数据库 |
| 调用位置 | app/routes/callback.tsx - OAuth 回调 |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:前端直接操作数据库
1. postgrestGet 查询用户是否存在(根据 sub)
2. 如果存在 → postgrestPut 更新用户信息
3. 如果不存在 → postgrestPost 插入新用户
建议后端 API:
POST /api/auth/sync-user
Body: { userInfo, userRole, area }
Response: { success, user_id, ... }
优点:
- ✅ 统一用户数据管理逻辑
- ✅ 避免前端直接操作用户表
- ✅ 更好的数据一致性保障
1.2 添加默认角色 - addDefaultRole()
| 项目 | 内容 |
|---|---|
| 函数 | addDefaultRole() |
| 行号 | 691-738 |
| PostgREST 操作 | postgrestGet + postgrestPost |
| 表名 | user_role |
| 功能 | 为新用户自动添加默认角色(common) |
| 调用位置 | saveUserInfo() 内部调用 |
| 建议 | 🔄 改为后端 API(随 saveUserInfo 一起) |
详细说明:
// 当前实现
1. postgrestGet 检查用户是否已有角色
2. 如果没有 → postgrestPost 添加角色
建议: 合并到 /api/auth/sync-user 接口中,后端自动处理
2. 首页与统计
文件: app/api/home/home.ts
2.1 获取入口模块 - getEntryModules()
| 项目 | 内容 |
|---|---|
| 函数 | getEntryModules() |
| 行号 | 232-371 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | entry_modules + document_types |
| 功能 | 获取用户可访问的入口模块及关联的文档类型 |
| 调用位置 | app/routes/home.tsx - 首页 |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
1. postgrestGet 查询 entry_modules(根据用户角色和地区过滤)
2. 对每个模块:postgrestGet 查询关联的 document_types
3. 前端进行地区启用状态过滤
建议后端 API:
GET /api/home/entry-modules?userRole={role}&userArea={area}
Response: {
modules: [
{
id, name, description, path, areas,
documentTypes: [...] // 已关联的文档类型
}
]
}
优点:
- ✅ 减少多次数据库查询
- ✅ 后端统一处理权限逻辑
- ✅ 支持更复杂的业务规则
3. 文档管理
文件: app/api/files/documents.ts
3.1 获取单个文档 - getDocument()
| 项目 | 内容 |
|---|---|
| 函数 | getDocument() |
| 行号 | 286-331 |
| PostgREST 操作 | postgrestGet + 内部调用多个查询 |
| 表名 | documents + evaluation_results + document_types |
| 功能 | 获取单个文档详情及评查结果统计 |
| 调用位置 | home.tsx, documents.list.tsx, documents.edit.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
1. postgrestGet 查询文档基本信息(documents 表)
2. 调用 getDocumentTypes() → postgrestGet 查询文档类型
3. 调用 getEvaluationResults() → postgrestGet 查询评查结果
4. 前端计算问题数量(issues)
5. 前端组装 DocumentUI 对象
建议后端 API:
GET /api/documents/{id}?userId={userId}
Response: {
id, name, documentNumber, type, typeName,
auditStatus, fileStatus, issues, // 后端计算
uploadTime, pageCount, ...
}
优点:
- ✅ 一次请求获取所有数据
- ✅ 后端计算问题数量,提高性能
- ✅ 减少前端数据组装逻辑
3.2 获取文档(无用户限制) - getDocumentWithNoUserId()
| 项目 | 内容 |
|---|---|
| 函数 | getDocumentWithNoUserId() |
| 行号 | 339-383 |
| PostgREST 操作 | postgrestGet + 内部调用多个查询 |
| 表名 | documents + evaluation_results + document_types |
| 功能 | 获取文档详情(跨用户查询,用于交叉评查) |
| 调用位置 | 交叉评查模块 |
| 建议 | 🔄 改为后端 API |
建议后端 API:
GET /api/documents/{id}/detail
Response: { ... } // 与 getDocument 类似,但无用户ID限制
3.3 更新文档 - updateDocument()
| 项目 | 内容 |
|---|---|
| 函数 | updateDocument() |
| 行号 | 393-458 |
| PostgREST 操作 | postgrestPut |
| 表名 | documents |
| 功能 | 更新文档信息(文档编号、审核状态、备注等) |
| 调用位置 | documents.edit.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
postgrestPut('documents', {
document_number, audit_status, is_test_document, remark
}, { id, user_id })
建议后端 API:
PUT /api/documents/{id}
Body: { documentNumber, auditStatus, isTest, remark }
Response: { success, updatedDocument }
优点:
- ✅ 后端可以添加业务逻辑(如状态变更日志)
- ✅ 统一权限校验
- ✅ 支持事务处理
3.4 删除文档 - deleteDocument()
| 项目 | 内容 |
|---|---|
| 函数 | deleteDocument() |
| 行号 | 242-279 |
| PostgREST 操作 | postgrestDelete |
| 表名 | documents |
| 功能 | 删除文档(只能删除自己的文档) |
| 调用位置 | 文档列表操作 |
| 建议 | 🔄 改为后端 API |
建议后端 API:
DELETE /api/documents/{id}?userId={userId}
Response: { success }
优点:
- ✅ 后端可以执行级联删除(评查结果、文件存储等)
- ✅ 记录删除日志
- ✅ 更安全的权限控制
4. 文件上传
文件: app/api/files/files-upload.ts
4.1 获取当天文档列表 - getTodayDocuments()
| 项目 | 内容 |
|---|---|
| 函数 | getTodayDocuments() |
| 行号 | 440-524 |
| PostgREST 操作 | postgrestGet |
| 表名 | documents |
| 功能 | 获取当天上传的文档列表(支持按文档类型过滤) |
| 调用位置 | documents.list.tsx, files.upload.tsx, ReviewTabs.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
postgrestGet('documents', {
select: 'id, name, type_id, file_size, status, ...',
filter: {
'created_at': `gte.${today}`,
'user_id': `eq.${userInfo.user_id}`,
'type_id': `in.(${typeIds})` // 从 sessionStorage 读取
},
order: 'created_at.desc'
})
建议后端 API:
GET /api/documents/today?userId={userId}&typeIds={ids}
Response: {
documents: [...]
}
优点:
- ✅ 后端可以优化查询性能
- ✅ 支持更复杂的筛选条件
- ✅ 统一日期范围逻辑
4.2 获取文档类型列表 - getDocumentTypes()
| 项目 | 内容 |
|---|---|
| 函数 | getDocumentTypes() |
| 行号 | 531-574 |
| PostgREST 操作 | postgrestGet |
| 表名 | document_types |
| 功能 | 获取文档类型列表(支持动态过滤) |
| 调用位置 | documents.list.tsx, files.upload.tsx |
| 建议 | ⚠️ 建议评估 |
详细说明:
// 当前实现
postgrestGet('document_types', {
select: 'id, name',
filter: { 'id': `in.(${typeIds})` } // 从 sessionStorage 读取
})
建议:
- 如果只是简单查询,可以保留 PostgREST
- 如果需要关联更多数据(如提示词配置),改为后端 API
4.3 获取文档状态 - getDocumentsStatus()
| 项目 | 内容 |
|---|---|
| 函数 | getDocumentsStatus() |
| 行号 | 583-658 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | documents + contract_structure_comparison |
| 功能 | 批量查询文档和合同附件的处理状态(用于轮询) |
| 调用位置 | documents.list.tsx, files.upload.tsx, ReviewTabs.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
1. postgrestGet('documents', { filter: { id: 'in.(1,2,3)' } })
2. postgrestGet('contract_structure_comparison', { filter: { id: 'in.(4,5)' } })
3. 前端合并结果
建议后端 API:
POST /api/documents/status
Body: { documentIds: [1,2,3], attachmentIds: [4,5] }
Response: {
documents: [{ id, status }, ...]
}
优点:
- ✅ 一次请求获取所有状态
- ✅ 减少前端逻辑
- ✅ 支持 WebSocket 推送(未来优化)
5. 评查点管理
文件: app/api/evaluation_points/rules.ts
5.1 获取评查点列表 - getRulesList()
| 项目 | 内容 |
|---|---|
| 函数 | getRulesList() |
| 行号 | 182-408 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | evaluation_points + evaluation_point_groups |
| 功能 | 获取评查点列表(支持分页、排序、多条件筛选) |
| 调用位置 | rules.list.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
1. postgrestGet('evaluation_point_groups', ...) // 查询类型筛选
2. postgrestGet('evaluation_points', {
select: `id, code, name,
child_group:evaluation_point_groups!fk_evaluation_points_group(...),
parent_group:evaluation_point_groups!fk_evaluation_points_parent_group(...)`
}) // 使用资源嵌入查询父子分组
3. 前端进行地区过滤、编码清洗
建议后端 API:
GET /api/rules/list?page={p}&pageSize={ps}&type={t}&group={g}&status={s}&keyword={k}&area={a}
Response: {
rules: [...],
total: 100,
page: 1,
pageSize: 10
}
优点:
- ✅ 简化复杂的资源嵌入查询
- ✅ 后端处理地区过滤和编码清洗
- ✅ 更好的查询性能优化
5.2 获取单个评查点 - getRule()
| 项目 | 内容 |
|---|---|
| 函数 | getRule() |
| 行号 | 409-502 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | evaluation_points + evaluation_point_groups |
| 功能 | 获取单个评查点详情 |
| 调用位置 | 评查点编辑页面 |
| 建议 | 🔒 必须保留(评查点详情) |
说明: 这是评查点详情相关功能,必须使用 PostgREST
5.3 创建评查点 - createRule()
| 项目 | 内容 |
|---|---|
| 函数 | createRule() |
| 行号 | 503-563 |
| PostgREST 操作 | postgrestPost |
| 表名 | evaluation_points |
| 功能 | 创建新的评查点 |
| 调用位置 | 评查点编辑页面 |
| 建议 | 🔒 必须保留(评查点详情) |
5.4 更新评查点 - updateRule()
| 项目 | 内容 |
|---|---|
| 函数 | updateRule() |
| 行号 | 564-624 |
| PostgREST 操作 | postgrestPut |
| 表名 | evaluation_points |
| 功能 | 更新评查点 |
| 调用位置 | 评查点编辑页面 |
| 建议 | 🔒 必须保留(评查点详情) |
5.5 删除评查点 - deleteRule()
| 项目 | 内容 |
|---|---|
| 函数 | deleteRule() |
| 行号 | 625-739 |
| PostgREST 操作 | postgrestDelete |
| 表名 | evaluation_points |
| 功能 | 删除评查点 |
| 调用位置 | 评查点列表 |
| 建议 | 🔒 必须保留(评查点详情) |
5.6 获取规则类型 - getRuleTypes()
| 项目 | 内容 |
|---|---|
| 函数 | getRuleTypes() |
| 行号 | 803-945 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | document_types + evaluation_point_groups |
| 功能 | 获取文档类型和评查点类型(用于筛选) |
| 调用位置 | rules.list.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
5.7 根据类型获取规则组 - getRuleGroupsByType()
| 项目 | 内容 |
|---|---|
| 函数 | getRuleGroupsByType() |
| 行号 | 946-1078 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_point_groups |
| 功能 | 根据文档类型ID获取规则组 |
| 调用位置 | rules.list.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
5.8 获取评查点数据(编辑用) - getEvaluationPoint()
| 项目 | 内容 |
|---|---|
| 函数 | getEvaluationPoint() |
| 行号 | 1152-1202 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_points |
| 功能 | 获取评查点数据(用于编辑页面) |
| 调用位置 | rules.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
5.9 获取评查点组列表 - getEvaluationPointGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getEvaluationPointGroups() |
| 行号 | 1203-1327 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_point_groups |
| 功能 | 获取所有评查点组(用于下拉选择) |
| 调用位置 | rules.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
5.10 保存评查点 - saveEvaluationPoint()
| 项目 | 内容 |
|---|---|
| 函数 | saveEvaluationPoint() |
| 行号 | 1328+ |
| PostgREST 操作 | postgrestPut / postgrestPost |
| 表名 | evaluation_points |
| 功能 | 保存评查点(新建或更新) |
| 调用位置 | rules.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6. 评查点分组
文件: app/api/evaluation_points/rule-groups.ts
6.1 获取顶级分组 - getRuleGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getRuleGroups() |
| 行号 | 74-145 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_point_groups |
| 功能 | 获取顶级评查点分组列表 |
| 调用位置 | rule-groups._index.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.2 获取子分组 - getChildGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getChildGroups() |
| 行号 | 146-245 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | evaluation_point_groups + evaluation_points |
| 功能 | 获取子分组列表及评查点数量 |
| 调用位置 | rule-groups._index.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.3 获取所有分组(树形) - getAllRuleGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getAllRuleGroups() |
| 行号 | 246-330 |
| PostgREST 操作 | postgrestGet × 多次 |
| 表名 | evaluation_point_groups + evaluation_points |
| 功能 | 获取所有分组并构建树形结构 |
| 调用位置 | document-types.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.4 获取单个分组 - getRuleGroup()
| 项目 | 内容 |
|---|---|
| 函数 | getRuleGroup() |
| 行号 | 331-429 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | evaluation_point_groups + evaluation_points |
| 功能 | 获取单个分组详情及评查点数量 |
| 调用位置 | rule-groups.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.5 创建分组 - createRuleGroup()
| 项目 | 内容 |
|---|---|
| 函数 | createRuleGroup() |
| 行号 | 430-513 |
| PostgREST 操作 | postgrestPost |
| 表名 | evaluation_point_groups |
| 功能 | 创建新的评查点分组 |
| 调用位置 | rule-groups.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.6 更新分组 - updateRuleGroup()
| 项目 | 内容 |
|---|---|
| 函数 | updateRuleGroup() |
| 行号 | 514-576 |
| PostgREST 操作 | postgrestPut |
| 表名 | evaluation_point_groups |
| 功能 | 更新评查点分组 |
| 调用位置 | rule-groups.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
6.7 删除分组 - deleteRuleGroup()
| 项目 | 内容 |
|---|---|
| 函数 | deleteRuleGroup() |
| 行号 | 577+ |
| PostgREST 操作 | postgrestDelete × 2 |
| 表名 | evaluation_point_groups + evaluation_points |
| 功能 | 删除分组(级联删除子分组和评查点) |
| 调用位置 | rule-groups._index.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
7. 评查文件审核
文件: app/api/evaluation_points/rules-files.ts
7.1 更新文档审核状态 - updateDocumentAuditStatus()
| 项目 | 内容 |
|---|---|
| 函数 | updateDocumentAuditStatus() |
| 行号 | 118-167 |
| PostgREST 操作 | postgrestPut |
| 表名 | documents |
| 功能 | 更新文件的审核状态(通过/不通过/警告) |
| 调用位置 | documents.list.tsx, files.upload.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
postgrestPut('documents',
{ audit_status: auditStatus },
{ id, user_id }
)
建议后端 API:
PUT /api/documents/{id}/audit-status
Body: { auditStatus, userId }
Response: { success }
优点:
- ✅ 后端可以记录审核日志
- ✅ 触发审核状态变更的业务逻辑
- ✅ 统一权限校验
8. 评审结果
文件: app/api/evaluation_points/reviews.ts
8.1 获取评查点列表 - getReviewPoints()
| 项目 | 内容 |
|---|---|
| 函数 | getReviewPoints() |
| 行号 | 132-750 |
| PostgREST 操作 | postgrestGet × 6 |
| 表名 | contract_structure_comparison, evaluation_results, evaluation_points, evaluation_point_groups, audit_status, cross_scoring_proposals |
| 功能 | 获取文档的完整评查结果(关联 6 个表) |
| 调用位置 | reviews.tsx, cross-checking.result.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:复杂的多表关联查询
1. postgrestGet('contract_structure_comparison', ...) // 合同附件
2. postgrestGet('evaluation_results', ...) // 评查结果
3. postgrestGet('evaluation_points', ...) // 评查点
4. postgrestGet('evaluation_point_groups', ...) // 评查点组
5. postgrestGet('audit_status', ...) // 审核状态
6. postgrestGet('cross_scoring_proposals', ...) // 交叉提案
7. 前端复杂的数据组装和分组
建议后端 API:
GET /api/documents/{id}/review-points
Response: {
reviewPoints: [
{
id, evaluationPointId, evaluationPointName,
groupName, result, score,
auditStatus, crossProposals, ...
}
],
groupedByCategory: {...}
}
优点:
- ✅ 大幅减少数据库查询(从 6 次到 1 次)
- ✅ 后端优化 JOIN 查询性能
- ✅ 简化前端数据处理逻辑
- ✅ 统一数据格式
8.2 更新评查结果 - updateReviewResult()
| 项目 | 内容 |
|---|---|
| 函数 | updateReviewResult() |
| 行号 | 751-894 |
| PostgREST 操作 | postgrestGet + postgrestPut / postgrestPost |
| 表名 | evaluation_results + audit_status |
| 功能 | 更新评查结果和审核状态 |
| 调用位置 | reviews.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
1. postgrestGet('evaluation_results', ...) // 获取当前结果
2. postgrestPut('evaluation_results', ...) // 更新结果
3. 根据情况:
- postgrestPut('audit_status', ...) // 更新审核状态
- 或 postgrestPost('audit_status', ...) // 创建审核状态
建议后端 API:
PUT /api/review-results/{id}
Body: {
evaluationResultId,
evaluatedResult,
evaluationOpinion,
userOpinion,
isReEvaluation
}
Response: { success, updatedResult }
优点:
- ✅ 事务处理,保证数据一致性
- ✅ 后端处理复杂的状态逻辑
- ✅ 记录修改历史
8.3 确认评查结果 - confirmReviewResults()
| 项目 | 内容 |
|---|---|
| 函数 | confirmReviewResults() |
| 行号 | 895+ |
| PostgREST 操作 | postgrestPut |
| 表名 | documents |
| 功能 | 确认评查并更新文档状态 |
| 调用位置 | reviews.tsx |
| 建议 | 🔄 改为后端 API |
建议后端 API:
POST /api/documents/{id}/confirm-review
Response: { success }
优点:
- ✅ 后端可以执行确认后的业务逻辑
- ✅ 触发通知或工作流
9. 文档类型
文件: app/api/document-types/document-types.ts
9.1 获取所有评查点分组 - getAllEvaluationPointGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getAllEvaluationPointGroups() |
| 行号 | 101-148 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_point_groups |
| 功能 | 获取所有评查点分组(用于文档类型关联) |
| 调用位置 | document-types.new.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
9.2 获取父级分组 - getParentEvaluationPointGroups()
| 项目 | 内容 |
|---|---|
| 函数 | getParentEvaluationPointGroups() |
| 行号 | 149-200 |
| PostgREST 操作 | postgrestGet |
| 表名 | evaluation_point_groups |
| 功能 | 获取父级评查点分组 |
| 调用位置 | document-types._index.tsx |
| 建议 | 🔒 必须保留(评查点详情) |
9.3 获取入口模块 - getEntryModules()
| 项目 | 内容 |
|---|---|
| 函数 | getEntryModules() |
| 行号 | 201-244 |
| PostgREST 操作 | postgrestGet |
| 表名 | entry_modules |
| 功能 | 获取入口模块列表(用于文档类型关联) |
| 调用位置 | document-types.new.tsx |
| 建议 | ⚠️ 建议评估 |
说明: 如果只是简单查询,可以保留;如果需要复杂业务逻辑,改为后端 API
9.4 获取文档类型列表 - getDocumentTypes()
| 项目 | 内容 |
|---|---|
| 函数 | getDocumentTypes() |
| 行号 | 311-465 |
| PostgREST 操作 | postgrestGet |
| 表名 | document_types |
| 功能 | 获取文档类型列表(支持分页、筛选) |
| 调用位置 | documents.list.tsx, document-types.new.tsx, document-types._index.tsx, documents.edit.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现
postgrestGet('document_types', {
select: `id, name, description, ...,
entry_modules!fk_document_types_entry_module(id,name)`, // 资源嵌入
filter: { ... },
order: '...',
limit: pageSize,
offset: offset
})
建议后端 API:
GET /api/document-types?page={p}&pageSize={ps}&name={n}&groupId={g}
Response: {
types: [...],
total: 100
}
优点:
- ✅ 简化资源嵌入查询
- ✅ 后端优化查询性能
- ✅ 支持更复杂的业务逻辑
9.5 删除文档类型 - deleteDocumentType()
| 项目 | 内容 |
|---|---|
| 函数 | deleteDocumentType() |
| 行号 | 466-559 |
| PostgREST 操作 | postgrestDelete |
| 表名 | document_types |
| 功能 | 删除文档类型 |
| 调用位置 | document-types._index.tsx |
| 建议 | 🔄 改为后端 API |
建议后端 API:
DELETE /api/document-types/{id}
Response: { success }
优点:
- ✅ 后端可以检查是否有关联数据
- ✅ 执行级联删除或软删除
- ✅ 记录删除日志
9.6 获取单个文档类型 - getDocumentType()
| 项目 | 内容 |
|---|---|
| 函数 | getDocumentType() |
| 行号 | 560-654 |
| PostgREST 操作 | postgrestGet |
| 表名 | document_types |
| 功能 | 获取单个文档类型详情 |
| 调用位置 | document-types.new.tsx |
| 建议 | ⚠️ 建议评估 |
说明: 简单查询,优先级较低
9.7 创建文档类型 - createDocumentType()
| 项目 | 内容 |
|---|---|
| 函数 | createDocumentType() |
| 行号 | 655-781 |
| PostgREST 操作 | postgrestPost |
| 表名 | document_types |
| 功能 | 创建新的文档类型 |
| 调用位置 | document-types.new.tsx |
| 建议 | 🔄 改为后端 API |
建议后端 API:
POST /api/document-types
Body: { name, description, entryModuleId, groupIds, promptConfigs, ... }
Response: { success, id }
优点:
- ✅ 后端可以验证数据完整性
- ✅ 处理关联关系的创建
- ✅ 事务处理
9.8 更新文档类型 - updateDocumentType()
| 项目 | 内容 |
|---|---|
| 函数 | updateDocumentType() |
| 行号 | 782+ |
| PostgREST 操作 | postgrestPut |
| 表名 | document_types |
| 功能 | 更新文档类型 |
| 调用位置 | document-types.new.tsx |
| 建议 | 🔄 改为后端 API |
建议后端 API:
PUT /api/document-types/{id}
Body: { ... }
Response: { success }
10. 入口模块
文件: app/api/entry-modules/entry-modules.ts
10.1 获取入口模块列表 - getEntryModules()
| 项目 | 内容 |
|---|---|
| 函数 | getEntryModules() |
| 行号 | 45-118 |
| PostgREST 操作 | postgrestGet |
| 表名 | entry_modules |
| 功能 | 获取入口模块列表(支持分页、JSONB 数组查询) |
| 调用位置 | entry-modules._index.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:使用 JSONB 数组查询
postgrestGet('entry_modules', {
filter: {
name: 'ilike.*关键词*',
areas: 'cs.{"梅州"}' // JSONB contains
}
})
建议后端 API:
GET /api/entry-modules?page={p}&pageSize={ps}&name={n}&area={a}
Response: {
modules: [...],
total: 100
}
优点:
- ✅ 简化 JSONB 查询逻辑
- ✅ 后端优化查询性能
10.2 根据 ID 获取入口模块 - getEntryModuleById()
| 项目 | 内容 |
|---|---|
| 函数 | getEntryModuleById() |
| 行号 | 126-150 |
| PostgREST 操作 | postgrestGet |
| 表名 | entry_modules |
| 功能 | 获取单个入口模块详情 |
| 调用位置 | entry-modules.new.tsx |
| 建议 | ✅ 保留(简单查询) |
10.3 创建入口模块 - createEntryModule()
| 项目 | 内容 |
|---|---|
| 函数 | createEntryModule() |
| 行号 | 158-179 |
| PostgREST 操作 | postgrestPost |
| 表名 | entry_modules |
| 功能 | 创建新的入口模块 |
| 调用位置 | entry-modules.new.tsx |
| 建议 | 🔄 改为后端 API |
10.4 更新入口模块 - updateEntryModule()
| 项目 | 内容 |
|---|---|
| 函数 | updateEntryModule() |
| 行号 | 188-211 |
| PostgREST 操作 | postgrestPut |
| 表名 | entry_modules |
| 功能 | 更新入口模块 |
| 调用位置 | entry-modules.new.tsx |
| 建议 | 🔄 改为后端 API |
10.5 删除入口模块 - deleteEntryModule()
| 项目 | 内容 |
|---|---|
| 函数 | deleteEntryModule() |
| 行号 | 219-242 |
| PostgREST 操作 | postgrestDelete |
| 表名 | entry_modules |
| 功能 | 删除入口模块 |
| 调用位置 | entry-modules._index.tsx |
| 建议 | 🔄 改为后端 API |
11. 交叉评查
文件: app/api/cross-checking/
11.1 更新文档审核状态 - updateDocumentAuditStatus()
文件: cross-files.ts
| 项目 | 内容 |
|---|---|
| 函数 | updateDocumentAuditStatus() |
| 行号 | 476-507 |
| PostgREST 操作 | postgrestPut |
| 表名 | documents |
| 功能 | 更新文件的审核状态(交叉评查场景) |
| 调用位置 | cross-checking 相关页面 |
| 建议 | 🔄 改为后端 API |
说明: 与 rules-files.ts 中的同名函数类似,建议统一改为后端 API
11.2 查找是否是发起人 - findIsProposer()
文件: cross-file-result.ts
| 项目 | 内容 |
|---|---|
| 函数 | findIsProposer() |
| 行号 | 91-112 |
| PostgREST 操作 | postgrestGet |
| 表名 | cross_examination_tasks |
| 功能 | 判断当前用户是否是任务发起人 |
| 调用位置 | 交叉评查意见操作 |
| 建议 | 🔄 改为后端 API |
建议后端 API:
GET /api/cross-review/tasks/{taskId}/is-proposer?userId={userId}
Response: { isProposer: true/false }
优点:
- ✅ 后端统一权限判断逻辑
- ✅ 可以扩展更复杂的权限规则
11.3 完成评查 - confirmReviewResults()
文件: cross-file-result.ts
| 项目 | 内容 |
|---|---|
| 函数 | confirmReviewResults() |
| 行号 | 359-394 |
| PostgREST 操作 | postgrestPut |
| 表名 | documents |
| 功能 | 完成评查并更新文档审核状态为通过 |
| 调用位置 | cross-checking.result.tsx |
| 建议 | 🔄 改为后端 API |
建议后端 API:
POST /api/cross-review/documents/{id}/confirm
Response: { success }
12. 提示词模板
文件: app/api/prompts/prompts.ts
12.1 获取提示词模板列表 - getPromptTemplates()
| 项目 | 内容 |
|---|---|
| 函数 | getPromptTemplates() |
| 行号 | 127-232 |
| PostgREST 操作 | postgrestGet |
| 表名 | prompt_templates |
| 功能 | 获取提示词模板列表(支持分页、筛选、关联创建者) |
| 调用位置 | prompts._index.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:使用资源嵌入查询创建者
postgrestGet('prompt_templates', {
select: `id, template_name, ...,
sso_users!created_by(username)`, // 资源嵌入
filter: { ... },
order: 'created_at.desc'
})
建议后端 API:
GET /api/prompts?page={p}&pageSize={ps}&name={n}&type={t}&status={s}
Response: {
templates: [
{ id, name, type, status, createdBy, createdAt, ... }
],
total: 100
}
优点:
- ✅ 简化资源嵌入查询
- ✅ 后端优化查询性能
12.2 获取单个提示词模板 - getPromptTemplate()
| 项目 | 内容 |
|---|---|
| 函数 | getPromptTemplate() |
| 行号 | 233-279 |
| PostgREST 操作 | postgrestGet |
| 表名 | prompt_templates |
| 功能 | 获取单个提示词模板详情 |
| 调用位置 | prompts.new.tsx |
| 建议 | ✅ 保留(简单查询) |
12.3 创建提示词模板 - createPromptTemplate()
| 项目 | 内容 |
|---|---|
| 函数 | createPromptTemplate() |
| 行号 | 280-359 |
| PostgREST 操作 | postgrestPost |
| 表名 | prompt_templates |
| 功能 | 创建新的提示词模板 |
| 调用位置 | prompts.new.tsx |
| 建议 | 🔄 改为后端 API |
12.4 更新提示词模板 - updatePromptTemplate()
| 项目 | 内容 |
|---|---|
| 函数 | updatePromptTemplate() |
| 行号 | 360-458 |
| PostgREST 操作 | postgrestPut |
| 表名 | prompt_templates |
| 功能 | 更新提示词模板 |
| 调用位置 | prompts.new.tsx |
| 建议 | 🔄 改为后端 API |
12.5 删除提示词模板 - deletePromptTemplate()
| 项目 | 内容 |
|---|---|
| 函数 | deletePromptTemplate() |
| 行号 | 459-499 |
| PostgREST 操作 | postgrestDelete |
| 表名 | prompt_templates |
| 功能 | 删除提示词模板 |
| 调用位置 | prompts._index.tsx |
| 建议 | 🔄 改为后端 API |
12.6 获取提示词选项列表 - getPromptTemplateOptions()
| 项目 | 内容 |
|---|---|
| 函数 | getPromptTemplateOptions() |
| 行号 | 500+ |
| PostgREST 操作 | postgrestGet |
| 表名 | prompt_templates |
| 功能 | 获取指定类型的模板选项(用于下拉选择) |
| 调用位置 | document-types.new.tsx, rules.new.tsx |
| 建议 | ✅ 保留(简单查询,低优先级) |
13. 合同模板
文件: app/api/contract-template/templates.ts
13.1 获取合同分类 - getContractCategories()
| 项目 | 内容 |
|---|---|
| 函数 | getContractCategories() |
| 行号 | 76-105 |
| PostgREST 操作 | postgrestGet |
| 表名 | contract_categories |
| 功能 | 获取所有合同分类 |
| 调用位置 | 合同模板页面 |
| 建议 | ✅ 保留(简单查询) |
13.2 获取分类及模板数量 - getContractCategoriesWithCount()
| 项目 | 内容 |
|---|---|
| 函数 | getContractCategoriesWithCount() |
| 行号 | 106-169 |
| PostgREST 操作 | postgrestGet × 多次 |
| 表名 | contract_categories + contract_templates |
| 功能 | 获取分类并统计每个分类的模板数量 |
| 调用位置 | contract-template.list._index.tsx, contract-template.search._index.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:多次查询
1. postgrestGet('contract_categories', ...) // 获取所有分类
2. 对每个分类:postgrestGet('contract_templates', { filter: { category_id } })
3. 前端统计数量
建议后端 API:
GET /api/contract-templates/categories-with-count
Response: {
categories: [
{ id, name, count: 10 }
]
}
优点:
- ✅ 一次查询获取所有数据(使用 SQL JOIN + COUNT)
- ✅ 大幅提升性能
13.3 获取合同模板列表 - getContractTemplates()
| 项目 | 内容 |
|---|---|
| 函数 | getContractTemplates() |
| 行号 | 170-311 |
| PostgREST 操作 | postgrestGet × 2 |
| 表名 | contract_categories + contract_templates |
| 功能 | 获取合同模板列表(支持分页、筛选、关键词搜索) |
| 调用位置 | contract-template.list._index.tsx, contract-template.search.results.tsx |
| 建议 | 🔄 改为后端 API |
详细说明:
// 当前实现:复杂的 OR 条件查询
1. 如果有关键词:postgrestGet('contract_categories', { filter: { name: 'ilike.*关键词*' } })
2. postgrestGet('contract_templates', {
select: `..., contract_categories!fk_contract_templates_category(...)`, // 资源嵌入
or: `(title.ilike.*关键词*,description.ilike.*关键词*,template_code.ilike.*关键词*)` // OR 查询
})
建议后端 API:
GET /api/contract-templates?page={p}&pageSize={ps}&category={c}&format={f}&keyword={k}&featured={f}
Response: {
templates: [...],
total: 100
}
优点:
- ✅ 简化复杂的 OR 条件查询
- ✅ 后端优化全文搜索
- ✅ 支持更高级的搜索功能
13.4 获取单个合同模板 - getContractTemplate()
| 项目 | 内容 |
|---|---|
| 函数 | getContractTemplate() |
| 行号 | 312-346 |
| PostgREST 操作 | postgrestGet |
| 表名 | contract_templates |
| 功能 | 获取单个合同模板详情 |
| 调用位置 | contract-template.detail.$id.tsx |
| 建议 | ✅ 保留(简单查询) |
13.5 搜索合同模板 - searchContractTemplates()
| 项目 | 内容 |
|---|---|
| 函数 | searchContractTemplates() |
| 行号 | 380+ |
| PostgREST 操作 | 内部调用 getContractTemplates() |
| 功能 | 搜索合同模板(封装函数) |
| 调用位置 | contract-template.search.results.tsx |
| 建议 | 🔄 改为后端 API(随 getContractTemplates 一起) |
汇总统计
按建议分类
| 建议 | 数量 | 占比 |
|---|---|---|
| 🔄 强烈建议改为后端 API | 32 | 53% |
| 🔒 必须保留(评查点详情) | 17 | 28% |
| ✅ 保留 PostgREST | 8 | 13% |
| ⚠️ 建议评估 | 3 | 5% |
| 总计 | 60 | 100% |
按模块分类
| 模块 | 🔄 改为 API | 🔒 必须保留 | ✅ 保留 | ⚠️ 评估 | 小计 |
|---|---|---|---|---|---|
| 认证服务 | 2 | 0 | 0 | 0 | 2 |
| 首页与统计 | 1 | 0 | 0 | 0 | 1 |
| 文档管理 | 4 | 0 | 0 | 0 | 4 |
| 文件上传 | 2 | 0 | 1 | 1 | 4 |
| 评查点管理 | 1 | 9 | 0 | 0 | 10 |
| 评查点分组 | 0 | 7 | 0 | 0 | 7 |
| 评查文件审核 | 1 | 0 | 0 | 0 | 1 |
| 评审结果 | 3 | 0 | 0 | 0 | 3 |
| 文档类型 | 5 | 2 | 0 | 2 | 9 |
| 入口模块 | 4 | 0 | 1 | 0 | 5 |
| 交叉评查 | 3 | 0 | 0 | 0 | 3 |
| 提示词模板 | 4 | 0 | 2 | 0 | 6 |
| 合同模板 | 3 | 0 | 2 | 0 | 5 |
| 总计 | 32 | 17 | 8 | 3 | 60 |
优先级建议
🔥 高优先级(建议立即改为后端 API)
-
评审结果模块 -
getReviewPoints()+updateReviewResult()- 理由:涉及 6 表关联查询,性能影响大
-
文档管理模块 -
getDocument()+updateDocument()+deleteDocument()- 理由:核心业务,使用频繁
-
文档状态查询 -
getDocumentsStatus()- 理由:轮询操作,频繁调用
-
合同模板列表 -
getContractCategoriesWithCount()+getContractTemplates()- 理由:多次查询,性能优化空间大
-
认证服务 -
saveUserInfo()+addDefaultRole()- 理由:安全性考虑,不应前端直接操作用户表
⚡ 中优先级
-
评查点列表 -
getRulesList()- 理由:复杂的资源嵌入查询
-
文档类型管理 - CRUD 操作
- 理由:涉及关联数据处理
-
入口模块管理 - CRUD 操作
- 理由:涉及 JSONB 查询
-
提示词模板管理 - CRUD 操作
- 理由:资源嵌入查询
🔽 低优先级
- 简单查询操作
- 理由:性能影响小,可后续优化
建议的实施步骤
- Phase 1: 高优先级模块(1-5)
- Phase 2: 中优先级模块(6-9)
- Phase 3: 低优先级模块(10)
每个 Phase 预计耗时:
- Phase 1: 2-3 周
- Phase 2: 2 周
- Phase 3: 1 周
注意: 评查点详情相关的 17 个函数必须保留 PostgREST,不应改为后端 API。