344 门诊预约挂号:未过滤过期号源,允许预约已过时的时间段
This commit is contained in:
@@ -40,4 +40,7 @@ public class TicketQueryDTO implements Serializable {
|
|||||||
|
|
||||||
// 每页显示条数 (默认查20条)
|
// 每页显示条数 (默认查20条)
|
||||||
private Integer limit = 20;
|
private Integer limit = 20;
|
||||||
|
|
||||||
|
// 浏览器当前时间戳(用来过滤过期号源,保证前后端一致)
|
||||||
|
private Long currentTime;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -358,14 +358,22 @@
|
|||||||
p.doctor_id AS doctorId,
|
p.doctor_id AS doctorId,
|
||||||
p.doctor_name AS doctorName,
|
p.doctor_name AS doctorName,
|
||||||
p.schedule_date AS scheduleDate,
|
p.schedule_date AS scheduleDate,
|
||||||
COALESCE(
|
<!-- 直接 COUNT 未预约的号源,前端已经做了时间过滤,这里只按日期统计 -->
|
||||||
SUM(
|
COUNT(
|
||||||
GREATEST(
|
CASE
|
||||||
COALESCE(p.total_quota, 0) - COALESCE(p.booked_num, 0) - COALESCE(p.locked_num, 0),
|
WHEN s.delete_flag = '0'
|
||||||
0
|
AND <include refid="slotStatusNormExpr" /> = 0
|
||||||
|
<!-- 使用前端传来的当前时间戳过滤过期号源,保证和前端完全一致 -->
|
||||||
|
AND (
|
||||||
|
p.schedule_date > CURRENT_DATE
|
||||||
|
OR (
|
||||||
|
p.schedule_date = CURRENT_DATE
|
||||||
|
AND CAST(p.schedule_date AS TIMESTAMP) + CAST(s.expect_time AS TIME) > TO_TIMESTAMP(#{query.currentTime}/1000)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
),
|
THEN s.id
|
||||||
0
|
ELSE NULL
|
||||||
|
END
|
||||||
) AS available,
|
) AS available,
|
||||||
COUNT(DISTINCT p.id) AS poolCount,
|
COUNT(DISTINCT p.id) AS poolCount,
|
||||||
CASE
|
CASE
|
||||||
@@ -380,10 +388,12 @@
|
|||||||
FROM
|
FROM
|
||||||
adm_schedule_pool p
|
adm_schedule_pool p
|
||||||
LEFT JOIN adm_doctor_schedule d ON p.schedule_id = d.id
|
LEFT JOIN adm_doctor_schedule d ON p.schedule_id = d.id
|
||||||
LEFT JOIN adm_organization org ON p.dept_id = org.id
|
LEFT JOIN adm_organization org ON p.dept_id = org.id AND org.delete_flag = '0'
|
||||||
AND org.delete_flag = '0'
|
LEFT JOIN adm_schedule_slot s ON s.pool_id = p.id AND s.delete_flag = '0'
|
||||||
<where>
|
<where>
|
||||||
p.delete_flag = '0'
|
p.delete_flag = '0'
|
||||||
|
<!-- 排除医生已停诊的号源 -->
|
||||||
|
AND (d.is_stopped IS NULL OR d.is_stopped = FALSE)
|
||||||
<!-- 过滤未来号源:只统计当前日期及未来日期的号源 -->
|
<!-- 过滤未来号源:只统计当前日期及未来日期的号源 -->
|
||||||
<if test="query.date != null and query.date != ''">
|
<if test="query.date != null and query.date != ''">
|
||||||
AND p.schedule_date = CAST(#{query.date} AS DATE)
|
AND p.schedule_date = CAST(#{query.date} AS DATE)
|
||||||
|
|||||||
@@ -697,15 +697,17 @@ export default {
|
|||||||
name: this.patientName?.trim() || null,
|
name: this.patientName?.trim() || null,
|
||||||
card: this.patientCard?.trim() || null,
|
card: this.patientCard?.trim() || null,
|
||||||
phone: this.patientPhone?.trim() || null,
|
phone: this.patientPhone?.trim() || null,
|
||||||
page,
|
page: 1,
|
||||||
limit: this.pageSize
|
limit: 1000 // 获取全量数据,前端过滤后再分页,避免过滤后分页错乱
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
buildDoctorQueryParams() {
|
buildDoctorQueryParams() {
|
||||||
return {
|
return {
|
||||||
date: this.selectedDate,
|
date: this.selectedDate,
|
||||||
type: this.selectedType === 'all' ? null : this.selectedType,
|
type: this.selectedType === 'all' ? null : this.selectedType,
|
||||||
department: this.selectedDepartment === 'all' ? null : this.selectedDepartment
|
department: this.selectedDepartment === 'all' ? null : this.selectedDepartment,
|
||||||
|
// 传递浏览器当前时间戳,后端用这个时间过滤过期号源,保证和前端过滤一致
|
||||||
|
currentTime: new Date().getTime()
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
handleTicketResponse(ticketResponse) {
|
handleTicketResponse(ticketResponse) {
|
||||||
@@ -746,15 +748,15 @@ export default {
|
|||||||
|
|
||||||
// 再进行状态过滤
|
// 再进行状态过滤
|
||||||
const filteredRecords = this.applyStatusFilter(timeFilteredRecords);
|
const filteredRecords = this.applyStatusFilter(timeFilteredRecords);
|
||||||
const total = Number(payload.total);
|
// 现在我们获取了全量数据,在前端过滤完成后再分页
|
||||||
this.tickets = [...filteredRecords];
|
// 这样保证过滤后分页正确,不会出现第一页空第二页有数据
|
||||||
this.allTickets = [...filteredRecords];
|
this.allTickets = [...filteredRecords];
|
||||||
// 当按状态筛选时,优先使用前端过滤后的数量,避免后端状态未生效导致"显示全部"
|
this.totalTickets = this.allTickets.length;
|
||||||
if (this.selectedStatus && this.selectedStatus !== 'all') {
|
|
||||||
this.totalTickets = this.tickets.length;
|
// 从过滤后的全量数据中取出当前页
|
||||||
} else {
|
const start = (this.currentPage - 1) * this.pageSize;
|
||||||
this.totalTickets = Number.isFinite(total) ? total : this.tickets.length;
|
const end = start + this.pageSize;
|
||||||
}
|
this.tickets = this.allTickets.slice(start, end);
|
||||||
},
|
},
|
||||||
applyStatusFilter(records = []) {
|
applyStatusFilter(records = []) {
|
||||||
if (!Array.isArray(records) || records.length === 0) {
|
if (!Array.isArray(records) || records.length === 0) {
|
||||||
@@ -791,7 +793,8 @@ export default {
|
|||||||
doctorList = data.data;
|
doctorList = data.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.doctors = doctorList
|
// 初始用后端返回的数据
|
||||||
|
let initialDoctors = doctorList
|
||||||
.map((doctor, index) => {
|
.map((doctor, index) => {
|
||||||
const id = doctor?.id ?? doctor?.doctorId ?? index;
|
const id = doctor?.id ?? doctor?.doctorId ?? index;
|
||||||
const available = Number(doctor?.available ?? doctor?.availableNum ?? doctor?.available_num ?? 0);
|
const available = Number(doctor?.available ?? doctor?.availableNum ?? doctor?.available_num ?? 0);
|
||||||
@@ -804,6 +807,8 @@ export default {
|
|||||||
})
|
})
|
||||||
.filter(doctor => !!doctor.name);
|
.filter(doctor => !!doctor.name);
|
||||||
|
|
||||||
|
this.doctors = initialDoctors;
|
||||||
|
|
||||||
if (this.selectedDoctorId && !this.doctors.some(d => d.id === this.selectedDoctorId)) {
|
if (this.selectedDoctorId && !this.doctors.some(d => d.id === this.selectedDoctorId)) {
|
||||||
this.selectedDoctorId = null;
|
this.selectedDoctorId = null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user