From 4d7a2db4dfe74814ea524c477b7c39c324eba1de Mon Sep 17 00:00:00 2001 From: wangjian963 <15215920+aprilry@user.noreply.gitee.com> Date: Thu, 25 Jun 2026 16:13:28 +0800 Subject: [PATCH] =?UTF-8?q?729=20=E3=80=90=E4=BD=8F=E9=99=A2=E6=8A=A4?= =?UTF-8?q?=E5=A3=AB=E7=AB=99-=E5=85=A5=E5=87=BA=E8=BD=AC=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E3=80=91=E5=BE=85=E8=BD=AC=E7=A7=91=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E2=80=9C=E5=85=A5=E9=99=A2=E7=97=85=E5=8C=BA/=E5=85=A5?= =?UTF-8?q?=E9=99=A2=E7=97=85=E6=88=BF=E2=80=9D=E4=B8=8B=E6=8B=89=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E6=97=A0=E6=95=B0=E6=8D=AE=EF=BC=8C=E6=9C=AA?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E8=AF=BB=E5=8F=96=E8=BD=AC=E7=A7=91=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../appservice/IATDManageAppService.java | 7 ++ .../impl/ATDManageAppServiceImpl.java | 103 +++++++++++++++++- .../controller/ATDManageController.java | 10 ++ .../dto/AdmissionPageParam.java | 6 + .../dto/AdmissionPatientPageDto.java | 14 +++ .../dto/TransferOptionsDto.java | 39 +++++++ .../ATDManageAppMapper.xml | 34 +++++- .../inpatientNurse/inOut/components/api.js | 10 ++ .../inOut/components/transferOut.vue | 58 +++++++++- 9 files changed, 273 insertions(+), 8 deletions(-) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/TransferOptionsDto.java diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/IATDManageAppService.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/IATDManageAppService.java index 0c1182f3c..f8853a27d 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/IATDManageAppService.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/IATDManageAppService.java @@ -123,5 +123,12 @@ public interface IATDManageAppService { * @return 结果 */ R cancelBedAssignment(Long encounterId); + + /** + * 获取转科筛选选项(转入病区、转入科室) + * + * @return 转科筛选选项 + */ + R getTransferOptions(); } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java index 4609bd1f8..8a72a39a2 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java @@ -17,11 +17,14 @@ import com.healthlink.his.administration.domain.ChargeItem; import com.healthlink.his.administration.service.IChargeItemService; import com.healthlink.his.administration.domain.EncounterLocation; import com.healthlink.his.administration.domain.EncounterParticipant; +import com.healthlink.his.administration.domain.Location; +import com.healthlink.his.administration.domain.Organization; import com.healthlink.his.administration.domain.Practitioner; import com.healthlink.his.administration.service.IEncounterLocationService; import com.healthlink.his.administration.service.IEncounterParticipantService; import com.healthlink.his.administration.service.IEncounterService; import com.healthlink.his.administration.service.ILocationService; +import com.healthlink.his.administration.service.IOrganizationService; import com.healthlink.his.administration.service.IPractitionerService; import com.healthlink.his.common.constant.CommonConstants; import com.healthlink.his.common.enums.*; @@ -114,6 +117,9 @@ public class ATDManageAppServiceImpl implements IATDManageAppService { @Resource private IPractitionerService practitionerService; + @Resource + private IOrganizationService organizationService; + @Resource private ApplicationEventPublisher eventPublisher; @@ -166,12 +172,25 @@ public class ATDManageAppServiceImpl implements IATDManageAppService { String searchKey, HttpServletRequest request) { // 获取当前登录用户的科室 ID Long currentUserOrgId = SecurityUtils.getLoginUser().getOrgId(); - + + // 提取转科筛选条件(字段名与 SQL 列别名不一致,需手动处理) + Long transferTargetWardId = admissionPageParam.getTransferTargetWardId(); + Long transferTargetOrgId = admissionPageParam.getTransferTargetOrgId(); + admissionPageParam.setTransferTargetWardId(null); + admissionPageParam.setTransferTargetOrgId(null); + // 构建查询条件 QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper(admissionPageParam, searchKey, new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr, CommonConstants.FieldName.PatientName, CommonConstants.FieldName.BusNo)), request); + // 手动添加转科目标筛选条件 + if (transferTargetWardId != null) { + queryWrapper.apply("ii.target_ward_id = {0}", transferTargetWardId); + } + if (transferTargetOrgId != null) { + queryWrapper.apply("ii.target_org_id = {0}", transferTargetOrgId); + } // 入院患者分页列表 Page admissionPatientPage = atdManageAppMapper.selectAdmissionPatientPage( new Page<>(pageNo, pageSize), queryWrapper, EncounterClass.IMP.getValue(), @@ -1008,6 +1027,88 @@ public class ATDManageAppServiceImpl implements IATDManageAppService { } } + /** + * 获取转科筛选选项(转入病区、转入科室) + * + * @return 转科筛选选项 + */ + @Override + public R getTransferOptions() { + Long currentUserOrgId = SecurityUtils.getLoginUser().getOrgId(); + String delFlagNo = DelFlag.NO.getCode(); + + // 查询当前科室下所有待转科患者 + List pendingTransfers = encounterService.list( + new LambdaQueryWrapper() + .eq(Encounter::getStatusEnum, EncounterZyStatus.PENDING_TRANSFER.getValue()) + .eq(Encounter::getOrganizationId, currentUserOrgId) + .eq(Encounter::getDeleteFlag, delFlagNo)); + if (pendingTransfers.isEmpty()) { + return R.ok(new TransferOptionsDto()); + } + + List encounterIds = pendingTransfers.stream().map(Encounter::getId).toList(); + + // 查询这些患者的转科申请,获取转入病区和转入科室 + List orderProcessList = orderProcessService.list( + new LambdaQueryWrapper() + .in(OrderProcess::getEncounterId, encounterIds) + .eq(OrderProcess::getDeleteFlag, delFlagNo) + .isNotNull(OrderProcess::getTargetLocationId)); + + // 去重收集转入病区 + Set wardIdSet = new LinkedHashSet<>(); + Set orgIdSet = new LinkedHashSet<>(); + Map wardNameMap = new HashMap<>(); + Map orgNameMap = new HashMap<>(); + + for (OrderProcess op : orderProcessList) { + if (op.getTargetLocationId() != null) { + wardIdSet.add(op.getTargetLocationId()); + } + if (op.getTargetOrganizationId() != null) { + orgIdSet.add(op.getTargetOrganizationId()); + } + } + + // 查询病区名称 + if (!wardIdSet.isEmpty()) { + List locations = locationService.listByIds(wardIdSet); + for (Location loc : locations) { + wardNameMap.put(loc.getId(), loc.getName()); + } + } + + // 查询科室名称 + if (!orgIdSet.isEmpty()) { + List orgs = organizationService.listByIds(orgIdSet); + if (orgs != null) { + for (Organization org : orgs) { + orgNameMap.put(org.getId(), org.getName()); + } + } + } + + // 构建转入病区选项 + List wardOptions = new ArrayList<>(); + for (Long wardId : wardIdSet) { + String name = wardNameMap.getOrDefault(wardId, String.valueOf(wardId)); + wardOptions.add(new TransferOptionsDto.OptionItem(wardId, name)); + } + + // 构建转入科室选项 + List orgOptions = new ArrayList<>(); + for (Long orgId : orgIdSet) { + String name = orgNameMap.getOrDefault(orgId, String.valueOf(orgId)); + orgOptions.add(new TransferOptionsDto.OptionItem(orgId, name)); + } + + TransferOptionsDto dto = new TransferOptionsDto(); + dto.setWardListOptions(wardOptions); + dto.setDepartmentListOptions(orgOptions); + return R.ok(dto); + } + /** * 退床 (取消分床) * diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/controller/ATDManageController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/controller/ATDManageController.java index e143098ae..60b8ebf62 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/controller/ATDManageController.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/controller/ATDManageController.java @@ -177,5 +177,15 @@ public class ATDManageController { public R cancelBedAssignment(Long encounterId) { return atdManageAppService.cancelBedAssignment(encounterId); } + + /** + * 获取转科筛选选项(转入病区、转入科室) + * + * @return 转科筛选选项 + */ + @GetMapping(value = "/transfer-options") + public R getTransferOptions() { + return atdManageAppService.getTransferOptions(); + } } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPageParam.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPageParam.java index e3846c502..db3988e14 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPageParam.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPageParam.java @@ -27,6 +27,12 @@ public class AdmissionPageParam { /** 入院病房 */ private Long houseId; + /** 转科目标病区(待转科患者筛选) */ + private Long transferTargetWardId; + + /** 转科目标科室(待转科患者筛选) */ + private Long transferTargetOrgId; + /** * 入院类型 */ diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPatientPageDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPatientPageDto.java index f5ff33963..f6a815b23 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPatientPageDto.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/AdmissionPatientPageDto.java @@ -146,4 +146,18 @@ public class AdmissionPatientPageDto { */ @JsonSerialize(using = ToStringSerializer.class) private Long patientId; + + /** 转科目标病区ID(转入病区) */ + @JsonSerialize(using = ToStringSerializer.class) + private Long targetWardId; + + /** 转科目标病区名称 */ + private String targetWardName; + + /** 转科目标科室ID(转入科室) */ + @JsonSerialize(using = ToStringSerializer.class) + private Long targetOrgId; + + /** 转科目标科室名称 */ + private String targetOrgName; } diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/TransferOptionsDto.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/TransferOptionsDto.java new file mode 100644 index 000000000..a0ba69b82 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/dto/TransferOptionsDto.java @@ -0,0 +1,39 @@ +package com.healthlink.his.web.inhospitalnursestation.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +/** + * 转科筛选选项 DTO + * + * @author system + * @date 2025-06-25 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class TransferOptionsDto { + + /** 入院病区选项(转入病区) */ + private List wardListOptions = new ArrayList<>(); + + /** 入院病房选项(转入科室) */ + private List departmentListOptions = new ArrayList<>(); + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class OptionItem { + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + private String name; + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml index 3e25e5add..8e1174ffa 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml @@ -24,7 +24,11 @@ ii.bed_name, ii.organization_name, ii.contract_name, - COALESCE(ii.time1, ii.time2, ii.time3) AS admission_time + COALESCE(ii.time1, ii.time2, ii.time3) AS admission_time, + ii.target_ward_id, + ii.target_org_id, + ii.target_ward_name, + ii.target_org_name FROM ( WITH locations AS ( SELECT ael.encounter_id, @@ -63,7 +67,11 @@ fc.contract_name, alw.admission_time as time1, alh.admission_time as time2, - alb.admission_time as time3 + alb.admission_time as time3, + dop.target_location_id AS target_ward_id, + dop.target_organization_id AS target_org_id, + al_target."name" AS target_ward_name, + ao_target."name" AS target_org_name FROM adm_encounter ae LEFT JOIN adm_patient ap ON ae.patient_id = ap.id @@ -87,6 +95,22 @@ LEFT JOIN fin_contract fc ON aa.contract_no = fc.bus_no AND fc.delete_flag = '0' + LEFT JOIN LATERAL ( + SELECT encounter_id, + target_location_id, + target_organization_id + FROM doc_order_process dop2 + WHERE dop2.encounter_id = ae.id + AND dop2.delete_flag = '0' + ORDER BY dop2.create_time DESC + LIMIT 1 + ) dop ON true + LEFT JOIN adm_location al_target + ON al_target.id = dop.target_location_id + AND al_target.delete_flag = '0' + LEFT JOIN adm_organization ao_target + ON ao_target.id = dop.target_organization_id + AND ao_target.delete_flag = '0' WHERE ae.delete_flag = '0' AND ae.class_enum = #{imp} AND ae.status_enum != #{toBeRegistered} @@ -115,7 +139,11 @@ fc.contract_name, alw.admission_time, alh.admission_time, - alb.admission_time + alb.admission_time, + dop.target_location_id, + dop.target_organization_id, + al_target."name", + ao_target."name" ORDER BY ae.bus_no DESC ) AS ii ${ew.customSqlSegment} diff --git a/healthlink-his-ui/src/views/inpatientNurse/inOut/components/api.js b/healthlink-his-ui/src/views/inpatientNurse/inOut/components/api.js index 0edf9a2cb..99ad25d85 100755 --- a/healthlink-his-ui/src/views/inpatientNurse/inOut/components/api.js +++ b/healthlink-his-ui/src/views/inpatientNurse/inOut/components/api.js @@ -135,6 +135,16 @@ export function updateOutHospital(encounterId) { }, }); } +/** + * 获取转科筛选选项(转入病区、转入科室) + */ +export function getTransferOptions() { + return request({ + url: '/nurse-station/atd-manage/transfer-options', + method: 'get', + }); +} + //清床 export function terminalCleaning(encounterId) { return request({ diff --git a/healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue b/healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue index 23405f09e..a21fa5eca 100755 --- a/healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue +++ b/healthlink-his-ui/src/views/inpatientNurse/inOut/components/transferOut.vue @@ -36,6 +36,7 @@ v-model="queryParams.houseId" clearable placeholder="请选择" + @change="changeHouseId" > { }); }; +// 入院病房切换事件 +const changeHouseId = () => { + if (currentOperationType.value === 'transfer') { + getPatientList(); + } +}; + // 病区切换事件 const changeWardLocationId = (id) => { + if (currentOperationType.value === 'transfer') { + // 转科模式:入院病房独立数据源,选中后刷新患者列表 + queryParams.value.houseId = ''; + getPatientList(); + return; + } if (id) { const params = { locationId: id, @@ -740,14 +757,31 @@ const resetSearchForm = () => { getPractitionerWard().then((res) => { initInfoOptions.value.wardListOptions = res.data || []; }); + // 转科页面:额外获取转科申请数据覆盖下拉框 + if (currentOperationType.value === 'transfer') { + getTransferOptions().then((res) => { + if (res.data && res.data.wardListOptions) { + initInfoOptions.value.wardListOptions = res.data.wardListOptions || []; + wardLocationList.value = res.data.departmentListOptions || []; + } + }); + } getPatientList(); }; // 获取患者列表 function getPatientList() { - console.log('queryParams==========>', JSON.stringify(queryParams.value)); + // 根据操作类型构建请求参数:转科模式使用 transferTargetWardId/transferTargetOrgId + let params = { ...queryParams.value }; + if (currentOperationType.value === 'transfer') { + params.transferTargetWardId = queryParams.value.wardId || undefined; + params.transferTargetOrgId = queryParams.value.houseId || undefined; + delete params.wardId; + delete params.houseId; + } + console.log('queryParams==========>', JSON.stringify(params)); // 根据操作类型筛选不同状态的患者 - getPendingInfo(queryParams.value).then((res) => { + getPendingInfo(params).then((res) => { console.log('res==========>', JSON.stringify(res.data)); let filteredPatients = []; if (currentOperationType.value === 'transfer') { @@ -970,7 +1004,7 @@ function handleGetDRMedication() { const initData = async () => { try { - // 并行获取初始化数据和科室数据 + // 并行获取初始化数据和科室数据(保留原有调用链路) const [initRes, wardRes] = await Promise.all([ getInit(), getPractitionerWard() @@ -979,7 +1013,7 @@ const initData = async () => { // 处理初始化数据 initInfoOptions.value = initRes.data; - // 处理科室数据 + // 处理科室数据(保持原有逻辑不变) queryParams.value.wardId = wardRes[0]?.id || ''; initInfoOptions.value.wardListOptions = wardRes; @@ -988,6 +1022,22 @@ const initData = async () => { changeWardLocationId(wardRes[0].id); } + // 转科页面:额外获取转科申请数据覆盖下拉框,清除 wardId/houseId + if (currentOperationType.value === 'transfer') { + try { + const transferRes = await getTransferOptions(); + if (transferRes.data && transferRes.data.wardListOptions) { + initInfoOptions.value.wardListOptions = transferRes.data.wardListOptions || []; + wardLocationList.value = transferRes.data.departmentListOptions || []; + // 转科模式不预设筛选值,让护士自行选择 + queryParams.value.wardId = ''; + queryParams.value.houseId = ''; + } + } catch (e) { + console.error('获取转科筛选选项失败', e); + } + } + // 最后获取患者列表 getPatientList(); } catch (error) {