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 结果
*/
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.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<AdmissionPageParam> 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<AdmissionPatientPageDto> 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<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) {
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 transferTargetWardId;
/** 转科目标科室(待转科患者筛选) */
private Long transferTargetOrgId;
/**
* 入院类型
*/

View File

@@ -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;
}

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.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}

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) {
return request({

View File

@@ -36,6 +36,7 @@
v-model="queryParams.houseId"
clearable
placeholder="请选择"
@change="changeHouseId"
>
<el-option
v-for="item in wardLocationList"
@@ -596,6 +597,7 @@ import {
getPersonAccount,
getPractitionerWard,
getPrescriptionList,
getTransferOptions,
terminalCleaning,
updateOutHospital,
updateTransferDepartment,
@@ -641,6 +643,8 @@ const queryParams = ref({
searchKey: '',
wardId: '',
houseId: '',
transferTargetWardId: undefined,
transferTargetOrgId: undefined,
});
const detailLoading = ref(false);
@@ -705,8 +709,21 @@ const handleCardClick = (item: any, index: number) => {
});
};
// 入院病房切换事件
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) {