Browse Source

fix:修复Acceleronix平台的月流量数据图不显示的问题

Jerry Liang 1 tháng trước cách đây
mục cha
commit
0aaca47cb4

+ 5 - 13
src/views/sim-card-manage/component/simCardDataView.vue

@@ -23,9 +23,10 @@
 
 <script setup lang="ts">
 import type { VNodeChild, CSSProperties } from 'vue'
-import { useMessage, NModal, NSwitch } from 'naive-ui'
-import { Chart, type G2Spec, type Mark, type Composition, type TooltipTitle } from '@antv/g2'
-import type { SimCardMonthlyData, SimCardDailyUsage } from '@/service/simCardManage/interface'
+import { NModal, NSwitch } from 'naive-ui'
+import { Chart, type TooltipTitle } from '@antv/g2'
+import type { SimCardMonthlyData } from '@/service/simCardManage/interface'
+import { getDaysInMonth } from '../month'
 
 import { usePersonalization } from '@/composable/usePersonalization'
 
@@ -35,9 +36,7 @@ const props = defineProps<{
 
 const show = defineModel<boolean>('show', { required: true })
 
-const message = useMessage()
-
-const { isDark, color } = usePersonalization()
+const { isDark } = usePersonalization()
 
 const simCardMonthlyChart = ref<HTMLDivElement | null>(null)
 
@@ -49,13 +48,6 @@ interface SimCardMonthlyChartData {
 
 let simCardMonthlyChartInstance: Chart | null = null
 
-function getDaysInMonth(yearMonth: string): number {
-  const [year, month] = yearMonth.split('-').map(Number)
-
-  // month 是 1~12,Date 的 month 是 0~11
-  return new Date(year, month, 0).getDate()
-}
-
 // 创建Chart
 function initSimCardMonthlyChart() {
   console.log({ simCardMonthlyChart: simCardMonthlyChart.value })

+ 16 - 0
src/views/sim-card-manage/month.test.ts

@@ -0,0 +1,16 @@
+import { describe, expect, it } from 'vitest'
+import { getDaysInMonth, getPrevMonth } from './month'
+
+describe('sim card month formats', () => {
+  it.each([
+    ['2026-09', 30, '2026-08'],
+    ['202609', 30, '202608'],
+    ['2026-01', 31, '2025-12'],
+    ['202601', 31, '202512'],
+    ['2024-02', 29, '2024-01'],
+    ['202402', 29, '202401'],
+  ])('handles %s', (month, days, previous) => {
+    expect(getDaysInMonth(month)).toBe(days)
+    expect(getPrevMonth(month)).toBe(previous)
+  })
+})

+ 25 - 0
src/views/sim-card-manage/month.ts

@@ -0,0 +1,25 @@
+/** SIM 月份同时存在 yyyy-MM (SmartHub) 和 yyyyMM (Acceleronix) 两种格式。 */
+const MONTH_PATTERN = /^(\d{4})(-?)(0[1-9]|1[0-2])$/
+
+function parseMonth(month: string): { year: number; monthNumber: number; dashed: boolean } {
+  const match = MONTH_PATTERN.exec(month)
+  if (!match) throw new Error(`Invalid SIM card month: ${month}`)
+
+  return {
+    year: Number(match[1]),
+    monthNumber: Number(match[3]),
+    dashed: match[2] === '-',
+  }
+}
+
+export function getDaysInMonth(month: string): number {
+  const { year, monthNumber } = parseMonth(month)
+  return new Date(year, monthNumber, 0).getDate()
+}
+
+export function getPrevMonth(month: string): string {
+  const { year, monthNumber, dashed } = parseMonth(month)
+  const previous = new Date(year, monthNumber - 2, 1)
+  const separator = dashed ? '-' : ''
+  return `${previous.getFullYear()}${separator}${String(previous.getMonth() + 1).padStart(2, '0')}`
+}

+ 7 - 9
src/views/sim-card-manage/useSimCardMonthlyCache.ts

@@ -2,6 +2,7 @@ import { reactive } from 'vue'
 import { getSimCardMonthlyData } from '@/service/simCardManage'
 import { simCardCacheDB } from '@/service/simCardManage/simCardCache'
 import type { SimCardMonthlyData, SimCardInfo } from '@/service/simCardManage/interface'
+import { getPrevMonth } from './month'
 
 /** 响应式内存缓存 key: `${giccid}_${month}` */
 const memoryCache = reactive(new Map<string, SimCardMonthlyData>())
@@ -26,13 +27,6 @@ export function cacheKey(giccid: string, month: string): string {
   return `${giccid}_${month}`
 }
 
-/** 获取上月 month 字符串 (输入 "2026-08" → 输出 "2026-07") */
-function getPrevMonth(month: string): string {
-  const [year, mon] = month.split('-').map(Number)
-  const date = new Date(year, mon - 2, 1)
-  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`
-}
-
 // ─── 核心:请求单条数据并写入双层缓存 ───
 
 function fetchAndCache(giccid: string, month: string): Promise<SimCardMonthlyData> {
@@ -157,7 +151,9 @@ function computeDailyIncrement(giccid: string, month: string): number | null {
   const data = memoryCache.get(key)
   if (!data) return null
 
-  const days = Object.keys(data.dailyUsage).map(Number).sort((a, b) => a - b)
+  const days = Object.keys(data.dailyUsage)
+    .map(Number)
+    .sort((a, b) => a - b)
   if (days.length === 0) return null
 
   const latestDay = days.at(-1)!
@@ -170,7 +166,9 @@ function computeDailyIncrement(giccid: string, month: string): number | null {
     const prevData = memoryCache.get(prevKey)
     if (!prevData) return null
 
-    const prevDays = Object.keys(prevData.dailyUsage).map(Number).sort((a, b) => a - b)
+    const prevDays = Object.keys(prevData.dailyUsage)
+      .map(Number)
+      .sort((a, b) => a - b)
     if (prevDays.length === 0) return null
 
     const lastDayOfPrevMonth = prevDays.at(-1)!