fix the month names were displayed incorrectly in the monthly income and expense trends chart when daylight saving time was involved (#392)

This commit is contained in:
MaysWind
2025-12-21 02:35:25 +08:00
parent d95e34a597
commit ece58b60ec
3 changed files with 31 additions and 23 deletions
+15 -14
View File
@@ -677,20 +677,20 @@ export const ALL_TRANSACTION_AMOUNTS_REQUEST_TYPE = [
export type TransactionAmountsRequestType = typeof ALL_TRANSACTION_AMOUNTS_REQUEST_TYPE[number]; export type TransactionAmountsRequestType = typeof ALL_TRANSACTION_AMOUNTS_REQUEST_TYPE[number];
export const LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES: TransactionAmountsRequestType[] = [ export const LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES: PartialRecord<TransactionAmountsRequestType, number> = {
'monthBeforeLast10Months', 'monthBeforeLast10Months': 11,
'monthBeforeLast9Months', 'monthBeforeLast9Months': 10,
'monthBeforeLast8Months', 'monthBeforeLast8Months': 9,
'monthBeforeLast7Months', 'monthBeforeLast7Months': 8,
'monthBeforeLast6Months', 'monthBeforeLast6Months': 7,
'monthBeforeLast5Months', 'monthBeforeLast5Months': 6,
'monthBeforeLast4Months', 'monthBeforeLast4Months': 5,
'monthBeforeLast3Months', 'monthBeforeLast3Months': 4,
'monthBeforeLast2Months', 'monthBeforeLast2Months': 3,
'monthBeforeLastMonth', 'monthBeforeLastMonth': 2,
'lastMonth', 'lastMonth': 1,
'thisMonth' 'thisMonth': 0
]; };
export interface TransactionAmountsRequestParams extends PartialRecord<TransactionAmountsRequestType, StartEndTime> { export interface TransactionAmountsRequestParams extends PartialRecord<TransactionAmountsRequestType, StartEndTime> {
readonly useTransactionTimezone: boolean; readonly useTransactionTimezone: boolean;
@@ -1009,6 +1009,7 @@ export interface TransactionOverviewResponseItem {
export interface TransactionMonthlyIncomeAndExpenseData { export interface TransactionMonthlyIncomeAndExpenseData {
readonly monthStartTime: number; readonly monthStartTime: number;
readonly monthsBeforeCurrentMonth: number;
readonly incomeAmount: number; readonly incomeAmount: number;
readonly expenseAmount: number; readonly expenseAmount: number;
readonly incompleteIncomeAmount: boolean; readonly incompleteIncomeAmount: boolean;
+11 -8
View File
@@ -202,10 +202,15 @@ import { useAccountsStore } from '@/stores/account.ts';
import { useTransactionCategoriesStore } from '@/stores/transactionCategory.ts'; import { useTransactionCategoriesStore } from '@/stores/transactionCategory.ts';
import { useOverviewStore } from '@/stores/overview.ts'; import { useOverviewStore } from '@/stores/overview.ts';
import { entries } from '@/core/base.ts';
import { type NumeralSystem } from '@/core/numeral.ts'; import { type NumeralSystem } from '@/core/numeral.ts';
import { DateRange } from '@/core/datetime.ts'; import { DateRange } from '@/core/datetime.ts';
import { ThemeType } from '@/core/theme.ts'; import { ThemeType } from '@/core/theme.ts';
import { type TransactionMonthlyIncomeAndExpenseData, LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES } from '@/models/transaction.ts'; import {
type TransactionAmountsRequestType,
type TransactionMonthlyIncomeAndExpenseData,
LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES
} from '@/models/transaction.ts';
import { getUnixTimeBeforeUnixTime, getUnixTimeAfterUnixTime } from '@/lib/datetime.ts'; import { getUnixTimeBeforeUnixTime, getUnixTimeAfterUnixTime } from '@/lib/datetime.ts';
import { isUserLogined, isUserUnlocked } from '@/lib/userstate.ts'; import { isUserLogined, isUserUnlocked } from '@/lib/userstate.ts';
@@ -275,27 +280,25 @@ const monthlyIncomeAndExpenseData = computed<TransactionMonthlyIncomeAndExpenseD
return data; return data;
} }
LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES.forEach(amountRequestType => { for (const [type, monthDiff] of entries(LATEST_12MONTHS_TRANSACTION_AMOUNTS_REQUEST_TYPES)) {
if (!Object.prototype.hasOwnProperty.call(transactionOverview.value, amountRequestType)) { const amountRequestType = type as TransactionAmountsRequestType;
return;
}
const dateRange = overviewStore.transactionDataRange[amountRequestType]; const dateRange = overviewStore.transactionDataRange[amountRequestType];
if (!dateRange) { if (!dateRange) {
return; continue;
} }
const item = transactionOverview.value[amountRequestType]; const item = transactionOverview.value[amountRequestType];
data.push({ data.push({
monthStartTime: dateRange.startTime, monthStartTime: dateRange.startTime,
monthsBeforeCurrentMonth: monthDiff,
incomeAmount: item?.incomeAmount || 0, incomeAmount: item?.incomeAmount || 0,
expenseAmount: item?.expenseAmount || 0, expenseAmount: item?.expenseAmount || 0,
incompleteIncomeAmount: item ? item.incompleteIncomeAmount : true, incompleteIncomeAmount: item ? item.incompleteIncomeAmount : true,
incompleteExpenseAmount: item ? item.incompleteExpenseAmount : true incompleteExpenseAmount: item ? item.incompleteExpenseAmount : true
}); });
}); }
return data; return data;
}); });
@@ -41,6 +41,7 @@ import { DISPLAY_HIDDEN_AMOUNT, INCOMPLETE_AMOUNT_SUFFIX } from '@/consts/numera
import { type TransactionMonthlyIncomeAndExpenseData } from '@/models/transaction.ts'; import { type TransactionMonthlyIncomeAndExpenseData } from '@/models/transaction.ts';
import { getUnixTimeBeforeUnixTime, getThisMonthFirstUnixTime } from '@/lib/datetime.ts';
import { getExpenseAndIncomeAmountColor } from '@/lib/ui/common.ts'; import { getExpenseAndIncomeAmountColor } from '@/lib/ui/common.ts';
export interface MonthlyIncomeAndExpenseCardClickEvent { export interface MonthlyIncomeAndExpenseCardClickEvent {
@@ -97,8 +98,11 @@ const chartOptions = computed<object>(() => {
const expenseIncomeAmountColor = getExpenseAndIncomeAmountColor(userStore.currentUserExpenseAmountColor, userStore.currentUserIncomeAmountColor, props.isDarkMode); const expenseIncomeAmountColor = getExpenseAndIncomeAmountColor(userStore.currentUserExpenseAmountColor, userStore.currentUserIncomeAmountColor, props.isDarkMode);
if (props.data) { if (props.data) {
const currentMonthFirstUnixTime = getThisMonthFirstUnixTime();
for (const item of props.data) { for (const item of props.data) {
const monthShortName = formatUnixTimeToGregorianLikeShortMonth(item.monthStartTime); const monthFirstUnixTime = getUnixTimeBeforeUnixTime(currentMonthFirstUnixTime, item.monthsBeforeCurrentMonth, 'months');
const monthShortName = formatUnixTimeToGregorianLikeShortMonth(monthFirstUnixTime);
monthNames.push(monthShortName); monthNames.push(monthShortName);
incomeAmounts.push(item.incomeAmount); incomeAmounts.push(item.incomeAmount);