195 lines
4.4 KiB
JavaScript
195 lines
4.4 KiB
JavaScript
|
|
/**
|
||
|
|
* 贷款申请模型
|
||
|
|
* @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;
|