From 92e1ff0f8b2ede2e44ce7d3197e7cb6f8307c438 Mon Sep 17 00:00:00 2001 From: Wenyan Date: Tue, 25 Nov 2025 12:26:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(evaluation):=20=E6=A8=A1=E5=9D=972.3+2.4?= =?UTF-8?q?=20-=20=E9=AA=8C=E8=AF=81=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=92=8C=E5=A2=9E=E5=BC=BA=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=85=B3=E8=81=94=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模块 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 --- app/api/evaluation_points/rules.ts | 44 +++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/app/api/evaluation_points/rules.ts b/app/api/evaluation_points/rules.ts index 5db0c44..29eb3a7 100644 --- a/app/api/evaluation_points/rules.ts +++ b/app/api/evaluation_points/rules.ts @@ -745,9 +745,45 @@ export async function updateRule(id: string, ruleData: Partial { try { - // console.log(`开始删除评查点, ID: ${id}`); - - // 使用 PostgREST 语法,通过查询参数指定要删除的行 + // 1. 验证评查点是否存在 + const existingRuleResponse = await getRule(id, token); + if (existingRuleResponse.error || !existingRuleResponse.data) { + return { error: '评查点不存在', status: 404 }; + } + + // 2. 检查是否有关联的评查结果 + // 注意:这里假设存在 evaluation_results 表,如果不存在可以跳过此检查 + try { + const resultsParams: PostgrestParams = { + select: 'id', + filter: { + 'evaluation_point_id': `eq.${id}` + }, + limit: 1, // 只需要知道是否存在,不需要全部 + token + }; + + const resultsResponse = await postgrestGet<{code: number; msg: string; data: Array<{id: number}>}>('evaluation_results', resultsParams); + + let hasResults = false; + if (resultsResponse.data && 'code' in resultsResponse.data && resultsResponse.data.data) { + hasResults = Array.isArray(resultsResponse.data.data) && resultsResponse.data.data.length > 0; + } else if (Array.isArray(resultsResponse.data)) { + hasResults = resultsResponse.data.length > 0; + } + + if (hasResults) { + return { + error: '该评查点已被使用,无法删除。如需停用,请使用禁用功能。', + status: 400 + }; + } + } catch (error) { + // 如果 evaluation_results 表不存在,忽略此错误并继续删除 + console.warn('检查评查结果关联时出错(表可能不存在):', error); + } + + // 3. 使用 PostgREST 语法,通过查询参数指定要删除的行 const postgrestParams: PostgrestParams = { filter: { 'id': `eq.${id}` @@ -757,7 +793,7 @@ export async function deleteRule(id: string, token?: string): Promise<{data: Rul }, token }; - + // 使用postgrestDelete删除评查点 const response = await postgrestDelete('evaluation_points', postgrestParams);