feat(doctorstation): 新增传染病报告卡功能并优化患者登记组件
- 新增传染病报告卡完整实现,包含甲乙丙类传染病选择和报告信息录入 - 在患者登记组件中修复性别字典数据去重问题 - 添加编辑模式支持和原始数据存储功能 - 实现姓名和身份证唯一性校验的编辑模式跳过逻辑 - 添加年龄自动计算功能基于出生日期 - 确保性别值为字符串类型以便与下拉框选项匹配 - 更新患者登记组件的标题和状态管理逻辑
This commit is contained in:
@@ -445,15 +445,28 @@ const getGenderOptions = async () => {
|
||||
try {
|
||||
// 从字典管理获取性别数据
|
||||
const genderDict = await proxy.getDictDataByType('性别');
|
||||
|
||||
// 去重:使用 Map 根据 value 去重
|
||||
const uniqueMap = new Map();
|
||||
genderDict.forEach(item => {
|
||||
if (!uniqueMap.has(item.value)) {
|
||||
uniqueMap.set(item.value, item);
|
||||
}
|
||||
});
|
||||
const uniqueGenders = Array.from(uniqueMap.values());
|
||||
|
||||
// 按字典排序字段排序
|
||||
const sortedGenders = genderDict.sort((a, b) => {
|
||||
const sortedGenders = uniqueGenders.sort((a, b) => {
|
||||
return (a.sort || 0) - (b.sort || 0);
|
||||
});
|
||||
// 转换为组件需要的格式
|
||||
|
||||
// 转换为组件需要的格式,确保 value 是字符串类型
|
||||
administrativegenderList.value = sortedGenders.map(item => ({
|
||||
value: item.value, // 使用字典键值
|
||||
value: String(item.value), // 确保值为字符串类型
|
||||
info: item.label // 使用字典标签
|
||||
}));
|
||||
|
||||
console.log('性别字典数据加载完成:', administrativegenderList.value);
|
||||
} catch (error) {
|
||||
console.error('获取性别字典数据失败:', error);
|
||||
// 降级方案:使用默认的性别选项
|
||||
@@ -527,6 +540,8 @@ const options = ref(pcas); // 地区数据
|
||||
|
||||
const title = ref('新增患者');
|
||||
const visible = ref(false);
|
||||
const isEditMode = ref(false); // 标记是否为编辑模式
|
||||
const originalFormData = ref({}); // 存储原始数据,用于编辑模式比较
|
||||
const emits = defineEmits(['submit']); // 声明自定义事件
|
||||
|
||||
const validateUniquePatient = (rule, value, callback) => {
|
||||
@@ -536,6 +551,13 @@ const validateUniquePatient = (rule, value, callback) => {
|
||||
return callback(); // 不满足条件,不校验
|
||||
}
|
||||
|
||||
// 修改模式下,如果姓名和身份证与原值相同,跳过校验
|
||||
if (isEditMode.value &&
|
||||
originalFormData.value.name === name &&
|
||||
originalFormData.value.idCard === idCard) {
|
||||
return callback();
|
||||
}
|
||||
|
||||
// 使用 axios 直接请求,避免依赖 proxy.$http
|
||||
import('@/utils/request').then(({ default: request }) => {
|
||||
request({
|
||||
@@ -1161,6 +1183,11 @@ const getCountryCodeOptions = async () => {
|
||||
|
||||
// 显示弹框
|
||||
function show() {
|
||||
// 重置为新增模式
|
||||
isEditMode.value = false;
|
||||
title.value = '新增患者';
|
||||
originalFormData.value = {};
|
||||
|
||||
// queryParams.roleId = props.roleId;
|
||||
getList();
|
||||
// 调用从字典管理获取性别数据的函数
|
||||
@@ -1206,6 +1233,10 @@ function reset() {
|
||||
organizationId: undefined,
|
||||
birthDate: undefined,
|
||||
};
|
||||
// 重置编辑模式状态
|
||||
isEditMode.value = false;
|
||||
title.value = '新增患者';
|
||||
originalFormData.value = {};
|
||||
proxy.resetForm('patientRef');
|
||||
}
|
||||
/** 提交按钮 */
|
||||
@@ -1376,13 +1407,32 @@ watch(
|
||||
// 设置查看模式
|
||||
function setViewMode(isView) {
|
||||
isViewMode.value = isView;
|
||||
if (isView) {
|
||||
title.value = '查看患者';
|
||||
}
|
||||
}
|
||||
|
||||
// 设置表单数据
|
||||
function setFormData(rowData) {
|
||||
// 标记为编辑模式
|
||||
isEditMode.value = true;
|
||||
title.value = '修改患者';
|
||||
|
||||
// 深拷贝数据以避免引用问题
|
||||
form.value = JSON.parse(JSON.stringify(rowData));
|
||||
|
||||
// 确保性别值为字符串类型,以便与下拉框选项匹配
|
||||
if (form.value.genderEnum !== undefined && form.value.genderEnum !== null) {
|
||||
form.value.genderEnum = String(form.value.genderEnum);
|
||||
}
|
||||
|
||||
// 保存原始数据,用于唯一性校验比较
|
||||
originalFormData.value = {
|
||||
name: rowData.name,
|
||||
idCard: rowData.idCard,
|
||||
identifierNo: rowData.identifierNo
|
||||
};
|
||||
|
||||
// 如果有地址信息,设置级联选择器
|
||||
if (rowData.addressProvince || rowData.addressCity || rowData.addressDistrict) {
|
||||
// 构建地址数组
|
||||
@@ -1399,7 +1449,7 @@ function setFormData(rowData) {
|
||||
}
|
||||
}
|
||||
|
||||
// 设置患者ID信息 - 如果没有patientIdInfoList则创建一个
|
||||
// 设置患者 ID 信息 - 如果没有 patientIdInfoList 则创建一个
|
||||
if (!form.value.patientIdInfoList || form.value.patientIdInfoList.length === 0) {
|
||||
form.value.patientIdInfoList = [
|
||||
{
|
||||
@@ -1413,10 +1463,29 @@ function setFormData(rowData) {
|
||||
form.value.typeCode = '01';
|
||||
}
|
||||
|
||||
// 设置活动标识 - 根据activeFlag设置tempFlag
|
||||
// 设置活动标识 - 根据 activeFlag 设置 tempFlag
|
||||
if (form.value.activeFlag) {
|
||||
form.value.tempFlag = form.value.activeFlag === 2 ? '1' : '0';
|
||||
}
|
||||
|
||||
// 根据出生日期自动计算年龄
|
||||
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--;
|
||||
}
|
||||
|
||||
// 只有当年龄为正数时才设置
|
||||
if (age >= 0) {
|
||||
form.value.age = age;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将地址转换为级联选择器所需的代码
|
||||
|
||||
Reference in New Issue
Block a user