Files
nxxmdata/bank-backend/models/Account.js
2025-09-17 18:04:28 +08:00

224 lines
4.8 KiB
JavaScript

/**
* 账户模型
* @file Account.js
* @description 银行账户模型定义
*/
const { DataTypes } = require('sequelize');
const BaseModel = require('./BaseModel');
const { sequelize } = require('../config/database');
class Account extends BaseModel {
/**
* 获取账户余额(元)
* @returns {String} 格式化后的余额
*/
getBalanceFormatted() {
return this.formatAmount(this.balance);
}
/**
* 获取可用余额(元)
* @returns {String} 格式化后的可用余额
*/
getAvailableBalanceFormatted() {
return this.formatAmount(this.available_balance);
}
/**
* 获取冻结金额(元)
* @returns {String} 格式化后的冻结金额
*/
getFrozenAmountFormatted() {
return this.formatAmount(this.frozen_amount);
}
/**
* 检查账户是否可用
* @returns {Boolean} 是否可用
*/
isActive() {
return this.status === 'active';
}
/**
* 检查余额是否充足
* @param {Number} amount 金额(分)
* @returns {Boolean} 余额是否充足
*/
hasSufficientBalance(amount) {
return this.available_balance >= amount;
}
/**
* 冻结资金
* @param {Number} amount 金额(分)
* @returns {Promise<Boolean>} 操作结果
*/
async freezeAmount(amount) {
if (!this.hasSufficientBalance(amount)) {
return false;
}
this.available_balance -= amount;
this.frozen_amount += amount;
await this.save();
return true;
}
/**
* 解冻资金
* @param {Number} amount 金额(分)
* @returns {Promise<Boolean>} 操作结果
*/
async unfreezeAmount(amount) {
if (this.frozen_amount < amount) {
return false;
}
this.available_balance += amount;
this.frozen_amount -= amount;
await this.save();
return true;
}
/**
* 扣减余额
* @param {Number} amount 金额(分)
* @returns {Promise<Boolean>} 操作结果
*/
async deductBalance(amount) {
if (!this.hasSufficientBalance(amount)) {
return false;
}
this.balance -= amount;
this.available_balance -= amount;
await this.save();
return true;
}
/**
* 增加余额
* @param {Number} amount 金额(分)
* @returns {Promise<Boolean>} 操作结果
*/
async addBalance(amount) {
this.balance += amount;
this.available_balance += amount;
await this.save();
return true;
}
/**
* 获取账户交易记录
* @param {Object} options 查询选项
* @returns {Promise<Array>} 交易记录列表
*/
async getTransactions(options = {}) {
try {
const { Transaction } = require('./index');
return await Transaction.findAll({
where: {
account_id: this.id,
...options.where
},
order: [['created_at', 'DESC']],
limit: options.limit || 50,
...options
});
} catch (error) {
console.error('获取账户交易记录失败:', error);
return [];
}
}
}
// 初始化Account模型
Account.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
account_number: {
type: DataTypes.STRING(20),
allowNull: false,
unique: true,
comment: '账户号码'
},
user_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'bank_users',
key: 'id'
}
},
account_type: {
type: DataTypes.ENUM('savings', 'checking', 'credit', 'loan'),
allowNull: false,
defaultValue: 'savings',
comment: '账户类型:储蓄、支票、信用卡、贷款'
},
balance: {
type: DataTypes.BIGINT,
allowNull: false,
defaultValue: 0,
comment: '账户余额(分)'
},
available_balance: {
type: DataTypes.BIGINT,
allowNull: false,
defaultValue: 0,
comment: '可用余额(分)'
},
frozen_amount: {
type: DataTypes.BIGINT,
allowNull: false,
defaultValue: 0,
comment: '冻结金额(分)'
},
currency: {
type: DataTypes.STRING(3),
allowNull: false,
defaultValue: 'CNY',
comment: '货币类型'
},
interest_rate: {
type: DataTypes.DECIMAL(5, 4),
allowNull: true,
comment: '利率(年化)'
},
status: {
type: DataTypes.ENUM('active', 'inactive', 'frozen', 'closed'),
allowNull: false,
defaultValue: 'active'
},
opened_at: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
comment: '开户时间'
},
closed_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_accounts',
modelName: 'Account'
});
module.exports = Account;