u
This commit is contained in:
1 parent
1934225c53
commit
e51f4948d4
10 files changed
+89
-66
No files matched your search
@@ -96,7 +96,12 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
|
||||
|
||||
categories: [],
|
||||
|
||||
setCategories: categories => set({ categories }),
|
||||
setCategories: categories =>
|
||||
set({
|
||||
categories: [...categories].sort(
|
||||
(a, b) => (a.sort_number ?? 0) - (b.sort_number ?? 0),
|
||||
),
|
||||
}),
|
||||
|
||||
init: async () => {
|
||||
try {
|
||||
@@ -120,14 +125,10 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
|
||||
},
|
||||
|
||||
getExpenseCategories: () =>
|
||||
(get().categories || [])
|
||||
.filter(c => c.type === MoneyCategoryEnum.Expense)
|
||||
.sort((a, b) => (a.sort_number ?? 0) - (b.sort_number ?? 0)),
|
||||
get().categories.filter(c => c.type === MoneyCategoryEnum.Expense),
|
||||
|
||||
getIncomeCategories: () =>
|
||||
(get().categories || [])
|
||||
.filter(c => c.type === MoneyCategoryEnum.Income)
|
||||
.sort((a, b) => (a.sort_number ?? 0) - (b.sort_number ?? 0)),
|
||||
get().categories.filter(c => c.type === MoneyCategoryEnum.Income),
|
||||
|
||||
getCategoryById: (id: number) => {
|
||||
return get().categories.find(c => c.id === id) || null
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import type { MoneyRecordGroup, MoneyRecordItem } from '@/types/money/record'
|
||||
import type { MoneyRecord, MoneyRecordGroup } from '@/types/money/record'
|
||||
import { create } from 'zustand'
|
||||
import { deleteMoneyRecordApi } from '@/request/api/money/record'
|
||||
import { MoneyCategoryEnum } from '@/types/money/category'
|
||||
import { add, sub } from '@/utils/math'
|
||||
import { isInMonth } from '@/utils/time'
|
||||
import { useMoneyCategoryStore } from './moneyCategory'
|
||||
|
||||
interface MoneyRecordStore {
|
||||
records: MoneyRecordGroup[]
|
||||
@@ -14,30 +15,47 @@ interface MoneyRecordStore {
|
||||
getTotalExpense: () => string
|
||||
getTotalBalance: () => string
|
||||
|
||||
setRecords: (records: MoneyRecordGroup[], month: string) => void
|
||||
setRecords: (records: MoneyRecord[], month: string) => void
|
||||
setCurrentMonth: (month: string) => void
|
||||
|
||||
addMoneyRecord: (data: MoneyRecordItem) => void
|
||||
updateMoneyRecord: (updated: MoneyRecordItem) => void
|
||||
addMoneyRecord: (data: MoneyRecord) => void
|
||||
updateMoneyRecord: (updated: MoneyRecord) => void
|
||||
deleteMoneyRecord: (id: number) => void
|
||||
|
||||
getMoneyRecordById: (id: number) => MoneyRecordItem | null
|
||||
getMoneyRecordById: (id: number) => MoneyRecord | null
|
||||
}
|
||||
|
||||
function recomputeGroups(records: MoneyRecordItem[]) {
|
||||
function recomputeGroups(records: MoneyRecord[]) {
|
||||
const { getCategoryById } = useMoneyCategoryStore.getState()
|
||||
|
||||
const groupsMap: Record<string, MoneyRecordGroup> = {}
|
||||
|
||||
records.forEach((r) => {
|
||||
const group = groupsMap[r.record_time] ?? { record_time: r.record_time, records: [], income: '0.00', expense: '0.00' }
|
||||
const category = getCategoryById(r.category_id)
|
||||
if (!category)
|
||||
return
|
||||
|
||||
const group = groupsMap[r.record_time] ?? {
|
||||
record_time: r.record_time,
|
||||
records: [],
|
||||
income: '0.00',
|
||||
expense: '0.00',
|
||||
}
|
||||
|
||||
group.records.push(r)
|
||||
if (r.category_type === MoneyCategoryEnum.Expense)
|
||||
|
||||
if (category.type === MoneyCategoryEnum.Expense)
|
||||
group.expense = add(group.expense, r.amount)
|
||||
if (r.category_type === MoneyCategoryEnum.Income)
|
||||
|
||||
if (category.type === MoneyCategoryEnum.Income)
|
||||
group.income = add(group.income, r.amount)
|
||||
|
||||
groupsMap[r.record_time] = group
|
||||
})
|
||||
|
||||
return Object.values(groupsMap).sort((a, b) => b.record_time.localeCompare(a.record_time))
|
||||
return Object.values(groupsMap).sort((a, b) =>
|
||||
b.record_time.localeCompare(a.record_time),
|
||||
)
|
||||
}
|
||||
|
||||
export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
|
||||
@@ -59,8 +77,10 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
|
||||
|
||||
/* ---------------- base ---------------- */
|
||||
setRecords: (records, month) => {
|
||||
const flatRecords = records.flatMap(g => g.records)
|
||||
const newGroups = recomputeGroups(flatRecords)
|
||||
const filtered = records.filter(r =>
|
||||
isInMonth(r.record_time, month),
|
||||
)
|
||||
const newGroups = recomputeGroups(filtered)
|
||||
set({ records: newGroups, currentMonth: month })
|
||||
},
|
||||
|
||||
|
||||
Reference in new issue
Block a user