diff --git a/openhis-ui-vue3/src/views/surgicalschedule/index.vue b/openhis-ui-vue3/src/views/surgicalschedule/index.vue index fcd0e3384..d72f0d3c3 100755 --- a/openhis-ui-vue3/src/views/surgicalschedule/index.vue +++ b/openhis-ui-vue3/src/views/surgicalschedule/index.vue @@ -1144,13 +1144,17 @@ const { const pendingAnesData = ref(null) // 监听麻醉字典加载,完成后立即设置表单值 +// Bug #433: watch 回调中优先判断字典是否已加载,未加载时跳过(不处理也不清理) +// 确保字典加载完成时 watch 仍然活跃并能处理 pendingAnesData let anesDataUnwatch = null function setupAnesDataWatch() { if (anesDataUnwatch) return // 防止重复设置 anesDataUnwatch = watch( anesthesiaList, (newList) => { - if (newList && newList.length > 0 && pendingAnesData.value) { + // Bug #433: 字典未加载时跳过,不清理 watch,等待下次触发 + if (!newList || newList.length === 0) return + if (pendingAnesData.value) { const data = pendingAnesData.value if (data.anesMethod != null) form.anesMethod = Number(data.anesMethod) if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel) @@ -1349,7 +1353,8 @@ function handleEdit(row) { if (res.code === 200) { const data = res.data Object.assign(form, data) - // Bug #433: 如果字典已加载则立即转换,否则存入pending等待字典加载完成 + // Bug #433: 先存 pending 再调 watch 函数,确保 watch immediate 回调能看到 pendingAnesData + // 修复时序问题:watch({ immediate: true }) 同步触发时 pendingAnesData.value 已被设置 if (anesthesiaList.value && anesthesiaList.value.length > 0) { if (data.anesMethod != null) form.anesMethod = Number(data.anesMethod) if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel) @@ -1359,6 +1364,8 @@ function handleEdit(row) { pendingAnesData.value = data setupAnesDataWatch() } + // Bug #433: 显式赋值确保响应式更新 + if (data.externalExpertName != null) form.externalExpertName = data.externalExpertName } else { proxy.$modal.msgError('获取手术安排详情失败') } @@ -1378,7 +1385,8 @@ function handleView(row) { if (res.code === 200) { const data = res.data Object.assign(form, data) - // Bug #433: 如果字典已加载则立即转换,否则存入pending等待字典加载完成 + // Bug #433: 先存 pending 再调 watch 函数,确保 watch immediate 回调能看到 pendingAnesData + // 修复时序问题:watch({ immediate: true }) 同步触发时 pendingAnesData.value 已被设置 if (anesthesiaList.value && anesthesiaList.value.length > 0) { if (data.anesMethod != null) form.anesMethod = Number(data.anesMethod) if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel) @@ -1388,6 +1396,8 @@ function handleView(row) { pendingAnesData.value = data setupAnesDataWatch() } + // Bug #433: 显式赋值确保响应式更新 + if (data.externalExpertName != null) form.externalExpertName = data.externalExpertName } else { proxy.$modal.msgError('获取手术安排详情失败') }