- systemPrompt条件从'aiModifyEnabled && targetRegionEl'改为'aiModifyEnabled',确保开启修改模式后大模型始终返回updatedHtml
- 接收updatedHtml逻辑增加if/else分支:targetRegionEl存在时走diff弹窗,不存在时调用execCmd('insertHTML')降级插入光标位置
- 参考参考-ReportEditor.tsx中injectAIText的降级机制
67 lines
3.4 KiB
Markdown
67 lines
3.4 KiB
Markdown
# 实现方案
|
||
|
||
## 修改文件
|
||
- `src/pages/ReportEditor.tsx`
|
||
|
||
## 修改位置:`handleAIGenerate` 函数(约 line 897-937)
|
||
|
||
### 修改 1:System Prompt 条件解绑
|
||
|
||
**原代码**(line 897-899):
|
||
```tsx
|
||
const systemPrompt = aiModifyEnabled && targetRegionEl
|
||
? '你是一名专业的外科医生助理。我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】,直接重写并输出目标区域的 HTML。\n重要指令:你必须严格返回合法的 JSON 对象,绝对不要包含任何 Markdown 标记(如 ```json)。\nJSON 格式如下:\n{ "reply": "简短的回复话术", "updatedHtml": "修改后的完整内部 HTML 代码" }'
|
||
: '你是一名专业的外科医生助理。请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令:严格返回合法的 JSON 对象。\nJSON 格式如下:\n{ "reply": "你的分析和回答" }';
|
||
```
|
||
|
||
**新代码**:
|
||
```tsx
|
||
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):
|
||
```tsx
|
||
if (responseJson.updatedHtml && aiModifyEnabled && targetRegionEl) {
|
||
setDiffModal({
|
||
isOpen: true,
|
||
originalHtml: currentHtml,
|
||
newHtml: responseJson.updatedHtml,
|
||
targetId: aiTargetRegion
|
||
});
|
||
}
|
||
```
|
||
|
||
**新代码**:
|
||
```tsx
|
||
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` 保持不变
|