Commit ef640258 by Liu

fix: 清空记录后新建会话

parent 9ea85437
...@@ -69,6 +69,8 @@ export const TacticsChat: React.FC = () => { ...@@ -69,6 +69,8 @@ export const TacticsChat: React.FC = () => {
const scrollableRef = useRef<HTMLDivElement | any>(null) const scrollableRef = useRef<HTMLDivElement | any>(null)
const position = useScroll(scrollableRef) const position = useScroll(scrollableRef)
const currentIdRef = useRef<string | undefined>(id) const currentIdRef = useRef<string | undefined>(id)
// 标记当前会话是否由「清空记录」操作创建,用于控制是否需要自动调用提问接口
const createdFromClearRef = useRef(false)
const lastSentQuestionRef = useRef<string>('') const lastSentQuestionRef = useRef<string>('')
const abortControllerRef = useRef<AbortController | null>(null) const abortControllerRef = useRef<AbortController | null>(null)
// 读取 from=tactics 的额外参数 // 读取 from=tactics 的额外参数
...@@ -79,14 +81,18 @@ export const TacticsChat: React.FC = () => { ...@@ -79,14 +81,18 @@ export const TacticsChat: React.FC = () => {
if (from !== 'tactics') { if (from !== 'tactics') {
return undefined return undefined
} }
const taskId = searchParams.get('taskId') || undefined
return { return {
version, version,
taskId: searchParams.get('taskId') || undefined, taskId,
pinBeginTime: searchParams.get('pinBeginTime') || undefined, pinBeginTime: searchParams.get('pinBeginTime') || undefined,
pinEndTime: searchParams.get('pinEndTime') || undefined, pinEndTime: searchParams.get('pinEndTime') || undefined,
partOrAll: searchParams.get('partOrAll') || undefined, partOrAll: searchParams.get('partOrAll') || undefined,
channel: searchParams.get('channel') || undefined, channel: searchParams.get('channel') || undefined,
channelName: searchParams.get('channelName') || undefined, channelName: searchParams.get('channelName') || undefined,
// from=tactics 场景下,新建会话需要的业务识别参数
busiType: '02',
busiId: taskId,
} }
}, [searchParams]) }, [searchParams])
const tacticsMetaFromStorage = useMemo(() => { const tacticsMetaFromStorage = useMemo(() => {
...@@ -595,10 +601,14 @@ export const TacticsChat: React.FC = () => { ...@@ -595,10 +601,14 @@ export const TacticsChat: React.FC = () => {
setHasCleared(true) setHasCleared(true)
setHistoryDividerIndex(null) setHistoryDividerIndex(null)
setHistoryDividerTime(null) setHistoryDividerTime(null)
// 标记接下来创建的新会话来源于「清空记录」,用于阻止自动触发一次提问
createdFromClearRef.current = true
dispatch( dispatch(
createTacticsConversation({ createTacticsConversation({
conversationData: getConversationExtra(), conversationData: getConversationExtra(),
shouldNavigate: false, // 清空记录后创建的新会话也需要更新路由中的 conversationId
// 因此这里改为 shouldNavigate: true,让下方 useEffect 触发 navigate
shouldNavigate: true,
shouldSendQuestion: '', shouldSendQuestion: '',
}), }),
) )
...@@ -624,7 +634,10 @@ export const TacticsChat: React.FC = () => { ...@@ -624,7 +634,10 @@ export const TacticsChat: React.FC = () => {
// - 有 userMeta:按 userMeta.numberType 映射 numberType(A03/A05/A07/A09),不传 recordType,仅传 userMeta // - 有 userMeta:按 userMeta.numberType 映射 numberType(A03/A05/A07/A09),不传 recordType,仅传 userMeta
const hasUserMeta = !!userMeta const hasUserMeta = !!userMeta
if (hasUserMeta) { if (hasUserMeta) {
const mappedNumberType = getNumberTypeWithUserMeta('A02', true) // place=user 场景下,重新分析也视为“自动调用”:
// - numberType 为 3/4/5/6:映射为 A03/A05/A07/A09
// - 其它值或不存在:recordType=A01
const mappedNumberType = getNumberTypeWithUserMeta('A01', true)
await handleSubmitQuestion(undefined, undefined, undefined, { await handleSubmitQuestion(undefined, undefined, undefined, {
busiType: '02', busiType: '02',
recordType: mappedNumberType, recordType: mappedNumberType,
...@@ -697,13 +710,23 @@ export const TacticsChat: React.FC = () => { ...@@ -697,13 +710,23 @@ export const TacticsChat: React.FC = () => {
useEffect(() => { useEffect(() => {
// 仅在历史记录查询完成且为空时,才自动触发一次提交 // 仅在历史记录查询完成且为空时,才自动触发一次提交
if (currentIdRef.current && !isLoading && hasHistory === false && !hasAutoSubmittedRef.current) { if (currentIdRef.current && !isLoading && hasHistory === false && !hasAutoSubmittedRef.current) {
// 如果当前会话是由「清空记录」创建的,则不自动调用提问接口
// 但仍然标记为已处理,避免后续重复触发
if (createdFromClearRef.current) {
createdFromClearRef.current = false
hasAutoSubmittedRef.current = true
return
}
hasAutoSubmittedRef.current = true hasAutoSubmittedRef.current = true
// 进入会话后自动触发一次提交: // 进入会话后自动触发一次提交:
// - 无 userMeta:沿用原逻辑,recordType=A02,携带 tacticsMeta // - 无 userMeta:沿用原逻辑,recordType=A02,携带 tacticsMeta
// - 有 userMeta:按 userMeta.numberType 映射 numberType(A03/A05/A07/A09),不传 recordType,仅传 userMeta // - 有 userMeta:按 userMeta.numberType 映射 numberType(A03/A05/A07/A09),不传 recordType,仅传 userMeta
const hasUserMeta = !!userMeta const hasUserMeta = !!userMeta
if (hasUserMeta) { if (hasUserMeta) {
const mappedNumberType = getNumberTypeWithUserMeta('A02', true) // place=user 场景下,首次自动调用:
// - numberType 为 3/4/5/6:映射为 A03/A05/A07/A09
// - 其它值或不存在:recordType=A01
const mappedNumberType = getNumberTypeWithUserMeta('A01', true)
handleSubmitQuestion( handleSubmitQuestion(
undefined, undefined,
undefined, undefined,
......
...@@ -25,23 +25,24 @@ export const TacticsHome: React.FC = () => { ...@@ -25,23 +25,24 @@ export const TacticsHome: React.FC = () => {
defaultValue: '', defaultValue: '',
}) })
// 仅在 from=tactics 且 version=2 时读取并缓存额外参数 // from=tactics 时读取并缓存额外参数(无论 version 是否为 2),用于新建会话
const tacticsMetaFromSearch = useMemo(() => { const tacticsMetaFromSearch = useMemo(() => {
const from = searchParams.get('from') const from = searchParams.get('from')
const version = searchParams.get('version') if (from !== 'tactics') {
if (from !== 'tactics' || version !== '2') {
return undefined return undefined
} }
const taskId = searchParams.get('taskId') || undefined
return { return {
version, version: searchParams.get('version'),
taskId: searchParams.get('taskId') || undefined, taskId,
pinBeginTime: searchParams.get('pinBeginTime') || undefined, pinBeginTime: searchParams.get('pinBeginTime') || undefined,
pinEndTime: searchParams.get('pinEndTime') || undefined, pinEndTime: searchParams.get('pinEndTime') || undefined,
partOrAll: searchParams.get('partOrAll') || undefined, partOrAll: searchParams.get('partOrAll') || undefined,
channel: searchParams.get('channel') || undefined, channel: searchParams.get('channel') || undefined,
channelName: searchParams.get('channelName') || undefined, channelName: searchParams.get('channelName') || undefined,
// 新建会话需要的业务识别参数
busiType: '02', busiType: '02',
busiId: searchParams.get('taskId') || undefined, busiId: taskId,
} }
}, [searchParams]) }, [searchParams])
const tacticsMetaFromStorage = useMemo(() => { const tacticsMetaFromStorage = useMemo(() => {
...@@ -51,7 +52,7 @@ export const TacticsHome: React.FC = () => { ...@@ -51,7 +52,7 @@ export const TacticsHome: React.FC = () => {
} }
try { try {
const parsed = JSON.parse(raw) const parsed = JSON.parse(raw)
if (parsed?.from === 'tactics' && parsed?.version === '2') { if (parsed?.from === 'tactics') {
return parsed return parsed
} }
} }
......
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