729 【住院护士站-入出转管理】待转科列表“入院病区/入院病房”下拉筛选项无数据,未正确读取转科申请数据

This commit is contained in:
wangjian963
2026-06-25 16:13:28 +08:00
parent 00fa8f3af9
commit 4d7a2db4df
9 changed files with 273 additions and 8 deletions

View File

@@ -123,5 +123,12 @@ public interface IATDManageAppService {
* @return 结果 * @return 结果
*/ */
R<?> cancelBedAssignment(Long encounterId); R<?> cancelBedAssignment(Long encounterId);
/**
* 获取转科筛选选项(转入病区、转入科室)
*
* @return 转科筛选选项
*/
R<?> getTransferOptions();
} }

View File

@@ -17,11 +17,14 @@ import com.healthlink.his.administration.domain.ChargeItem;
import com.healthlink.his.administration.service.IChargeItemService; import com.healthlink.his.administration.service.IChargeItemService;
import com.healthlink.his.administration.domain.EncounterLocation; import com.healthlink.his.administration.domain.EncounterLocation;
import com.healthlink.his.administration.domain.EncounterParticipant; 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.domain.Practitioner;
import com.healthlink.his.administration.service.IEncounterLocationService; import com.healthlink.his.administration.service.IEncounterLocationService;
import com.healthlink.his.administration.service.IEncounterParticipantService; import com.healthlink.his.administration.service.IEncounterParticipantService;
import com.healthlink.his.administration.service.IEncounterService; import com.healthlink.his.administration.service.IEncounterService;
import com.healthlink.his.administration.service.ILocationService; 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.administration.service.IPractitionerService;
import com.healthlink.his.common.constant.CommonConstants; import com.healthlink.his.common.constant.CommonConstants;
import com.healthlink.his.common.enums.*; import com.healthlink.his.common.enums.*;
@@ -114,6 +117,9 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
@Resource @Resource
private IPractitionerService practitionerService; private IPractitionerService practitionerService;
@Resource
private IOrganizationService organizationService;
@Resource @Resource
private ApplicationEventPublisher eventPublisher; private ApplicationEventPublisher eventPublisher;
@@ -166,12 +172,25 @@ public class ATDManageAppServiceImpl implements IATDManageAppService {
String searchKey, HttpServletRequest request) { String searchKey, HttpServletRequest request) {
// 获取当前登录用户的科室 ID // 获取当前登录用户的科室 ID
Long currentUserOrgId = SecurityUtils.getLoginUser().getOrgId(); Long currentUserOrgId = SecurityUtils.getLoginUser().getOrgId();
// 提取转科筛选条件(字段名与 SQL 列别名不一致,需手动处理)
Long transferTargetWardId = admissionPageParam.getTransferTargetWardId();
Long transferTargetOrgId = admissionPageParam.getTransferTargetOrgId();
admissionPageParam.setTransferTargetWardId(null);
admissionPageParam.setTransferTargetOrgId(null);
// 构建查询条件 // 构建查询条件
QueryWrapper<AdmissionPageParam> queryWrapper = HisQueryUtils.buildQueryWrapper(admissionPageParam, searchKey, QueryWrapper<AdmissionPageParam> queryWrapper = HisQueryUtils.buildQueryWrapper(admissionPageParam, searchKey,
new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr, new HashSet<>(Arrays.asList(CommonConstants.FieldName.PatientWbStr, CommonConstants.FieldName.PatientPyStr,
CommonConstants.FieldName.PatientName, CommonConstants.FieldName.BusNo)), CommonConstants.FieldName.PatientName, CommonConstants.FieldName.BusNo)),
request); request);
// 手动添加转科目标筛选条件
if (transferTargetWardId != null) {
queryWrapper.apply("ii.target_ward_id = {0}", transferTargetWardId);
}
if (transferTargetOrgId != null) {
queryWrapper.apply("ii.target_org_id = {0}", transferTargetOrgId);
}
// 入院患者分页列表 // 入院患者分页列表
Page<AdmissionPatientPageDto> admissionPatientPage = atdManageAppMapper.selectAdmissionPatientPage( Page<AdmissionPatientPageDto> admissionPatientPage = atdManageAppMapper.selectAdmissionPatientPage(
new Page<>(pageNo, pageSize), queryWrapper, EncounterClass.IMP.getValue(), 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<Encounter> pendingTransfers = encounterService.list(
new LambdaQueryWrapper<Encounter>()
.eq(Encounter::getStatusEnum, EncounterZyStatus.PENDING_TRANSFER.getValue())
.eq(Encounter::getOrganizationId, currentUserOrgId)
.eq(Encounter::getDeleteFlag, delFlagNo));
if (pendingTransfers.isEmpty()) {
return R.ok(new TransferOptionsDto());
}
List<Long> encounterIds = pendingTransfers.stream().map(Encounter::getId).toList();
// 查询这些患者的转科申请,获取转入病区和转入科室
List<OrderProcess> orderProcessList = orderProcessService.list(
new LambdaQueryWrapper<OrderProcess>()
.in(OrderProcess::getEncounterId, encounterIds)
.eq(OrderProcess::getDeleteFlag, delFlagNo)
.isNotNull(OrderProcess::getTargetLocationId));
// 去重收集转入病区
Set<Long> wardIdSet = new LinkedHashSet<>();
Set<Long> orgIdSet = new LinkedHashSet<>();
Map<Long, String> wardNameMap = new HashMap<>();
Map<Long, String> 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<Location> locations = locationService.listByIds(wardIdSet);
for (Location loc : locations) {
wardNameMap.put(loc.getId(), loc.getName());
}
}
// 查询科室名称
if (!orgIdSet.isEmpty()) {
List<Organization> orgs = organizationService.listByIds(orgIdSet);
if (orgs != null) {
for (Organization org : orgs) {
orgNameMap.put(org.getId(), org.getName());
}
}
}
// 构建转入病区选项
List<TransferOptionsDto.OptionItem> wardOptions = new ArrayList<>();
for (Long wardId : wardIdSet) {
String name = wardNameMap.getOrDefault(wardId, String.valueOf(wardId));
wardOptions.add(new TransferOptionsDto.OptionItem(wardId, name));
}
// 构建转入科室选项
List<TransferOptionsDto.OptionItem> 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);
}
/** /**
* 退床 (取消分床) * 退床 (取消分床)
* *

View File

@@ -177,5 +177,15 @@ public class ATDManageController {
public R<?> cancelBedAssignment(Long encounterId) { public R<?> cancelBedAssignment(Long encounterId) {
return atdManageAppService.cancelBedAssignment(encounterId); return atdManageAppService.cancelBedAssignment(encounterId);
} }
/**
* 获取转科筛选选项(转入病区、转入科室)
*
* @return 转科筛选选项
*/
@GetMapping(value = "/transfer-options")
public R<?> getTransferOptions() {
return atdManageAppService.getTransferOptions();
}
} }

View File

@@ -27,6 +27,12 @@ public class AdmissionPageParam {
/** 入院病房 */ /** 入院病房 */
private Long houseId; private Long houseId;
/** 转科目标病区(待转科患者筛选) */
private Long transferTargetWardId;
/** 转科目标科室(待转科患者筛选) */
private Long transferTargetOrgId;
/** /**
* 入院类型 * 入院类型
*/ */

View File

@@ -146,4 +146,18 @@ public class AdmissionPatientPageDto {
*/ */
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
private Long patientId; 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;
} }

View File

@@ -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<OptionItem> wardListOptions = new ArrayList<>();
/** 入院病房选项(转入科室) */
private List<OptionItem> departmentListOptions = new ArrayList<>();
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class OptionItem {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private String name;
}
}

View File

@@ -24,7 +24,11 @@
ii.bed_name, ii.bed_name,
ii.organization_name, ii.organization_name,
ii.contract_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 ( FROM (
WITH locations AS ( WITH locations AS (
SELECT ael.encounter_id, SELECT ael.encounter_id,
@@ -63,7 +67,11 @@
fc.contract_name, fc.contract_name,
alw.admission_time as time1, alw.admission_time as time1,
alh.admission_time as time2, 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 FROM adm_encounter ae
LEFT JOIN adm_patient ap LEFT JOIN adm_patient ap
ON ae.patient_id = ap.id ON ae.patient_id = ap.id
@@ -87,6 +95,22 @@
LEFT JOIN fin_contract fc LEFT JOIN fin_contract fc
ON aa.contract_no = fc.bus_no ON aa.contract_no = fc.bus_no
AND fc.delete_flag = '0' 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' WHERE ae.delete_flag = '0'
AND ae.class_enum = #{imp} AND ae.class_enum = #{imp}
AND ae.status_enum != #{toBeRegistered} AND ae.status_enum != #{toBeRegistered}
@@ -115,7 +139,11 @@
fc.contract_name, fc.contract_name,
alw.admission_time, alw.admission_time,
alh.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 ORDER BY ae.bus_no DESC
) AS ii ) AS ii
${ew.customSqlSegment} ${ew.customSqlSegment}

View File

@@ -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) { export function terminalCleaning(encounterId) {
return request({ return request({

View File

@@ -36,6 +36,7 @@
v-model="queryParams.houseId" v-model="queryParams.houseId"
clearable clearable
placeholder="请选择" placeholder="请选择"
@change="changeHouseId"
> >
<el-option <el-option
v-for="item in wardLocationList" v-for="item in wardLocationList"
@@ -596,6 +597,7 @@ import {
getPersonAccount, getPersonAccount,
getPractitionerWard, getPractitionerWard,
getPrescriptionList, getPrescriptionList,
getTransferOptions,
terminalCleaning, terminalCleaning,
updateOutHospital, updateOutHospital,
updateTransferDepartment, updateTransferDepartment,
@@ -641,6 +643,8 @@ const queryParams = ref({
searchKey: '', searchKey: '',
wardId: '', wardId: '',
houseId: '', houseId: '',
transferTargetWardId: undefined,
transferTargetOrgId: undefined,
}); });
const detailLoading = ref(false); const detailLoading = ref(false);
@@ -705,8 +709,21 @@ const handleCardClick = (item: any, index: number) => {
}); });
}; };
// 入院病房切换事件
const changeHouseId = () => {
if (currentOperationType.value === 'transfer') {
getPatientList();
}
};
// 病区切换事件 // 病区切换事件
const changeWardLocationId = (id) => { const changeWardLocationId = (id) => {
if (currentOperationType.value === 'transfer') {
// 转科模式:入院病房独立数据源,选中后刷新患者列表
queryParams.value.houseId = '';
getPatientList();
return;
}
if (id) { if (id) {
const params = { const params = {
locationId: id, locationId: id,
@@ -740,14 +757,31 @@ const resetSearchForm = () => {
getPractitionerWard().then((res) => { getPractitionerWard().then((res) => {
initInfoOptions.value.wardListOptions = res.data || []; 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(); getPatientList();
}; };
// 获取患者列表 // 获取患者列表
function 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)); console.log('res==========>', JSON.stringify(res.data));
let filteredPatients = []; let filteredPatients = [];
if (currentOperationType.value === 'transfer') { if (currentOperationType.value === 'transfer') {
@@ -970,7 +1004,7 @@ function handleGetDRMedication() {
const initData = async () => { const initData = async () => {
try { try {
// 并行获取初始化数据和科室数据 // 并行获取初始化数据和科室数据(保留原有调用链路)
const [initRes, wardRes] = await Promise.all([ const [initRes, wardRes] = await Promise.all([
getInit(), getInit(),
getPractitionerWard() getPractitionerWard()
@@ -979,7 +1013,7 @@ const initData = async () => {
// 处理初始化数据 // 处理初始化数据
initInfoOptions.value = initRes.data; initInfoOptions.value = initRes.data;
// 处理科室数据 // 处理科室数据(保持原有逻辑不变)
queryParams.value.wardId = wardRes[0]?.id || ''; queryParams.value.wardId = wardRes[0]?.id || '';
initInfoOptions.value.wardListOptions = wardRes; initInfoOptions.value.wardListOptions = wardRes;
@@ -988,6 +1022,22 @@ const initData = async () => {
changeWardLocationId(wardRes[0].id); 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(); getPatientList();
} catch (error) { } catch (error) {