Commit e254a080 by Liu

fix:工单参数

parent c4cb0a30
...@@ -111,12 +111,21 @@ export const TacticsChat: React.FC = () => { ...@@ -111,12 +111,21 @@ export const TacticsChat: React.FC = () => {
const orderMeta = useMemo(() => { const orderMeta = useMemo(() => {
const from = searchParams.get('from') const from = searchParams.get('from')
const place = searchParams.get('place') const place = searchParams.get('place')
console.log('[TacticsChat] orderMeta useMemo:', {
from,
place,
allSearchParams: Object.fromEntries(searchParams.entries()),
})
if (from !== 'tactics' || place !== 'order') { if (from !== 'tactics' || place !== 'order') {
return undefined return undefined
} }
return { const workOrderIds = searchParams.get('workOrderIds')
workOrderIds: searchParams.get('workOrderIds') || undefined, const result = {
workOrderIds: workOrderIds !== null ? workOrderIds : undefined,
} }
console.log('[TacticsChat] orderMeta result:', result)
// 如果 URL 中有 workOrderIds 参数(包括空字符串),则使用它;否则为 undefined
return result
}, [searchParams]) }, [searchParams])
// 仅用于创建会话的额外参数(create_conversation) // 仅用于创建会话的额外参数(create_conversation)
...@@ -401,7 +410,7 @@ export const TacticsChat: React.FC = () => { ...@@ -401,7 +410,7 @@ export const TacticsChat: React.FC = () => {
const shouldIncludeOrderMeta = extra?.includeOrderMeta !== false const shouldIncludeOrderMeta = extra?.includeOrderMeta !== false
// 去除缓存中可能存在的 from 字段,避免作为参数传递 // 去除缓存中可能存在的 from 字段,避免作为参数传递
const { from: _omitFrom, ...safeTacticsMeta } = tacticsMeta || {} const { from: _omitFrom, ...safeTacticsMeta } = (tacticsMeta || {}) as Record<string, any>
const requestBody: Record<string, any> = { const requestBody: Record<string, any> = {
conversationId: currentIdRef.current, conversationId: currentIdRef.current,
...@@ -415,7 +424,12 @@ export const TacticsChat: React.FC = () => { ...@@ -415,7 +424,12 @@ export const TacticsChat: React.FC = () => {
// 优先级:orderMeta > userMeta > tacticsMeta // 优先级:orderMeta > userMeta > tacticsMeta
// 优先使用 orderMeta,如果存在 orderMeta 且需要包含,则传入 orderMeta 的字段 // 优先使用 orderMeta,如果存在 orderMeta 且需要包含,则传入 orderMeta 的字段
if (orderMeta && shouldIncludeOrderMeta) { if (orderMeta && shouldIncludeOrderMeta) {
console.log('[TacticsChat] handleSubmitQuestion: orderMeta', orderMeta)
Object.assign(requestBody, orderMeta) Object.assign(requestBody, orderMeta)
console.log('[TacticsChat] handleSubmitQuestion: requestBody after orderMeta', {
workOrderIds: requestBody.workOrderIds,
hasWorkOrderIds: 'workOrderIds' in requestBody,
})
} }
// 如果没有 orderMeta 或不需要包含 orderMeta,则使用 userMeta // 如果没有 orderMeta 或不需要包含 orderMeta,则使用 userMeta
else if (userMeta && shouldIncludeUserMeta) { else if (userMeta && shouldIncludeUserMeta) {
...@@ -463,6 +477,15 @@ export const TacticsChat: React.FC = () => { ...@@ -463,6 +477,15 @@ export const TacticsChat: React.FC = () => {
if (shouldSendQuestion || (question && extra?.includeQuestion === false)) { if (shouldSendQuestion || (question && extra?.includeQuestion === false)) {
requestBody.question = question ?? '' requestBody.question = question ?? ''
} }
// 调试日志:检查最终请求参数
console.log('[TacticsChat] handleSubmitQuestion: final requestBody', {
workOrderIds: requestBody.workOrderIds,
hasWorkOrderIds: 'workOrderIds' in requestBody,
orderMeta,
shouldIncludeOrderMeta,
requestBodyKeys: Object.keys(requestBody),
requestBodyStringified: JSON.stringify(requestBody),
})
fetchStreamResponse( fetchStreamResponse(
fetchUrl, fetchUrl,
requestBody, requestBody,
......
...@@ -13,9 +13,27 @@ import { fetchEfficiencyQuestionList } from '@/api/home' ...@@ -13,9 +13,27 @@ import { fetchEfficiencyQuestionList } from '@/api/home'
import SdreamLoading from '@/components/SdreamLoading' import SdreamLoading from '@/components/SdreamLoading'
import { fetchLoginByToken, fetchLoginByUid } from '@/api/common' import { fetchLoginByToken, fetchLoginByUid } from '@/api/common'
import { fetchSessionConversationId } from '@/api/conversation' import { fetchSessionConversationId } from '@/api/conversation'
import { fetchCheckTokenApi } from '@/api/chat'
import { getUserRolesFromRoute, safeLocalStorageGetItem, safeSessionStorageGetItem, safeSessionStorageRemoveItem, safeSessionStorageSetItem } from '@/lib/utils' import { getUserRolesFromRoute, safeLocalStorageGetItem, safeSessionStorageGetItem, safeSessionStorageRemoveItem, safeSessionStorageSetItem } from '@/lib/utils'
import type { Conversation } from '@/types/conversation' import type { Conversation } from '@/types/conversation'
// 从 localStorage 获取 token 的辅助函数
function getTokenFromStorage(): string | null {
const tokenStr = safeLocalStorageGetItem('__TOKEN__')
if (!tokenStr) {
return null
}
try {
// useLocalStorageState 会将值序列化为 JSON,需要解析
const parsed = JSON.parse(tokenStr)
return parsed || tokenStr
}
catch {
// 如果不是 JSON 格式,直接使用原始值
return tokenStr
}
}
function getAnimationProps(delay: number) { function getAnimationProps(delay: number) {
return { return {
variants: { variants: {
...@@ -52,6 +70,7 @@ export const Home: React.FC = () => { ...@@ -52,6 +70,7 @@ export const Home: React.FC = () => {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const location = useLocation() const location = useLocation()
const hasFetched = useRef(false) const hasFetched = useRef(false)
const hasCalledBusinessApis = useRef(false) // 防止业务接口重复调用
// 使用 useState // 使用 useState
const [otherQuestions, setOtherQuestions] = useState<any>({ content: [] }) const [otherQuestions, setOtherQuestions] = useState<any>({ content: [] })
const [isToolBtnActive, setIsToolBtnActive] = useState<boolean>(false) const [isToolBtnActive, setIsToolBtnActive] = useState<boolean>(false)
...@@ -289,6 +308,8 @@ export const Home: React.FC = () => { ...@@ -289,6 +308,8 @@ export const Home: React.FC = () => {
if (res.data.userName) { if (res.data.userName) {
setUserName(res.data.userName) setUserName(res.data.userName)
} }
// 确保 token 已写入 localStorage(useLocalStorageState 是同步的,但为了保险起见,使用微任务确保写入完成)
await new Promise(resolve => setTimeout(resolve, 0))
window.dispatchEvent( window.dispatchEvent(
new StorageEvent('storage', { new StorageEvent('storage', {
key: '__TOKEN__', key: '__TOKEN__',
...@@ -301,6 +322,10 @@ export const Home: React.FC = () => { ...@@ -301,6 +322,10 @@ export const Home: React.FC = () => {
// 如果是 from=tactics,只执行登录,不执行其他业务逻辑(由 TacticsHome 处理) // 如果是 from=tactics,只执行登录,不执行其他业务逻辑(由 TacticsHome 处理)
if (from !== 'tactics') { if (from !== 'tactics') {
console.log('homeNew sso555555') console.log('homeNew sso555555')
// 确保 token 已写入 localStorage 后再调用业务接口
const actualToken = getTokenFromStorage() || res.data.token
if (actualToken && !hasCalledBusinessApis.current) {
hasCalledBusinessApis.current = true
// 触发自定义事件,通知 ChatEditor 强制重置为制度活化 // 触发自定义事件,通知 ChatEditor 强制重置为制度活化
window.dispatchEvent(new CustomEvent('forceResetToGeneralMode')) window.dispatchEvent(new CustomEvent('forceResetToGeneralMode'))
getSessionConversationId() getSessionConversationId()
...@@ -310,6 +335,7 @@ export const Home: React.FC = () => { ...@@ -310,6 +335,7 @@ export const Home: React.FC = () => {
} }
} }
} }
}
catch (error) { catch (error) {
console.error('SSO 登录失败:', error) console.error('SSO 登录失败:', error)
// 登录失败时清除标志,允许重试 // 登录失败时清除标志,允许重试
...@@ -324,9 +350,25 @@ export const Home: React.FC = () => { ...@@ -324,9 +350,25 @@ export const Home: React.FC = () => {
console.log('homeNew sso666666') console.log('homeNew sso666666')
hasFetched.current = true hasFetched.current = true
if (viteOutputObj === 'inner') { if (viteOutputObj === 'inner') {
// inner 环境下,如果没有 loginCode,先验证 token 是否有效
// 保证登录成功(token 有效)后再调用业务接口
const existingToken = getTokenFromStorage()
if (existingToken && !hasCalledBusinessApis.current) {
try {
// 验证 token 是否有效
await fetchCheckTokenApi()
// token 验证成功,调用业务接口
hasCalledBusinessApis.current = true
getSessionConversationId() getSessionConversationId()
dispatch(fetchConversations()) dispatch(fetchConversations())
} }
catch (error) {
// token 验证失败,不调用业务接口
console.error('Token 验证失败:', error)
}
}
// 如果没有 token,不调用业务接口,等待 loginCode 或用户手动登录
}
else { else {
// 模拟登录 可以用来测试 // 模拟登录 可以用来测试
const res = await fetchLoginByUid('123123') const res = await fetchLoginByUid('123123')
...@@ -343,6 +385,8 @@ export const Home: React.FC = () => { ...@@ -343,6 +385,8 @@ export const Home: React.FC = () => {
if (res.data.userName) { if (res.data.userName) {
setUserName(res.data.userName) setUserName(res.data.userName)
} }
// 确保 token 已写入 localStorage(useLocalStorageState 是同步的,但为了保险起见,使用微任务确保写入完成)
await new Promise(resolve => setTimeout(resolve, 0))
// 主动触发 storage 事件,确保其他组件能监听到变化 // 主动触发 storage 事件,确保其他组件能监听到变化
window.dispatchEvent( window.dispatchEvent(
new StorageEvent('storage', { new StorageEvent('storage', {
...@@ -353,6 +397,10 @@ export const Home: React.FC = () => { ...@@ -353,6 +397,10 @@ export const Home: React.FC = () => {
storageArea: localStorage, storageArea: localStorage,
}), }),
) )
// 确保 token 已写入 localStorage 后再调用业务接口
const actualToken = getTokenFromStorage() || res.data.token
if (actualToken && !hasCalledBusinessApis.current) {
hasCalledBusinessApis.current = true
// 触发自定义事件,通知 ChatEditor 强制重置为制度活化 // 触发自定义事件,通知 ChatEditor 强制重置为制度活化
window.dispatchEvent(new CustomEvent('forceResetToGeneralMode')) window.dispatchEvent(new CustomEvent('forceResetToGeneralMode'))
getSessionConversationId() getSessionConversationId()
...@@ -362,6 +410,7 @@ export const Home: React.FC = () => { ...@@ -362,6 +410,7 @@ export const Home: React.FC = () => {
} }
} }
} }
}
}, [setToken, setUserName, dispatch]) }, [setToken, setUserName, dispatch])
// 监听路由参数变化,提取 userRoles(确保路由参数被正确解析) // 监听路由参数变化,提取 userRoles(确保路由参数被正确解析)
......
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