import { ref } from 'vue'; import { useMessage } from '@jeesite/core/hooks/web/useMessage'; import { useGo } from '@jeesite/core/hooks/web/usePage'; import { timeSeriesJump } from '@jeesite/otg/api/otgApi'; import type { TimeSeriesQuery } from '@jeesite/otg/api/types/query'; import { BEHAVIOR_SPACETIME_JUMP_QUERY_KEY, buildTimeSeriesJumpQuery, persistBehaviorSpacetimeJumpResult, hasMeaningfulJumpPayload, resolveBehaviorSpacetimeJumpPayload, serializeBehaviorSpacetimeJumpPayload, } from '@jeesite/otg/utils/timeSeriesJump'; interface JumpToBehaviorSpacetimeOptions { onBeforeNavigate?: () => void; } const buildTimeSeriesJumpRequest = (query: ReturnType) => { return { hasLocal: query.hasLocal || 'N', tableNameEn: query.tableNameEn || query.tableName, id: query.id || query.rowId, } satisfies Pick; }; const sharedJumping = ref(false); let activeJumpPromise: Promise | null = null; let activeJumpKey = ''; export function useTimeSeriesJump() { const go = useGo(); const { createMessage } = useMessage(); const jumpToBehaviorSpacetime = async ( query: Partial & Record, options?: JumpToBehaviorSpacetimeOptions, ) => { const requestQuery = buildTimeSeriesJumpQuery(query); const jumpRequest = buildTimeSeriesJumpRequest(requestQuery); if (!jumpRequest.id || !jumpRequest.tableNameEn) { createMessage.warning('当前记录缺少行为时空主键,暂时无法跳转。'); return false; } const jumpKey = JSON.stringify(jumpRequest); if (sharedJumping.value && activeJumpPromise) { return activeJumpKey === jumpKey ? activeJumpPromise : false; } const currentPromise = (async () => { sharedJumping.value = true; activeJumpKey = jumpKey; try { const resp = await timeSeriesJump(jumpRequest); persistBehaviorSpacetimeJumpResult(resp); const payload = resolveBehaviorSpacetimeJumpPayload(resp, requestQuery); if (!hasMeaningfulJumpPayload(payload)) { createMessage.warning('行为时空跳转参数为空,暂时无法跳转。'); return false; } options?.onBeforeNavigate?.(); await go({ path: '/behaviorSpacetime/index', query: { [BEHAVIOR_SPACETIME_JUMP_QUERY_KEY]: serializeBehaviorSpacetimeJumpPayload(payload), }, }); return true; } catch { createMessage.error('跳转行为时空分析失败,请稍后重试。'); return false; } finally { if (activeJumpPromise === currentPromise) { activeJumpPromise = null; activeJumpKey = ''; sharedJumping.value = false; } } })(); activeJumpPromise = currentPromise; return currentPromise; }; return { jumping: sharedJumping, jumpToBehaviorSpacetime, }; }