fix(database): 修复患者首页查询重复数据和关联查询问题

- 在ATDManageAppMapper.xml中添加DISTINCT关键字解决入院患者信息重复问题
- 重构PatientHomeAppMapper.xml中的复杂查询逻辑,使用子查询替代多层JOIN提高性能
- 修复vital signs查询中的字段关联错误,将base_service_req_id改为request_id
- 优化前端implementDepartment组件的数据加载逻辑,添加异步处理和错误捕获
- 为诊疗项目下拉框添加数据加载状态检查,防止空数据导致的界面异常
- 实现防抖机制和数据量限制,提升大数据量下的响应性能
- 添加并行数据加载,减少页面初始化时间
This commit is contained in:
2026-01-20 08:24:07 +08:00
parent a3dce8de60
commit 649f7bcf5b
4 changed files with 314 additions and 207 deletions

View File

@@ -236,24 +236,34 @@ const filterNode = (value, data) => {
};
// 所有诊疗项目列表
const allImplementDepartmentList = ref([]);
function getAllImplementDepartment() {
async function getAllImplementDepartment() {
loading.value = true;
getAllTreatmentList().then((res) => {
try {
const res = await getAllTreatmentList();
allImplementDepartmentList.value = res.data.map((item) => ({
value: item.activityDefinitionId,
label: item.activityDefinitionName,
}));
// 为所有现有行初始化过滤选项
catagoryList.value.forEach(row => {
if (!row.hasOwnProperty('filteredOptions')) {
row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个
row.loading = false;
}
});
// 为所有现有行初始化过滤选项(使用防抖处理,避免频繁更新)
if (catagoryList.value && catagoryList.value.length > 0) {
// 使用 setTimeout 将 DOM 更新推迟到下一个事件循环,避免阻塞
setTimeout(() => {
catagoryList.value.forEach(row => {
if (!row.hasOwnProperty('filteredOptions')) {
row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个
row.loading = false;
}
});
}, 0);
}
loading.value = false;
});
} catch (error) {
console.error('获取诊疗项目列表失败:', error);
loading.value = false;
proxy.$message.error('获取诊疗项目列表失败');
}
}
/** 选择条数 */
@@ -269,16 +279,30 @@ function handleRemoteQuery(query, row) {
row.loading = true;
// 模拟异步延迟
setTimeout(() => {
// 过滤选项
row.filteredOptions = allImplementDepartmentList.value.filter(item => {
// 确保数据已加载
if (!allImplementDepartmentList.value || allImplementDepartmentList.value.length === 0) {
row.filteredOptions = [];
row.loading = false;
return;
}
// 过滤选项,限制结果数量以提高性能
const filtered = allImplementDepartmentList.value.filter(item => {
return item.label.toLowerCase().includes(query.toLowerCase()) ||
item.value.toLowerCase().includes(query.toLowerCase());
});
// 限制返回结果数量,避免过多选项导致性能问题
row.filteredOptions = filtered.slice(0, 100); // 限制为前100个匹配项
row.loading = false;
}, 300); // 300ms 延迟,模拟网络请求
} else {
// 如果查询为空,显示所有选项(但限制数量以提高性能)
row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个
if (allImplementDepartmentList.value && allImplementDepartmentList.value.length > 0) {
row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个
} else {
row.filteredOptions = [];
}
}
}
@@ -288,6 +312,15 @@ function handleAddItem() {
proxy.$message.warning('请先保存当前行后再新增!');
return;
}
// 确保 allImplementDepartmentList 已经初始化
if (!allImplementDepartmentList.value || allImplementDepartmentList.value.length === 0) {
proxy.$message.warning('正在加载数据,请稍后再试!');
// 如果数据还未加载完成,尝试重新加载
getAllImplementDepartment();
return;
}
const newRow = {
startTime: '00:00:00',
endTime: '23:59:59',
@@ -411,26 +444,28 @@ function continueHandleNodeClick(node) {
}
/** 目录分类查询 */
function getDiseaseTreatmentList() {
async function getDiseaseTreatmentList() {
loading.value = true;
getDiseaseTreatmentInit().then(({ data }) => {
loading.value = false;
try {
const { data } = await getDiseaseTreatmentInit();
//分类目录初始化获取
// 分类目录初始化获取
catagoryDicts.value = data.diagnosisCategoryOptions.sort((a, b) => {
return parseInt(a.value) - parseInt(b.value);
});
});
// 诊疗目录分类查询下拉树结d构
loading.value = true;
// 诊疗目录分类查询下拉树结d构
getImplDepartList();
} catch (error) {
console.error('获取疾病治疗初始化数据失败:', error);
proxy.$message.error('获取分类目录失败');
}
// 诊疗目录分类查询下拉树结构
await getImplDepartList();
loading.value = false;
}
// 诊疗目录分类查询下拉树结d构
function getImplDepartList() {
loading.value = true;
getImplementDepartmentList().then((res) => {
loading.value = false;
async function getImplDepartList() {
try {
const res = await getImplementDepartmentList();
if (res.code === 200) {
if (res.data.records.length > 0) {
organization.value = res.data.records.map((res) => {
@@ -444,13 +479,24 @@ function getImplDepartList() {
organization.value = [];
}
} else {
this.$modal.msgError(res.code);
proxy.$modal.msgError(res.code);
}
});
} catch (error) {
console.error('获取实施部门列表失败:', error);
proxy.$message.error('获取科室信息失败');
}
}
onMounted(() => {
getAllImplementDepartment();
getDiseaseTreatmentList();
onMounted(async () => {
try {
// 并行加载数据,提高效率
await Promise.all([
getAllImplementDepartment(),
getDiseaseTreatmentList()
]);
} catch (error) {
console.error('初始化数据加载失败:', error);
proxy.$message.error('数据加载失败,请稍后重试');
}
});
</script>
<style scoped>