diff --git a/logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json b/logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json new file mode 100755 index 00000000..9d14d063 --- /dev/null +++ b/logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json @@ -0,0 +1,20 @@ +{ + "keep": { + "days": true, + "amount": 14 + }, + "auditLog": "/root/.openclaw/workspace/his-repo/logs/.2c17bf7b4e92189ae54ef8e767273ceaeb613314-audit.json", + "files": [ + { + "date": 1778128585254, + "name": "/root/.openclaw/workspace/his-repo/logs/application-2026-05-07.log", + "hash": "2ec545aad5feb57a45e48b0a980690b3b9ef6b90e57204f6c3dfb1c7f2fd4d95" + }, + { + "date": 1778200962650, + "name": "/root/.openclaw/workspace/his-repo/logs/application-2026-05-08.log", + "hash": "cf50ef7b8aa656efb0a209a252219fea97a437ff9020b1b8770788f1ba51303e" + } + ], + "hashType": "sha256" +} \ No newline at end of file diff --git a/logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json b/logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json new file mode 100755 index 00000000..c346d314 --- /dev/null +++ b/logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json @@ -0,0 +1,20 @@ +{ + "keep": { + "days": true, + "amount": 14 + }, + "auditLog": "/root/.openclaw/workspace/his-repo/logs/.9c2086cba7d24dcd050254bba93c4693957f894e-audit.json", + "files": [ + { + "date": 1778128585256, + "name": "/root/.openclaw/workspace/his-repo/logs/error-2026-05-07.log", + "hash": "84a811bf9cf76799b49d36df79427471c8e0cfaa1bd359422d69091b06a64f87" + }, + { + "date": 1778200962653, + "name": "/root/.openclaw/workspace/his-repo/logs/error-2026-05-08.log", + "hash": "83b015957301572a67ea6fb41a65dfe5aa357831ca361155629630c6e9ef68bd" + } + ], + "hashType": "sha256" +} \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/appservice/impl/CheckMethodAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/appservice/impl/CheckMethodAppServiceImpl.java index 51bd6d0e..cf60f32e 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/appservice/impl/CheckMethodAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/appservice/impl/CheckMethodAppServiceImpl.java @@ -106,6 +106,7 @@ public class CheckMethodAppServiceImpl implements ICheckMethodAppService { if (ObjectUtil.isNotEmpty(m.getPackageName())) { CheckPackage pkg = packageMap.get(m.getPackageName()); if (pkg != null) { + dto.setPackageId(pkg.getId()); dto.setPackagePrice(pkg.getPackagePrice()); dto.setServiceFee(pkg.getServiceFee()); } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/controller/CheckTypeController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/controller/CheckTypeController.java index 360a72ea..cd6c55ae 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/controller/CheckTypeController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/controller/CheckTypeController.java @@ -220,6 +220,36 @@ public class CheckTypeController extends BaseController { return AjaxResult.success(result); } + /** + * 查询检查套餐明细,用于医生站已选择套餐展开显示 + */ + @GetMapping({ "/package/{packageId}/details", "/check-package/{packageId}/details" }) + public AjaxResult getPackageDetails(@PathVariable Long packageId) { + List details = checkPackageDetailService.list( + new LambdaQueryWrapper() + .eq(CheckPackageDetail::getPackageId, packageId) + .orderByAsc(CheckPackageDetail::getOrderNum) + .orderByAsc(CheckPackageDetail::getId)); + + List> result = details.stream().map(d -> { + Map item = new LinkedHashMap<>(); + item.put("id", d.getId()); + item.put("packageId", d.getPackageId()); + item.put("itemCode", d.getItemCode()); + item.put("itemName", d.getItemName()); + item.put("name", d.getItemName()); + item.put("quantity", d.getQuantity()); + item.put("unit", d.getUnit()); + item.put("unitPrice", d.getUnitPrice()); + item.put("price", d.getUnitPrice()); + item.put("amount", d.getAmount()); + item.put("orderNum", d.getOrderNum()); + return item; + }).collect(Collectors.toList()); + + return AjaxResult.success(result); + } + /** 套餐级别文字映射 */ private String parseLevelText(String level) { if ("1".equals(level)) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/dto/CheckMethodDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/dto/CheckMethodDto.java index 54582a31..4859dbaa 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/dto/CheckMethodDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/check/dto/CheckMethodDto.java @@ -31,6 +31,9 @@ public class CheckMethodDto { /* 套餐名称 */ private String packageName; + /* 套餐ID */ + private Long packageId; + /* 套餐价格 - Bug #384修复:通过packageName匹配CheckPackage获取 */ private BigDecimal packagePrice; diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/ISurgeryAppService.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/ISurgeryAppService.java index 457b8652..a5554917 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/ISurgeryAppService.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/ISurgeryAppService.java @@ -25,7 +25,9 @@ public interface ISurgeryAppService { * @param plannedTimeEnd 计划结束时间 * @return 手术列表 */ - IPage getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, String plannedTimeStart, String plannedTimeEnd); + IPage getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, + String plannedTimeStart, String plannedTimeEnd, + String createTimeStart, String createTimeEnd); /** * 根据ID查询手术详情 diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java index 04f00917..971ab367 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/appservice/impl/SurgeryAppServiceImpl.java @@ -108,7 +108,9 @@ public class SurgeryAppServiceImpl implements ISurgeryAppService { * @return 手术列表 */ @Override - public IPage getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, String plannedTimeStart, String plannedTimeEnd) { + public IPage getSurgeryPage(SurgeryDto surgeryDto, Integer pageNo, Integer pageSize, + String plannedTimeStart, String plannedTimeEnd, + String createTimeStart, String createTimeEnd) { QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(surgeryDto, null, new HashSet() {{ add("surgery_no"); @@ -148,6 +150,34 @@ public class SurgeryAppServiceImpl implements ISurgeryAppService { } } } + + // 申请时间范围(创建时间 create_time)查询:用于“手术申请查询”弹窗 + if (createTimeStart != null && !createTimeStart.isEmpty()) { + try { + LocalDateTime startDateTime = LocalDateTime.parse(createTimeStart, DateTimeFormatter.ISO_DATE_TIME); + queryWrapper.ge("create_time", startDateTime); + } catch (Exception e) { + try { + LocalDateTime startDateTime = LocalDateTime.parse(createTimeStart + "T00:00:00", DateTimeFormatter.ISO_DATE_TIME); + queryWrapper.ge("create_time", startDateTime); + } catch (Exception ex) { + log.error("解析创建开始时间失败: {}", createTimeStart, ex); + } + } + } + if (createTimeEnd != null && !createTimeEnd.isEmpty()) { + try { + LocalDateTime endDateTime = LocalDateTime.parse(createTimeEnd, DateTimeFormatter.ISO_DATE_TIME); + queryWrapper.le("create_time", endDateTime); + } catch (Exception e) { + try { + LocalDateTime endDateTime = LocalDateTime.parse(createTimeEnd + "T23:59:59", DateTimeFormatter.ISO_DATE_TIME); + queryWrapper.le("create_time", endDateTime); + } catch (Exception ex) { + log.error("解析创建结束时间失败: {}", createTimeEnd, ex); + } + } + } queryWrapper.orderByDesc("create_time"); return surgeryAppMapper.getSurgeryPage(new Page<>(pageNo, pageSize), queryWrapper); diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/controller/SurgeryController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/controller/SurgeryController.java index e9f01bc9..b20ed8eb 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/controller/SurgeryController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/controller/SurgeryController.java @@ -40,9 +40,12 @@ public class SurgeryController { @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, @RequestParam(value = "plannedTimeStart", required = false) String plannedTimeStart, - @RequestParam(value = "plannedTimeEnd", required = false) String plannedTimeEnd) { + @RequestParam(value = "plannedTimeEnd", required = false) String plannedTimeEnd, + @RequestParam(value = "createTimeStart", required = false) String createTimeStart, + @RequestParam(value = "createTimeEnd", required = false) String createTimeEnd) { // 将时间范围参数传递给服务层 - IPage page = surgeryAppService.getSurgeryPage(surgeryDto, pageNo, pageSize, plannedTimeStart, plannedTimeEnd); + IPage page = surgeryAppService.getSurgeryPage(surgeryDto, pageNo, pageSize, + plannedTimeStart, plannedTimeEnd, createTimeStart, createTimeEnd); return R.ok(page); } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java index ec72e987..0f0a8b21 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java @@ -912,7 +912,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp ChargeItem chargeItem; // 新增 + 修改 // 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来 + // 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList List insertOrUpdateList = medicineList.stream() + .filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType())) .filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()) || e.getRequestId() != null)) @@ -1358,7 +1360,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp ChargeItem chargeItem; // 新增 + 修改 // 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来 + // 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList List insertOrUpdateList = deviceList.stream() + .filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType())) .filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()) || e.getRequestId() != null)) @@ -1673,7 +1677,9 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp ChargeItem chargeItem; // 新增 + 修改 // 🔧 BugFix: 如果 requestId 不为空说明是已存在的医嘱,需要更新,即使 dbOpType 不匹配也应该包含进来 + // 🔧 BugFix #454: 排除删除操作,避免误入insertOrUpdateList触发执行科室校验 List insertOrUpdateList = activityList.stream() + .filter(e -> !DbOpType.DELETE.getCode().equals(e.getDbOpType())) .filter(e -> (DbOpType.INSERT.getCode().equals(e.getDbOpType()) || DbOpType.UPDATE.getCode().equals(e.getDbOpType()) || e.getRequestId() != null)) diff --git a/openhis-ui-vue3/src/api/operatingroom.js b/openhis-ui-vue3/src/api/operatingroom.js index 9d979bd1..35584301 100755 --- a/openhis-ui-vue3/src/api/operatingroom.js +++ b/openhis-ui-vue3/src/api/operatingroom.js @@ -13,6 +13,33 @@ export function listOperatingRoom(query) { }) } +/** + * 查询诊疗项目列表(用于诊疗子项检索) + * @param {Object} query - 查询参数 + * @returns {Promise} 请求结果 + */ +export function listMedicalItems(query) { + return request({ + url: '/clinical-manage/medical-item/list', + method: 'get', + params: query + }) +} + +/** + * 查询医嘱类型列表 + * @param {Object} query - 查询参数 + * @returns {Promise} 请求结果 + */ +export function listAdviceTypes(query) { + return request({ + url: '/clinical-manage/advice-type/list', + method: 'get', + params: query + }) +} +``` + /** * 查询手术室详细 * @param {Long} id - 手术室ID diff --git a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue index c81c6863..04eb2f81 100755 --- a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue +++ b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue @@ -393,12 +393,24 @@ function openSaveImplementDepartment(row) { editImplementDepartment(params).then((res) => { data.isAdding = false; // 允许新增下一行 proxy.$modal.msgSuccess('保存成功!'); + // 确保选中项在 filteredOptions 中,使 el-select 能正确显示名称 + const savedItem = allImplementDepartmentList.value.find(i => i.value === row.activityDefinitionId); + if (savedItem && !row.filteredOptions.some(o => o.value === row.activityDefinitionId)) { + row.filteredOptions.push(savedItem); + } + getList(); }); } else { delete params.id; addImplementDepartment(params).then((res) => { data.isAdding = false; // 允许新增下一行 proxy.$modal.msgSuccess('保存成功!'); + // 确保选中项在 filteredOptions 中,使 el-select 能正确显示名称 + const savedItem = allImplementDepartmentList.value.find(i => i.value === row.activityDefinitionId); + if (savedItem && !row.filteredOptions.some(o => o.value === row.activityDefinitionId)) { + row.filteredOptions.push(savedItem); + } + getList(); }); } } diff --git a/openhis-ui-vue3/src/views/doctorstation/components/inspection/inspectionApplication.vue b/openhis-ui-vue3/src/views/doctorstation/components/inspection/inspectionApplication.vue index 53b568e6..6e17e4f1 100755 --- a/openhis-ui-vue3/src/views/doctorstation/components/inspection/inspectionApplication.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/inspection/inspectionApplication.vue @@ -164,6 +164,20 @@ /> + + + + + + @@ -293,6 +307,34 @@ + + + + + + + + + + + + + + + + + + + + + + 普通 + 急诊 + + + + + @@ -925,7 +967,9 @@ const formData = reactive({ applyDocCode: '', applyDeptCode: '', specimenName: '血液', - encounterId: '' + encounterId: '', + executeTime: null, + applicationType: 0 }) // 表单引用 @@ -1329,13 +1373,13 @@ const getInspectionList = () => { // 如果返回的是分页对象 {records: [...], total: 100} if (Array.isArray(res.data.records)) { // 直接使用后端返回的数据(后端已按申请单返回,无需合并) - inspectionList.value = res.data.records + inspectionList.value = mergeInspectionApplyRecords(res.data.records) total.value = res.data.total || res.data.records.length } // 如果返回的是普通数组 else if (Array.isArray(res.data)) { - // 直接使用后端返回的数据 - inspectionList.value = res.data + // 合并同一个申请单的明细 + inspectionList.value = mergeInspectionApplyRecords(res.data) total.value = res.data.length } // 如果返回的是其他对象结构 @@ -1476,6 +1520,8 @@ const resetForm = async () => { visitNo: '', specimenName: '血液', encounterId: props.patientInfo.encounterId || '', + executeTime: null, + applicationType: 0, }) selectedInspectionItems.value = [] @@ -1911,7 +1957,9 @@ const loadApplicationToForm = async (row) => { auditTime: detail.auditTime, visitNo: detail.visitNo, specimenName: detail.specimenName, - encounterId: detail.encounterId + encounterId: detail.encounterId, + executeTime: detail.executeTime || null, + applicationType: detail.applicationType ?? 0 }) // 加载检验项目数据 diff --git a/openhis-ui-vue3/src/views/inpatientDoctor/home/index.vue b/openhis-ui-vue3/src/views/inpatientDoctor/home/index.vue index ac02baab..9b634931 100755 --- a/openhis-ui-vue3/src/views/inpatientDoctor/home/index.vue +++ b/openhis-ui-vue3/src/views/inpatientDoctor/home/index.vue @@ -17,8 +17,11 @@ - + +```vue + +``` diff --git a/openhis-ui-vue3/src/views/medicationmanagement/requisitionManagement/requisitionManagement/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/requisitionManagement/requisitionManagement/index.vue index ee5025a4..f46e0be7 100755 --- a/openhis-ui-vue3/src/views/medicationmanagement/requisitionManagement/requisitionManagement/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/requisitionManagement/requisitionManagement/index.vue @@ -990,7 +990,7 @@ function selectRow(rowValue, index) { form.purchaseinventoryList[index].ybNo = rowValue.ybNo; // #439 fix: 不清空sourceLocationId,保留handleAddRow设置的仓库ID if (!form.purchaseinventoryList[index].sourceLocationId) { - form.purchaseinventoryList[index].sourceLocationId = ''; + form.purchaseinventoryList[index].sourceLocationId = receiptHeaderForm.headerLocationId || ''; } getPharmacyCabinetList().then((res) => { purposeTypeListOptions.value = res.data; diff --git a/openhis-ui-vue3/src/views/surgicalschedule/index.vue b/openhis-ui-vue3/src/views/surgicalschedule/index.vue index 2108a7a6..dfa2da73 100755 --- a/openhis-ui-vue3/src/views/surgicalschedule/index.vue +++ b/openhis-ui-vue3/src/views/surgicalschedule/index.vue @@ -58,6 +58,312 @@ + + + 新增 + + + + + 修改 + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +