feat: 添加信贷客户家庭关系表单前端校验

**必填字段校验:**
- 信贷客户身份证号(必填+18位格式校验)
- 关系类型(必填)
- 关系人姓名(必填+长度2-50+字符格式)
- 性别(必填)
- 关系人证件类型(必填)
- 关系人证件号码(必填+动态格式校验)

**格式校验:**
- 身份证号:18位国家标准格式+校验位验证
- 护照:字母开头6-20位字符
- 手机号码:11位1开头格式验证
- 姓名:仅支持中英文和·符号

**业务逻辑校验:**
- 出生日期:不能晚于当前日期,不能早于150年前
- 生效/失效日期:失效日期不能早于生效日期

**长度限制:**
- 微信名称1/2/3:最多50字符
- 详细联系地址:最多200字符
- 关系详细描述:最多500字符
This commit is contained in:
wkc
2026-02-11 17:09:36 +08:00
parent 45e4096366
commit 12e384ab19

View File

@@ -496,19 +496,56 @@ export default {
// 表单校验 // 表单校验
rules: { rules: {
personId: [ personId: [
{ required: true, message: "信贷客户身份证号不能为空", trigger: "blur" } { required: true, message: "信贷客户身份证号不能为空", trigger: "blur" },
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/, message: "请输入正确的18位身份证号", trigger: "blur" }
], ],
relationType: [ relationType: [
{ required: true, message: "关系类型不能为空", trigger: "change" } { required: true, message: "关系类型不能为空", trigger: "change" }
], ],
relationName: [ relationName: [
{ required: true, message: "关系人姓名不能为空", trigger: "blur" } { required: true, message: "关系人姓名不能为空", trigger: "blur" },
{ min: 2, max: 50, message: "关系人姓名长度在2到50个字符", trigger: "blur" },
{ pattern: /^[\u4e00-\u9fa5a-zA-Z·]+$/, message: "姓名只能包含中文、英文和·", trigger: "blur" }
],
gender: [
{ required: true, message: "性别不能为空", trigger: "change" }
], ],
relationCertType: [ relationCertType: [
{ required: true, message: "关系人证件类型不能为空", trigger: "change" } { required: true, message: "关系人证件类型不能为空", trigger: "change" }
], ],
relationCertNo: [ relationCertNo: [
{ required: true, message: "关系人证件号码不能为空", trigger: "blur" } { required: true, message: "关系人证件号码不能为空", trigger: "blur" },
{ validator: this.validateCertNo, trigger: "blur" }
],
mobilePhone1: [
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码", trigger: "blur" }
],
mobilePhone2: [
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号码", trigger: "blur" }
],
wechatNo1: [
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
],
wechatNo2: [
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
],
wechatNo3: [
{ max: 50, message: "微信名称不能超过50个字符", trigger: "blur" }
],
contactAddress: [
{ max: 200, message: "详细联系地址不能超过200个字符", trigger: "blur" }
],
relationDesc: [
{ max: 500, message: "关系详细描述不能超过500个字符", trigger: "blur" }
],
birthDate: [
{ validator: this.validateBirthDate, trigger: "change" }
],
effectiveDate: [
{ validator: this.validateDateRange, trigger: "change" }
],
invalidDate: [
{ validator: this.validateDateRange, trigger: "change" }
] ]
}, },
// 导入参数 // 导入参数
@@ -564,6 +601,118 @@ export default {
} }
}, },
methods: { methods: {
/**
* 校验证件号码
* 根据证件类型进行不同的校验
*/
validateCertNo(rule, value, callback) {
if (!value) {
callback();
return;
}
const certType = this.form.relationCertType;
if (certType === '身份证') {
// 18位身份证号码校验
const pattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/;
if (!pattern.test(value)) {
callback(new Error('请输入正确的18位身份证号码'));
return;
}
// 校验身份证校验位
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(value[i]) * weights[i];
}
const checkCode = checkCodes[sum % 11];
if (value[17].toUpperCase() !== checkCode) {
callback(new Error('身份证号码校验位错误'));
return;
}
} else if (certType === '护照') {
// 护照校验字母开头后跟数字总长度6-20位
const pattern = /^[a-zA-Z][0-9a-zA-Z]{5,19}$/;
if (!pattern.test(value)) {
callback(new Error('护照号码格式不正确应为字母开头的6-20位字符'));
return;
}
} else {
// 其他证件类型:基本长度校验
if (value.length < 6 || value.length > 50) {
callback(new Error('证件号码长度应在6-50位之间'));
return;
}
}
callback();
},
/**
* 校验出生日期
* 出生日期不能晚于当前日期
*/
validateBirthDate(rule, value, callback) {
if (!value) {
callback();
return;
}
const birthDate = new Date(value);
const today = new Date();
if (birthDate > today) {
callback(new Error('出生日期不能晚于当前日期'));
return;
}
// 校验年龄不能超过150岁
const maxBirthDate = new Date();
maxBirthDate.setFullYear(maxBirthDate.getFullYear() - 150);
if (birthDate < maxBirthDate) {
callback(new Error('出生日期不能早于150年前'));
return;
}
callback();
},
/**
* 校验生效日期和失效日期
* 失效日期不能早于生效日期
*/
validateDateRange(rule, value, callback) {
if (!value) {
callback();
return;
}
// 如果当前校验的是失效日期
if (rule.field === 'invalidDate' && this.form.effectiveDate) {
const effectiveDate = new Date(this.form.effectiveDate);
const invalidDate = new Date(value);
if (invalidDate < effectiveDate) {
callback(new Error('失效日期不能早于生效日期'));
return;
}
}
// 如果生效日期和失效日期都已填写,确保失效日期晚于生效日期
if (this.form.effectiveDate && this.form.invalidDate) {
const effectiveDate = new Date(this.form.effectiveDate);
const invalidDate = new Date(this.form.invalidDate);
if (invalidDate < effectiveDate) {
if (rule.field === 'effectiveDate') {
callback(new Error('生效日期不能晚于失效日期'));
return;
}
}
}
callback();
},
/** 查询信贷客户家庭关系列表 */ /** 查询信贷客户家庭关系列表 */
getList() { getList() {
this.loading = true; this.loading = true;