729 【住院护士站-入出转管理】待转科列表“入院病区/入院病房”下拉筛选项无数据,未正确读取转科申请数据
This commit is contained in:
@@ -123,5 +123,12 @@ public interface IATDManageAppService {
|
||||
* @return 结果
|
||||
*/
|
||||
R<?> cancelBedAssignment(Long encounterId);
|
||||
|
||||
/**
|
||||
* 获取转科筛选选项(转入病区、转入科室)
|
||||
*
|
||||
* @return 转科筛选选项
|
||||
*/
|
||||
R<?> getTransferOptions();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 退床 (取消分床)
|
||||
*
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,12 @@ public class AdmissionPageParam {
|
||||
/** 入院病房 */
|
||||
private Long houseId;
|
||||
|
||||
/** 转科目标病区(待转科患者筛选) */
|
||||
private Long transferTargetWardId;
|
||||
|
||||
/** 转科目标科室(待转科患者筛选) */
|
||||
private Long transferTargetOrgId;
|
||||
|
||||
/**
|
||||
* 入院类型
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user