- systemPrompt条件从'aiModifyEnabled && targetRegionEl'改为'aiModifyEnabled',确保开启修改模式后大模型始终返回updatedHtml
- 接收updatedHtml逻辑增加if/else分支:targetRegionEl存在时走diff弹窗,不存在时调用execCmd('insertHTML')降级插入光标位置
- 参考参考-ReportEditor.tsx中injectAIText的降级机制
54 lines
1.8 KiB
Markdown
54 lines
1.8 KiB
Markdown
# 需求分析
|
||
|
||
## 时间戳
|
||
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'` 可保留,但需通过降级逻辑补偿
|