Files
Mdeical_Sur_Report/工程分析/20260419_0344/实现方案.md
admin c1d2438d2b fix(editor): AI只聊天不修改——解绑SystemPrompt目标区域依赖 + 增加光标插入降级
- systemPrompt条件从'aiModifyEnabled && targetRegionEl'改为'aiModifyEnabled',确保开启修改模式后大模型始终返回updatedHtml
- 接收updatedHtml逻辑增加if/else分支:targetRegionEl存在时走diff弹窗,不存在时调用execCmd('insertHTML')降级插入光标位置
- 参考参考-ReportEditor.tsx中injectAIText的降级机制
2026-04-19 03:47:14 +08:00

3.4 KiB
Raw Blame History

实现方案

修改文件

  • src/pages/ReportEditor.tsx

修改位置:handleAIGenerate 函数(约 line 897-937

修改 1System Prompt 条件解绑

原代码line 897-899

const systemPrompt = aiModifyEnabled && targetRegionEl
  ? '你是一名专业的外科医生助理。我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】直接重写并输出目标区域的 HTML。\n重要指令你必须严格返回合法的 JSON 对象,绝对不要包含任何 Markdown 标记(如 ```json。\nJSON 格式如下:\n{ "reply": "简短的回复话术", "updatedHtml": "修改后的完整内部 HTML 代码" }'
  : '你是一名专业的外科医生助理。请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令严格返回合法的 JSON 对象。\nJSON 格式如下:\n{ "reply": "你的分析和回答" }';

新代码

const systemPrompt = aiModifyEnabled
  ? '你是一名专业的外科医生助理。我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】直接重写或生成目标区域的 HTML。\n重要指令你必须严格返回合法的 JSON 对象,绝对不要包含任何 Markdown 标记(如 ```json。\nJSON 格式如下:\n{ "reply": "简短的回复话术", "updatedHtml": "修改后的完整内部 HTML 代码" }'
  : '你是一名专业的外科医生助理。请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令严格返回合法的 JSON 对象。\nJSON 格式如下:\n{ "reply": "你的分析和回答" }';

变更点:条件从 aiModifyEnabled && targetRegionEl 改为 aiModifyEnabled,解绑对目标区域存在的强依赖。

修改 2接收逻辑增加降级插入

原代码line 930-937

if (responseJson.updatedHtml && aiModifyEnabled && targetRegionEl) {
  setDiffModal({
    isOpen: true,
    originalHtml: currentHtml,
    newHtml: responseJson.updatedHtml,
    targetId: aiTargetRegion
  });
}

新代码

if (responseJson.updatedHtml && aiModifyEnabled) {
  if (targetRegionEl) {
    setDiffModal({
      isOpen: true,
      originalHtml: currentHtml,
      newHtml: responseJson.updatedHtml,
      targetId: aiTargetRegion
    });
  } else {
    execCmd('insertHTML', responseJson.updatedHtml);
  }
}

变更点

  1. 接收条件从 responseJson.updatedHtml && aiModifyEnabled && targetRegionEl 放宽为 responseJson.updatedHtml && aiModifyEnabled
  2. 增加 if/else 分支:
    • targetRegionEl 存在 → 走 diff 弹窗(原有流程)
    • targetRegionEl 不存在 → 调用 execCmd('insertHTML', ...) 直接插入光标位置(参考代码降级逻辑)
  3. execCmd 为当前代码已存在的辅助函数,会自动处理 focus、execCommand、contentRef 更新和草稿保存

不修改的内容

  • aiTargetRegion 默认值 'none' 保持不变
  • promptText 构建逻辑保持不变(全局上下文 + 目标区域源码 + 医生指令)
  • Diff 弹窗和 confirmAiInjection 保持不变