Commit e254a080 by Liu

fix:工单参数

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