更新政府端和银行端
This commit is contained in:
210
bank-backend/models/Transaction.js
Normal file
210
bank-backend/models/Transaction.js
Normal file
@@ -0,0 +1,210 @@
|
||||
/**
|
||||
* 交易记录模型
|
||||
* @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<Boolean>} 操作结果
|
||||
*/
|
||||
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;
|
||||
Reference in New Issue
Block a user