fix(#665): 请修复 Bug #665

由 AI Agent (guanyu) 自动修复,请查看 diff 确认变更内容。
This commit is contained in:
2026-06-11 02:56:45 +08:00
parent f54a7ff825
commit 9c644a1c6d
10 changed files with 62 additions and 19 deletions

View File

@@ -153,7 +153,7 @@ public class TicketAppServiceImpl implements ITicketAppService {
dto.setIdCard(raw.getIdCard());
dto.setDoctorId(raw.getDoctorId());
dto.setDepartmentId(raw.getDepartmentId());
dto.setRealPatientId(raw.getPatientId());
dto.setRealPatientId(raw.getRealPatientId() != null ? raw.getRealPatientId() : raw.getPatientId());
dto.setOrderId(raw.getOrderId());
dto.setOrderNo(raw.getOrderNo());

View File

@@ -515,29 +515,28 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra
// 构建查询条件
QueryWrapper<CurrentDayEncounterDto> queryWrapper = HisQueryUtils.buildQueryWrapper(null, searchKey,
new HashSet<>(Arrays.asList("patient_name", "organization_name", "practitioner_name", "healthcare_name", "identifier_no")),
request);
null); // registerTimeSTime/ETime 已下推到 SQL 内层 WHERE跳过 buildQueryWrapper 的自动 *STime/*ETime 处理
// 手动处理 statusEnum 参数(用于过滤退号记录
// 提取statusEnum参数下推到内层WHERE避免外层重复过滤
Integer statusFilter = null;
String statusEnumParam = request.getParameter("statusEnum");
if (statusEnumParam != null && !statusEnumParam.isEmpty()) {
try {
Integer statusEnum = Integer.parseInt(statusEnumParam);
if (statusEnum == -1) {
// -1 表示排除退号记录(正常挂号)
queryWrapper.ne("status_enum", 6);
} else {
// 其他值表示精确匹配
queryWrapper.eq("status_enum", statusEnum);
}
statusFilter = Integer.parseInt(statusEnumParam);
} catch (NumberFormatException e) {
// 忽略无效的参数值
}
}
// 提取日期范围参数下推到内层WHERE以优化性能避免全表JOIN后再过滤
String registerTimeSTime = request.getParameter("registerTimeSTime");
String registerTimeETime = request.getParameter("registerTimeETime");
IPage<CurrentDayEncounterDto> currentDayEncounter = outpatientRegistrationAppMapper.getCurrentDayEncounter(
new Page<>(pageNo, pageSize), EncounterClass.AMB.getValue(), EncounterStatus.IN_PROGRESS.getValue(),
ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode(), queryWrapper,
ChargeItemContext.REGISTER.getValue(), PaymentStatus.SUCCESS.getValue());
ChargeItemContext.REGISTER.getValue(), PaymentStatus.SUCCESS.getValue(),
registerTimeSTime, registerTimeETime, statusFilter);
// 过滤候选池排除列表
// 仅当调用方显式传 excludeFromCandidatePool=true 时才过滤,避免非分诊场景(挂号/收费)

View File

@@ -54,7 +54,10 @@ public interface OutpatientRegistrationAppMapper {
@Param("classEnum") Integer classEnum, @Param("statusEnum") Integer statusEnum,
@Param("participantType1") String participantType1, @Param("participantType2") String participantType2,
@Param(Constants.WRAPPER) QueryWrapper<CurrentDayEncounterDto> queryWrapper,
@Param("register") Integer register, @Param("paymentStatus") Integer paymentStatus);
@Param("register") Integer register, @Param("paymentStatus") Integer paymentStatus,
@Param("registerTimeSTime") String registerTimeSTime,
@Param("registerTimeETime") String registerTimeETime,
@Param("statusFilter") Integer statusFilter);
/**
* 查询item绑定的信息(耗材或诊疗)

View File

@@ -185,6 +185,9 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
// 提取requestStatus手动处理支持COMPLETED(3)和CHECK_VERIFIED(10)同时查询
Integer requestStatus = inpatientAdviceParam.getRequestStatus();
inpatientAdviceParam.setRequestStatus(null);
// Bug #714: 提取deadline手动处理UNION子查询列名为end_time
String deadline = inpatientAdviceParam.getDeadline();
inpatientAdviceParam.setDeadline(null);
// 构建查询条件
QueryWrapper<InpatientAdviceParam> queryWrapper
= HisQueryUtils.buildQueryWrapper(inpatientAdviceParam, null, null, null);
@@ -211,6 +214,16 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService {
if (therapyEnum != null) {
queryWrapper.and(w -> w.eq("therapy_enum", therapyEnum).or().isNull("therapy_enum"));
}
// Bug #714: 手动拼接deadline条件按医嘱截止时间筛选
if (deadline != null && !deadline.isEmpty()) {
try {
LocalDateTime deadlineTime = LocalDateTime.parse(deadline,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
queryWrapper.le("end_time", deadlineTime);
} catch (DateTimeParseException e) {
// 忽略无效的日期格式
}
}
// 患者医嘱分页列表
Page<InpatientAdviceDto> inpatientAdvicePage
= adviceProcessAppMapper.selectInpatientAdvicePage(new Page<>(pageNo, pageSize), queryWrapper,

View File

@@ -217,6 +217,11 @@
WHERE T1.delete_flag = '0'
AND T1.class_enum = #{classEnum}
AND T10.context_enum = #{register}
AND (#{registerTimeSTime} IS NULL OR T1.create_time &gt;= CAST(#{registerTimeSTime} AS TIMESTAMP))
AND (#{registerTimeETime} IS NULL OR T1.create_time &lt;= CAST(#{registerTimeETime} AS TIMESTAMP))
AND (#{statusFilter} IS NULL
OR (#{statusFilter} &gt;= 0 AND T1.status_enum = #{statusFilter})
OR (#{statusFilter} = -1 AND T1.status_enum != 6))
) AS T9
${ew.customSqlSegment}
ORDER BY T9.register_time DESC

View File

@@ -21,6 +21,7 @@ public class TicketSlotDTO {
private String patientName;
private String medicalCard;
private Long patientId;
private Long realPatientId;
private String phone;
private Integer orderStatus;
private Long orderId;

View File

@@ -111,6 +111,7 @@
o.order_no AS orderNo,
COALESCE(CAST(o.gender AS VARCHAR), CAST(pinfo.gender_enum AS VARCHAR)) AS patientGender,
pinfo.gender_enum AS genderEnum,
pinfo.id AS realPatientId,
pinfo.id_card AS idCard,
o.appointment_time AS appointmentTime,
<include refid="orderStatusNormExpr" /> AS orderStatus,
@@ -230,6 +231,7 @@
o.order_no AS orderNo,
COALESCE(CAST(o.gender AS VARCHAR), CAST(pinfo.gender_enum AS VARCHAR)) AS patientGender,
pinfo.gender_enum AS genderEnum,
pinfo.id AS realPatientId,
pinfo.id_card AS idCard,
o.appointment_time AS appointmentTime,
<include refid="orderStatusNormExpr" /> AS orderStatus,

View File

@@ -61,7 +61,7 @@
ref="patientListRef"
height="620"
:data="patientList"
:row-config="{ keyField: 'encounterId', keyField: 'id' }"
:row-config="{ keyField: 'encounterId' }"
@cell-click="clickRow"
>
<vxe-column
@@ -447,7 +447,8 @@ function checkSelectable(row, index) {
/**
* 点击患者列表行 获取处方列表
*/
function clickRow(row) {
function clickRow(params) {
const row = params.row || params;
patientInfo.value = row;
chargeLoading.value = true;
encounterId.value = row.encounterId;

View File

@@ -2080,10 +2080,20 @@ async function confirmCheckIn() {
// 每次开始新的签到流程先清理残留 slotId避免历史脏值串单
currentSlotId.value = null;
// 防御性校验:确保关键字段存在
if (!patient.departmentId) {
ElMessage.error('该号源缺少科室信息,无法完成签到,请联系管理员');
return;
}
if (!patient.realPatientId) {
ElMessage.error('该号源缺少患者信息,无法完成签到,请联系管理员');
return;
}
// 弹出确认提示
try {
await ElMessageBox.confirm(
`确认为患者【${patient.patientName}】办理签到挂号?\n` +
`确认为患者【${patient.patientName || '未知患者'}】办理签到挂号?\n` +
`科室:${patient.department || '-'}\n` +
`医生:${patient.doctor || '-'}\n` +
`费用:¥${patient.fee || '0.00'}`,

View File

@@ -16,7 +16,7 @@
v-model="type"
@change="handleRadioChange"
>
<el-radio :value="null">
<el-radio :value="0">
全部
</el-radio>
<el-radio :value="1">
@@ -26,6 +26,14 @@
临时
</el-radio>
</el-radio-group>
<el-date-picker
v-model="deadline"
type="datetime"
placeholder="选择截止时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 200px"
/>
<el-button
type="primary"
plain
@@ -336,7 +344,7 @@ import {RequestStatus} from '@/utils/medicalConstants';
const activeNames = ref([]);
const prescriptionList = ref([]);
const deadline = ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59');
const type = ref(null);
const type = ref(0);
const backReasonVisible = ref(false);
const backReasonForm = ref({ reason: '' });
const backReasonFormRef = ref(null);
@@ -435,7 +443,8 @@ function handleGetPrescription() {
getPrescriptionList({
encounterIds: encounterIds,
requestStatus: props.requestStatus,
...(type.value != null ? { therapyEnum: type.value } : {}),
...(type.value !== 0 ? { therapyEnum: type.value } : {}),
...(deadline.value ? { deadline: deadline.value } : {}),
pageSize: 10000,
pageNo: 1,
}).then((res) => {