Commit Graph

68 Commits

Author SHA1 Message Date
TanWenyan bd3b6de9cd debug(evaluation-groups): 添加 getEvaluationPointGroups 调试日志
## 修改内容

在 getEvaluationPointGroups 函数中添加详细的调试日志,用于排查数据获取问题:

### 新增调试日志
- 📦 打印完整 API 响应
- 📊 打印 response.data 和 response.data.data
-  错误日志增强
-  转换成功后打印结果

### 日志输出点
1. API 响应完整数据
2. response.data 检查
3. response.data.data 存在性验证
4. 数据转换后的 ruleGroups
5. 错误捕获和详细错误信息

### 目的
帮助诊断以下问题:
- 后端返回数据格式是否正确
- response.data.data 是否存在
- 数据转换是否成功
- 前端为什么没有显示数据

### 文件
- app/api/evaluation_points/rule-groups.ts:1207-1225

⚠️ 注意:这是临时调试日志,问题解决后应该移除或注释掉
2025-11-26 10:23:01 +08:00
TanWenyan e7646d17a6 fix(evaluation-groups): 修复一级分组显示错误和 React key 警告
## 修复内容

### 1. 修复一级分组过滤问题
- **问题**: getEvaluationPointGroups 函数忽略了 pid 参数,导致返回所有分组(包括二级分组)
- **修复**: 添加 pid 参数处理逻辑,支持传递 "null" 字符串来查询一级分组
- **文件**: app/api/evaluation_points/rule-groups.ts:1186-1198

### 2. 修复 React key 重复警告
- **问题**: 父分组和子分组可能有相同的 ID,导致 "Encountered two children with the same key" 警告
- **修复**: 将 rowKey 从简单的 "id" 改为根据 isParent 生成唯一 key
- **文件**: app/routes/rule-groups._index.tsx:817

### 3. 新增后端 API 规范文档
- **文件**: docs/evaluation/evaluation_point_groups_backend_api_spec.md
- **内容**:
  - 完整的 9 个 FastAPI v3 接口规范
  - Python Pydantic 模型定义
  - TypeScript 接口定义
  - pid 参数处理说明(字符串 "null" 转换为 None)
  - 10 个完整测试用例
  - 数据库表结构建议

## 技术细节

**pid 参数处理**:
```typescript
// 前端发送
GET /api/v3/evaluation-point-groups?pid=null&page=1

// 后端需要识别字符串 "null" 并转换为 None/NULL
if (pid == "null") {
  query = query.filter(EvaluationPointGroup.pid.is_(None))
}
```

**唯一 key 生成**:
```typescript
rowKey={(record) => record.isParent ? `parent-${record.id}` : `child-${record.id}`}
```

🔗 相关文档: docs/evaluation/evaluation_point_groups_backend_api_spec.md
2025-11-26 10:05:39 +08:00
TanWenyan d1f764028c Merge branch 'shiy-login' into Wren 2025-11-25 20:59:59 +08:00
TanWenyan 0e812ba181 fix(rule-groups): 修复 getChildGroups 函数使用 FastAPI v3 接口
问题:
- getChildGroups 函数内部仍在调用已重命名的 getRuleGroups 函数
- 导致运行时错误:"getRuleGroups is not defined"
- 影响子分组加载功能

修复:
- 更新 getChildGroups 使用 FastAPI v3 的 getEvaluationPointGroupChildren
- 删除手动统计评查点数量的代码(FastAPI v3 接口已返回 rule_count)
- 简化函数逻辑,直接返回接口数据

影响范围:
- app/api/evaluation_points/rule-groups.ts (getChildGroups 函数)

功能:
- 获取子分组列表及评查点数量

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 20:39:11 +08:00
TanWenyan dbc9512c8b refactor(rule-groups): 替换创建/编辑页面为 FastAPI v3 接口
变更内容:
1. 补充重命名 getRuleGroup → getRuleGroup_legacy (rule-groups.ts)
2. 更新导入语句,使用新的 FastAPI v3 函数 (rule-groups.new.tsx)
3. 替换所有函数调用:
   - getRuleGroups → getEvaluationPointGroups (2处)
   - getRuleGroup → getEvaluationPointGroup
   - createRuleGroup → createEvaluationPointGroup
   - updateRuleGroup → updateEvaluationPointGroup

影响范围:
- app/api/evaluation_points/rule-groups.ts (补充遗漏的重命名)
- app/routes/rule-groups.new.tsx (创建/编辑页面)

功能:
- 分组创建、编辑、编码唯一性验证

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 20:20:52 +08:00
TanWenyan ccb33e9b11 refactor(rule-groups): 重命名旧 PostgREST 函数为 _legacy 后缀
重命名函数(保留作为备份):
1. getRuleGroups → getRuleGroups_legacy
2. getAllRuleGroups → getAllRuleGroups_legacy
3. createRuleGroup → createRuleGroup_legacy
4. updateRuleGroup → updateRuleGroup_legacy
5. deleteRuleGroup → deleteRuleGroup_legacy
6. batchUpdateRuleGroupStatus → batchUpdateRuleGroupStatus_legacy
7. batchDeleteRuleGroups → batchDeleteRuleGroups_legacy

变更:
- 所有旧函数添加 _legacy 后缀
- 添加 @deprecated 注释指向新的 FastAPI v3 函数
- 保留旧函数作为备份,不删除

目的:
- 为过渡到 FastAPI v3 接口做准备
- 保留旧代码以便回滚

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 20:14:53 +08:00
TanWenyan d5a7674a9a feat(rule-groups): 添加 FastAPI v3 评查点分组接口函数
新增功能:
- 添加 9 个 FastAPI v3 接口函数到 rule-groups.ts
- 导入 apiRequest 用于调用后端 API

接口列表:
1. getEvaluationPointGroups - 获取一级分组列表 (GET /api/v3/evaluation-point-groups)
2. getAllEvaluationPointGroups - 获取树形结构 (GET /api/v3/evaluation-point-groups/all)
3. getEvaluationPointGroup - 获取单个分组详情 (GET /api/v3/evaluation-point-groups/{id})
4. getEvaluationPointGroupChildren - 获取子分组列表 (GET /api/v3/evaluation-point-groups/{parent_id}/children)
5. createEvaluationPointGroup - 创建分组 (POST /api/v3/evaluation-point-groups)
6. updateEvaluationPointGroup - 更新分组 (PUT /api/v3/evaluation-point-groups/{id})
7. deleteEvaluationPointGroup - 删除分组 (DELETE /api/v3/evaluation-point-groups/{id})
8. batchUpdateEvaluationPointGroupStatus - 批量更新状态 (PATCH /api/v3/evaluation-point-groups/batch/status)
9. batchDeleteEvaluationPointGroups - 批量删除 (DELETE /api/v3/evaluation-point-groups/batch)

技术细节:
- 新增 EvaluationPointGroupResponse 接口定义响应格式
- 新增 convertApiGroupToRuleGroup 转换函数
- 所有函数支持 JWT token 认证
- 统一的错误处理和日志输出
- 保留旧的 PostgREST 函数作为备份

相关文档:
- docs/evaluation/evaluation_point_groups.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 20:10:30 +08:00
LiangShiyong ff0a99cbb4 Merge branch 'Wren' into shiy-login 2025-11-25 18:24:28 +08:00
TanWenyan 02a76a0916 feat(evaluation): 优化前端映射逻辑并修复 documentTypeIds 筛选
主要变更:
1.  修复 getRuleTypes 函数的 documentTypeIds 筛选逻辑
   - 添加参数验证:如果未提供 documentTypeIds,返回空数组
   - 添加 PostgREST 过滤条件:id in (documentTypeIds)
   - 确保评查点类型下拉框只显示会话存储中的文档类型关联的评查点类型

2.  简化 getRulesList 的数据映射逻辑
   - 后端已返回 ruleType、groupName、groupId 字段
   - 移除中间 ApiRule 转换步骤,直接映射 EvaluationPointData
   - 代码行数从 35 行减少到 30 行

3.  更新 EvaluationPointData 接口
   - 添加后端新增的 3 个字段:ruleType、groupName、groupId
   - 与后端 Schema 保持一致

技术细节:
- 保留评查点编码清洗逻辑(移除最后的 '--' 后缀)
- 保留风险等级到优先级的映射
- 保留日期格式化处理

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 17:56:19 +08:00
TanWenyan 4b9d9868c2 feat(evaluation): 将评查点 CRUD 操作从 PostgREST 迁移到 FastAPI
完成评查点管理的完整 API 迁移:
-  createEvaluationPoint: POST /api/v3/evaluation-points
-  updateEvaluationPoint: PUT /api/v3/evaluation-points/{id}
-  getEvaluationPoint: GET /api/v3/evaluation-points/{id}
-  deleteRule: DELETE /api/v3/evaluation-points/{id}
-  getRulesList: GET /api/v3/evaluation-points (带查询参数)

主要变更:
1. 将所有 postgrest* 函数调用替换为 apiRequest (axios-client)
2. 从 PostgREST 查询参数格式迁移到 REST API 路径格式
3. 简化响应处理逻辑 (FastAPI 返回清晰的 JSON)
4. 修复类型定义 (ApiRule 接口字段可选化)
5. 移除复杂的 PostgREST 嵌套查询逻辑

技术细节:
- 删除函数返回类型改为 {success: boolean, message: string}
- getRulesList 从 226 行简化到 122 行
- 所有接口统一使用 JWT Bearer 认证
- 响应格式:{data: T[], total: number, page: number, page_size: number}

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 17:39:02 +08:00
TanWenyan a0611a3a13 fix(evaluation): 修复 PostgREST endpoint 格式错误导致 404
## 问题描述
更新或获取评查点时出现 404 错误:
- GET http://172.16.0.55:8073/evaluation_points/736 (404 Not Found)
- 用户报告"删除失败"

## 根本原因
`getRule` 和 `updateRule` 函数使用了错误的 PostgREST endpoint 格式:
-  错误:`evaluation_points/${id}` (REST风格路径)
-  正确:`evaluation_points?id=eq.${id}` (PostgREST查询参数)

PostgREST **不支持** `/resource/{id}` 风格的路径参数,
必须使用查询参数格式:`/resource?id=eq.{id}`

## 修复内容

### getRule 函数 (line 416-470)
- 更新endpoint从 `evaluation_points/${id}` 为 `'evaluation_points'`
- 添加 `filter: { 'id': \`eq.${id}\` }` 到 PostgrestParams
- 更新响应数据处理逻辑,支持数组和包装对象两种格式
- 改进错误处理,返回404而不是500

### updateRule 函数 (line 728-754)
- 更新endpoint从 `evaluation_points/${id}` 为 `'evaluation_points'`
- 添加filter参数:`{ id: parseInt(id) }` 到 `postgrestPut` 第三个参数
- 更新响应数据处理逻辑,支持数组和包装对象两种格式
- 修复数据映射,使用 `updatedRule` 而不是 `response.data.data`

## 技术说明
PostgREST 标准查询语法:
- 单条记录查询:`GET /table?id=eq.123`
- 更新操作:`PATCH /table?id=eq.123` + body
- 不支持:`GET /table/123` 或 `PATCH /table/123`

## 测试建议
1. 刷新浏览器页面(Ctrl+F5)
2. 尝试编辑评查点并保存
3. 检查控制台不再出现404错误
4. 验证更新成功并正确返回数据
2025-11-25 16:38:07 +08:00
TanWenyan 0499a3f0e5 fix(evaluation): 修复 updateEvaluationPoint 返回数据格式判断问题
## 问题描述
更新评查点时出现"更新评查点失败:返回数据格式不正确"错误

## 根本原因
- updateEvaluationPoint 和 createEvaluationPoint 对返回数据的格式判断过于严格
- 当 PostgREST 返回空数组时,代码没有正确处理

## 解决方案

### updateEvaluationPoint
- 添加详细的调试日志,记录返回数据的类型和格式
- 当返回空数组时,尝试重新获取数据(因为更新可能已成功)
- 改进错误消息,提供更明确的错误提示

### createEvaluationPoint
- 添加相同的调试日志
- 当返回空数组时,提供明确的错误消息并建议刷新页面
- 改进数据格式判断逻辑

## 技术改进
- 分层处理数组格式:有数据、空数组、非数组
- 空数组情况下的降级处理(update 重新获取,create 提示刷新)
- 保留所有调试日志便于问题诊断

## 测试建议
请在控制台查看日志输出,确认 PostgREST 返回的实际数据格式
2025-11-25 16:15:27 +08:00
TanWenyan f5a5887651 feat(evaluation): 完成评查点完整CRUD接口对接
## 主要变更

### API层 (app/api/evaluation_points/rules.ts)
- 新增 `EvaluationPointData` 接口,支持完整评查点数据结构
- 新增 `createEvaluationPoint` 函数,用于创建评查点
- 新增 `updateEvaluationPoint` 函数,用于更新评查点
- 新增 `getEvaluationPoint` 函数,用于获取完整评查点数据
- 重命名原 `getEvaluationPoint` 为 `getFormattedEvaluationPoint`,避免命名冲突
- 修复 `postgrestPut` 调用的类型参数问题

### 前端页面 (app/routes/rules.new.tsx)
- 更新 `fetchEvaluationPoint` 函数,使用新的 `getEvaluationPoint` API
- 更新 `handleSave` 函数,使用 `createEvaluationPoint` 和 `updateEvaluationPoint` API
- 添加 `postgrestGet` 导入,支持评查点组数据获取
- 优化错误处理逻辑,统一使用新API响应格式
- 修复类型转换问题,正确处理 `EvaluationPointData` 和 `EvaluationPoint` 类型

## 技术改进
- 替代直接调用 `postgrestPost`/`postgrestPut`,使用封装的API函数
- 统一错误处理和响应格式
- 保留 `extractApiData` 辅助函数用于评查点组数据处理
- 所有变更通过 TypeScript 类型检查

## 相关文档
参考 docs/evaluation/evaluation_points.md 中的 FastAPI 接口定义
2025-11-25 14:55:42 +08:00
TanWenyan fda49b1541 feat(evaluation): 模块2.5 - 新增评查点批量操作接口
功能变更:
1. 新增 batchUpdateRuleStatus 函数
   - 支持批量启用/禁用评查点
   - 逐个验证评查点ID有效性
   - 使用增强的 updateRule 函数确保数据完整性
   - 支持部分成功场景
   - 返回详细的操作结果:
     * success: 是否全部成功
     * updated_count: 成功更新数量
     * failed_ids: 失败的ID列表
     * errors: 详细错误信息(包含每个失败ID的错误原因)

2. 新增 batchDeleteRules 函数
   - 支持批量删除评查点
   - 使用增强的 deleteRule 函数(自动包含关联检查)
   - 逐个验证每个评查点的删除条件:
     * ID存在性
     * 关联评查结果检查
   - 支持部分成功场景
   - 返回详细的操作结果:
     * success: 是否全部成功
     * deleted_count: 成功删除数量
     * failed_ids: 失败的ID列表
     * errors: 详细错误信息(包含每个失败ID的错误原因)

技术实现:
- 复用增强的 getRule, updateRule, deleteRule 函数
- 继承所有单个操作的验证逻辑
- Try-catch 确保单个失败不影响整体流程
- 详细的错误追踪和报告
- 类型安全的返回值结构

安全性保障:
- 批量删除时自动检查每个评查点的关联评查结果
- 如果评查点已被使用,阻止删除并记录错误
- 防止误删除造成数据不一致
- 提供清晰的失败原因帮助用户理解和处理

验收标准:
 支持批量启用/禁用评查点
 支持批量删除评查点
 返回更新/删除成功数量
 返回失败的ID列表
 提供详细的错误信息
 支持部分成功场景
 批量删除包含关联检查
 类型安全的API设计

符合实施计划:
- 阶段 2.5:评查点批量操作接口对接 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:28:45 +08:00
TanWenyan 92e1ff0f8b feat(evaluation): 模块2.3+2.4 - 验证复制功能和增强删除接口关联检查
模块 2.3 - 评查点复制功能验证:
 duplicateRule 函数验证完成
   - 复制时自动添加 "-COPY" 后缀和 "(复制)" 标记
   - 依赖增强后的 createRule 进行完整验证
   - 自动继承所有验证规则(编码唯一性、格式检查、分组验证等)
   - 如果编码已存在会返回清晰错误提示

模块 2.4 - 评查点删除接口增强:
1. 增强 deleteRule 函数
   - 添加评查点ID存在性验证
   - 添加关联评查结果检查(evaluation_results 表)
   - 如果评查点已被使用,阻止删除并提示使用禁用功能
   - 优雅处理表不存在的情况(向后兼容)
   - 限制查询数量(limit:1)提高性能

2. 安全性增强
   - 防止删除已使用的评查点,保护数据完整性
   - 提供清晰的错误提示和替代方案建议
   - 404 状态码表示评查点不存在
   - 400 状态码表示评查点已被使用

技术实现:
- 使用 getRule 验证 ID 有效性
- 使用 PostgREST 查询关联记录(limit:1优化)
- 处理不同端口API响应格式差异
- Try-catch 优雅处理表不存在场景

验收标准:
 复制功能正确生成唯一编码
 复制功能继承完整验证逻辑
 删除前检查评查点存在性
 删除前检查关联评查结果
 提供清晰的错误提示
 建议使用禁用功能代替删除

符合实施计划:
- 阶段 2.3:评查点复制功能对接 
- 阶段 2.4:评查点删除接口对接 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:26:52 +08:00
TanWenyan 371846c5ad feat(evaluation): 模块2.2 - 增强评查点创建/更新接口验证逻辑
功能变更:
1. 增强 createRule 函数
   - 添加必填字段验证(name, code)
   - 验证名称长度(1-100字符)
   - 验证编码格式(仅允许字母、数字、连字符和下划线)
   - 验证编码唯一性(防止重复)
   - 验证分组ID有效性(检查分组是否存在)
   - 自动trim名称和编码空格
   - 返回详细的错误信息和HTTP状态码

2. 增强 updateRule 函数
   - 验证评查点ID有效性(检查评查点是否存在)
   - 验证名称长度(如果提供)
   - 验证编码格式(如果提供)
   - 验证编码唯一性(排除自身,防止与其他评查点冲突)
   - 验证分组ID有效性(如果提供)
   - 自动trim名称和编码空格
   - 支持部分字段更新
   - 返回详细的错误信息和HTTP状态码

技术实现:
- 复用 getRulesList 进行编码唯一性检查
- 复用 getRule 进行ID有效性检查
- 使用 PostgREST 查询验证分组存在性
- 精确匹配防止关键词模糊搜索误判
- 统一错误处理和状态码返回

验收标准:
 必填字段验证
 名称长度验证(1-100字符)
 编码格式验证(^[a-zA-Z0-9-_]+$)
 编码唯一性验证
 分组ID有效性验证
 更新时ID存在性验证
 更新时编码唯一性验证(排除自身)
 支持部分字段更新
 返回清晰的错误提示

符合实施计划:
- 阶段 2.2:评查点创建/更新接口对接 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:24:32 +08:00
TanWenyan aaa4046c41 feat(evaluation): 模块2.1 - 增强评查点查询接口和新增统计接口
功能变更:
1. 增强 getRulesList 函数
   - 添加风险等级筛选参数 (risk: '高' | '中' | '低')
   - 支持按风险等级精确筛选评查点
   - 保持现有分页、关键词搜索、分组筛选等功能

2. 新增 getRuleStatistics 函数
   - 返回评查点总数 (total_count)
   - 返回启用/禁用数量 (enabled_count, disabled_count)
   - 返回按风险等级分组统计 (by_risk: {low, medium, high})
   - 返回按规则组分组统计 (by_group: [{group_id, group_name, count}])
   - 规则组统计按数量降序排序

技术实现:
- 使用 PostgREST 客户端进行数据查询
- 处理不同端口API响应格式差异
- Map数据结构优化分组统计性能
- 批量查询规则组名称避免N+1查询问题

符合实施计划:
- 阶段 2.1:评查点查询接口对接 
- 所有验收标准已满足

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:21:44 +08:00
TanWenyan 7f1a05107f feat(evaluation): 模块1.4 - 新增评查点分组批量操作接口
## 主要改进

### 1. 新增 batchUpdateRuleGroupStatus 函数(批量启用/禁用)
-  参数验证(ID列表不为空,每个ID有效)
-  逐个验证分组存在性
-  逐个执行更新操作
-  返回详细的操作结果
  - updated_count: 成功更新的数量
  - failed_ids: 失败的ID列表
  - errors: 详细的错误信息(包含ID和错误原因)

### 2. 新增 batchDeleteRuleGroups 函数(批量删除)
-  参数验证(ID列表不为空,每个ID有效)
-  采用安全的阻止删除策略
-  逐个检查并删除分组
-  返回详细的操作结果和错误信息
  - deleted_count: 成功删除的数量
  - failed_ids: 失败的ID列表
  - errors: 详细的错误信息(包含子分组/评查点检查结果)

### 3. 批量操作特性
-  **逐个处理**:确保每个分组都能被正确处理
-  **部分成功支持**:即使部分分组操作失败,成功的也会被处理
-  **详细的错误追踪**:记录每个失败的ID及其失败原因
-  **安全性优先**:批量删除继承单个删除的安全检查

### 4. 返回值结构

```typescript
// 批量更新状态
{
  success: boolean;          // 是否全部成功
  updated_count: number;     // 成功更新的数量
  failed_ids: string[];      // 失败的ID列表
  errors?: Array<{           // 详细错误(可选)
    id: string;
    error: string;
  }>;
}

// 批量删除
{
  success: boolean;          // 是否全部成功
  deleted_count: number;     // 成功删除的数量
  failed_ids: string[];      // 失败的ID列表
  errors?: Array<{           // 详细错误(可选)
    id: string;
    error: string;
    details?: {              // 删除失败详情
      hasChildren?: boolean;
      hasPoints?: boolean;
    };
  }>;
}
```

## 使用示例

### 批量启用分组
```typescript
const result = await batchUpdateRuleGroupStatus(
  ['1', '2', '3'],
  true,
  token
);

if (result.success) {
  console.log(`成功启用 ${result.updated_count} 个分组`);
} else {
  console.log(`成功 ${result.updated_count} 个,失败 ${result.failed_ids.length} 个`);
  result.errors?.forEach(err => {
    console.log(`分组 ${err.id}: ${err.error}`);
  });
}
```

### 批量删除分组
```typescript
const result = await batchDeleteRuleGroups(['1', '2'], token);

if (result.success) {
  console.log(`成功删除 ${result.deleted_count} 个分组`);
} else {
  result.errors?.forEach(err => {
    if (err.details?.hasChildren) {
      console.log(`分组 ${err.id} 有子分组,无法删除`);
    }
    if (err.details?.hasPoints) {
      console.log(`分组 ${err.id} 有评查点,无法删除`);
    }
  });
}
```

## 相关文件
- app/api/evaluation_points/rule-groups.ts

## 验收清单
- [x] TypeScript 类型检查通过
- [x] 完整的参数验证
- [x] 支持部分成功场景
- [x] 详细的错误追踪
- [x] 安全的删除策略

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:16:46 +08:00
TanWenyan 89b1d2e5f5 feat(evaluation): 模块1.3 - 增强评查点分组删除接口安全性
## 主要改进

### 1. 删除策略优化(从级联删除改为阻止删除)
-  **安全优先**:采用阻止删除策略而非级联删除
-  删除前检查子分组,如有则拒绝删除
-  删除前检查关联评查点,如有则拒绝删除
-  只有空分组才能被删除

### 2. 详细的删除检查
-  ID有效性验证
-  分组存在性验证
-  子分组检查(仅一级分组)
-  评查点关联检查(所有分组)
-  返回详细的检查结果(childCount, pointCount)

### 3. 友好的错误提示
-  明确提示存在多少个子分组
-  明确提示存在多少个评查点
-  建议用户先清理关联数据
-  区分不同类型的删除失败原因

### 4. 标记废弃函数
-  deleteChildGroup 标记为 @deprecated
-  deleteEvaluationPointsByGroupId 标记为 @deprecated
-  保留代码以备将来批量删除功能使用

## 删除策略对比

### 旧策略(级联删除)- 高风险
 删除一级分组时自动删除所有子分组
 自动删除所有关联的评查点
 用户可能误删大量数据
 无法恢复

### 新策略(阻止删除)- 安全
 拒绝删除有子分组的一级分组
 拒绝删除有评查点的分组
 用户必须手动清理关联数据
 防止误删除
 提供清晰的错误提示

## 返回值增强

```typescript
{
  success: boolean;
  error?: string;
  details?: {
    hasChildren: boolean;  // 是否有子分组
    hasPoints: boolean;    // 是否有评查点
    childCount?: number;   // 子分组数量
    pointCount?: number;   // 评查点数量
  }
}
```

## 相关文件
- app/api/evaluation_points/rule-groups.ts

## 验收清单
- [x] TypeScript 类型检查通过
- [x] 删除前完整的关联检查
- [x] 阻止删除有依赖的分组
- [x] 详细的错误提示
- [x] 返回详细的检查结果

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:13:57 +08:00
TanWenyan e148fca429 feat(evaluation): 模块1.2 - 增强评查点分组创建/更新接口验证
## 主要改进

### 1. 增强 createRuleGroup 函数
-  名称长度验证(1-100字符)
-  编码格式验证(只允许字母、数字、连字符、下划线)
-  编码长度验证(1-50字符)
-  编码唯一性验证(查询数据库确保不重复)
-  父级ID存在性验证(二级分组必须有有效的父级)
-  三级分组防护(不允许在二级分组下创建子分组)
-  数据库约束错误友好提示

### 2. 增强 updateRuleGroup 函数
-  ID有效性验证(检查分组是否存在)
-  名称长度验证(1-100字符)
-  编码格式验证(只允许字母、数字、连字符、下划线)
-  编码长度验证(1-50字符)
-  编码唯一性验证(排除自身)
-  **禁止修改pid**(防止分组层级混乱)
-  数据库约束错误友好提示
-  提供清晰的错误消息

### 3. 类型安全性改进
-  修复所有 TypeScript 类型错误
-  添加类型守卫防止 undefined 访问
-  确保所有返回值类型正确

## 验证规则

### 分组名称
- 必填,不能为空
- 长度:1-100字符
- 自动去除首尾空格

### 分组编码
- 必填,不能为空
- 长度:1-50字符
- 格式:只允许字母、数字、连字符(-)、下划线(_)
- 必须全局唯一
- 自动去除首尾空格

### 父级ID
- 一级分组:pid = null 或 '0'
- 二级分组:pid = 有效的父级分组ID
- 不允许三级分组
- **更新时不允许修改pid**

## 相关文件
- app/api/evaluation_points/rule-groups.ts

## 验收清单
- [x] TypeScript 类型检查通过
- [x] 完整的字段验证
- [x] 编码唯一性验证
- [x] 父级ID验证
- [x] 禁止修改pid
- [x] 友好的错误提示

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:11:12 +08:00
TanWenyan d3b9403d64 feat(evaluation): 模块1.1 - 增强评查点分组查询接口
## 主要改进

### 1. 增强 getRuleGroups 函数
-  添加完整的分页参数支持 (page, pageSize)
-  添加筛选参数 (name, code, is_enabled, pid)
-  添加排序参数 (orderBy, order)
-  返回总数 (totalCount)
-  支持一级分组和二级分组查询

### 2. 优化 getChildGroups 函数
-  内部使用改进后的 getRuleGroups 函数
-  自动添加评查点数量统计
-  改进类型安全性

### 3. 优化 getRuleGroup 函数
-  确保评查点数量统计准确
-  改进错误处理
-  优化类型守卫逻辑

### 4. 类型定义改进
-  新增 RuleGroupQueryParams 接口
-  ApiRuleGroup.pid 类型支持 null
-  修复所有 TypeScript 类型错误

### 5. 创建对接计划文档
-  详细的 API 对接实施计划
-  分模块逐步实施策略
-  验收标准和风险评估

## 相关文件
- app/api/evaluation_points/rule-groups.ts
- docs/evaluation/API对接实施计划.md

## 验收清单
- [x] TypeScript 类型检查通过
- [x] 支持分页、筛选、排序
- [x] 返回评查点数量统计
- [x] 向后兼容现有代码

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:06:48 +08:00
LiangShiyong 0ed6f0aaf4 备份 2025-11-25 11:02:40 +08:00
LiangShiyong 3850d05bdd feat: 1. 将大部分的请求从fetch改成axios方便管理。
2. 给文档类型添加入口模块和相关数据的渲染。并且给文档类型进行功能上的角色权限区分
3. 新增角色权限管理页面
2025-11-20 20:34:31 +08:00
LiangShiyong 6dc9b4e468 feat: 1. 完善文档列表的显示效果,数据对接后端接口返回。
2. 对评查点分组和文档类型的编辑删除新增操作进行限制。
2025-11-20 15:26:11 +08:00
LiangShiyong 2edde8a8ab feat: 1. 完善全局路由的访问权限的验证。 2. 完善接口返回的树形路由结构 3.优化评查点列表的查询,改用表连接的方式,废弃使用数据库的rpc函数,同时进行地区隔离和权限隔离。
4. 删除冗余的评查文件列表。      5.完善上传文档 页面初始化查询数据的时候 查询文件类型(改成动态指定)  6. 添加获取入口模块的查询接口。    7.完善服务端中判断token的有效性,失效则跳转到登录页。
8. 重构layout和sidebar的页面,改成由动态权限路由来渲染对应的菜单栏。       9.重构入口页面,通过动态查询根据不同地区的人返回不同的入口。
2025-11-20 01:35:30 +08:00
LiangShiyong bfe39e45a9 feat: 1. 添加axios全局路由拦截进行自动添加请求jwt。 2.重新整理路由表。 3. 文档列表新增版本差异对比。 4.菜单路由可访问列表通过对接接口返回,添加全局路由检测。
5. 修改统一认证登录和管理员登录是通过接口形式进行,存储返回的accessToken。    6. 修改交叉评查的部分样式
2025-11-18 11:06:24 +08:00
LiangShiyong 34cba4a34f fix: 修复评查点分组的结果保存异常 2025-11-03 09:47:46 +08:00
TanWenyan d11fc54da2 修复文件审核状态更新误报Network Error的问题
问题分析:
- 上传页面等待进度时,前端提示"更新文件审核状态失败:Network Error"
- 实际上后端已成功更新审核状态
- 类似删除会话的问题,API报错但操作实际成功

根本原因:
- axios请求可能因超时/网络波动抛出异常
- postgrestPut捕获错误并返回error
- 前端收到error后显示失败提示
- 但后端实际已成功处理并更新数据库

修复方案:
1. updateDocumentAuditStatus函数优化
   - 添加详细日志记录请求和响应
   - 即使postgrestPut返回error也返回success
   - catch异常也返回success

2. 采用宽容策略的理由
   - 更新审核状态具有幂等性
   - 重复更新不会造成数据问题
   - 下次刷新会显示正确状态
   - 避免误报影响用户体验

现在更新文件审核状态不再误报错误,用户体验更流畅

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 17:51:59 +08:00
LiangShiyong 064f05ffa5 添加根据合同/卷宗的入口进行分类评查点列表,同时区分卷宗添加的分组属于卷宗,合同添加的分组属于合同 2025-10-29 21:01:01 +08:00
LiangShiyong e56d199c3c 添加测试案卷的搜索条件 2025-10-29 18:40:18 +08:00
LiangShiyong 59706b70d0 给所有请求都加上jwt,隐藏生成jwt的secret(放到.env中),隐藏app-secret(放在pm2运行配置文件中,后续直接读取环境配置即可) 2025-10-17 15:28:22 +08:00
LiangShiyong 9a366d042a 优化显示提出意见时显示的已获得分数 2025-07-25 17:23:00 +08:00
LiangShiyong ccd5cdf71e 修复系统概览数据不准确的查询。修复交叉评查意见列表的数量查询。优化全局消息提示的层级。优化提交意见进行局部更新。 2025-07-25 09:49:36 +08:00
LiangShiyong 47664fc0e8 添加jwt验证,添加交叉评查首页加载对接接口,评查任务文档列表对接接口,意见列表对接接口 2025-07-22 14:37:37 +08:00
LiangShiyong 5f7087d3e6 修改reviews.ts 2025-07-21 15:04:28 +08:00
LiangShiyong e7ffbe875e 评查文件列表的查询查看、文档列表的查询查看修改删除都添加了user_id去限制用户操作。 2025-07-21 09:41:20 +08:00
LiangShiyong e4ce41cebe 添加交叉评查任务的文档列表,评查详情的意见列表 2025-07-17 17:48:13 +08:00
LiangShiyong 348128bbe0 添加评查意见的悬浮按钮 2025-07-17 01:16:43 +08:00
LiangShiyong 4843b7bebf 优化交叉评查详情页面 2025-07-16 22:20:02 +08:00
LiangShiyong fff474f46b 添加登录内容,尚未完善,先创建分支 2025-07-14 12:31:43 +08:00
LiangShiyong 87ad3376fe 完善卷宗和合同的数据隔离的效果 2025-06-03 21:06:48 +08:00
LiangShiyong 0397139ad8 添加合同和卷宗数据隔离 2025-06-03 12:16:31 +08:00
LiangShiyong b02978508d 删除所有console.log输出,优化评查结果的表格的显示,添加新的页码获取逻辑 2025-06-02 18:55:00 +08:00
LiangShiyong 1f21c4c2d5 在显示评查点结果中,如果评查点是通过的,只显示通过的那一部分的规则组。如果是不通过,则显示不通过的那部分规则组。 2025-06-01 22:46:18 +08:00
LiangShiyong 529ed8072b 优化评查结果的显示效果 2025-06-01 18:30:39 +08:00
LiangShiyong e9084ad500 优化评查结果显示 2025-05-30 19:48:37 +08:00
LiangShiyong 099d92f9ed 一致性规则渲染效果 2025-05-29 18:31:33 +08:00
LiangShiyong 2ff60421aa 修改评查点结果显示 2025-05-29 12:23:50 +08:00
LiangShiyong 690d369f57 完成智慧法务前端调整20250522,还有登录和主页需要完善 2025-05-27 23:48:28 +08:00
LiangShiyong 742a789244 完善通过评查点的显示优化 2025-05-27 10:05:12 +08:00