| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- import { defineStore } from 'pinia'
- import { ref, computed } from 'vue'
- import * as api from '@/api/screen'
- export const useNavigationStore = defineStore('navigation', () => {
- // 目的地列表
- const destinations = ref([])
- // 当前导航任务
- const currentTask = ref(null)
- // 导航状态
- const navigationStatus = ref({
- taskId: '',
- status: 'idle',
- currentPoint: '',
- targetName: '',
- progress: 0,
- estimatedTime: ''
- })
- // 导航历史
- const navigationHistory = ref([])
- // 计算属性
- const isNavigating = computed(() => {
- return ['starting', 'navigating', 'arriving'].includes(navigationStatus.value.status)
- })
- const hasActiveTask = computed(() => !!currentTask.value)
- // 按分类分组的目的地
- const destinationsByCategory = computed(() => {
- const grouped = {}
- destinations.value.forEach(dest => {
- if (!grouped[dest.category]) {
- grouped[dest.category] = []
- }
- grouped[dest.category].push(dest)
- })
- return grouped
- })
- // 方法
- async function fetchDestinations() {
- try {
- const res = await api.getDestinations()
- destinations.value = res
- } catch (e) {
- console.error('Failed to fetch destinations:', e)
- destinations.value = []
- }
- }
- async function startNavigation(destination) {
- try {
- const res = await api.startNavigation({ destinationId: destination.destinationId })
- currentTask.value = {
- ...destination,
- taskId: res.taskId,
- startTime: Date.now()
- }
- navigationStatus.value = {
- taskId: res.taskId,
- status: 'starting',
- currentPoint: '起点',
- targetName: destination.name,
- progress: 0,
- estimatedTime: destination.estimatedTime || '3分钟'
- }
- return res
- } catch (e) {
- throw e
- }
- }
- async function fetchNavigationStatus() {
- if (!currentTask.value) return null
- try {
- const res = await api.getNavigationStatus({ taskId: currentTask.value.taskId })
- navigationStatus.value = res
- return res
- } catch (e) {
- console.error('Failed to fetch navigation status:', e)
- return null
- }
- }
- async function cancelNavigation() {
- if (!currentTask.value) return
- try {
- await api.cancelNavigation({ taskId: currentTask.value.taskId })
- addToHistory(currentTask.value)
- currentTask.value = null
- navigationStatus.value = {
- taskId: '',
- status: 'idle',
- currentPoint: '',
- targetName: '',
- progress: 0,
- estimatedTime: ''
- }
- } catch (e) {
- console.error('Failed to cancel navigation:', e)
- throw e
- }
- }
- function addToHistory(task) {
- navigationHistory.value.unshift({
- ...task,
- endTime: Date.now(),
- duration: task.startTime ? Date.now() - task.startTime : 0
- })
- if (navigationHistory.value.length > 10) {
- navigationHistory.value.pop()
- }
- }
- function clearNavigation() {
- currentTask.value = null
- navigationStatus.value = {
- taskId: '',
- status: 'idle',
- currentPoint: '',
- targetName: '',
- progress: 0,
- estimatedTime: ''
- }
- }
- // 模拟导航进度(用于演示)
- function simulateNavigation() {
- if (!currentTask.value) return
- const steps = [
- { status: 'starting', progress: 10, message: '正在规划路线...' },
- { status: 'navigating', progress: 30, message: '开始带路' },
- { status: 'navigating', progress: 50, message: '请跟我来' },
- { status: 'navigating', progress: 70, message: '前方转弯' },
- { status: 'navigating', progress: 85, message: '即将到达' },
- { status: 'arriving', progress: 100, message: '已到达目的地' }
- ]
- let stepIndex = 0
- const interval = setInterval(() => {
- if (stepIndex < steps.length) {
- const step = steps[stepIndex]
- navigationStatus.value = {
- ...navigationStatus.value,
- status: step.status,
- progress: step.progress
- }
- stepIndex++
- } else {
- clearInterval(interval)
- }
- }, 2000)
- }
- return {
- destinations,
- currentTask,
- navigationStatus,
- navigationHistory,
- isNavigating,
- hasActiveTask,
- destinationsByCategory,
- fetchDestinations,
- startNavigation,
- fetchNavigationStatus,
- cancelNavigation,
- addToHistory,
- clearNavigation,
- simulateNavigation
- }
- })
|