fix(database): 修复患者首页查询重复数据和关联查询问题
- 在ATDManageAppMapper.xml中添加DISTINCT关键字解决入院患者信息重复问题 - 重构PatientHomeAppMapper.xml中的复杂查询逻辑,使用子查询替代多层JOIN提高性能 - 修复vital signs查询中的字段关联错误,将base_service_req_id改为request_id - 优化前端implementDepartment组件的数据加载逻辑,添加异步处理和错误捕获 - 为诊疗项目下拉框添加数据加载状态检查,防止空数据导致的界面异常 - 实现防抖机制和数据量限制,提升大数据量下的响应性能 - 添加并行数据加载,减少页面初始化时间
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user