fix:1.根据建议生成内容后没有自动更新章节内容
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Modal, Progress, Spin, Alert, Tabs, Card, Tag, List, Empty, Statistic, Row, Col, Button } from 'antd';
|
import { Modal, Spin, Alert, Tabs, Card, Tag, List, Empty, Statistic, Row, Col, Button } from 'antd';
|
||||||
import {
|
import {
|
||||||
ThunderboltOutlined,
|
ThunderboltOutlined,
|
||||||
BulbOutlined,
|
BulbOutlined,
|
||||||
@@ -192,28 +192,112 @@ export default function ChapterAnalysis({ chapterId, visible, onClose }: Chapter
|
|||||||
if (!task || task.status === 'completed') return null;
|
if (!task || task.status === 'completed') return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ padding: '24px' }}>
|
<div style={{
|
||||||
<div style={{ display: 'flex', alignItems: 'center', marginBottom: 16 }}>
|
padding: '40px',
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
minHeight: '300px'
|
||||||
|
}}>
|
||||||
|
{/* 标题和图标 */}
|
||||||
|
<div style={{
|
||||||
|
textAlign: 'center',
|
||||||
|
marginBottom: 32
|
||||||
|
}}>
|
||||||
{renderStatusIcon()}
|
{renderStatusIcon()}
|
||||||
<span style={{ marginLeft: 8, fontSize: 16 }}>
|
<div style={{
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
marginTop: 16,
|
||||||
|
color: task.status === 'failed' ? '#ff4d4f' : '#262626'
|
||||||
|
}}>
|
||||||
{task.status === 'pending' && '等待分析...'}
|
{task.status === 'pending' && '等待分析...'}
|
||||||
{task.status === 'running' && 'AI正在分析中...'}
|
{task.status === 'running' && 'AI正在分析中...'}
|
||||||
{task.status === 'failed' && '分析失败'}
|
{task.status === 'failed' && '分析失败'}
|
||||||
</span>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Progress
|
|
||||||
percent={task.progress}
|
{/* 进度条 */}
|
||||||
status={task.status === 'failed' ? 'exception' : 'active'}
|
<div style={{
|
||||||
/>
|
width: '100%',
|
||||||
|
maxWidth: '500px',
|
||||||
|
marginBottom: 16
|
||||||
|
}}>
|
||||||
|
<div style={{
|
||||||
|
height: 12,
|
||||||
|
background: '#f0f0f0',
|
||||||
|
borderRadius: 6,
|
||||||
|
overflow: 'hidden',
|
||||||
|
marginBottom: 12
|
||||||
|
}}>
|
||||||
|
<div style={{
|
||||||
|
height: '100%',
|
||||||
|
background: task.status === 'failed'
|
||||||
|
? 'linear-gradient(90deg, #ff4d4f 0%, #ff7875 100%)'
|
||||||
|
: task.progress === 100
|
||||||
|
? 'linear-gradient(90deg, #52c41a 0%, #73d13d 100%)'
|
||||||
|
: 'linear-gradient(90deg, #1890ff 0%, #40a9ff 100%)',
|
||||||
|
width: `${task.progress}%`,
|
||||||
|
transition: 'all 0.3s ease',
|
||||||
|
borderRadius: 6,
|
||||||
|
boxShadow: task.progress > 0 && task.status !== 'failed'
|
||||||
|
? '0 0 10px rgba(24, 144, 255, 0.3)'
|
||||||
|
: 'none'
|
||||||
|
}} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 进度百分比 */}
|
||||||
|
<div style={{
|
||||||
|
textAlign: 'center',
|
||||||
|
fontSize: 32,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: task.status === 'failed' ? '#ff4d4f' :
|
||||||
|
task.progress === 100 ? '#52c41a' : '#1890ff',
|
||||||
|
marginBottom: 8
|
||||||
|
}}>
|
||||||
|
{task.progress}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 状态消息 */}
|
||||||
|
<div style={{
|
||||||
|
textAlign: 'center',
|
||||||
|
fontSize: 16,
|
||||||
|
color: '#595959',
|
||||||
|
minHeight: 24,
|
||||||
|
marginBottom: 16
|
||||||
|
}}>
|
||||||
|
{task.status === 'pending' && '分析任务已创建,正在队列中...'}
|
||||||
|
{task.status === 'running' && '正在提取关键信息和记忆片段...'}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 错误信息 */}
|
||||||
{task.status === 'failed' && task.error_message && (
|
{task.status === 'failed' && task.error_message && (
|
||||||
<Alert
|
<Alert
|
||||||
message="分析失败"
|
message="分析失败"
|
||||||
description={task.error_message}
|
description={task.error_message}
|
||||||
type="error"
|
type="error"
|
||||||
showIcon
|
showIcon
|
||||||
style={{ marginTop: 16 }}
|
style={{
|
||||||
|
marginTop: 16,
|
||||||
|
maxWidth: '500px',
|
||||||
|
width: '100%'
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* 提示文字 */}
|
||||||
|
{task.status !== 'failed' && (
|
||||||
|
<div style={{
|
||||||
|
textAlign: 'center',
|
||||||
|
fontSize: 13,
|
||||||
|
color: '#8c8c8c',
|
||||||
|
marginTop: 16
|
||||||
|
}}>
|
||||||
|
分析过程需要一定时间,请耐心等待
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -646,9 +730,28 @@ export default function ChapterAnalysis({ chapterId, visible, onClose }: Chapter
|
|||||||
originalContent={chapterInfo.content}
|
originalContent={chapterInfo.content}
|
||||||
newContent={newGeneratedContent}
|
newContent={newGeneratedContent}
|
||||||
wordCount={newContentWordCount}
|
wordCount={newContentWordCount}
|
||||||
onApply={() => {
|
onApply={async () => {
|
||||||
// 应用新内容后刷新章节信息
|
// 应用新内容后刷新章节信息和分析
|
||||||
fetchAnalysisStatus();
|
setChapterInfo(null);
|
||||||
|
setAnalysis(null);
|
||||||
|
|
||||||
|
// 重新加载章节内容
|
||||||
|
try {
|
||||||
|
const chapterResponse = await fetch(`/api/chapters/${chapterId}`);
|
||||||
|
if (chapterResponse.ok) {
|
||||||
|
const chapterData = await chapterResponse.json();
|
||||||
|
setChapterInfo({
|
||||||
|
title: chapterData.title,
|
||||||
|
chapter_number: chapterData.chapter_number,
|
||||||
|
content: chapterData.content || ''
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('重新加载章节失败:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新分析状态
|
||||||
|
await fetchAnalysisStatus();
|
||||||
}}
|
}}
|
||||||
onDiscard={() => {
|
onDiscard={() => {
|
||||||
// 放弃新内容,清空状态
|
// 放弃新内容,清空状态
|
||||||
|
|||||||
@@ -50,28 +50,32 @@ const ChapterContentComparison: React.FC<ChapterContentComparisonProps> = ({
|
|||||||
throw new Error('应用新内容失败');
|
throw new Error('应用新内容失败');
|
||||||
}
|
}
|
||||||
|
|
||||||
message.success('新内容已应用!正在触发章节分析...');
|
message.success('新内容已应用!');
|
||||||
|
|
||||||
// 触发章节分析
|
// 先调用 onApply 通知父组件刷新
|
||||||
try {
|
onApply();
|
||||||
const analysisResponse = await fetch(`/api/chapters/${chapterId}/analyze`, {
|
|
||||||
method: 'POST',
|
// 延迟触发章节分析,给父组件时间刷新
|
||||||
headers: {
|
setTimeout(async () => {
|
||||||
'Content-Type': 'application/json',
|
try {
|
||||||
|
const analysisResponse = await fetch(`/api/chapters/${chapterId}/analyze`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (analysisResponse.ok) {
|
||||||
|
message.success('章节分析已开始,请稍后查看结果');
|
||||||
|
} else {
|
||||||
|
message.warning('章节分析触发失败,您可以手动触发分析');
|
||||||
}
|
}
|
||||||
});
|
} catch (analysisError) {
|
||||||
|
console.error('触发分析失败:', analysisError);
|
||||||
if (analysisResponse.ok) {
|
|
||||||
message.success('章节分析已开始,请稍后查看结果');
|
|
||||||
} else {
|
|
||||||
message.warning('章节分析触发失败,您可以手动触发分析');
|
message.warning('章节分析触发失败,您可以手动触发分析');
|
||||||
}
|
}
|
||||||
} catch (analysisError) {
|
}, 500);
|
||||||
console.error('触发分析失败:', analysisError);
|
|
||||||
message.warning('章节分析触发失败,您可以手动触发分析');
|
|
||||||
}
|
|
||||||
|
|
||||||
onApply();
|
|
||||||
onClose();
|
onClose();
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error.message || '应用失败');
|
message.error(error.message || '应用失败');
|
||||||
|
|||||||
@@ -1358,6 +1358,20 @@ export default function Chapters() {
|
|||||||
onClose={() => {
|
onClose={() => {
|
||||||
setAnalysisVisible(false);
|
setAnalysisVisible(false);
|
||||||
|
|
||||||
|
// 刷新章节列表以显示最新内容
|
||||||
|
refreshChapters();
|
||||||
|
|
||||||
|
// 刷新项目信息以更新字数统计
|
||||||
|
if (currentProject) {
|
||||||
|
projectApi.getProject(currentProject.id)
|
||||||
|
.then(updatedProject => {
|
||||||
|
setCurrentProject(updatedProject);
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('刷新项目信息失败:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 延迟500ms后刷新该章节的分析状态,给后端足够时间完成数据库写入
|
// 延迟500ms后刷新该章节的分析状态,给后端足够时间完成数据库写入
|
||||||
if (analysisChapterId) {
|
if (analysisChapterId) {
|
||||||
const chapterIdToRefresh = analysisChapterId;
|
const chapterIdToRefresh = analysisChapterId;
|
||||||
|
|||||||
Reference in New Issue
Block a user