import { readBody } from 'h3'; import { createTransaction, type TransactionStatus, } from '~/utils/finance-repository'; import { useResponseError, useResponseSuccess } from '~/utils/response'; import { notifyTransactionWebhook } from '~/utils/telegram-webhook'; import { notifyTransaction } from '~/utils/telegram-bot'; import db from '~/utils/sqlite'; const DEFAULT_CURRENCY = 'CNY'; const ALLOWED_STATUSES: TransactionStatus[] = [ 'draft', 'pending', 'approved', 'rejected', 'paid', ]; export default defineEventHandler(async (event) => { const body = await readBody(event); if (!body?.type || !body?.amount || !body?.transactionDate) { return useResponseError('缺少必填字段', -1); } const amount = Number(body.amount); if (Number.isNaN(amount)) { return useResponseError('金额格式不正确', -1); } const status = (body.status as TransactionStatus | undefined) ?? 'approved'; if (!ALLOWED_STATUSES.includes(status)) { return useResponseError('状态值不合法', -1); } const transaction = createTransaction({ type: body.type, amount, currency: body.currency ?? DEFAULT_CURRENCY, categoryId: body.categoryId ?? null, accountId: body.accountId ?? null, transactionDate: body.transactionDate, description: body.description ?? '', project: body.project ?? null, memo: body.memo ?? null, status, reimbursementBatch: body.reimbursementBatch ?? null, reviewNotes: body.reviewNotes ?? null, submittedBy: body.submittedBy ?? null, approvedBy: body.approvedBy ?? null, statusUpdatedAt: body.statusUpdatedAt ?? undefined, approvedAt: body.approvedAt ?? undefined, }); // 发送Webhook通知(保留原有功能) notifyTransactionWebhook(transaction, { action: 'created' }).catch((error) => console.error('[finance][transactions.post] webhook notify failed', error), ); // 发送Telegram通知(新功能) try { // 获取分类和账户名称 let categoryName: string | undefined; let accountName: string | undefined; if (transaction.categoryId) { const category = db .prepare<{ name: string }>('SELECT name FROM finance_categories WHERE id = ?') .get(transaction.categoryId); categoryName = category?.name; } if (transaction.accountId) { const account = db .prepare<{ name: string }>('SELECT name FROM finance_accounts WHERE id = ?') .get(transaction.accountId); accountName = account?.name; } await notifyTransaction( { id: transaction.id, type: transaction.type, amount: transaction.amount, currency: transaction.currency, categoryName, accountName, transactionDate: transaction.transactionDate, description: transaction.description || undefined, status: transaction.status, }, 'created', ); } catch (error) { console.error('[finance][transactions.post] telegram notify failed', error); } return useResponseSuccess(transaction); });