fix(editor): AI只聊天不修改——解绑SystemPrompt目标区域依赖 + 增加光标插入降级

- systemPrompt条件从'aiModifyEnabled && targetRegionEl'改为'aiModifyEnabled',确保开启修改模式后大模型始终返回updatedHtml
- 接收updatedHtml逻辑增加if/else分支:targetRegionEl存在时走diff弹窗,不存在时调用execCmd('insertHTML')降级插入光标位置
- 参考参考-ReportEditor.tsx中injectAIText的降级机制
This commit is contained in:
2026-04-19 03:47:14 +08:00
parent 854a00c2fa
commit c1d2438d2b
5 changed files with 217 additions and 9 deletions

View File

@@ -0,0 +1,53 @@
# 需求分析
## 时间戳
2026-04-19 03:44
## 需求来源
用户在 report-editor 中输入「请随机填充文本内容」AI 在聊天气泡中正常回复,但编辑器中的「手术步骤-AI可编辑部分」没有修改。
## 现象
1. AI 聊天面板有输出reply
2. 编辑器中的 AI 可编辑区域内容未更新
3. 没有触发 diff 确认弹窗
## 根因分析
对比当前代码与 `参考-ReportEditor.tsx`,问题有两个层面:
### 层面 1System 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'` 可保留,但需通过降级逻辑补偿