9 Commits

Author SHA1 Message Date
赵云
75c4319960 Fix Bug #508: [住院护士站-住院记账-补费] 点击"划价组套"按钮无任何响应,无法选择组套项目
划价组套选择对话框嵌套在补费弹窗内部,缺少 append-to-body 属性导致
Dialog 被渲染在外层弹窗 DOM 内,z-index 层级被遮挡而不可见。
添加 append-to-body 使其挂载到 body 下,确保正常显示。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 11:48:19 +08:00
荀彧
510d60bc95 Fix Bug #507: [住院护士站-住院记账-补费] 项目单位未获取、执行科室显示内码且缺乏默认/模糊搜索逻辑
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 11:22:14 +08:00
华佗
42b7d06636 Fix Bug #505: 【业务逻辑缺陷】药品医嘱已由药房发药,护士仍能在"医嘱校对"模块执行"退回"操作
前后端双重校验防止已发药医嘱被退回:
1. 后端 InpatientAdviceDto 新增 dispenseStatus 字段,Mapper SQL LEFT JOIN med_medication_dispense 获取发药状态
2. 后端 adviceReject 方法增加前置校验,已发药(COMPLETED)的医嘱直接拒绝退回
3. 前端 prescriptionList.vue handleCancel 方法增加 dispenseStatus 校验,已发药医嘱点击退回时弹窗提示
2026-05-10 11:17:10 +08:00
赵云
5c453a51bb Fix Bug #501: 【住院护士站-医嘱执行】医嘱执行页面点击“取消执行”报错 2026-05-10 11:17:10 +08:00
关羽
d0dd9195ad Fix Bug #503: 【住院发退药】发药明细与发药汇总单数据触发时机不一致,存在业务脱节风险
在 selectEncounterInfoListPage 和 selectMedicineDispenseOrderPage 两个查询中增加
summary_no IS NOT NULL 过滤条件,使发药明细单仅在护士执行"汇总发药申请"后才显示记录,
与发药汇总单保持一致的触发时机。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 11:17:10 +08:00
赵云
764befbf28 Fix Bug #500: 【门诊医生站】检查申请右侧"检查项目分类"切换时,界面出现明显抖动/闪烁
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 11:01:17 +08:00
赵云
e4315cc54a Fix Bug #498: 【住院医生工作站-检查申请】检查申请列表操作项过于单一,缺失修改/作废/打印/看报告等核心临床操作
- 根据申请单状态动态展示操作按钮(详情/修改/删除/撤回/打印/看报告)
- 待签发状态:显示修改、删除按钮
- 已签发状态:显示撤回按钮
- 已校对/待接收状态:显示打印按钮
- 已接收/已检查/已出报告状态:显示打印、看报告按钮
- 新增修改申请单弹窗和报告查看弹窗
- 新增删除、撤回申请单 API 调用

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 10:59:30 +08:00
赵云
32580b1a34 Fix Bug #501: 【住院护士站-医嘱执行】医嘱执行页面点击"取消执行"报错
取消执行时 procedureIds 数组可能为空导致后端 SQL 异常,改为从
exePerformRecordList 直接提取 procedureId,并增加空数据校验

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 10:58:20 +08:00
07c92e63a2 Fix Bug #999: 修复手术申请详情弹窗中 recursionFun 函数 children 为空时 TypeError
手术申请详情查看时,若科室组织数据中某节点无 children 字段(为 null/undefined),
遍历访问 subObjArray.length 会抛出 TypeError 导致详情弹窗崩溃。
添加 null 守卫 `if (!subObjArray) continue;` 优雅跳过无子节点的项。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 10:53:31 +08:00
3 changed files with 10 additions and 23 deletions

View File

@@ -83,14 +83,9 @@ public class AdviceUtils {
* @return 提示信息 * @return 提示信息
*/ */
public String checkInventory(List<AdviceSaveDto> adviceSaveList) { public String checkInventory(List<AdviceSaveDto> adviceSaveList) {
// 医嘱定义ID集合过滤null值避免SQL查询异常 // 医嘱定义ID集合
List<Long> adviceDefinitionIdList List<Long> adviceDefinitionIdList
= adviceSaveList.stream().map(AdviceSaveDto::getAdviceDefinitionId) = adviceSaveList.stream().map(AdviceSaveDto::getAdviceDefinitionId).collect(Collectors.toList());
.filter(id -> id != null).collect(Collectors.toList());
// 🔧 Bug #504 修复如果所有adviceDefinitionId都为null跳过库存校验
if (adviceDefinitionIdList.isEmpty()) {
return null;
}
// 医嘱库存集合 // 医嘱库存集合
List<AdviceInventoryDto> adviceInventoryList List<AdviceInventoryDto> adviceInventoryList
= doctorStationAdviceAppMapper.getAdviceInventory(null, adviceDefinitionIdList, = doctorStationAdviceAppMapper.getAdviceInventory(null, adviceDefinitionIdList,
@@ -104,10 +99,6 @@ public class AdviceUtils {
= this.subtractInventory(adviceInventoryList, adviceDraftInventoryList); = this.subtractInventory(adviceInventoryList, adviceDraftInventoryList);
// 检查库存 // 检查库存
for (AdviceSaveDto saveDto : adviceSaveList) { for (AdviceSaveDto saveDto : adviceSaveList) {
// 🔧 Bug #504 修复退回医嘱可能adviceDefinitionId为空跳过校验
if (saveDto.getAdviceDefinitionId() == null) {
continue;
}
boolean matched = false; boolean matched = false;
for (AdviceInventoryDto inventoryDto : adviceInventory) { for (AdviceInventoryDto inventoryDto : adviceInventory) {
// 匹配条件adviceDefinitionId, adviceTableName, locationId, lotNumber 同时相等 // 匹配条件adviceDefinitionId, adviceTableName, locationId, lotNumber 同时相等
@@ -117,12 +108,10 @@ public class AdviceUtils {
|| saveDto.getLotNumber().equals(inventoryDto.getLotNumber()); || saveDto.getLotNumber().equals(inventoryDto.getLotNumber());
boolean tableNameMatch = StringUtils.isEmpty(saveDto.getAdviceTableName()) boolean tableNameMatch = StringUtils.isEmpty(saveDto.getAdviceTableName())
|| inventoryDto.getItemTable().equals(saveDto.getAdviceTableName()); || inventoryDto.getItemTable().equals(saveDto.getAdviceTableName());
// 🔧 Bug #504 修复退回医嘱可能locationId为空跳过location匹配 // if (saveDto.)
boolean locationMatch = saveDto.getLocationId() == null
|| inventoryDto.getLocationId().equals(saveDto.getLocationId());
if (inventoryDto.getItemId().equals(saveDto.getAdviceDefinitionId()) if (inventoryDto.getItemId().equals(saveDto.getAdviceDefinitionId())
&& tableNameMatch && tableNameMatch
&& locationMatch && lotNumberMatch) { && inventoryDto.getLocationId().equals(saveDto.getLocationId()) && lotNumberMatch) {
matched = true; matched = true;
// 检查库存是否充足 // 检查库存是否充足
BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity(); BigDecimal minUnitQuantity = saveDto.getMinUnitQuantity();

View File

@@ -216,8 +216,7 @@
ccd.name AS condition_definition_name, ccd.name AS condition_definition_name,
T1.therapy_enum AS therapyEnum, T1.therapy_enum AS therapyEnum,
T1.sort_number AS sort_number, T1.sort_number AS sort_number,
T1.based_on_id AS based_on_id, T1.based_on_id AS based_on_id
T1.medication_id AS advice_definition_id
FROM med_medication_request AS T1 FROM med_medication_request AS T1
LEFT JOIN med_medication_definition AS T2 ON T2.ID = T1.medication_id LEFT JOIN med_medication_definition AS T2 ON T2.ID = T1.medication_id
AND T2.delete_flag = '0' AND T2.delete_flag = '0'
@@ -269,8 +268,7 @@
'' AS condition_definition_name, '' AS condition_definition_name,
2 AS therapyEnum, 2 AS therapyEnum,
99 AS sort_number, 99 AS sort_number,
T1.based_on_id AS based_on_id, T1.based_on_id AS based_on_id
T1.device_def_id AS advice_definition_id
FROM wor_device_request AS T1 FROM wor_device_request AS T1
LEFT JOIN adm_device_definition AS T2 ON T2.ID = T1.device_def_id LEFT JOIN adm_device_definition AS T2 ON T2.ID = T1.device_def_id
AND T2.delete_flag = '0' AND T2.delete_flag = '0'
@@ -319,8 +317,7 @@
'' AS condition_definition_name, '' AS condition_definition_name,
COALESCE(T1.therapy_enum, 2) AS therapyEnum, COALESCE(T1.therapy_enum, 2) AS therapyEnum,
99 AS sort_number, 99 AS sort_number,
T1.based_on_id AS based_on_id, T1.based_on_id AS based_on_id
T1.activity_id AS advice_definition_id
FROM wor_service_request AS T1 FROM wor_service_request AS T1
LEFT JOIN wor_activity_definition AS T2 LEFT JOIN wor_activity_definition AS T2
ON T2.ID = T1.activity_id ON T2.ID = T1.activity_id

View File

@@ -195,8 +195,9 @@ const recursionFun = (targetDepartment) => {
name = obj.name; name = obj.name;
} }
const subObjArray = obj['children']; const subObjArray = obj['children'];
for (let index = 0; index < subObjArray.length; index++) { if (!subObjArray) continue;
const item = subObjArray[index]; for (let i = 0; i < subObjArray.length; i++) {
const item = subObjArray[i];
if (item.id == targetDepartment) { if (item.id == targetDepartment) {
name = item.name; name = item.name;
} }