Commit 4a6d1a42 by Liu

fix:重新分析分割线

parent ef640258
...@@ -43,8 +43,7 @@ export const TacticsChat: React.FC = () => { ...@@ -43,8 +43,7 @@ export const TacticsChat: React.FC = () => {
const viteOutputObj = import.meta.env.VITE_OUTPUT_OBJ || 'open' const viteOutputObj = import.meta.env.VITE_OUTPUT_OBJ || 'open'
const [isLoading, setIsLoading] = useState(false) const [isLoading, setIsLoading] = useState(false)
const [allItems, setAllItems] = useState<ChatRecord[]>([]) const [allItems, setAllItems] = useState<ChatRecord[]>([])
const [historyDividerIndex, setHistoryDividerIndex] = useState<number | null>(null) const [historyDividers, setHistoryDividers] = useState<{ index: number, time: string }[]>([])
const [historyDividerTime, setHistoryDividerTime] = useState<string | null>(null)
const [hasCleared, setHasCleared] = useState(false) const [hasCleared, setHasCleared] = useState(false)
const [showClearConfirm, setShowClearConfirm] = useState(false) const [showClearConfirm, setShowClearConfirm] = useState(false)
// 标记当前会话是否已有历史记录;null 表示尚未完成查询 // 标记当前会话是否已有历史记录;null 表示尚未完成查询
...@@ -370,7 +369,7 @@ export const TacticsChat: React.FC = () => { ...@@ -370,7 +369,7 @@ export const TacticsChat: React.FC = () => {
question: string | undefined, question: string | undefined,
productCode?: string, productCode?: string,
toolId?: string, toolId?: string,
extra?: { busiType?: string, recordType?: string, numberType?: string, includeQuestion?: boolean, includeTacticsMeta?: boolean, includeUserMeta?: boolean }, extra?: { busiType?: string, recordType?: string, numberType?: string, includeQuestion?: boolean, includeTacticsMeta?: boolean, includeUserMeta?: boolean, isReanalyze?: boolean },
) => { ) => {
// 优先读取缓存中的 toolId,再回退到传参 // 优先读取缓存中的 toolId,再回退到传参
const sessionToolId = sessionStorage.getItem('currentToolId') ?? undefined const sessionToolId = sessionStorage.getItem('currentToolId') ?? undefined
...@@ -387,6 +386,9 @@ export const TacticsChat: React.FC = () => { ...@@ -387,6 +386,9 @@ export const TacticsChat: React.FC = () => {
await fetchCheckTokenApi() await fetchCheckTokenApi()
// 一次性添加用户问题和空的AI回答;如果不需要问题(自动触发场景),只添加 AI 占位 // 一次性添加用户问题和空的AI回答;如果不需要问题(自动触发场景),只添加 AI 占位
const shouldIncludeQuestion = extra?.includeQuestion !== false && !!question const shouldIncludeQuestion = extra?.includeQuestion !== false && !!question
const isReanalyze = extra?.isReanalyze === true
// 同步计算分割线位置(基于当前 allItems 长度)
const nextDividerIndex = isReanalyze ? allItems.length + (shouldIncludeQuestion ? 2 : 1) : null
setAllItems(prevItems => [ setAllItems(prevItems => [
...prevItems, ...prevItems,
...(shouldIncludeQuestion ...(shouldIncludeQuestion
...@@ -402,6 +404,10 @@ export const TacticsChat: React.FC = () => { ...@@ -402,6 +404,10 @@ export const TacticsChat: React.FC = () => {
answerList: [{ answer: '' }], answerList: [{ answer: '' }],
} as ChatRecord, } as ChatRecord,
]) ])
if (isReanalyze && nextDividerIndex !== null) {
const currentTime = formatCurrentTime()
setHistoryDividers(prev => [...prev, { index: nextDividerIndex, time: currentTime }])
}
// 创建新的 AbortController // 创建新的 AbortController
abortControllerRef.current = new AbortController() abortControllerRef.current = new AbortController()
...@@ -489,9 +495,9 @@ export const TacticsChat: React.FC = () => { ...@@ -489,9 +495,9 @@ export const TacticsChat: React.FC = () => {
// 正常的stream数据 // 正常的stream数据
if (msg?.type === 'DATA' && msg?.content?.code === '00000000') { if (msg?.type === 'DATA' && msg?.content?.code === '00000000') {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('流式[TacticsChat] handleSubmitQuestion:success', msg) console.log('========================流式输出====================', msg)
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('[TacticsChat] handleSubmitQuestion:data', msg.content?.data) console.log('========================流式输出字符串====================', msg.content?.data)
handleStreamMesageData(msg, question || '') handleStreamMesageData(msg, question || '')
} }
if (msg?.type === 'DATA' && msg?.content?.code === '01010005') { if (msg?.type === 'DATA' && msg?.content?.code === '01010005') {
...@@ -517,12 +523,8 @@ export const TacticsChat: React.FC = () => { ...@@ -517,12 +523,8 @@ export const TacticsChat: React.FC = () => {
const res = await fetchTacticsQaRecordPage(conversationId) const res = await fetchTacticsQaRecordPage(conversationId)
const qaRecords = res.data || [] const qaRecords = res.data || []
const hasHistoryFlag = qaRecords.length > 0 const hasHistoryFlag = qaRecords.length > 0
const historyCount = qaRecords.length
// 始终添加 system 角色作为欢迎语 // 始终添加 system 角色作为欢迎语
const messages = [{ role: 'system' } as ChatRecord, ...processApiResponse(qaRecords)] const messages = [{ role: 'system' } as ChatRecord, ...processApiResponse(qaRecords)]
// 分割线按“历史记录条数 + 欢迎语”计算,避免缺失 question 的记录被漏算
setHistoryDividerIndex(hasHistoryFlag ? historyCount + 1 : null)
setHistoryDividerTime(hasHistoryFlag ? formatCurrentTime() : null)
// 处理历史记录中的参考文档标记 // 处理历史记录中的参考文档标记
const processedMessages = messages.map((item) => { const processedMessages = messages.map((item) => {
if (item.role === 'ai' && item.answerList?.[0]?.answer) { if (item.role === 'ai' && item.answerList?.[0]?.answer) {
...@@ -570,8 +572,7 @@ export const TacticsChat: React.FC = () => { ...@@ -570,8 +572,7 @@ export const TacticsChat: React.FC = () => {
return [{ role: 'system' } as ChatRecord] return [{ role: 'system' } as ChatRecord]
}) })
setHasCleared(false) setHasCleared(false)
setHistoryDividerIndex(null) setHistoryDividers([])
setHistoryDividerTime(null)
// 拉取失败时视为无历史记录,后续可按需触发自动提问 // 拉取失败时视为无历史记录,后续可按需触发自动提问
setHasHistory(false) setHasHistory(false)
} }
...@@ -599,8 +600,7 @@ export const TacticsChat: React.FC = () => { ...@@ -599,8 +600,7 @@ export const TacticsChat: React.FC = () => {
// 清空对话列表,只保留欢迎语 // 清空对话列表,只保留欢迎语
setAllItems([{ role: 'system' } as ChatRecord]) setAllItems([{ role: 'system' } as ChatRecord])
setHasCleared(true) setHasCleared(true)
setHistoryDividerIndex(null) setHistoryDividers([])
setHistoryDividerTime(null)
// 标记接下来创建的新会话来源于「清空记录」,用于阻止自动触发一次提问 // 标记接下来创建的新会话来源于「清空记录」,用于阻止自动触发一次提问
createdFromClearRef.current = true createdFromClearRef.current = true
dispatch( dispatch(
...@@ -644,6 +644,7 @@ export const TacticsChat: React.FC = () => { ...@@ -644,6 +644,7 @@ export const TacticsChat: React.FC = () => {
includeQuestion: false, includeQuestion: false,
includeTacticsMeta: false, includeTacticsMeta: false,
includeUserMeta: true, includeUserMeta: true,
isReanalyze: true,
}) })
} }
else { else {
...@@ -652,6 +653,7 @@ export const TacticsChat: React.FC = () => { ...@@ -652,6 +653,7 @@ export const TacticsChat: React.FC = () => {
recordType: 'A01', recordType: 'A01',
includeQuestion: false, includeQuestion: false,
includeTacticsMeta: true, includeTacticsMeta: true,
isReanalyze: true,
}) })
} }
// 重新拉取会话列表,保持原有行为 // 重新拉取会话列表,保持原有行为
...@@ -682,13 +684,13 @@ export const TacticsChat: React.FC = () => { ...@@ -682,13 +684,13 @@ export const TacticsChat: React.FC = () => {
lastSentQuestionRef.current = '' lastSentQuestionRef.current = ''
// 每次切换会话时重置历史标记,等待新会话的历史查询结果 // 每次切换会话时重置历史标记,等待新会话的历史查询结果
setHasHistory(null) setHasHistory(null)
setHistoryDividers([])
getUserQaRecordPage(id) getUserQaRecordPage(id)
} }
else { else {
// 如果没有 id,显示欢迎语,等待登录成功后创建新会话 // 如果没有 id,显示欢迎语,等待登录成功后创建新会话
setAllItems([{ role: 'system' } as ChatRecord]) setAllItems([{ role: 'system' } as ChatRecord])
setHistoryDividerIndex(null) setHistoryDividers([])
setHistoryDividerTime(null)
setIsLoading(false) setIsLoading(false)
setHasHistory(false) setHasHistory(false)
} }
...@@ -927,17 +929,22 @@ export const TacticsChat: React.FC = () => { ...@@ -927,17 +929,22 @@ export const TacticsChat: React.FC = () => {
> >
<div className={`${styles.inter} pt-[8px] pb-[24px] min-h-full`}> <div className={`${styles.inter} pt-[8px] pb-[24px] min-h-full`}>
{allItems.map((record, index) => { {allItems.map((record, index) => {
// 如果 question 为空字符串、null 或不存在则不展示该条记录
if (record.role === 'user' && !record.question) {
return null
}
const matchedDivider = historyDividers.find(divider => divider.index === index + 1)
const recordId = record.answerList?.[0]?.recordId || record.groupId const recordId = record.answerList?.[0]?.recordId || record.groupId
const uniqueKey = recordId const uniqueKey = recordId
? `${record.role}-${recordId}` ? `${record.role}-${recordId}`
: `${record.role}-${record.question || record.answerList?.[0]?.answer || ''}-${index}` : `${record.role}-${record.question || record.answerList?.[0]?.answer || ''}-${index}`
return ( return (
<React.Fragment key={uniqueKey}> <React.Fragment key={uniqueKey}>
{historyDividerIndex !== null && index + 1 === historyDividerIndex && ( {matchedDivider && (
<div className="flex items-center gap-[12px] my-[16px] text-[#B2B8C1] text-[12px]"> <div className="flex items-center gap-[12px] my-[16px] text-[#B2B8C1] text-[12px]">
<div className="flex-1 h-px bg-[#E4E7EC]" /> <div className="flex-1 h-px bg-[#E4E7EC]" />
<span>以上为历史分析数据</span> <span>以上为历史分析数据</span>
<span>{historyDividerTime || formatCurrentTime()}</span> <span>{matchedDivider.time}</span>
<div className="flex-1 h-px bg-[#E4E7EC]" /> <div className="flex-1 h-px bg-[#E4E7EC]" />
</div> </div>
)} )}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment