Merge branch 'develop' of https://gitea.gentronhealth.com/py/his into develop

This commit is contained in:
2026-02-03 15:11:03 +08:00

View File

@@ -10,58 +10,8 @@
<el-input v-model="form.name" clearable :disabled="isViewMode" /> <el-input v-model="form.name" clearable :disabled="isViewMode" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="性别" prop="genderEnum"> <el-form-item label="民族" prop="nationalityCode" label-width="80px">
<el-radio-group v-model="form.genderEnum" :disabled="isViewMode">
<el-radio
v-for="item in administrativegenderList"
:key="item.value"
:label="item.value"
>
{{ item.info }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="活动标识" prop="tempFlag">
<el-radio-group v-model="form.tempFlag" :disabled="isViewMode">
<el-radio v-for="dict in patient_temp_flag" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系方式" prop="phone">
<el-input v-model="form.phone" clearable :disabled="isViewMode" />
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="证件类型" prop="typeCode">
<el-select
v-model="form.typeCode"
placeholder="证件类型"
clearable
:disabled="isViewMode"
@change="typeChange"
>
<el-option
v-for="dict in sys_idtype"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="身份证号码" prop="idCard">
<el-input v-model="form.idCard" clearable :disabled="isViewMode" @blur="onBlur" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="民族" prop="nationalityCode">
<el-select v-model="form.nationalityCode" clearable filterable :disabled="isViewMode"> <el-select v-model="form.nationalityCode" clearable filterable :disabled="isViewMode">
<el-option <el-option
v-for="item in nationality_code" v-for="item in nationality_code"
@@ -99,24 +49,84 @@
</el-row> </el-row>
<!-- 第二行证件类别证件号码*年龄 --> <!-- 第二行证件类别证件号码*年龄 -->
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="证件类别" prop="typeCode" label-width="80px">
<el-select
v-model="form.typeCode"
placeholder="就诊卡"
clearable
:disabled="isViewMode"
>
<el-option
v-for="dict in sys_idtype"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="证件号码" prop="idCard" label-width="80px">
<el-input v-model="form.idCard" clearable :disabled="isViewMode" @blur="onBlur" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="年龄" prop="age" label-width="80px">
<el-input
v-model="form.age"
:disabled="isViewMode"
@input="handleAgeInput"
placeholder="请输入年龄"
>
<template #suffix></template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行国籍*联系方式出生日期 -->
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="国籍" prop="countryCode" label-width="80px">
<el-select v-model="form.countryCode" placeholder="请选择国籍" clearable filterable :disabled="isViewMode">
<el-option
v-for="item in countryCodeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系方式" prop="phone" label-width="80px">
<el-input v-model="form.phone" 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-row :gutter="10"> <el-row :gutter="10">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="就诊卡号" prop="identifierNo"> <el-form-item label="就诊卡号" prop="identifierNo">
<el-input v-model="form.identifierNo" clearable :disabled="isViewMode" /> <el-input v-model="form.identifierNo" clearable :disabled="isViewMode" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="8">
<el-form-item label="国家编码" prop="countryCode">
<el-input v-model="form.countryCode" clearable :disabled="isViewMode" />
</el-form-item>
</el-col> -->
</el-row>
<!-- <el-col :span="6">
<el-form-item label="年龄" prop="age">
<el-input v-model="form.age" clearable :disabled="isViewMode"/>
</el-form-item>
</el-col> -->
<el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="职业" prop="prfsEnum"> <el-form-item label="职业" prop="prfsEnum">
<el-select v-model="form.prfsEnum" placeholder="职业" clearable :disabled="isViewMode"> <el-select v-model="form.prfsEnum" placeholder="职业" clearable :disabled="isViewMode">
@@ -135,7 +145,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<!-- 第四行工作单位 -->
<!-- 第五行工作单位 -->
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="工作单位" prop="workCompany"> <el-form-item label="工作单位" prop="workCompany">
@@ -262,7 +273,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="8">
<el-form-item label="死亡时间" prop="deceasedDate"> <el-form-item label="死亡时间" prop="deceasedDate">
<el-date-picker <el-date-picker
v-model="form.deceasedDate" v-model="form.deceasedDate"
@@ -345,6 +356,7 @@ import {addPatient, getOutpatientRegistrationList, patientlLists} from './outpat
import {updatePatient} from '@/views/patientmanagement/patientmanagement/component/api'; import {updatePatient} from '@/views/patientmanagement/patientmanagement/component/api';
import {getGenderAndAge, isValidCNidCardNumber, isValidCNPhoneNumber,} from '../../../../utils/validate'; import {getGenderAndAge, isValidCNidCardNumber, isValidCNPhoneNumber,} from '../../../../utils/validate';
import {ElMessage} from 'element-plus'; import {ElMessage} from 'element-plus';
import {getConfigKey} from '@/api/system/config'; // 导入获取配置的方法
const router = useRouter(); const router = useRouter();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@@ -578,28 +590,39 @@ const validateIdCard = (rule, value, callback) => {
// 监护人信息条件验证函数 // 监护人信息条件验证函数
const validateGuardianInfo = (rule, value, callback) => { const validateGuardianInfo = (rule, value, callback) => {
// 只有当年龄小于规定年龄时才验证监护人信息 // 从系统配置获取监护人规定年龄
if (form.value.age) { getConfigKey('guardianAge').then(res => {
// 提取年龄数字部分 if (res.code === 200) {
const ageMatch = form.value.age.toString().match(/\d+/); const guardianAgeValue = parseInt(res.data) || 16; // 默认值为16
if (ageMatch) {
const age = parseInt(ageMatch[0]); // 提取年龄数字部分
const guardianAgeValue = parseInt(props.guardianAge) || 16; const ageMatch = form.value.age.toString().match(/\d+/);
// 如果年龄小于规定年龄,监护人信息必须填写 if (ageMatch) {
if (age < guardianAgeValue && !value) { const age = parseInt(ageMatch[0]);
return callback(new Error(`年龄小于${guardianAgeValue}岁的患者必须填写监护人信息`)); // 如果年龄小于规定年龄,监护人信息必须填写
if (age < guardianAgeValue && !value) {
return callback(new Error(`年龄小于${guardianAgeValue}岁的患者必须填写监护人信息`));
}
} }
} }
} callback(); // 如果获取不到配置或出现错误,仍然通过验证
callback(); }).catch(error => {
console.error('获取监护人规定年龄配置失败:', error);
callback(); // 获取配置失败时也通过验证
});
} }
const data = reactive({ const data = reactive({
isViewMode: false, isViewMode: false,
form: { form: {
typeCode: '01', typeCode: '08', // 证件类别,默认为'08'(就诊卡)
tempFlag: '1', birthDate: undefined,
// genderEnum: 0, age: undefined,
hukouAddressSelect: undefined,
hukouAddress: undefined,
postalCode: undefined,
companyAddress: undefined,
patientDerived: undefined,
}, },
rules: { rules: {
name: [{ required: true, message: '姓名不能为空', trigger: 'change' }, name: [{ required: true, message: '姓名不能为空', trigger: 'change' },
@@ -616,7 +639,18 @@ const data = reactive({
genderEnum: [{ required: true, message: '请选择性别', trigger: 'change' }], genderEnum: [{ required: true, message: '请选择性别', trigger: 'change' }],
age: [{ required: true, message: '年龄不能为空', trigger: 'change' }], age: [{ required: true, message: '年龄不能为空', trigger: 'change' }],
phone: [{ required: true, message: '联系方式不能为空', trigger: 'change' }], phone: [{ required: true, message: '联系方式不能为空', trigger: 'change' }],
idCard: [{ required: true, message: '证件号不能为空', trigger: 'change' }], identifierNo: [{ required: true, message: '就诊卡号不能为空', trigger: 'change' }],
idCard: [
{ required: false, message: '证件号码不能为空', trigger: 'change' },
{ validator: validateIdCard, trigger: 'blur' },
{ validator: validateUniquePatient, trigger: 'blur' }
],
birthDate: [{ required: false, message: '请选择出生日期', trigger: 'change' }],
// 监护人信息条件验证规则
guardianName: [{ validator: validateGuardianInfo, trigger: 'blur' }],
guardianRelation: [{ validator: validateGuardianInfo, trigger: 'blur' }],
guardianPhone: [{ validator: validateGuardianInfo, trigger: 'blur' }],
guardianIdNo: [{ validator: validateGuardianInfo, trigger: 'blur' }],
}, },
}); });
@@ -1271,22 +1305,74 @@ function cancel() {
visible.value = false; visible.value = false;
reset(); reset();
} }
// 身份证号失去焦点获取年龄和性别 // 处理出生日期变化,自动计算年龄
const onBlur = () => { function handleBirthDateChange() {
if (form.value.typeCode === '01') { if (form.value.birthDate) {
const info = getGenderAndAge(form.value.idCard || ''); const birthDate = new Date(form.value.birthDate);
form.value.age = info.age; const today = new Date();
form.value.genderEnum = info.gender;
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;
} }
}; }
//切换证件类型
const typeChange = () => { // 处理年龄输入,自动计算出生日期
if (form.value.typeCode === '01') { function handleAgeInput() {
const info = getGenderAndAge(form.value.idCard || ''); // 提取数字部分
form.value.age = info.age; const ageMatch = form.value.age.match(/\d+/);
form.value.genderEnum = info.gender; 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) => {
if (newIdCard && newIdCard.length === 18) {
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;
const currentDay = today.getDate();
let age = currentYear - birthYear;
// 如果当前月份小于出生月份或者月份相同但当前日期小于出生日期则年龄减1
if (
currentMonth < birthMonth ||
(currentMonth === birthMonth && currentDay < birthDay)
) {
age--;
}
form.value.age = age ;
}
}
);
// 设置查看模式 // 设置查看模式
function setViewMode(isView) { function setViewMode(isView) {
isViewMode.value = isView; isViewMode.value = isView;