Compare commits

...

3 Commits

Author SHA1 Message Date
荀彧
9c18442274 Fix Bug #401: 门诊完诊审计日志错误:div_log 表中 pool_id 与 slot_id 存值与设计规范不符
根因:completeEncounter 方法中先将队列状态更新为 COMPLETED,再用内存中
的 queueItem.getStatus() 判断是否已完诊,导致 queueAlreadyCompleted 始终为 true,
div_log 审计日志永远不会被写入。

修复:在更新队列状态之前记录原始完成状态(queueWasAlreadyCompleted),
用该值判断是否需要写入 div_log,确保完诊时正确生成审计日志。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 08:51:36 +08:00
关羽
6fa32c6116 Fix Bug #510: [住院医生工作站] 进入页面报错
根因:order/index.vue 中 getList() 在模块顶层执行(非生命周期钩子),
组件导入时立即触发 API 调用,此时患者尚未选择导致 encounterId 为 undefined;
同时 getListInfo() 缺少患者选择守护检查,多处 API 以空参数调用后端引发循环报错。

修复:
1. 将 getList() 从模块顶层移至 onMounted() 生命周期钩子
2. 在 getListInfo() 开头添加 patientInfo.encounterId 守护检查
2026-05-14 08:51:36 +08:00
关羽
d3a04062dd Fix Bug #507: [住院护士站-住院记账-补费] 项目单位未获取、执行科室显示内码且缺乏默认/模糊搜索逻辑
后端SQL修复: DoctorStationAdviceAppMapper.xml 中诊疗项 min_unit_code 硬编码为空字符串,
改为使用 permitted_unit_code,使前端单位下拉框有可用选项

前端修复:
1. api.js getOrgList 添加 pageSize:100 参数,确保获取足够科室数据
2. FeeDialog.vue loadDepartmentOptions 增加回退逻辑:当树形结构无children时使用扁平records

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 08:51:36 +08:00
5 changed files with 18 additions and 7 deletions

View File

@@ -326,6 +326,9 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
// 如果队列项存在且未完成,更新队列状态为已完成
// 使用排除法而非白名单:只要不是"已完成"就可以完诊,覆盖跳过、等待等非标准流转状态
// Bug #401在更新前记录队列原始完成状态用于判断是否需要写入 div_log
boolean queueWasAlreadyCompleted = queueItem != null
&& TriageQueueStatus.COMPLETED.getValue().equals(queueItem.getStatus());
if (queueItem != null &&
!TriageQueueStatus.COMPLETED.getValue().equals(queueItem.getStatus())) {
java.time.LocalDateTime nowLocal = java.time.LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS);
@@ -343,10 +346,8 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
}
// 写入 div_log 审计日志(独立于队列项,确保每次完诊都生成记录)
// 防重复:若队列项已是 COMPLETED 状态,说明护士站已处理过并写过分诊日志,不再重复写入
boolean queueAlreadyCompleted = queueItem != null
&& TriageQueueStatus.COMPLETED.getValue().equals(queueItem.getStatus());
if (!queueAlreadyCompleted) {
// Bug #401使用更新前记录的原始状态判断避免自身更新后将状态改为 COMPLETED 导致误判为"已完成"
if (!queueWasAlreadyCompleted) {
try {
LoginUser loginUser = SecurityUtils.getLoginUser();
DivLog divLog = new DivLog()

View File

@@ -239,7 +239,7 @@
NULL AS activity_type_dictText,
-- 前端"包装单位"列显示使用单位permitted_unit_code
T1.permitted_unit_code AS unit_code,
'' AS min_unit_code,
T1.permitted_unit_code AS min_unit_code,
'' AS volume,
'' AS method_code,
'' AS rate_code,

View File

@@ -533,6 +533,7 @@ const statusOption = [
let loadingInstance = undefined;
onMounted(() => {
document.addEventListener('keydown', escKeyListener);
getList();
});
onBeforeUnmount(() => {
@@ -573,7 +574,6 @@ function handleTotalAmount() {
}
}, new Decimal(0));
}
getList();
function getList() {
getDiagnosisDefinitionList(queryParams.value).then((res) => {
// prescriptionList.value = res.data.records;
@@ -585,6 +585,11 @@ function refresh() {
}
// 获取列表信息
function getListInfo(addNewRow) {
// 守护:未选择患者时不发起 API 请求,避免页面加载时循环报错
if (!patientInfo.value || !patientInfo.value.encounterId) {
console.warn('⚠️ getListInfo 跳过:未选择患者');
return;
}
loadingInstance = ElLoading.service({ fullscreen: true });
setTimeout(() => {
loadingInstance.close();

View File

@@ -524,7 +524,11 @@ function loadDepartmentOptions() {
getOrgList()
.then((res) => {
if (res.data && res.data.records && res.data.records.length > 0) {
departmentOptions.value = res.data.records[0].children || [];
const firstRecord = res.data.records[0];
// 优先使用 children树形结构回退到 records 本身(扁平结构)
departmentOptions.value = (firstRecord.children && firstRecord.children.length > 0)
? firstRecord.children
: res.data.records;
}
})
.catch(() => {

View File

@@ -28,6 +28,7 @@ export function getOrgList() {
return request({
url: '/base-data-manage/organization/organization',
method: 'get',
params: { pageSize: 100, pageNum: 1 },
});
}
/**