/** * 贷款申请模型 * @file LoanApplication.js * @description 银行系统贷款申请数据模型 */ const { DataTypes } = require('sequelize'); const BaseModel = require('./BaseModel'); class LoanApplication extends BaseModel { /** * 获取申请状态文本 * @returns {String} 状态文本 */ getStatusText() { const statusMap = { pending_review: '待初审', verification_pending: '核验待放款', pending_binding: '待绑定', approved: '已通过', rejected: '已拒绝' }; return statusMap[this.status] || this.status; } /** * 获取申请类型文本 * @returns {String} 类型文本 */ getTypeText() { const typeMap = { personal: '个人贷款', business: '企业贷款', mortgage: '抵押贷款' }; return typeMap[this.type] || this.type; } /** * 格式化申请金额 * @returns {String} 格式化后的金额 */ getFormattedAmount() { return `${this.amount.toFixed(2)}元`; } } // 初始化LoanApplication模型 LoanApplication.init({ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, applicationNumber: { type: DataTypes.STRING(50), allowNull: false, unique: true, comment: '申请单号' }, productName: { type: DataTypes.STRING(200), allowNull: false, comment: '贷款产品名称' }, farmerName: { type: DataTypes.STRING(100), allowNull: false, comment: '申请养殖户姓名' }, borrowerName: { type: DataTypes.STRING(100), allowNull: false, comment: '贷款人姓名' }, borrowerIdNumber: { type: DataTypes.STRING(20), allowNull: false, comment: '贷款人身份证号' }, assetType: { type: DataTypes.STRING(50), allowNull: false, comment: '生资种类' }, applicationQuantity: { type: DataTypes.STRING(100), allowNull: false, comment: '申请数量' }, amount: { type: DataTypes.DECIMAL(15, 2), allowNull: false, comment: '申请额度' }, status: { type: DataTypes.ENUM( 'pending_review', 'verification_pending', 'pending_binding', 'approved', 'rejected' ), allowNull: false, defaultValue: 'pending_review', comment: '申请状态' }, type: { type: DataTypes.ENUM('personal', 'business', 'mortgage'), allowNull: false, defaultValue: 'personal', comment: '申请类型' }, term: { type: DataTypes.INTEGER, allowNull: false, comment: '申请期限(月)' }, interestRate: { type: DataTypes.DECIMAL(5, 2), allowNull: false, comment: '预计利率' }, phone: { type: DataTypes.STRING(20), allowNull: false, comment: '联系电话' }, purpose: { type: DataTypes.TEXT, allowNull: true, comment: '申请用途' }, remark: { type: DataTypes.TEXT, allowNull: true, comment: '备注' }, applicationTime: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, comment: '申请时间' }, approvedTime: { type: DataTypes.DATE, allowNull: true, comment: '审批通过时间' }, rejectedTime: { type: DataTypes.DATE, allowNull: true, comment: '审批拒绝时间' }, approvedBy: { type: DataTypes.INTEGER, allowNull: true, comment: '审批人ID' }, rejectedBy: { type: DataTypes.INTEGER, allowNull: true, comment: '拒绝人ID' }, rejectionReason: { type: DataTypes.TEXT, allowNull: true, comment: '拒绝原因' } }, { sequelize: require('../config/database').sequelize, modelName: 'LoanApplication', tableName: 'bank_loan_applications', timestamps: true, createdAt: 'createdAt', updatedAt: 'updatedAt', hooks: { beforeCreate: (application) => { // 生成申请单号 if (!application.applicationNumber) { const now = new Date(); const timestamp = now.getFullYear().toString() + (now.getMonth() + 1).toString().padStart(2, '0') + now.getDate().toString().padStart(2, '0') + now.getHours().toString().padStart(2, '0') + now.getMinutes().toString().padStart(2, '0') + now.getSeconds().toString().padStart(2, '0'); const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0'); application.applicationNumber = timestamp + random; } } } }); module.exports = LoanApplication;