# 实现方案 ## 修改文件 - `src/pages/ReportEditor.tsx` ## 修改位置:`handleAIGenerate` 函数(约 line 860-950) ### 修改 1:自动修正目标区域 在获取 `targetRegionEl` 之前,增加自动修正逻辑:如果修改模式开启且未选定区域,自动选择文档中的第一个 AI 区域。 **原代码**(line 877): ```tsx const targetRegionEl = editorRef.current?.querySelector(`.ai-region[data-ai-id="${aiTargetRegion}"] .ai-content`) as HTMLElement | null; ``` **新代码**: ```tsx let actualTargetId = aiTargetRegion; if (aiModifyEnabled && actualTargetId === 'none') { const availableRegions = checkAiRegions(); if (availableRegions.length > 0) { actualTargetId = availableRegions[0].id; setAiTargetRegion(actualTargetId); } } const targetRegionEl = editorRef.current?.querySelector(`.ai-region[data-ai-id="${actualTargetId}"] .ai-content`) as HTMLElement | null; ``` **变更点**: 1. 引入 `actualTargetId` 变量,初始值为 `aiTargetRegion` 2. 若 `aiModifyEnabled` 为 true 且 `actualTargetId === 'none'`,调用 `checkAiRegions()` 获取可用区域列表 3. 若有可用区域,将 `actualTargetId` 设为第一个区域的 id,并同步更新 React state(`setAiTargetRegion`) 4. 后续所有依赖目标区域 ID 的地方(querySelector、diffModal targetId)均使用 `actualTargetId` ### 修改 2:优化 systemPrompt 文案 **原代码**(line 897-899): ```tsx const systemPrompt = aiModifyEnabled ? '你是一名专业的外科医生助理。我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】,直接重写或生成目标区域的 HTML。\n重要指令:你必须严格返回合法的 JSON 对象,绝对不要包含任何 Markdown 标记(如 ```json)。\nJSON 格式如下:\n{ "reply": "简短的回复话术", "updatedHtml": "修改后的完整内部 HTML 代码" }' : '你是一名专业的外科医生助理。请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令:严格返回合法的 JSON 对象。\nJSON 格式如下:\n{ "reply": "你的分析和回答" }'; ``` **新代码**: ```tsx const systemPrompt = aiModifyEnabled ? '你是一名专业的外科医生助理。当前处于【修改模式】。\n我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】,直接重写并输出目标区域的 HTML。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 必须包含 "reply"(简短回复话术)和 "updatedHtml"(修改后的完整内部 HTML 代码)两个字段\n3. 绝对不要包含任何 Markdown 标记(如 ```json)' : '你是一名专业的外科医生助理。当前处于【对话模式】。\n请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 仅包含 "reply"(你的专业回答)一个字段\n3. 不要返回任何 HTML 代码\n4. 绝对不要包含任何 Markdown 标记'; ``` **变更点**: 1. 修改模式 systemPrompt 明确标注「当前处于【修改模式】」 2. 明确要求必须包含 `reply` 和 `updatedHtml` 两个字段 3. 对话模式 systemPrompt 明确标注「当前处于【对话模式】」 4. 明确要求仅包含 `reply` 字段,不要返回 HTML ### 修改 3:diffModal targetId 使用 actualTargetId **原代码**(line 936): ```tsx targetId: aiTargetRegion ``` **新代码**: ```tsx targetId: actualTargetId ``` **变更点**:确保 diff 弹窗确认注入时,使用实际修正后的区域 ID,而非可能仍为 `'none'` 的 `aiTargetRegion`。