提交 b46e0652 authored 作者: 朱政's avatar 朱政

feat:优化多智库分析的流式输出显示状态

上级 3f12faf6
...@@ -222,7 +222,7 @@ export async function postReportDomainViewAnalysisStream(data, handlers = {}) { ...@@ -222,7 +222,7 @@ export async function postReportDomainViewAnalysisStream(data, handlers = {}) {
const msg = JSON.parse(jsonText) const msg = JSON.parse(jsonText)
if (typeof onMessage === 'function') onMessage(msg) if (typeof onMessage === 'function') onMessage(msg)
if (msg?.type === 'reasoning' && msg?.chunk != null && typeof onReasoningChunk === 'function') { if (msg?.type === 'reasoning' && msg?.chunk != null && typeof onReasoningChunk === 'function') {
const c = String(msg.chunk).trim() const c = String(msg.chunk)
if (c) onReasoningChunk(c) if (c) onReasoningChunk(c)
} }
} catch (e) { } catch (e) {
...@@ -241,7 +241,7 @@ export async function postReportDomainViewAnalysisStream(data, handlers = {}) { ...@@ -241,7 +241,7 @@ export async function postReportDomainViewAnalysisStream(data, handlers = {}) {
const msg = JSON.parse(jsonText) const msg = JSON.parse(jsonText)
if (typeof onMessage === 'function') onMessage(msg) if (typeof onMessage === 'function') onMessage(msg)
if (msg?.type === 'reasoning' && msg?.chunk != null && typeof onReasoningChunk === 'function') { if (msg?.type === 'reasoning' && msg?.chunk != null && typeof onReasoningChunk === 'function') {
const c = String(msg.chunk).trim() const c = String(msg.chunk)
if (c) onReasoningChunk(c) if (c) onReasoningChunk(c)
} }
} catch (e) { } catch (e) {
......
...@@ -187,9 +187,7 @@ ...@@ -187,9 +187,7 @@
</div> </div>
</div> </div>
<div class="being-analysis-box-content" ref="beingAnalysisContentRef"> <div class="being-analysis-box-content" ref="beingAnalysisContentRef">
<div class="being-analysis-content-line" v-for="(line, idx) in beingAnalysisChunks" :key="idx"> <div class="being-analysis-content-text">{{ beingAnalysisContent }}</div>
{{ line }}
</div>
</div> </div>
</div> </div>
<div v-if="isAnalysisLoading" class="being-analysis-image"> <div v-if="isAnalysisLoading" class="being-analysis-image">
...@@ -326,7 +324,7 @@ const searchPolicy = ref(""); ...@@ -326,7 +324,7 @@ const searchPolicy = ref("");
const isBox2 = ref(true) const isBox2 = ref(true)
const isAnalysisLoading = ref(false) const isAnalysisLoading = ref(false)
const isBeingAnalysisExpanded = ref(false) const isBeingAnalysisExpanded = ref(false)
const beingAnalysisChunks = ref([]) const beingAnalysisContent = ref("")
const beingAnalysisContentRef = ref(null) const beingAnalysisContentRef = ref(null)
const activeOpinionTab = ref('consensus') const activeOpinionTab = ref('consensus')
const toggleBeingAnalysisBox = () => { const toggleBeingAnalysisBox = () => {
...@@ -338,7 +336,7 @@ const scrollBeingAnalysisToBottom = async () => { ...@@ -338,7 +336,7 @@ const scrollBeingAnalysisToBottom = async () => {
if (!el) return if (!el) return
el.scrollTop = el.scrollHeight el.scrollTop = el.scrollHeight
} }
watch(() => beingAnalysisChunks.value.length, async () => { watch(() => beingAnalysisContent.value, async () => {
if (!isBeingAnalysisExpanded.value) return if (!isBeingAnalysisExpanded.value) return
await scrollBeingAnalysisToBottom() await scrollBeingAnalysisToBottom()
}) })
...@@ -588,7 +586,7 @@ const handleAnalysis = async () => { ...@@ -588,7 +586,7 @@ const handleAnalysis = async () => {
isBox2.value = false isBox2.value = false
isAnalysisLoading.value = true isAnalysisLoading.value = true
isBeingAnalysisExpanded.value = false isBeingAnalysisExpanded.value = false
beingAnalysisChunks.value = [] beingAnalysisContent.value = ""
domainViewAnalysisRes.value = null domainViewAnalysisRes.value = null
// 每次进入“开始分析”默认回到共识观点,避免上次状态残留导致内容错位 // 每次进入“开始分析”默认回到共识观点,避免上次状态残留导致内容错位
activeOpinionTab.value = 'consensus' activeOpinionTab.value = 'consensus'
...@@ -600,7 +598,7 @@ const handleBack = () => { ...@@ -600,7 +598,7 @@ const handleBack = () => {
// 返回选择时终止“分析中”展示,恢复空态图 // 返回选择时终止“分析中”展示,恢复空态图
isAnalysisLoading.value = false isAnalysisLoading.value = false
isBeingAnalysisExpanded.value = false isBeingAnalysisExpanded.value = false
beingAnalysisChunks.value = [] beingAnalysisContent.value = ""
// 返回选择时也重置,确保下次进入分析展示一致 // 返回选择时也重置,确保下次进入分析展示一致
activeOpinionTab.value = 'consensus' activeOpinionTab.value = 'consensus'
} }
...@@ -693,7 +691,7 @@ const mergeAnalysisAnswerParts = (parts) => { ...@@ -693,7 +691,7 @@ const mergeAnalysisAnswerParts = (parts) => {
const handlePostReportDomainViewAnalysis = async () => { const handlePostReportDomainViewAnalysis = async () => {
try { try {
viewpointDetailByKey.value = {} viewpointDetailByKey.value = {}
beingAnalysisChunks.value = [] beingAnalysisContent.value = ""
const selectedReports = selectedReportList.value || [] const selectedReports = selectedReportList.value || []
const reportEntriesRaw = await Promise.all( const reportEntriesRaw = await Promise.all(
selectedReports.map(async (report) => { selectedReports.map(async (report) => {
...@@ -798,7 +796,7 @@ const handlePostReportDomainViewAnalysis = async () => { ...@@ -798,7 +796,7 @@ const handlePostReportDomainViewAnalysis = async () => {
console.log("智库领域观点分析入参", payload) console.log("智库领域观点分析入参", payload)
const res = await postReportDomainViewAnalysisStream(payload, { const res = await postReportDomainViewAnalysisStream(payload, {
onReasoningChunk: async (chunk) => { onReasoningChunk: async (chunk) => {
beingAnalysisChunks.value = [...beingAnalysisChunks.value, chunk] beingAnalysisContent.value += String(chunk)
await scrollBeingAnalysisToBottom() await scrollBeingAnalysisToBottom()
} }
}) })
...@@ -1103,9 +1101,10 @@ onMounted(async () => { ...@@ -1103,9 +1101,10 @@ onMounted(async () => {
} }
} }
.being-analysis-content-line { .being-analysis-content-text {
line-height: 22px; line-height: 22px;
white-space: nowrap; white-space: pre-wrap;
word-break: break-word;
} }
.being-analysis-image { .being-analysis-image {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论