@@ -80,6 +80,19 @@
< el-input v-model = "form.countryCode" clearable :disabled="isViewMode" / >
< / el-form-item >
< / el-col >
< el-col :span = "8" >
< el-form-item label = "出生日期" prop = "birthDate" >
< el-date-picker
v-model = "form.birthDate"
type = "date"
placeholder = "请选择出生日期"
format = "YYYY年MM月DD日"
:disabled = "isViewMode"
value -format = " YYYY -MM -DD "
@change ="handleBirthDateChange"
/ >
< / el-form-item >
< / el-col >
< / el-row >
<!-- < el-col :span = "6" >
< el-form-item label = "年龄" prop = "age" >
@@ -109,7 +122,8 @@
< el-input
v-model = "form.age"
:disabled = "isViewMode"
@input ="(value) => (form.age = value.replace(/[^0-9]/g, '')) "
@input ="handleAgeInput "
placeholder = "请输入年龄"
/ >
< / el-form-item >
< / el-col >
@@ -286,19 +300,62 @@ const title = ref('新增患者');
const visible = ref ( false ) ;
const emits = defineEmits ( [ 'submit' ] ) ; // 声明自定义事件
// 身份证号码校验函数
const validateIdCard = ( rule , value , callback ) => {
if ( ! value ) {
callback ( ) ;
return ;
}
// 18位身份证正则
const reg = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/ ;
if ( ! reg . test ( value ) ) {
return callback ( new Error ( '请输入正确的18位身份证号码' ) ) ;
}
// 校验码验证( 第18位)
const factor = [ 7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2 ] ;
const parity = [ '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' ] ;
let sum = 0 ;
for ( let i = 0 ; i < 17 ; i ++ ) {
sum += parseInt ( value . charAt ( i ) ) * factor [ i ] ;
}
const last = parity [ sum % 11 ] ;
if ( last !== value . charAt ( 17 ) . toUpperCase ( ) ) {
return callback ( new Error ( '身份证校验码错误' ) ) ;
}
callback ( ) ; // 校验通过
}
const data = reactive ( {
isViewMode : false ,
form : {
typeCode : '08' ,
birthDate : undefined ,
age : undefined ,
} ,
rules : {
name : [ { required : true , message : '姓名不能为空' , trigger : 'change' } ] ,
genderEnum : [ { required : true , message : '请选择性别' , trigger : 'change' } ] ,
age : [ { required : true , message : '年龄不能为空' , trigger : 'change' } ] ,
phone : [ { required : true , message : '联系方式不能为空' , trigger : 'change' } ] ,
identifierNo : [ { required : true , message : '就诊卡号不能为空' , trigger : 'change' } ] ,
idCard : [
{ required : true , message : '证件号码不能为空' , trigger : 'change' } ,
{ validator : validateIdCard , trigger : 'blur' }
] ,
birthDate : [ { required : false , message : '请选择出生日期' , trigger : 'change' } ] ,
} ,
} ) ;
const { queryParams , form , rules , isViewMode } = toRefs ( data ) ;
const props = defineProps ( {
@@ -308,6 +365,46 @@ const props = defineProps({
} ,
} ) ;
// 处理出生日期变化,自动计算年龄
function handleBirthDateChange ( ) {
if ( form . value . birthDate ) {
const birthDate = new Date ( form . value . birthDate ) ;
const today = new Date ( ) ;
let age = today . getFullYear ( ) - birthDate . getFullYear ( ) ;
const monthDiff = today . getMonth ( ) - birthDate . getMonth ( ) ;
// 计算精确年龄
if ( monthDiff < 0 || ( monthDiff === 0 && today . getDate ( ) < birthDate . getDate ( ) ) ) {
age -- ;
}
form . value . age = age + '岁' ;
}
}
// 处理年龄输入,自动计算出生日期
function handleAgeInput ( ) {
// 提取数字部分
const ageMatch = form . value . age . match ( /\d+/ ) ;
if ( ageMatch ) {
const age = parseInt ( ageMatch [ 0 ] ) ;
// 移除非数字字符,保留数字和可能的单位
form . value . age = age + '岁' ;
// 计算出生日期
const today = new Date ( ) ;
const birthYear = today . getFullYear ( ) - age ;
const birthMonth = today . getMonth ( ) ;
const birthDay = today . getDate ( ) ;
const birthDate = new Date ( birthYear , birthMonth , birthDay ) ;
// 格式化为YYYY-MM-DD
const formattedBirthDate = birthDate . toISOString ( ) . split ( 'T' ) [ 0 ] ;
form . value . birthDate = formattedBirthDate ;
}
}
watch (
( ) => form . value . idCard ,
( newIdCard ) => {
@@ -315,7 +412,8 @@ watch(
const birthYear = parseInt ( newIdCard . substring ( 6 , 10 ) ) ;
const birthMonth = parseInt ( newIdCard . substring ( 10 , 12 ) ) ;
const birthDay = parseInt ( newIdCard . substring ( 12 , 14 ) ) ;
// 设置出生日期
form . value . birthDate = ` ${ birthYear } - ${ birthMonth . toString ( ) . padStart ( 2 , '0' ) } - ${ birthDay . toString ( ) . padStart ( 2 , '0' ) } ` ;
const today = new Date ( ) ;
const currentYear = today . getFullYear ( ) ;
const currentMonth = today . getMonth ( ) + 1 ;
@@ -331,7 +429,7 @@ watch(
age -- ;
}
form . value . age = age ;
form . value . age = age + '岁' ;
}
}
) ;
@@ -424,6 +522,7 @@ function reset() {
maritalStatusEnum : undefined ,
busNo : undefined ,
organizationId : undefined ,
birthDate : undefined ,
} ;
proxy . resetForm ( 'patientRef' ) ;
}
@@ -485,7 +584,7 @@ defineExpose({
margin - right : 10 px ! important ;
}
/* 使用深度选择器 */
/* 使用深度选择器 */
. custom - label - spacing : deep ( . el - form - item _ _label ) {
line - height : 1.2 ; /* 调整行间距 */
margin - bottom : 4 px ; /* 调整 label 和输入框之间的间距 */