navigation.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { defineStore } from 'pinia'
  2. import { ref, computed } from 'vue'
  3. import * as api from '@/api/screen'
  4. export const useNavigationStore = defineStore('navigation', () => {
  5. // 目的地列表
  6. const destinations = ref([])
  7. // 当前导航任务
  8. const currentTask = ref(null)
  9. // 导航状态
  10. const navigationStatus = ref({
  11. taskId: '',
  12. status: 'idle',
  13. currentPoint: '',
  14. targetName: '',
  15. progress: 0,
  16. estimatedTime: ''
  17. })
  18. // 导航历史
  19. const navigationHistory = ref([])
  20. // 计算属性
  21. const isNavigating = computed(() => {
  22. return ['starting', 'navigating', 'arriving'].includes(navigationStatus.value.status)
  23. })
  24. const hasActiveTask = computed(() => !!currentTask.value)
  25. // 按分类分组的目的地
  26. const destinationsByCategory = computed(() => {
  27. const grouped = {}
  28. destinations.value.forEach(dest => {
  29. if (!grouped[dest.category]) {
  30. grouped[dest.category] = []
  31. }
  32. grouped[dest.category].push(dest)
  33. })
  34. return grouped
  35. })
  36. // 方法
  37. async function fetchDestinations() {
  38. try {
  39. const res = await api.getDestinations()
  40. destinations.value = res
  41. } catch (e) {
  42. console.error('Failed to fetch destinations:', e)
  43. destinations.value = []
  44. }
  45. }
  46. async function startNavigation(destination) {
  47. try {
  48. const res = await api.startNavigation({ destinationId: destination.destinationId })
  49. currentTask.value = {
  50. ...destination,
  51. taskId: res.taskId,
  52. startTime: Date.now()
  53. }
  54. navigationStatus.value = {
  55. taskId: res.taskId,
  56. status: 'starting',
  57. currentPoint: '起点',
  58. targetName: destination.name,
  59. progress: 0,
  60. estimatedTime: destination.estimatedTime || '3分钟'
  61. }
  62. return res
  63. } catch (e) {
  64. throw e
  65. }
  66. }
  67. async function fetchNavigationStatus() {
  68. if (!currentTask.value) return null
  69. try {
  70. const res = await api.getNavigationStatus({ taskId: currentTask.value.taskId })
  71. navigationStatus.value = res
  72. return res
  73. } catch (e) {
  74. console.error('Failed to fetch navigation status:', e)
  75. return null
  76. }
  77. }
  78. async function cancelNavigation() {
  79. if (!currentTask.value) return
  80. try {
  81. await api.cancelNavigation({ taskId: currentTask.value.taskId })
  82. addToHistory(currentTask.value)
  83. currentTask.value = null
  84. navigationStatus.value = {
  85. taskId: '',
  86. status: 'idle',
  87. currentPoint: '',
  88. targetName: '',
  89. progress: 0,
  90. estimatedTime: ''
  91. }
  92. } catch (e) {
  93. console.error('Failed to cancel navigation:', e)
  94. throw e
  95. }
  96. }
  97. function addToHistory(task) {
  98. navigationHistory.value.unshift({
  99. ...task,
  100. endTime: Date.now(),
  101. duration: task.startTime ? Date.now() - task.startTime : 0
  102. })
  103. if (navigationHistory.value.length > 10) {
  104. navigationHistory.value.pop()
  105. }
  106. }
  107. function clearNavigation() {
  108. currentTask.value = null
  109. navigationStatus.value = {
  110. taskId: '',
  111. status: 'idle',
  112. currentPoint: '',
  113. targetName: '',
  114. progress: 0,
  115. estimatedTime: ''
  116. }
  117. }
  118. // 模拟导航进度(用于演示)
  119. function simulateNavigation() {
  120. if (!currentTask.value) return
  121. const steps = [
  122. { status: 'starting', progress: 10, message: '正在规划路线...' },
  123. { status: 'navigating', progress: 30, message: '开始带路' },
  124. { status: 'navigating', progress: 50, message: '请跟我来' },
  125. { status: 'navigating', progress: 70, message: '前方转弯' },
  126. { status: 'navigating', progress: 85, message: '即将到达' },
  127. { status: 'arriving', progress: 100, message: '已到达目的地' }
  128. ]
  129. let stepIndex = 0
  130. const interval = setInterval(() => {
  131. if (stepIndex < steps.length) {
  132. const step = steps[stepIndex]
  133. navigationStatus.value = {
  134. ...navigationStatus.value,
  135. status: step.status,
  136. progress: step.progress
  137. }
  138. stepIndex++
  139. } else {
  140. clearInterval(interval)
  141. }
  142. }, 2000)
  143. }
  144. return {
  145. destinations,
  146. currentTask,
  147. navigationStatus,
  148. navigationHistory,
  149. isNavigating,
  150. hasActiveTask,
  151. destinationsByCategory,
  152. fetchDestinations,
  153. startNavigation,
  154. fetchNavigationStatus,
  155. cancelNavigation,
  156. addToHistory,
  157. clearNavigation,
  158. simulateNavigation
  159. }
  160. })