feat(patient): 实现门诊挂号页面跳转到患者档案页面的精确定位功能
- 在门诊挂号页面添加患者ID和姓名查询参数传递到患者档案页面 - 在患者档案页面实现路由参数接收和按数据库ID精确查询功能 - 新增searchType字段支持按姓名和病人ID两种查询方式 - 优化患者档案页面初始化逻辑,分离字典数据加载和列表查询 - 修改后端服务实现,对精确ID查询跳过医生患者过滤条件以确保跳转查询成功
This commit is contained in:
@@ -482,4 +482,4 @@ public class DoctorStationDiagnosisAppServiceImpl implements IDoctorStationDiagn
|
|||||||
|
|
||||||
return R.ok(encounterDiagnosis);
|
return R.ok(encounterDiagnosis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -143,29 +143,35 @@ public class PatientInformationServiceImpl implements IPatientInformationService
|
|||||||
CommonConstants.FieldName.BusNo, CommonConstants.FieldName.PyStr, CommonConstants.FieldName.WbStr)),
|
CommonConstants.FieldName.BusNo, CommonConstants.FieldName.PyStr, CommonConstants.FieldName.WbStr)),
|
||||||
request);
|
request);
|
||||||
|
|
||||||
// 查询当前用户对应的医生信息
|
// 检查是否是精确ID查询(从门诊挂号页面跳转时使用)
|
||||||
LambdaQueryWrapper<com.openhis.administration.domain.Practitioner> practitionerQuery = new LambdaQueryWrapper<>();
|
boolean hasExactIdQuery = (patientBaseInfoDto.getId() != null);
|
||||||
practitionerQuery.eq(com.openhis.administration.domain.Practitioner::getUserId, userId);
|
|
||||||
// 使用list()避免TooManyResultsException异常,然后取第一个记录
|
|
||||||
List<com.openhis.administration.domain.Practitioner> practitionerList = practitionerService.list(practitionerQuery);
|
|
||||||
com.openhis.administration.domain.Practitioner practitioner = practitionerList != null && !practitionerList.isEmpty() ? practitionerList.get(0) : null;
|
|
||||||
|
|
||||||
// 如果当前用户是医生,添加医生患者过滤条件
|
// 只有非精确ID查询时,才添加医生患者过滤条件
|
||||||
if (practitioner != null) {
|
if (!hasExactIdQuery) {
|
||||||
// 查询该医生作为接诊医生(ADMITTER, code="1")和挂号医生(REGISTRATION_DOCTOR, code="12")的所有就诊记录的患者ID
|
// 查询当前用户对应的医生信息
|
||||||
List<Long> doctorPatientIds = patientManageMapper.getPatientIdsByPractitionerId(
|
LambdaQueryWrapper<com.openhis.administration.domain.Practitioner> practitionerQuery = new LambdaQueryWrapper<>();
|
||||||
practitioner.getId(),
|
practitionerQuery.eq(com.openhis.administration.domain.Practitioner::getUserId, userId);
|
||||||
Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode()));
|
// 使用list()避免TooManyResultsException异常,然后取第一个记录
|
||||||
|
List<com.openhis.administration.domain.Practitioner> practitionerList = practitionerService.list(practitionerQuery);
|
||||||
|
com.openhis.administration.domain.Practitioner practitioner = practitionerList != null && !practitionerList.isEmpty() ? practitionerList.get(0) : null;
|
||||||
|
|
||||||
if (doctorPatientIds != null && !doctorPatientIds.isEmpty()) {
|
// 如果当前用户是医生,添加医生患者过滤条件
|
||||||
// 添加患者ID过滤条件 - 注意:这里使用列名而不是表别名
|
if (practitioner != null) {
|
||||||
queryWrapper.in("id", doctorPatientIds);
|
// 查询该医生作为接诊医生(ADMITTER, code="1")和挂号医生(REGISTRATION_DOCTOR, code="12")的所有就诊记录的患者ID
|
||||||
} else {
|
List<Long> doctorPatientIds = patientManageMapper.getPatientIdsByPractitionerId(
|
||||||
// 如果没有相关患者,返回空结果
|
practitioner.getId(),
|
||||||
queryWrapper.eq("id", -1); // 设置一个不存在的ID
|
Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode()));
|
||||||
|
|
||||||
|
if (doctorPatientIds != null && !doctorPatientIds.isEmpty()) {
|
||||||
|
// 添加患者ID过滤条件 - 注意:这里使用列名而不是表别名
|
||||||
|
queryWrapper.in("id", doctorPatientIds);
|
||||||
|
} else {
|
||||||
|
// 如果没有相关患者,返回空结果
|
||||||
|
queryWrapper.eq("id", -1); // 设置一个不存在的ID
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// 如果不是医生,查询所有患者
|
||||||
}
|
}
|
||||||
// 如果不是医生,查询所有患者
|
|
||||||
|
|
||||||
IPage<PatientBaseInfoDto> patientInformationPage
|
IPage<PatientBaseInfoDto> patientInformationPage
|
||||||
= patientManageMapper.getPatientPage(new Page<>(pageNo, pageSize), queryWrapper);
|
= patientManageMapper.getPatientPage(new Page<>(pageNo, pageSize), queryWrapper);
|
||||||
|
|||||||
@@ -961,7 +961,20 @@ async function handleReadCard(value) {
|
|||||||
|
|
||||||
/** 跳转到患者档案页面 */
|
/** 跳转到患者档案页面 */
|
||||||
function goToPatientRecord() {
|
function goToPatientRecord() {
|
||||||
router.push('/patient/patientmgr');
|
// 如果已选择患者,则跳转到档案页面并定位到该患者
|
||||||
|
if (form.value.patientId) {
|
||||||
|
// 使用患者ID作为查询参数传递到档案页面
|
||||||
|
router.push({
|
||||||
|
path: '/patient/patientmgr',
|
||||||
|
query: {
|
||||||
|
patientId: form.value.patientId,
|
||||||
|
patientName: form.value.name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 未选择患者时,直接跳转到档案页面
|
||||||
|
router.push('/patient/patientmgr');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 新增用户信息弹窗 */
|
/** 新增用户信息弹窗 */
|
||||||
|
|||||||
@@ -118,9 +118,14 @@
|
|||||||
<script setup name="patientManagement">
|
<script setup name="patientManagement">
|
||||||
import pcas from 'china-division/dist/pcas-code.json';
|
import pcas from 'china-division/dist/pcas-code.json';
|
||||||
import {nextTick, ref} from 'vue';
|
import {nextTick, ref} from 'vue';
|
||||||
|
import {useRoute} from 'vue-router';
|
||||||
|
import {useRouter} from 'vue-router';
|
||||||
import {addPatient, listPatient, lists, updatePatient} from './component/api';
|
import {addPatient, listPatient, lists, updatePatient} from './component/api';
|
||||||
import PatientAddDialog from '@/views/charge/outpatientregistration/components/patientAddDialog';
|
import PatientAddDialog from '@/views/charge/outpatientregistration/components/patientAddDialog';
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
const showSearch = ref(true);
|
const showSearch = ref(true);
|
||||||
const open = ref(false);
|
const open = ref(false);
|
||||||
const title = ref('');
|
const title = ref('');
|
||||||
@@ -178,7 +183,9 @@ const data = reactive({
|
|||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
searchKey: undefined,
|
searchKey: undefined,
|
||||||
name: undefined
|
name: undefined,
|
||||||
|
patientId: undefined, // 新增: 专门用于数据库ID查询
|
||||||
|
searchType: 'name' // 新增: 查询类型, 'name'按姓名查询, 'patientId'按病人ID查询
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
|
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
|
||||||
@@ -242,13 +249,25 @@ const findNodeByCode = (data, code) => {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 查询患者列表 */
|
/** 查询患者列表 - 基础查询方法,用于初始化等操作 */
|
||||||
function getList() {
|
function getList() {
|
||||||
|
// 执行查询
|
||||||
listPatient(queryParams.value).then((response) => {
|
listPatient(queryParams.value).then((response) => {
|
||||||
patientList.value = response.data.records;
|
patientList.value = response.data.records;
|
||||||
total.value = response.data.total;
|
total.value = response.data.total;
|
||||||
console.log('patientList======>', JSON.stringify(patientList.value));
|
console.log('patientList======>', JSON.stringify(patientList.value));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 初始化字典数据(仅在第一次加载时执行)
|
||||||
|
if (!listsFlag.value) {
|
||||||
|
getInitDictData();
|
||||||
|
listsFlag.value = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化字典数据 - 分离字典数据加载逻辑 */
|
||||||
|
const listsFlag = ref(false);
|
||||||
|
function getInitDictData() {
|
||||||
lists().then((response) => {
|
lists().then((response) => {
|
||||||
console.log(response);
|
console.log(response);
|
||||||
occupationtypeList.value = response.data.occupationType;
|
occupationtypeList.value = response.data.occupationType;
|
||||||
@@ -262,6 +281,86 @@ function getList() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 - 支持按姓名和病人ID两种查询方式 */
|
||||||
|
function handleQuery() {
|
||||||
|
queryParams.value.pageNo = 1;
|
||||||
|
queryParams.value.createTimeSTime =
|
||||||
|
dateRange.value && dateRange.value.length == 2 ? dateRange.value[0] : '';
|
||||||
|
queryParams.value.createTimeETime =
|
||||||
|
dateRange.value && dateRange.value.length == 2 ? dateRange.value[1] : '';
|
||||||
|
|
||||||
|
// 根据查询类型设置查询参数
|
||||||
|
if (queryParams.value.searchType === 'patientId') {
|
||||||
|
// 按病人ID查询(数据库ID) - 直接传递ID参数
|
||||||
|
const queryParamsCopy = {
|
||||||
|
pageNo: queryParams.value.pageNo,
|
||||||
|
pageSize: queryParams.value.pageSize,
|
||||||
|
id: queryParams.value.patientId,
|
||||||
|
searchKey: undefined
|
||||||
|
};
|
||||||
|
console.log('按数据库ID查询参数:', queryParamsCopy);
|
||||||
|
|
||||||
|
// 执行查询
|
||||||
|
listPatient(queryParamsCopy).then((response) => {
|
||||||
|
patientList.value = response.data.records;
|
||||||
|
total.value = response.data.total;
|
||||||
|
console.log('查询结果:', response.data);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 按姓名/拼音码/病人ID查询(兼容原有逻辑)
|
||||||
|
queryParams.value.id = undefined;
|
||||||
|
|
||||||
|
// 执行查询
|
||||||
|
listPatient(queryParams.value).then((response) => {
|
||||||
|
patientList.value = response.data.records;
|
||||||
|
total.value = response.data.total;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
function resetQuery() {
|
||||||
|
dateRange.value = [];
|
||||||
|
proxy.resetForm('queryRef');
|
||||||
|
queryParams.value.patientId = undefined;
|
||||||
|
queryParams.value.searchType = 'name';
|
||||||
|
queryParams.value.id = undefined;
|
||||||
|
queryParams.value.name = undefined;
|
||||||
|
handleQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 从门诊挂号页面跳转时的精确查询 - 按数据库ID查询 */
|
||||||
|
function queryByPatientId(patientId) {
|
||||||
|
console.log('收到门诊挂号传递的patientId:', patientId);
|
||||||
|
|
||||||
|
// 直接构造查询参数,避免受到其他条件干扰
|
||||||
|
const exactQueryParams = {
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
id: patientId, // 直接使用ID字段进行精确查询
|
||||||
|
searchKey: undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('精确查询参数:', exactQueryParams);
|
||||||
|
|
||||||
|
// 执行查询
|
||||||
|
listPatient(exactQueryParams).then((response) => {
|
||||||
|
patientList.value = response.data.records;
|
||||||
|
total.value = response.data.total;
|
||||||
|
console.log('按数据库ID查询结果:', JSON.stringify(patientList.value));
|
||||||
|
console.log('查询到的患者数量:', response.data.records.length);
|
||||||
|
|
||||||
|
// 如果查询成功,清空patientId以免影响后续查询
|
||||||
|
if (response.data.records && response.data.records.length > 0) {
|
||||||
|
console.log('查询成功,找到患者:', response.data.records[0].name);
|
||||||
|
} else {
|
||||||
|
console.warn('未找到匹配的患者,ID:', patientId);
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('查询失败:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** 表单重置 */
|
/** 表单重置 */
|
||||||
function reset() {
|
function reset() {
|
||||||
form.value = {
|
form.value = {
|
||||||
@@ -305,23 +404,6 @@ function handlePatientAdded(patientData) {
|
|||||||
// 患者添加成功后刷新列表
|
// 患者添加成功后刷新列表
|
||||||
getList();
|
getList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 搜索按钮操作 */
|
|
||||||
function handleQuery() {
|
|
||||||
queryParams.value.pageNo = 1;
|
|
||||||
queryParams.value.createTimeSTime =
|
|
||||||
dateRange.value && dateRange.value.length == 2 ? dateRange.value[0] : '';
|
|
||||||
queryParams.value.createTimeETime =
|
|
||||||
dateRange.value && dateRange.value.length == 2 ? dateRange.value[1] : '';
|
|
||||||
// 执行查询
|
|
||||||
getList();
|
|
||||||
}
|
|
||||||
/** 重置按钮操作 */
|
|
||||||
function resetQuery() {
|
|
||||||
dateRange.value = [];
|
|
||||||
proxy.resetForm('queryRef');
|
|
||||||
handleQuery();
|
|
||||||
}
|
|
||||||
/** 新增按钮操作 */
|
/** 新增按钮操作 */
|
||||||
function handleAdd() {
|
function handleAdd() {
|
||||||
patientAddRef.value.show(); // 使用与门诊挂号一致的方式显示新增患者组件
|
patientAddRef.value.show(); // 使用与门诊挂号一致的方式显示新增患者组件
|
||||||
@@ -640,7 +722,14 @@ function submitForm() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getList();
|
// 检查是否从门诊挂号页面跳转过来,并携带了patientId参数
|
||||||
|
if (route.query.patientId) {
|
||||||
|
// 使用精确查询方法按数据库ID查询
|
||||||
|
queryByPatientId(route.query.patientId);
|
||||||
|
} else {
|
||||||
|
// 正常加载患者列表
|
||||||
|
getList();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user