useTimeSeriesJump.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { ref } from 'vue';
  2. import { useMessage } from '@jeesite/core/hooks/web/useMessage';
  3. import { useGo } from '@jeesite/core/hooks/web/usePage';
  4. import { timeSeriesJump } from '@jeesite/otg/api/otgApi';
  5. import type { TimeSeriesQuery } from '@jeesite/otg/api/types/query';
  6. import {
  7. BEHAVIOR_SPACETIME_JUMP_QUERY_KEY,
  8. buildTimeSeriesJumpQuery,
  9. persistBehaviorSpacetimeJumpResult,
  10. hasMeaningfulJumpPayload,
  11. resolveBehaviorSpacetimeJumpPayload,
  12. serializeBehaviorSpacetimeJumpPayload,
  13. } from '@jeesite/otg/utils/timeSeriesJump';
  14. interface JumpToBehaviorSpacetimeOptions {
  15. onBeforeNavigate?: () => void;
  16. }
  17. const buildTimeSeriesJumpRequest = (query: ReturnType<typeof buildTimeSeriesJumpQuery>) => {
  18. return {
  19. hasLocal: query.hasLocal || 'N',
  20. tableNameEn: query.tableNameEn || query.tableName,
  21. id: query.id || query.rowId,
  22. } satisfies Pick<TimeSeriesQuery, 'hasLocal' | 'tableNameEn' | 'id'>;
  23. };
  24. const sharedJumping = ref(false);
  25. let activeJumpPromise: Promise<boolean> | null = null;
  26. let activeJumpKey = '';
  27. export function useTimeSeriesJump() {
  28. const go = useGo();
  29. const { createMessage } = useMessage();
  30. const jumpToBehaviorSpacetime = async (
  31. query: Partial<TimeSeriesQuery> & Record<string, unknown>,
  32. options?: JumpToBehaviorSpacetimeOptions,
  33. ) => {
  34. const requestQuery = buildTimeSeriesJumpQuery(query);
  35. const jumpRequest = buildTimeSeriesJumpRequest(requestQuery);
  36. if (!jumpRequest.id || !jumpRequest.tableNameEn) {
  37. createMessage.warning('当前记录缺少行为时空主键,暂时无法跳转。');
  38. return false;
  39. }
  40. const jumpKey = JSON.stringify(jumpRequest);
  41. if (sharedJumping.value && activeJumpPromise) {
  42. return activeJumpKey === jumpKey ? activeJumpPromise : false;
  43. }
  44. const currentPromise = (async () => {
  45. sharedJumping.value = true;
  46. activeJumpKey = jumpKey;
  47. try {
  48. const resp = await timeSeriesJump(jumpRequest);
  49. persistBehaviorSpacetimeJumpResult(resp);
  50. const payload = resolveBehaviorSpacetimeJumpPayload(resp, requestQuery);
  51. if (!hasMeaningfulJumpPayload(payload)) {
  52. createMessage.warning('行为时空跳转参数为空,暂时无法跳转。');
  53. return false;
  54. }
  55. options?.onBeforeNavigate?.();
  56. await go({
  57. path: '/behaviorSpacetime/index',
  58. query: {
  59. [BEHAVIOR_SPACETIME_JUMP_QUERY_KEY]: serializeBehaviorSpacetimeJumpPayload(payload),
  60. },
  61. });
  62. return true;
  63. } catch {
  64. createMessage.error('跳转行为时空分析失败,请稍后重试。');
  65. return false;
  66. } finally {
  67. if (activeJumpPromise === currentPromise) {
  68. activeJumpPromise = null;
  69. activeJumpKey = '';
  70. sharedJumping.value = false;
  71. }
  72. }
  73. })();
  74. activeJumpPromise = currentPromise;
  75. return currentPromise;
  76. };
  77. return {
  78. jumping: sharedJumping,
  79. jumpToBehaviorSpacetime,
  80. };
  81. }