挂号补单功能的完善
This commit is contained in:
104
check_display_order.sql
Normal file
104
check_display_order.sql
Normal file
@@ -0,0 +1,104 @@
|
||||
-- 检查流水号(display_order)是否按“科室+医生+当天”正确递增
|
||||
--
|
||||
-- 说明:
|
||||
-- 1. display_order 存的是纯数字(1, 2, 3...),不带时间戳前缀
|
||||
-- 2. 时间戳前缀(如 20260109)是在前端显示时加上的
|
||||
-- 3. 后端用 Redis key "ORG-{科室ID}-DOC-{医生ID}" 按天自增
|
||||
--
|
||||
-- 如何判断逻辑是否正确:
|
||||
-- 同一科室、同一医生、同一天的记录,display_order 应该递增(1, 2, 3...)
|
||||
-- 不同科室、不同医生、不同天的记录,可能都是 1(这是正常的)
|
||||
|
||||
-- ========================================
|
||||
-- 查询1:按“科室+医生+日期”分组,看每组内的 display_order 是否递增
|
||||
-- ========================================
|
||||
SELECT
|
||||
DATE(start_time) AS 日期,
|
||||
organization_id AS 科室ID,
|
||||
registrar_id AS 医生ID,
|
||||
COUNT(*) AS 该组记录数,
|
||||
MIN(display_order) AS 最小序号,
|
||||
MAX(display_order) AS 最大序号,
|
||||
STRING_AGG(display_order::text, ', ' ORDER BY start_time) AS 序号列表,
|
||||
STRING_AGG(id::text, ', ' ORDER BY start_time) AS 记录ID列表
|
||||
FROM adm_encounter
|
||||
WHERE delete_flag = '0'
|
||||
AND start_time >= CURRENT_DATE - INTERVAL '7 days' -- 只看最近7天
|
||||
AND display_order IS NOT NULL
|
||||
GROUP BY DATE(start_time), organization_id, registrar_id
|
||||
ORDER BY 日期 DESC, 科室ID, 医生ID;
|
||||
|
||||
-- ========================================
|
||||
-- 查询2:详细查看每条记录,看同组内的序号是否连续
|
||||
-- ========================================
|
||||
SELECT
|
||||
id AS 记录ID,
|
||||
DATE(start_time) AS 日期,
|
||||
organization_id AS 科室ID,
|
||||
registrar_id AS 医生ID,
|
||||
start_time AS 挂号时间,
|
||||
display_order AS 流水号,
|
||||
-- 计算:同组内的序号应该是 1, 2, 3...,看是否有重复或跳号
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY DATE(start_time), organization_id, registrar_id
|
||||
ORDER BY start_time
|
||||
) AS 应该是第几个,
|
||||
CASE
|
||||
WHEN display_order = ROW_NUMBER() OVER (
|
||||
PARTITION BY DATE(start_time), organization_id, registrar_id
|
||||
ORDER BY start_time
|
||||
) THEN '✓ 正常'
|
||||
ELSE '✗ 异常'
|
||||
END AS 是否正常
|
||||
FROM adm_encounter
|
||||
WHERE delete_flag = '0'
|
||||
AND start_time >= CURRENT_DATE - INTERVAL '7 days'
|
||||
AND display_order IS NOT NULL
|
||||
ORDER BY DATE(start_time) DESC, organization_id, registrar_id, start_time;
|
||||
|
||||
-- ========================================
|
||||
-- 查询3:只看今天的数据(最直观)
|
||||
-- ========================================
|
||||
SELECT
|
||||
id AS 记录ID,
|
||||
organization_id AS 科室ID,
|
||||
registrar_id AS 医生ID,
|
||||
start_time AS 挂号时间,
|
||||
display_order AS 流水号
|
||||
FROM adm_encounter
|
||||
WHERE delete_flag = '0'
|
||||
AND DATE(start_time) = CURRENT_DATE
|
||||
AND display_order IS NOT NULL
|
||||
ORDER BY organization_id, registrar_id, start_time;
|
||||
|
||||
-- ========================================
|
||||
-- 查询4:发现问题 - 找出同组内 display_order 重复的记录
|
||||
-- ========================================
|
||||
WITH ranked AS (
|
||||
SELECT
|
||||
id,
|
||||
DATE(start_time) AS reg_date,
|
||||
organization_id,
|
||||
registrar_id,
|
||||
start_time,
|
||||
display_order,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY DATE(start_time), organization_id, registrar_id
|
||||
ORDER BY start_time
|
||||
) AS should_be_order
|
||||
FROM adm_encounter
|
||||
WHERE delete_flag = '0'
|
||||
AND start_time >= CURRENT_DATE - INTERVAL '7 days'
|
||||
AND display_order IS NOT NULL
|
||||
)
|
||||
SELECT
|
||||
reg_date AS 日期,
|
||||
organization_id AS 科室ID,
|
||||
registrar_id AS 医生ID,
|
||||
COUNT(*) AS 重复数量,
|
||||
STRING_AGG(id::text || '->' || display_order::text, ', ') AS 问题记录
|
||||
FROM ranked
|
||||
WHERE display_order != should_be_order
|
||||
GROUP BY reg_date, organization_id, registrar_id
|
||||
ORDER BY reg_date DESC;
|
||||
|
||||
@@ -141,4 +141,9 @@ public class CurrentDayEncounterDto {
|
||||
*/
|
||||
private String identifierNo;
|
||||
|
||||
/**
|
||||
* 流水号(就诊当日序号)
|
||||
*/
|
||||
private Integer displayOrder;
|
||||
|
||||
}
|
||||
|
||||
@@ -69,12 +69,3 @@ public class ReprintRegistrationDto {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1818,6 +1818,10 @@ public class PaymentRecServiceImpl implements IPaymentRecService {
|
||||
// 保存就诊信息
|
||||
Encounter encounter = new Encounter();
|
||||
BeanUtils.copyProperties(encounterFormData, encounter);
|
||||
// 将挂号医生ID提前塞入 encounter 的 registrarId,便于生成“科室+医生+当日”序号
|
||||
if (encounterParticipantFormData.getPractitionerId() != null) {
|
||||
encounter.setRegistrarId(encounterParticipantFormData.getPractitionerId());
|
||||
}
|
||||
encounter.setBusNo(outpatientRegistrationSettleParam.getBusNo());
|
||||
// 就诊ID
|
||||
Long encounterId = iEncounterService.saveEncounterByRegister(encounter);
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
<select id="getCurrentDayEncounter" resultType="com.openhis.web.chargemanage.dto.CurrentDayEncounterDto">
|
||||
SELECT T9.tenant_id AS tenantId,
|
||||
T9.encounter_id AS encounterId,
|
||||
T9.display_order AS displayOrder,
|
||||
T9.organization_id AS organizationId,
|
||||
T9.organization_name AS organizationName,
|
||||
T9.healthcare_name AS healthcareName,
|
||||
@@ -70,6 +71,7 @@
|
||||
from (
|
||||
SELECT T1.tenant_id AS tenant_id,
|
||||
T1.id AS encounter_id,
|
||||
T1.display_order AS display_order,
|
||||
T1.organization_id AS organization_id,
|
||||
T2.NAME AS organization_name,
|
||||
T3.NAME AS healthcare_name,
|
||||
|
||||
@@ -44,8 +44,16 @@ public class EncounterServiceImpl extends ServiceImpl<EncounterMapper, Encounter
|
||||
// 生成就诊编码 医保挂号时是先生成码后生成实体
|
||||
encounter.setBusNo(assignSeqUtil.getSeqByDay(AssignSeqEnum.ENCOUNTER_NUM.getPrefix(), 4));
|
||||
}
|
||||
// 生成就诊序号 (患者ID + 科室ID 作为当日就诊号的唯一标识)
|
||||
String preFix = encounter.getPatientId() + String.valueOf(encounter.getOrganizationId());
|
||||
// 生成就诊序号:
|
||||
// 1) 若挂号医生已传入(registrarId 充当挂号医生 ID),按“科室+医生+当日”递增
|
||||
// Key 示例:ORG-123-DOC-456 -> 1、2、3...
|
||||
// 2) 否则按“科室+当日”递增
|
||||
String preFix;
|
||||
if (encounter.getRegistrarId() != null) {
|
||||
preFix = "ORG-" + encounter.getOrganizationId() + "-DOC-" + encounter.getRegistrarId();
|
||||
} else {
|
||||
preFix = "ORG-" + encounter.getOrganizationId();
|
||||
}
|
||||
encounter.setDisplayOrder(assignSeqUtil.getSeqNoByDay(preFix));
|
||||
// 患者ID
|
||||
Long patientId = encounter.getPatientId();
|
||||
|
||||
@@ -151,10 +151,6 @@
|
||||
<span class="label">患者姓名:</span>
|
||||
<span class="value">{{ form.name || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="label">门诊号:</span>
|
||||
<span class="value">{{ form.serialNo || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="label">就诊卡号:</span>
|
||||
<span class="value">{{ form.cardNo || '-' }}</span>
|
||||
@@ -233,6 +229,12 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 流水号显示在左下角 -->
|
||||
<div class="serial-number-bottom-left">
|
||||
<span class="serial-label">流水号:</span>
|
||||
<span class="serial-value">{{ form.serialNo || '-' }}</span>
|
||||
</div>
|
||||
|
||||
<div class="print-footer">
|
||||
<div class="reminder">温馨提示: 请妥善保管此凭条,就诊时请携带。</div>
|
||||
</div>
|
||||
@@ -545,29 +547,47 @@ function formatDateTime(date) {
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
}
|
||||
|
||||
// 计算流水号(与 fillForm 中的逻辑一致)
|
||||
// 计算流水号:格式为 YYYYMMDD-XXX,其中 XXX 为后端按"科室+医生+当日"自增的 displayOrder
|
||||
// 确保同一科室同一医生同一天内是 001、002、003... 递增
|
||||
function calculateSerialNo(row) {
|
||||
if (!row) {
|
||||
return '-';
|
||||
}
|
||||
|
||||
// 优先使用已有的 serialNo(如果存在)
|
||||
if (row.serialNo) {
|
||||
return row.serialNo;
|
||||
// 获取挂号日期(YYYYMMDD格式)
|
||||
let dateStr = '';
|
||||
if (row.registerTime) {
|
||||
const date = new Date(row.registerTime);
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
dateStr = `${year}${month}${day}`;
|
||||
} else {
|
||||
// 如果没有挂号时间,使用当前日期
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = String(now.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(now.getDate()).padStart(2, '0');
|
||||
dateStr = `${year}${month}${day}`;
|
||||
}
|
||||
|
||||
// 使用 encounterId 的后3位计算流水号
|
||||
if (row.encounterId) {
|
||||
const idStr = String(row.encounterId);
|
||||
const lastThree = idStr.slice(-3);
|
||||
const num = parseInt(lastThree) || 0;
|
||||
return String((num % 999) + 1).padStart(3, '0');
|
||||
// 获取序号部分(3位数字,001-999)
|
||||
// 直接使用后端返回的 displayOrder,自增逻辑在后端按"科室+医生+当日"保证
|
||||
let serialNum = 1;
|
||||
if (row.displayOrder != null && row.displayOrder !== undefined) {
|
||||
const num = Number(row.displayOrder) || 0;
|
||||
serialNum = num > 0 ? num : 1;
|
||||
} else if (row.serialNo) {
|
||||
// 兼容旧数据:如果有已有的 serialNo 字段
|
||||
const num = Number(row.serialNo) || 0;
|
||||
serialNum = num > 0 ? num : 1;
|
||||
} else {
|
||||
// 兜底:没有任何序号信息时,给 1
|
||||
serialNum = 1;
|
||||
}
|
||||
|
||||
// 如果 encounterId 为空,生成一个001-999的序列号
|
||||
const timestamp = Date.now();
|
||||
const serial = (timestamp % 999) + 1;
|
||||
return String(serial).padStart(3, '0');
|
||||
// 格式:YYYYMMDD-XXX(例如:20250113-001)
|
||||
return `${dateStr}-${String(serialNum).padStart(3, '0')}`;
|
||||
}
|
||||
|
||||
// 提交补打挂号
|
||||
@@ -835,6 +855,26 @@ function handleBrowserPrint() {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
.serial-number-bottom-left {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
left: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.serial-number-bottom-left .serial-label {
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.serial-number-bottom-left .serial-value {
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
.print-content {
|
||||
position: relative;
|
||||
min-height: 500px;
|
||||
padding-bottom: 60px;
|
||||
}
|
||||
.print-footer {
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
@@ -1052,6 +1092,31 @@ async function handleConfirmSelect() {
|
||||
color: red;
|
||||
}
|
||||
|
||||
/* 流水号显示在左下角,加粗 */
|
||||
.serial-number-bottom-left {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
left: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.serial-number-bottom-left .serial-label {
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.serial-number-bottom-left .serial-value {
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.print-content {
|
||||
position: relative;
|
||||
min-height: 500px;
|
||||
padding-bottom: 60px; /* 为左下角流水号留出空间 */
|
||||
}
|
||||
|
||||
.print-footer {
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
|
||||
212
query_patient_by_serial_no.sql
Normal file
212
query_patient_by_serial_no.sql
Normal file
@@ -0,0 +1,212 @@
|
||||
-- 根据流水号查询病人信息
|
||||
--
|
||||
-- 流水号格式:YYYYMMDD-XXX(例如:20260109-001)
|
||||
-- - 前面8位是日期(YYYYMMDD)
|
||||
-- - 后面3位是序号(XXX),对应数据库的 display_order
|
||||
--
|
||||
-- 说明:
|
||||
-- display_order 是按"科室+医生+当天"自增的,所以同一天不同科室/不同医生可能有相同的序号
|
||||
-- 如果只知道序号(如 001),建议配合科室、医生、日期范围一起查询
|
||||
|
||||
-- ========================================
|
||||
-- 方案1:知道完整流水号(如:20260109-001)
|
||||
-- ========================================
|
||||
-- 参数说明:
|
||||
-- :serial_no = '20260109-001' -- 完整流水号
|
||||
--
|
||||
-- 解析逻辑:
|
||||
-- 日期:20260109 -> 2026-01-09
|
||||
-- 序号:001 -> 1
|
||||
|
||||
WITH parsed AS (
|
||||
SELECT
|
||||
-- 提取日期部分(前8位)并转换为日期格式
|
||||
TO_DATE(SUBSTRING(:serial_no FROM 1 FOR 8), 'YYYYMMDD') AS target_date,
|
||||
-- 提取序号部分(最后3位)并转换为整数
|
||||
CAST(SUBSTRING(:serial_no FROM 10) AS INTEGER) AS target_order
|
||||
)
|
||||
SELECT
|
||||
e.id AS 就诊ID,
|
||||
e.bus_no AS 就诊编码,
|
||||
DATE(e.start_time) AS 挂号日期,
|
||||
e.start_time AS 挂号时间,
|
||||
e.organization_id AS 科室ID,
|
||||
e.registrar_id AS 医生ID,
|
||||
e.display_order AS 流水号序号,
|
||||
-- 计算完整流水号(用于验证)
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0') AS 完整流水号,
|
||||
p.id AS 患者ID,
|
||||
p.name AS 患者姓名,
|
||||
p.bus_no AS 患者业务号,
|
||||
p.gender AS 性别,
|
||||
p.birth_date AS 出生日期,
|
||||
p.phone AS 电话,
|
||||
e.status_enum AS 状态
|
||||
FROM adm_encounter e
|
||||
INNER JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
|
||||
CROSS JOIN parsed
|
||||
WHERE e.delete_flag = '0'
|
||||
AND DATE(e.start_time) = parsed.target_date
|
||||
AND e.display_order = parsed.target_order
|
||||
ORDER BY e.start_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- ========================================
|
||||
-- 方案2:只知道序号(如:001),配合其他条件查询
|
||||
-- ========================================
|
||||
-- 参数说明:
|
||||
-- :order_no = '001' -- 序号(不带日期)
|
||||
-- :start_date = '2026-01-01' -- 开始日期(可选,缩小范围)
|
||||
-- :end_date = '2026-01-31' -- 结束日期(可选,缩小范围)
|
||||
-- :organization_id = 123 -- 科室ID(可选,精确匹配)
|
||||
-- :registrar_id = 456 -- 医生ID(可选,精确匹配)
|
||||
-- :patient_name = '张三' -- 患者姓名(可选,模糊匹配)
|
||||
|
||||
SELECT
|
||||
e.id AS 就诊ID,
|
||||
e.bus_no AS 就诊编码,
|
||||
DATE(e.start_time) AS 挂号日期,
|
||||
e.start_time AS 挂号时间,
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0') AS 完整流水号,
|
||||
e.organization_id AS 科室ID,
|
||||
e.registrar_id AS 医生ID,
|
||||
e.display_order AS 流水号序号,
|
||||
p.id AS 患者ID,
|
||||
p.name AS 患者姓名,
|
||||
p.bus_no AS 患者业务号,
|
||||
p.phone AS 电话,
|
||||
e.status_enum AS 状态
|
||||
FROM adm_encounter e
|
||||
INNER JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
|
||||
WHERE e.delete_flag = '0'
|
||||
AND e.display_order = CAST(:order_no AS INTEGER) -- 序号匹配
|
||||
-- 以下条件可选,去掉注释并根据需要填入值
|
||||
-- AND DATE(e.start_time) >= CAST(:start_date AS DATE) -- 日期范围:开始
|
||||
-- AND DATE(e.start_time) <= CAST(:end_date AS DATE) -- 日期范围:结束
|
||||
-- AND e.organization_id = CAST(:organization_id AS BIGINT) -- 科室匹配
|
||||
-- AND e.registrar_id = CAST(:registrar_id AS BIGINT) -- 医生匹配
|
||||
-- AND p.name LIKE '%' || :patient_name || '%' -- 患者姓名模糊匹配
|
||||
ORDER BY e.start_time DESC
|
||||
LIMIT 50;
|
||||
|
||||
-- ========================================
|
||||
-- 方案3:按患者姓名 + 大概日期范围查询(最常用)
|
||||
-- ========================================
|
||||
-- 参数说明:
|
||||
-- :patient_name = '张三' -- 患者姓名(模糊匹配)
|
||||
-- :start_date = '2026-01-01' -- 开始日期
|
||||
-- :end_date = '2026-01-31' -- 结束日期
|
||||
|
||||
SELECT
|
||||
e.id AS 就诊ID,
|
||||
e.bus_no AS 就诊编码,
|
||||
DATE(e.start_time) AS 挂号日期,
|
||||
e.start_time AS 挂号时间,
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0') AS 完整流水号,
|
||||
e.organization_id AS 科室ID,
|
||||
e.registrar_id AS 医生ID,
|
||||
e.display_order AS 流水号序号,
|
||||
p.id AS 患者ID,
|
||||
p.name AS 患者姓名,
|
||||
p.bus_no AS 患者业务号,
|
||||
p.phone AS 电话,
|
||||
e.status_enum AS 状态
|
||||
FROM adm_encounter e
|
||||
INNER JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
|
||||
WHERE e.delete_flag = '0'
|
||||
AND p.name LIKE '%' || :patient_name || '%'
|
||||
AND DATE(e.start_time) >= CAST(:start_date AS DATE)
|
||||
AND DATE(e.start_time) <= CAST(:end_date AS DATE)
|
||||
ORDER BY e.start_time DESC;
|
||||
|
||||
-- ========================================
|
||||
-- 方案4:按就诊卡号查询(最准确)
|
||||
-- ========================================
|
||||
-- 参数说明:
|
||||
-- :card_no = '12345678' -- 就诊卡号
|
||||
|
||||
SELECT
|
||||
e.id AS 就诊ID,
|
||||
e.bus_no AS 就诊编码,
|
||||
DATE(e.start_time) AS 挂号日期,
|
||||
e.start_time AS 挂号时间,
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0') AS 完整流水号,
|
||||
e.organization_id AS 科室ID,
|
||||
e.registrar_id AS 医生ID,
|
||||
e.display_order AS 流水号序号,
|
||||
p.id AS 患者ID,
|
||||
p.name AS 患者姓名,
|
||||
p.bus_no AS 患者业务号,
|
||||
COALESCE(
|
||||
(SELECT identifier_no
|
||||
FROM adm_patient_identifier
|
||||
WHERE patient_id = p.id
|
||||
AND delete_flag = '0'
|
||||
AND identifier_no IS NOT NULL
|
||||
AND identifier_no != ''
|
||||
ORDER BY create_time ASC
|
||||
LIMIT 1),
|
||||
p.bus_no,
|
||||
''
|
||||
) AS 就诊卡号,
|
||||
p.phone AS 电话,
|
||||
e.status_enum AS 状态
|
||||
FROM adm_encounter e
|
||||
INNER JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
|
||||
WHERE e.delete_flag = '0'
|
||||
AND (
|
||||
-- 优先匹配 identifier_no
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM adm_patient_identifier api
|
||||
WHERE api.patient_id = p.id
|
||||
AND api.delete_flag = '0'
|
||||
AND api.identifier_no = :card_no
|
||||
)
|
||||
OR
|
||||
-- 备用:匹配 patient.bus_no
|
||||
p.bus_no = :card_no
|
||||
)
|
||||
ORDER BY e.start_time DESC
|
||||
LIMIT 20;
|
||||
|
||||
-- ========================================
|
||||
-- 方案5:模糊查询流水号(部分匹配)
|
||||
-- ========================================
|
||||
-- 参数说明:
|
||||
-- :serial_part = '20260109' -- 只输入日期部分
|
||||
-- 或
|
||||
-- :serial_part = '001' -- 只输入序号部分
|
||||
-- 或
|
||||
-- :serial_part = '20260109-00' -- 输入部分(前缀匹配)
|
||||
|
||||
SELECT
|
||||
e.id AS 就诊ID,
|
||||
e.bus_no AS 就诊编码,
|
||||
DATE(e.start_time) AS 挂号日期,
|
||||
e.start_time AS 挂号时间,
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0') AS 完整流水号,
|
||||
e.organization_id AS 科室ID,
|
||||
e.registrar_id AS 医生ID,
|
||||
e.display_order AS 流水号序号,
|
||||
p.id AS 患者ID,
|
||||
p.name AS 患者姓名,
|
||||
p.bus_no AS 患者业务号,
|
||||
p.phone AS 电话,
|
||||
e.status_enum AS 状态
|
||||
FROM adm_encounter e
|
||||
INNER JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
|
||||
WHERE e.delete_flag = '0'
|
||||
AND (
|
||||
-- 匹配日期部分(如输入:20260109)
|
||||
TO_CHAR(e.start_time, 'YYYYMMDD') LIKE :serial_part || '%'
|
||||
OR
|
||||
-- 匹配序号部分(如输入:001)
|
||||
LPAD(e.display_order::text, 3, '0') LIKE '%' || :serial_part || '%'
|
||||
OR
|
||||
-- 匹配完整流水号前缀(如输入:20260109-00)
|
||||
(TO_CHAR(e.start_time, 'YYYYMMDD') || '-' || LPAD(e.display_order::text, 3, '0')) LIKE :serial_part || '%'
|
||||
)
|
||||
ORDER BY e.start_time DESC
|
||||
LIMIT 50;
|
||||
|
||||
Reference in New Issue
Block a user