| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- import { defineStore } from 'pinia'
- import { computed, ref } from 'vue'
- import { fetchAlarmFilters, fetchAlarms } from '../api/alarms'
- import type { AlarmRow } from '../types'
- function pad2(value: number): string {
- return String(value).padStart(2, '0')
- }
- function today(): string {
- const d = new Date()
- return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`
- }
- const PLAY_INTERVAL = 5000
- export const useAlarmsStore = defineStore('alarms', () => {
- const devices = ref<string[]>([])
- const alarmTypes = ref<string[]>([])
- const deviceCode = ref('') // 空 = 全部
- const alarmType = ref('') // 空 = 全部
- const page = ref(1)
- const pageSize = ref(30)
- const total = ref(0)
- const items = ref<AlarmRow[]>([])
- const loading = ref(false)
- const selectedId = ref<number | null>(null)
- // 播放状态
- const playing = ref(false)
- const paused = ref(false)
- const displayDate = ref(today())
- let playTimer: ReturnType<typeof setTimeout> | undefined
- let playIndex = 0
- const selected = computed<AlarmRow | null>(
- () => items.value.find((row) => row.id === selectedId.value) ?? null,
- )
- async function loadFilters(): Promise<void> {
- const filters = await fetchAlarmFilters()
- devices.value = filters.devices
- alarmTypes.value = filters.alarm_types
- if (!deviceCode.value) {
- deviceCode.value =
- devices.value.find((d) => d.replace(/\D/g, '') === '8') ?? devices.value[0] ?? ''
- }
- }
- async function load(): Promise<void> {
- loading.value = true
- try {
- const res = await fetchAlarms({
- device_code: deviceCode.value || undefined,
- alarm_type: alarmType.value || undefined,
- page: page.value,
- page_size: pageSize.value,
- })
- items.value = res.items
- total.value = res.total
- if (selectedId.value && !items.value.some((row) => row.id === selectedId.value)) {
- selectedId.value = null
- }
- } finally {
- loading.value = false
- }
- }
- function setDevice(value: string): void {
- deviceCode.value = value || ''
- page.value = 1
- load()
- }
- function setType(value: string): void {
- alarmType.value = value || ''
- page.value = 1
- load()
- }
- function setPage(value: number): void {
- page.value = value
- load()
- }
- function select(row: AlarmRow): void {
- selectedId.value = selectedId.value === row.id ? null : row.id
- }
- function clearSelected(): void {
- selectedId.value = null
- }
- /** 初始加载完成后自动选中第一条(最新)。 */
- function autoSelectFirst(): void {
- if (selectedId.value === null && items.value[0]) {
- selectedId.value = items.value[0].id
- }
- }
- /* ---------------- 故障播放(从最早到最新) ---------------- */
- function clearTimer(): void {
- if (playTimer) { clearTimeout(playTimer); playTimer = undefined }
- }
- async function showGlobalIndex(globalIndex: number): Promise<void> {
- const targetPage = Math.floor(globalIndex / pageSize.value) + 1
- if (targetPage !== page.value) {
- page.value = targetPage
- await load()
- }
- const row = items.value[globalIndex % pageSize.value]
- if (row) {
- selectedId.value = row.id
- displayDate.value = row.alarm_time_start.slice(0, 10)
- }
- }
- function schedule(): void {
- clearTimer()
- if (!playing.value || paused.value) return
- playTimer = setTimeout(advance, PLAY_INTERVAL)
- }
- async function advance(): Promise<void> {
- if (!playing.value || paused.value) return
- playIndex -= 1
- if (playIndex < 0) {
- await resetToInitial()
- return
- }
- await showGlobalIndex(playIndex)
- schedule()
- }
- async function startPlayback(): Promise<void> {
- if (!total.value) return
- clearTimer()
- playing.value = true
- paused.value = false
- playIndex = total.value - 1 // 全局最后一条(最早)
- await showGlobalIndex(playIndex)
- schedule()
- }
- async function resetToInitial(): Promise<void> {
- clearTimer()
- playing.value = false
- paused.value = false
- page.value = 1
- await load()
- if (items.value[0]) selectedId.value = items.value[0].id
- displayDate.value = today()
- }
- async function stopPlayback(): Promise<void> {
- await resetToInitial()
- }
- function togglePause(): void {
- if (!playing.value) return
- paused.value = !paused.value
- if (paused.value) clearTimer()
- else schedule()
- }
- function reset(): void {
- clearTimer()
- items.value = []
- total.value = 0
- page.value = 1
- selectedId.value = null
- playing.value = false
- paused.value = false
- displayDate.value = today()
- }
- return {
- devices, alarmTypes, deviceCode, alarmType, page, pageSize, total, items,
- loading, selectedId, selected, playing, paused, displayDate,
- loadFilters, load, setDevice, setType, setPage, select, clearSelected,
- autoSelectFirst, startPlayback, stopPlayback, togglePause, reset,
- }
- })
|