131 lines
2.9 KiB
TypeScript
131 lines
2.9 KiB
TypeScript
import {
|
||
MOCK_ACCOUNTS,
|
||
MOCK_BUDGETS,
|
||
MOCK_CATEGORIES,
|
||
MOCK_CURRENCIES,
|
||
MOCK_EXCHANGE_RATES,
|
||
} from './mock-data';
|
||
import db from './sqlite';
|
||
|
||
export function listAccounts() {
|
||
return MOCK_ACCOUNTS;
|
||
}
|
||
|
||
export function listCategories() {
|
||
// 从数据库读取分类
|
||
try {
|
||
const stmt = db.prepare(`
|
||
SELECT id, name, type, icon, color, user_id as userId, is_active as isActive
|
||
FROM finance_categories
|
||
WHERE is_active = 1
|
||
ORDER BY type, id
|
||
`);
|
||
const categories = stmt.all() as any[];
|
||
|
||
// 转换为前端需要的格式
|
||
return categories.map(cat => ({
|
||
id: cat.id,
|
||
userId: cat.userId,
|
||
name: cat.name,
|
||
type: cat.type,
|
||
icon: cat.icon,
|
||
color: cat.color,
|
||
sortOrder: cat.id,
|
||
isSystem: true,
|
||
isActive: Boolean(cat.isActive),
|
||
}));
|
||
} catch (error) {
|
||
console.error('从数据库读取分类失败,使用MOCK数据:', error);
|
||
return MOCK_CATEGORIES;
|
||
}
|
||
}
|
||
|
||
export function listBudgets() {
|
||
return MOCK_BUDGETS;
|
||
}
|
||
|
||
export function listCurrencies() {
|
||
return MOCK_CURRENCIES;
|
||
}
|
||
|
||
export function listExchangeRates() {
|
||
return MOCK_EXCHANGE_RATES;
|
||
}
|
||
|
||
export function createCategoryRecord(category: any) {
|
||
try {
|
||
const stmt = db.prepare(`
|
||
INSERT INTO finance_categories (name, type, icon, color, user_id, is_active)
|
||
VALUES (?, ?, ?, ?, ?, 1)
|
||
`);
|
||
const result = stmt.run(
|
||
category.name,
|
||
category.type,
|
||
category.icon || '📝',
|
||
category.color || '#dfe4ea',
|
||
category.userId || 1
|
||
);
|
||
return {
|
||
id: result.lastInsertRowid,
|
||
...category,
|
||
createdAt: new Date().toISOString(),
|
||
};
|
||
} catch (error) {
|
||
console.error('创建分类失败:', error);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
export function updateCategoryRecord(id: number, category: any) {
|
||
try {
|
||
const updates: string[] = [];
|
||
const params: any[] = [];
|
||
|
||
if (category.name) {
|
||
updates.push('name = ?');
|
||
params.push(category.name);
|
||
}
|
||
if (category.icon) {
|
||
updates.push('icon = ?');
|
||
params.push(category.icon);
|
||
}
|
||
if (category.color) {
|
||
updates.push('color = ?');
|
||
params.push(category.color);
|
||
}
|
||
|
||
if (updates.length === 0) return null;
|
||
|
||
params.push(id);
|
||
const stmt = db.prepare(`
|
||
UPDATE finance_categories
|
||
SET ${updates.join(', ')}
|
||
WHERE id = ?
|
||
`);
|
||
stmt.run(...params);
|
||
|
||
// 返回更新后的分类
|
||
const selectStmt = db.prepare('SELECT * FROM finance_categories WHERE id = ?');
|
||
return selectStmt.get(id);
|
||
} catch (error) {
|
||
console.error('更新分类失败:', error);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
export function deleteCategoryRecord(id: number) {
|
||
try {
|
||
// 软删除
|
||
const stmt = db.prepare(`
|
||
UPDATE finance_categories
|
||
SET is_active = 0
|
||
WHERE id = ?
|
||
`);
|
||
stmt.run(id);
|
||
return true;
|
||
} catch (error) {
|
||
console.error('删除分类失败:', error);
|
||
return false;
|
||
}
|
||
}
|