# 需求分析 ## 时间戳 2026-04-19 03:44 ## 需求来源 用户在 report-editor 中输入「请随机填充文本内容」,AI 在聊天气泡中正常回复,但编辑器中的「手术步骤-AI可编辑部分」没有修改。 ## 现象 1. AI 聊天面板有输出(reply) 2. 编辑器中的 AI 可编辑区域内容未更新 3. 没有触发 diff 确认弹窗 ## 根因分析 对比当前代码与 `参考-ReportEditor.tsx`,问题有两个层面: ### 层面 1:System Prompt 条件过于严苛 当前代码: ```tsx const systemPrompt = aiModifyEnabled && targetRegionEl ? '...修改HTML...' : '...纯聊天...' ``` `targetRegionEl` 的获取依赖 `aiTargetRegion`(默认 `'none'`)。如果用户未在下拉框中选中具体区域,`targetRegionEl` 为 `null`,systemPrompt 降级为纯聊天模式,大模型根本不会返回 `updatedHtml` 字段。 参考代码: ```tsx const systemPrompt = aiModifyEnabled ? '...修改HTML...' : '...纯聊天...' ``` 只依赖 `aiModifyEnabled`,只要用户开启「允许修改正文」,大模型就会返回 `updatedHtml`。 ### 层面 2:接收逻辑缺少降级插入 当前代码: ```tsx if (responseJson.updatedHtml && aiModifyEnabled && targetRegionEl) { setDiffModal({...}) } ``` 同样因为 `targetRegionEl` 为 `null`,即使大模型返回了 `updatedHtml`,也会被丢弃。 参考代码 `injectAIText`: ```tsx if (targetRegion) { targetRegion.innerHTML = ... // 注入目标区域 } else { execCmd('insertHTML', htmlContent); // 降级:插入光标位置 } ``` 找不到目标区域时,直接将内容插入编辑器当前光标位置。 ## 约束条件 - 当前代码已有 `execCmd` 辅助函数,可直接复用 - 需要保留 diff 弹窗流程(目标区域存在时) - `aiTargetRegion` 默认值 `'none'` 可保留,但需通过降级逻辑补偿