/** * 交易记录模型 * @file Transaction.js * @description 银行交易记录模型定义 */ const { DataTypes } = require('sequelize'); const BaseModel = require('./BaseModel'); const { sequelize } = require('../config/database'); class Transaction extends BaseModel { /** * 获取交易金额(元) * @returns {String} 格式化后的金额 */ getAmountFormatted() { return this.formatAmount(this.amount); } /** * 获取交易后余额(元) * @returns {String} 格式化后的余额 */ getBalanceAfterFormatted() { return this.formatAmount(this.balance_after); } /** * 检查是否为收入交易 * @returns {Boolean} 是否为收入 */ isIncome() { return this.transaction_type === 'deposit' || this.transaction_type === 'transfer_in' || this.transaction_type === 'interest'; } /** * 检查是否为支出交易 * @returns {Boolean} 是否为支出 */ isExpense() { return this.transaction_type === 'withdrawal' || this.transaction_type === 'transfer_out' || this.transaction_type === 'fee'; } /** * 获取交易状态描述 * @returns {String} 状态描述 */ getStatusDescription() { const statusMap = { 'pending': '处理中', 'completed': '已完成', 'failed': '失败', 'cancelled': '已取消', 'reversed': '已冲正' }; return statusMap[this.status] || '未知状态'; } /** * 获取交易类型描述 * @returns {String} 类型描述 */ getTypeDescription() { const typeMap = { 'deposit': '存款', 'withdrawal': '取款', 'transfer_in': '转入', 'transfer_out': '转出', 'interest': '利息', 'fee': '手续费', 'loan': '贷款', 'repayment': '还款' }; return typeMap[this.transaction_type] || '未知类型'; } /** * 检查交易是否可以撤销 * @returns {Boolean} 是否可以撤销 */ canReverse() { return this.status === 'completed' && this.transaction_type !== 'fee' && this.created_at > new Date(Date.now() - 24 * 60 * 60 * 1000); // 24小时内 } /** * 撤销交易 * @returns {Promise} 操作结果 */ async reverse() { if (!this.canReverse()) { return false; } try { // 更新交易状态 this.status = 'reversed'; this.reversed_at = new Date(); await this.save(); // 这里应该创建反向交易记录 // 实际实现中需要更复杂的逻辑 return true; } catch (error) { console.error('撤销交易失败:', error); return false; } } } // 初始化Transaction模型 Transaction.init({ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, transaction_number: { type: DataTypes.STRING(32), allowNull: false, unique: true, comment: '交易流水号' }, account_id: { type: DataTypes.INTEGER, allowNull: false, references: { model: 'bank_accounts', key: 'id' } }, transaction_type: { type: DataTypes.ENUM( 'deposit', 'withdrawal', 'transfer_in', 'transfer_out', 'interest', 'fee', 'loan', 'repayment' ), allowNull: false, comment: '交易类型' }, amount: { type: DataTypes.BIGINT, allowNull: false, comment: '交易金额(分)' }, balance_before: { type: DataTypes.BIGINT, allowNull: false, comment: '交易前余额(分)' }, balance_after: { type: DataTypes.BIGINT, allowNull: false, comment: '交易后余额(分)' }, counterparty_account: { type: DataTypes.STRING(20), allowNull: true, comment: '对方账户号' }, counterparty_name: { type: DataTypes.STRING(100), allowNull: true, comment: '对方户名' }, description: { type: DataTypes.STRING(255), allowNull: true, comment: '交易描述' }, reference_number: { type: DataTypes.STRING(50), allowNull: true, comment: '参考号' }, status: { type: DataTypes.ENUM('pending', 'completed', 'failed', 'cancelled', 'reversed'), allowNull: false, defaultValue: 'pending' }, processed_at: { type: DataTypes.DATE, allowNull: true, comment: '处理时间' }, reversed_at: { type: DataTypes.DATE, allowNull: true, comment: '撤销时间' }, created_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW }, updated_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW } }, { sequelize, tableName: 'bank_transactions', modelName: 'Transaction' }); module.exports = Transaction;