Commit Graph

166 Commits

Author SHA1 Message Date
LiangShiyong 88e3d57351 fix:修复大模型对话管理的ant文本框和下拉选择框的样式 2025-12-08 14:21:27 +08:00
TanWenyan 3f5c23123b feat: 添加对话应用选择和知识库切换功能
- 新增对话应用管理模块(dify-chat-apps),支持获取和切换对话应用
- 优化对话应用切换后自动刷新会话列表功能
- 知识库管理页面新增下拉选择器,支持切换不同知识库
- API 层支持 app_id 参数传递,实现多应用会话隔离

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 01:44:34 +08:00
TanWenyan 27aff59152 feat: 添加知识库配置管理功能
新增地区-知识库绑定管理功能,支持增删改查操作
- 添加 V3 API 路由层:area-datasets 相关接口
- 添加 API 客户端:area-datasets.ts
- 添加自定义 Hook:use-area-dataset-config.ts
- 添加管理组件:area-dataset-config.tsx
- 修复路由冲突问题,删除重复的 .ts 路由文件
- 更新 dataset-manager 页面,添加 Tabs 导航

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 23:12:21 +08:00
PingChuan 21bcb1310b Merge remote-tracking branch 'origin/Wren' into PingChuan 2025-12-05 23:37:37 +08:00
PingChuan 7a2a481f44 refertor:使用antdX重构dify聊天渲染组件,到处引用文件 2025-12-05 23:36:12 +08:00
TanWenyan d53742948d feat: 知识库设置页面增加 retrieval_model 检索配置功能
1. 召回测试页面增加 Score 阈值参数配置
2. 知识库设置页面新增检索模型配置:
   - 检索方式 (向量/全文/混合/关键字检索)
   - Reranking 模型 (默认开启,不可关闭)
   - Top K 返回数量
   - Score 阈值 (默认开启,可调节数值)
3. 修复 Dify API 字段名问题 (retrieval_model_dict)
4. 优化数据加载流程,使用详情接口获取完整配置

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 22:07:16 +08:00
LiangShiyong 91b7518c99 feat: 1. 完善起草合同页面的逻辑交互,对接minio的接口操作 2025-12-05 20:17:37 +08:00
LiangShiyong 3d1dbb3f97 all in 2025-12-05 00:09:32 +08:00
LiangShiyong bb3d22eabf Merge branch 'PingChuan' into shiy-login 2025-12-05 00:05:40 +08:00
LiangShiyong 33f10896a0 fix: 1.接入ai_suggestion.
2. 接入合同起草功能。
2025-12-05 00:04:45 +08:00
PingChuan dcdc21b90e feat:新增dify接入知识库时更新文档嵌入参数的功能 2025-12-04 17:47:44 +08:00
LiangShiyong eca98fc540 Merge branch 'PingChuan' into shiy-login
# Conflicts:
#	app/config/api-config.ts
2025-12-03 12:10:21 +08:00
LiangShiyong d88cfc818b feat: 1. 实现一键替换。
2. 优化追加附件和模板上传的样式。
2025-12-03 12:07:56 +08:00
PingChuan a13f3b3635 feat: 完善Dify知识库管理召回测试模块,优化知识库上传文件时的分段配置设置 2025-12-03 12:03:09 +08:00
PingChuan 0f49426a2e feat:完成上传文档时调整嵌入参数模块初版 2025-12-02 22:29:32 +08:00
LiangShiyong 88466b7a8b feat: 1. 完善交叉评查上传创建任务,改成动态加载文档类型。
2. 重新对齐交叉评查的接口。
2025-12-02 10:10:03 +08:00
LiangShiyong c9e0d5abba Merge branch 'PingChuan' into shiy-login 2025-12-01 12:40:22 +08:00
LiangShiyong c43485ec27 fix: 添加交叉评查的案卷类型的查询,动态选择文档类型 2025-12-01 12:36:38 +08:00
PingChuan 0c1b81cfb2 temp:临时备份,完成一半知识库管理模块 2025-12-01 12:33:53 +08:00
PingChuan 754ec2c7b5 feat:完成dify知识库文档基础CRUD模块 2025-11-30 21:28:49 +08:00
LiangShiyong af258fe669 Merge branch 'PingChuan' into shiy-login 2025-11-30 19:33:46 +08:00
LiangShiyong 4fcc92a381 feat: 1. 接入CollaboraViewer选中的高亮效果,清除高亮功能,页面销毁自动清除高亮。
2. 合同模板对比接入monaco editor的效果。
3. 添加交叉评查的案卷类型的数据查询。

fix: 1. 修复文档列表的打开模态框蒙板层显示效果。
2025-11-30 19:33:05 +08:00
PingChuan c94cc00138 feat:前端新增初版知识库管理页面 2025-11-30 19:27:01 +08:00
PingChuan 9614899171 feat:重构dify前端组件以及转发逻辑 2025-11-30 16:24:35 +08:00
LiangShiyong fb67f138dc fix: 1. 全局axios添加formData文件上传的检测,删除Content-Type让axios自动检测。
2. 完善入口模块管理的接口的对接。
3. 完善角色权限管理的接口对接和测试。
4. 完善主页的入口模块的图标的显示和图片的显示。
2025-11-29 19:37:29 +08:00
LiangShiyong 30e100ef3e feat: 1. 本地化思源黑体的字体包并优先使用。
2. 添加权限映射表和全局查看权限的hook,便于路由控制不同权限按钮显示/隐藏。
3. 删除评查点分组的部分旧api方法。
4. 对接评查点分组接口,文档类型接口, 提示词管理接口, 入口模块管理的接口。
5. 优化角色权限管理的接口,完善不用地区的访问权限认证。
6. 优化主页交叉评查和设置的入口样式和布局。
7. 优化评查点分组,评查规则的功能权限校验。
2025-11-29 10:37:35 +08:00
LiangShiyong d5827a2146 fix: 1. 接入入口模块的管理接口,优化样式。
2. 将查看文档评查结果详情对接接口,采用接口的方式进行查询。
2025-11-26 23:37:14 +08:00
TanWenyan e4e1757977 fix: 修复首页统计数据字段映射错误
修正后端API字段名称:
- pass_rate_growth → monthly_pass_rate_growth
- issues_detected → monthly_detected_issues
- issues_growth → monthly_issues_growth

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 18:55:46 +08:00
TanWenyan 1e9e0044ba feat: 角色权限管理v3.0及错误处理优化
1. 角色权限管理升级:
   - 添加路由下展开式API权限管理功能
   - 新增 getRoleRoutesWithPermissions 和 saveRoleApiPermissions API
   - 支持按路由展开/收起查看和勾选权限
   - 过滤"所有权限"选项,只显示具体权限

2. 错误处理优化:
   - 403 无权限错误显示为"无权限访问该资源"
   - 修复评查点分组批量删除显示"成功删除 undefined 个分组"的问题

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 17:04:18 +08:00
TanWenyan 5073090bcb feat: 添加 403 无权限弹窗提示
## 修改内容

在 axios 响应拦截器中添加 403 Forbidden 错误处理:
- 检测到 403 状态码时,显示 toast 警告提示
- 提示信息:"无权限访问该资源"
- 只在客户端环境显示,服务端不显示 toast

## 代码位置
- app/api/axios-client.ts:177-185

## 实现
```typescript
// 🔒 403 无权限错误处理
if (isAxiosError(error) && error.response?.status === 403) {
  console.warn('⚠️ [403 Forbidden] 无权限访问:', error.config?.url);

  // 只在客户端显示 toast 提示
  if (typeof window !== 'undefined') {
    toastService.warning('无权限访问该资源');
  }
}
```

## 用户体验
- 用户访问无权限资源时,右上角显示黄色警告 toast
- toast 自动消失,不阻塞用户操作
- 控制台同时输出警告日志便于调试
2025-11-26 12:13:44 +08:00
TanWenyan da7e565bbb fix(evaluation-groups): 修复 Authorization 头缺失问题
## 问题
GET 和 DELETE 请求在 token 为 undefined 时,传递空对象 `{}` 作为 headers,导致 axios-client 拦截器无法自动添加 Authorization 头。

## 根本原因
```typescript
//  错误写法
headers: token ? { 'Authorization': `Bearer ${token}` } : {}
```
当 token 为 undefined 时,传递的是空对象 `{}`,axios-client 认为已经提供了 headers,就跳过拦截器。

## 修复方案
```typescript
//  正确写法
...(token ? { headers: { 'Authorization': `Bearer ${token}` } } : {})
```
当 token 为 undefined 时,完全不传 headers 参数,让 axios-client 拦截器自动添加。

## 修复的函数
1.  getEvaluationPointGroups (GET)
2.  getAllEvaluationPointGroups (GET)
3.  getEvaluationPointGroup (GET)
4.  getEvaluationPointGroupChildren (GET)
5.  deleteEvaluationPointGroup (DELETE)

## 未修复的函数(无需修复)
- createEvaluationPointGroup (POST) - headers 总是包含 Content-Type
- updateEvaluationPointGroup (PUT) - headers 总是包含 Content-Type
- batchUpdateEvaluationPointGroupStatus (PATCH) - headers 总是包含 Content-Type
- batchDeleteEvaluationPointGroups (DELETE) - headers 总是包含 Content-Type

POST/PUT/PATCH 请求因为总是需要设置 Content-Type,所以 headers 对象总是存在,拦截器会正常工作。

## 影响
修复后,即使 token 参数为 undefined,axios-client 拦截器也能正常添加 Authorization 头。

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

## 相关日志
解决了控制台警告:
⚠️ [apiRequest] 请求缺少 Authorization 头!headers:
2025-11-26 10:37:36 +08:00
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
LiangShiyong 83f8d80e12 合并代码 2025-11-25 20:50:34 +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 fbf741bca9 Merge branch 'Wren' into shiy-login 2025-11-25 18:47:46 +08:00
TanWenyan 87a1bf87e5 fix(axios-client): 修复 code 字段类型判断导致的误报错误
问题:
- axios-client 检查 API 响应中的 code 字段时,没有区分数字类型和字符串类型
- 当后端返回包含业务编码字段 code: "05PZSYTZSNRYZX" 的数据时,被误判为错误响应
- 导致 GET /api/v3/evaluation-points/:id 等接口报"API请求失败: 未知错误"

解决方案:
- 添加 typeof data.code === 'number' 类型检查
- 只有数字类型的 code 才被视为 API 状态码(0 或 200)
- 字符串类型的 code 被视为业务数据字段,不触发错误检查

影响范围:
- 所有返回包含字符串 code 字段的 API 响应
- 特别是评查点相关接口(code 是评查点编码)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 18:36:15 +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