From 12e384ab19506638cf1590006d7892be9f654d8f Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Wed, 11 Feb 2026 17:09:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BF=A1=E8=B4=B7?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E5=AE=B6=E5=BA=AD=E5=85=B3=E7=B3=BB=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E5=89=8D=E7=AB=AF=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **必填字段校验:** - 信贷客户身份证号(必填+18位格式校验) - 关系类型(必填) - 关系人姓名(必填+长度2-50+字符格式) - 性别(必填) - 关系人证件类型(必填) - 关系人证件号码(必填+动态格式校验) **格式校验:** - 身份证号:18位国家标准格式+校验位验证 - 护照:字母开头6-20位字符 - 手机号码:11位1开头格式验证 - 姓名:仅支持中英文和·符号 **业务逻辑校验:** - 出生日期:不能晚于当前日期,不能早于150年前 - 生效/失效日期:失效日期不能早于生效日期 **长度限制:** - 微信名称1/2/3:最多50字符 - 详细联系地址:最多200字符 - 关系详细描述:最多500字符 --- .../src/views/ccdiCustFmyRelation/index.vue | 155 +++++++++++++++++- 1 file changed, 152 insertions(+), 3 deletions(-) diff --git a/ruoyi-ui/src/views/ccdiCustFmyRelation/index.vue b/ruoyi-ui/src/views/ccdiCustFmyRelation/index.vue index 30113fd..476bf60 100644 --- a/ruoyi-ui/src/views/ccdiCustFmyRelation/index.vue +++ b/ruoyi-ui/src/views/ccdiCustFmyRelation/index.vue @@ -496,19 +496,56 @@ export default { // 表单校验 rules: { 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: [ { required: true, message: "关系类型不能为空", trigger: "change" } ], 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: [ { required: true, message: "关系人证件类型不能为空", trigger: "change" } ], 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: { + /** + * 校验证件号码 + * 根据证件类型进行不同的校验 + */ + 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() { this.loading = true;