77 门诊挂号-》预约签到
This commit is contained in:
@@ -4,6 +4,41 @@
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.openhis.appointmentmanage.mapper.ScheduleSlotMapper">
|
||||
|
||||
<!-- 统一状态值(兼容数字/英文字符串存储),输出 Integer,避免 resultType 映射 NumberFormatException -->
|
||||
<sql id="slotStatusNormExpr">
|
||||
CASE
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('0', 'unbooked', 'available') THEN 0
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('1', 'booked') THEN 1
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('2', 'cancelled', 'canceled', 'stopped') THEN 2
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('3', 'locked') THEN 3
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('4', 'checked', 'checked_in', 'checkin') THEN 4
|
||||
WHEN LOWER(CONCAT('', s.status)) IN ('5', 'returned') THEN 5
|
||||
ELSE NULL
|
||||
END
|
||||
</sql>
|
||||
|
||||
<sql id="orderStatusNormExpr">
|
||||
CASE
|
||||
WHEN LOWER(CONCAT('', o.status)) IN ('1', 'booked') THEN 1
|
||||
WHEN LOWER(CONCAT('', o.status)) IN ('2', 'checked', 'checked_in', 'checkin') THEN 2
|
||||
WHEN LOWER(CONCAT('', o.status)) IN ('3', 'cancelled', 'canceled') THEN 3
|
||||
WHEN LOWER(CONCAT('', o.status)) IN ('4', 'returned') THEN 4
|
||||
ELSE NULL
|
||||
END
|
||||
</sql>
|
||||
|
||||
<sql id="poolStatusNormExpr">
|
||||
CASE
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('0', 'unbooked', 'available') THEN 0
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('1', 'booked') THEN 1
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('2', 'cancelled', 'canceled', 'stopped') THEN 2
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('3', 'locked') THEN 3
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('4', 'checked', 'checked_in', 'checkin') THEN 4
|
||||
WHEN LOWER(CONCAT('', p.status)) IN ('5', 'returned') THEN 5
|
||||
ELSE NULL
|
||||
END
|
||||
</sql>
|
||||
|
||||
<!-- 注意这里的 resultType 指向了您刚建好的 DTO 实体类 -->
|
||||
<select id="selectAllTicketSlots" resultType="com.openhis.appointmentmanage.domain.TicketSlotDTO">
|
||||
SELECT
|
||||
@@ -16,12 +51,12 @@
|
||||
o.patient_name AS patientName,
|
||||
o.medical_card AS medicalCard,
|
||||
o.phone AS phone,
|
||||
o.status AS orderStatus,
|
||||
s.status AS slotStatus,
|
||||
<include refid="orderStatusNormExpr" /> AS orderStatus,
|
||||
<include refid="slotStatusNormExpr" /> AS slotStatus,
|
||||
s.expect_time AS expectTime,
|
||||
p.schedule_date AS scheduleDate,
|
||||
d.reg_type AS regType,
|
||||
p.status AS poolStatus,
|
||||
<include refid="poolStatusNormExpr" /> AS poolStatus,
|
||||
p.stop_reason AS stopReason,
|
||||
d.is_stopped AS isStopped
|
||||
FROM
|
||||
@@ -39,7 +74,7 @@
|
||||
FROM
|
||||
order_main
|
||||
WHERE
|
||||
status IN (1, 2)
|
||||
LOWER(CONCAT('', status)) IN ('1', '2', '4', 'booked', 'checked', 'checked_in', 'checkin', 'returned')
|
||||
ORDER BY
|
||||
slot_id,
|
||||
create_time DESC
|
||||
@@ -66,12 +101,18 @@
|
||||
o.patient_name AS patientName,
|
||||
o.medical_card AS medicalCard,
|
||||
o.phone AS phone,
|
||||
o.status AS orderStatus,
|
||||
s.status AS slotStatus,
|
||||
o.id AS orderId,
|
||||
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_card AS idCard,
|
||||
o.appointment_time AS appointmentTime,
|
||||
<include refid="orderStatusNormExpr" /> AS orderStatus,
|
||||
<include refid="slotStatusNormExpr" /> AS slotStatus,
|
||||
s.expect_time AS expectTime,
|
||||
p.schedule_date AS scheduleDate,
|
||||
d.reg_type AS regType,
|
||||
p.status AS poolStatus,
|
||||
<include refid="poolStatusNormExpr" /> AS poolStatus,
|
||||
p.stop_reason AS stopReason,
|
||||
d.is_stopped AS isStopped
|
||||
FROM
|
||||
@@ -87,15 +128,20 @@
|
||||
patient_name,
|
||||
medical_card,
|
||||
phone,
|
||||
id,
|
||||
order_no,
|
||||
gender,
|
||||
appointment_time,
|
||||
status
|
||||
FROM
|
||||
order_main
|
||||
WHERE
|
||||
status IN (1, 2)
|
||||
LOWER(CONCAT('', status)) IN ('1', '2', '4', 'booked', 'checked', 'checked_in', 'checkin', 'returned')
|
||||
ORDER BY
|
||||
slot_id,
|
||||
create_time DESC
|
||||
) o ON o.slot_id = s.id
|
||||
LEFT JOIN adm_patient pinfo ON o.patient_id = pinfo.id
|
||||
WHERE
|
||||
s.id = #{id}
|
||||
</select>
|
||||
@@ -115,7 +161,7 @@
|
||||
UPDATE adm_schedule_slot
|
||||
SET
|
||||
status = #{status},
|
||||
<if test="status == 0">
|
||||
<if test="status != null and '0'.equals(status.toString())">
|
||||
order_id = NULL,
|
||||
</if>
|
||||
update_time = now()
|
||||
@@ -124,11 +170,25 @@
|
||||
AND delete_flag = '0'
|
||||
</update>
|
||||
|
||||
<update id="updateSlotStatusAndCheckInTime">
|
||||
UPDATE adm_schedule_slot
|
||||
SET
|
||||
status = #{status},
|
||||
check_in_time = #{checkInTime},
|
||||
update_time = NOW()
|
||||
WHERE
|
||||
id = #{slotId}
|
||||
AND delete_flag = '0'
|
||||
</update>
|
||||
|
||||
<select id="selectPoolIdBySlotId" resultType="java.lang.Long">
|
||||
SELECT pool_id
|
||||
FROM adm_schedule_slot
|
||||
WHERE id = #{slotId}
|
||||
AND delete_flag = '0'
|
||||
SELECT
|
||||
pool_id
|
||||
FROM
|
||||
adm_schedule_slot
|
||||
WHERE
|
||||
id = #{slotId}
|
||||
AND delete_flag = '0'
|
||||
</select>
|
||||
|
||||
<update id="bindOrderToSlot">
|
||||
@@ -155,12 +215,18 @@
|
||||
o.patient_name AS patientName,
|
||||
o.medical_card AS medicalCard,
|
||||
o.phone AS phone,
|
||||
o.status AS orderStatus,
|
||||
s.status AS slotStatus,
|
||||
o.id AS orderId,
|
||||
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_card AS idCard,
|
||||
o.appointment_time AS appointmentTime,
|
||||
<include refid="orderStatusNormExpr" /> AS orderStatus,
|
||||
<include refid="slotStatusNormExpr" /> AS slotStatus,
|
||||
s.expect_time AS expectTime,
|
||||
p.schedule_date AS scheduleDate,
|
||||
d.reg_type AS regType,
|
||||
p.status AS poolStatus,
|
||||
<include refid="poolStatusNormExpr" /> AS poolStatus,
|
||||
p.stop_reason AS stopReason,
|
||||
d.is_stopped AS isStopped
|
||||
FROM
|
||||
@@ -176,15 +242,20 @@
|
||||
patient_name,
|
||||
medical_card,
|
||||
phone,
|
||||
id,
|
||||
order_no,
|
||||
gender,
|
||||
appointment_time,
|
||||
status
|
||||
FROM
|
||||
order_main
|
||||
WHERE
|
||||
status IN (1, 2)
|
||||
LOWER(CONCAT('', status)) IN ('1', '2', '4', 'booked', 'checked', 'checked_in', 'checkin', 'returned')
|
||||
ORDER BY
|
||||
slot_id,
|
||||
create_time DESC
|
||||
) o ON o.slot_id = s.id
|
||||
LEFT JOIN adm_patient pinfo ON o.patient_id = pinfo.id
|
||||
<where>
|
||||
p.delete_flag = '0'
|
||||
AND s.delete_flag = '0' <!-- 1. 按日期查 -->
|
||||
@@ -225,35 +296,49 @@
|
||||
<!-- 5. 核心:解答您疑问的 4 种业务状态的复合查询! -->
|
||||
<if test="query.status != null and query.status != '' and query.status != 'all'">
|
||||
<choose>
|
||||
<when test="query.status == 'unbooked'">
|
||||
AND s.status = 0
|
||||
<when test="'unbooked'.equals(query.status) or '未预约'.equals(query.status)">
|
||||
AND <include refid="slotStatusNormExpr" /> = 0
|
||||
AND (
|
||||
d.is_stopped IS NULL
|
||||
OR d.is_stopped = FALSE
|
||||
)
|
||||
</when>
|
||||
<when test="query.status == 'booked'">
|
||||
AND s.status = 1
|
||||
AND o.status = 1
|
||||
<when test="'booked'.equals(query.status) or '已预约'.equals(query.status)">
|
||||
AND <include refid="slotStatusNormExpr" /> = 1
|
||||
AND <include refid="orderStatusNormExpr" /> = 1
|
||||
AND (
|
||||
d.is_stopped IS NULL
|
||||
OR d.is_stopped = FALSE
|
||||
)
|
||||
</when>
|
||||
<when test="query.status == 'checked'">
|
||||
AND s.status = 1
|
||||
AND o.status = 2
|
||||
<when test="'checked'.equals(query.status) or '已取号'.equals(query.status)">
|
||||
AND (
|
||||
<include refid="slotStatusNormExpr" /> = 4
|
||||
OR (
|
||||
<include refid="slotStatusNormExpr" /> = 1
|
||||
AND <include refid="orderStatusNormExpr" /> = 2
|
||||
)
|
||||
)
|
||||
AND (
|
||||
d.is_stopped IS NULL
|
||||
OR d.is_stopped = FALSE
|
||||
)
|
||||
</when>
|
||||
<when test="query.status == 'cancelled'">
|
||||
<when test="'cancelled'.equals(query.status) or '已停诊'.equals(query.status) or '已取消'.equals(query.status)">
|
||||
AND (
|
||||
s.status = 2
|
||||
<include refid="slotStatusNormExpr" /> = 2
|
||||
OR d.is_stopped = TRUE
|
||||
)
|
||||
</when>
|
||||
<when test="'returned'.equals(query.status) or '已退号'.equals(query.status)">
|
||||
AND (
|
||||
<include refid="slotStatusNormExpr" /> = 5
|
||||
OR <include refid="orderStatusNormExpr" /> = 4
|
||||
)
|
||||
</when>
|
||||
<otherwise>
|
||||
AND 1 = 2
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
</where>
|
||||
@@ -266,9 +351,22 @@
|
||||
SELECT
|
||||
p.doctor_id AS doctorId,
|
||||
p.doctor_name AS doctorName,
|
||||
COALESCE(SUM(GREATEST(COALESCE(p.total_quota, 0) - COALESCE(p.booked_num, 0) - COALESCE(p.locked_num, 0), 0)), 0) AS available,
|
||||
COALESCE(
|
||||
SUM(
|
||||
GREATEST(
|
||||
COALESCE(p.total_quota, 0) - COALESCE(p.booked_num, 0) - COALESCE(p.locked_num, 0),
|
||||
0
|
||||
)
|
||||
),
|
||||
0
|
||||
) AS available,
|
||||
CASE
|
||||
WHEN MAX(CASE WHEN d.reg_type = 1 THEN 1 ELSE 0 END) = 1 THEN 'expert'
|
||||
WHEN MAX(
|
||||
CASE
|
||||
WHEN d.reg_type = 1 THEN 1
|
||||
ELSE 0
|
||||
END
|
||||
) = 1 THEN 'expert'
|
||||
ELSE 'general'
|
||||
END AS ticketType
|
||||
FROM
|
||||
@@ -290,7 +388,10 @@
|
||||
AND d.reg_type = 1
|
||||
</when>
|
||||
<when test="query.type == 'general'">
|
||||
AND (d.reg_type != 1 OR d.reg_type IS NULL)
|
||||
AND (
|
||||
d.reg_type != 1
|
||||
OR d.reg_type IS NULL
|
||||
)
|
||||
</when>
|
||||
</choose>
|
||||
</if>
|
||||
|
||||
Reference in New Issue
Block a user