import type { TransactionStatus } from '~/utils/finance-repository'; import { readBody } from 'h3'; import { createTransaction, getAccountById, getCategoryById, } from '~/utils/finance-repository'; import { useResponseError, useResponseSuccess } from '~/utils/response'; import { notifyTransaction } from '~/utils/telegram-bot'; import { notifyTransactionWebhook } from '~/utils/telegram-webhook'; const DEFAULT_CURRENCY = 'CNY'; const ALLOWED_STATUSES = new Set([ '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.has(status)) { return useResponseError('状态值不合法', -1); } const transaction = await 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 { const category = transaction.categoryId ? await getCategoryById(transaction.categoryId) : null; const account = transaction.accountId ? await getAccountById(transaction.accountId) : null; await notifyTransaction( { id: transaction.id, type: transaction.type, amount: transaction.amount, currency: transaction.currency, categoryName: category?.name, accountName: account?.name, 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); });