Revert "Fix Bug #550: AI修复"

This reverts commit 16c42ca108.
This commit is contained in:
2026-05-27 08:59:07 +08:00
parent bd14563691
commit 9db5ced4e3
5432 changed files with 778638 additions and 171 deletions

View File

@@ -0,0 +1,45 @@
-- 智能分诊排队:候选池排除记录表
-- 用途:记录已从智能候选池中移除的患者(加入队列后不再出现在候选池)
-- 注意:必须在后端实际连接的 schema 中执行dev环境是 hisdevtest环境是 histestprd环境是 hisprd
-- 执行前请先确认SET search_path TO hisdev; (或对应的 schema
CREATE TABLE IF NOT EXISTS hisdev.triage_candidate_exclusion (
id BIGSERIAL PRIMARY KEY,
tenant_id INTEGER NOT NULL,
exclusion_date DATE NOT NULL,
encounter_id BIGINT NOT NULL,
patient_id BIGINT,
patient_name VARCHAR(255),
organization_id BIGINT,
organization_name VARCHAR(255),
reason VARCHAR(100) DEFAULT 'ADDED_TO_QUEUE', -- 排除原因ADDED_TO_QUEUE加入队列、MANUAL_REMOVE手动移除
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
delete_flag CHAR(1) NOT NULL DEFAULT '0'
);
-- 常用查询索引:按租户/日期/就诊记录查询
CREATE INDEX IF NOT EXISTS idx_triage_candidate_exclusion_list
ON hisdev.triage_candidate_exclusion (tenant_id, exclusion_date, delete_flag, encounter_id);
-- 防重复:同一天同租户同就诊记录只能有一条排除记录(未删除)
CREATE UNIQUE INDEX IF NOT EXISTS uq_triage_candidate_exclusion_encounter
ON hisdev.triage_candidate_exclusion (tenant_id, exclusion_date, encounter_id, delete_flag)
WHERE delete_flag = '0';
-- 就诊记录ID索引用于关联查询
CREATE INDEX IF NOT EXISTS idx_triage_candidate_exclusion_encounter_id
ON hisdev.triage_candidate_exclusion (encounter_id);
-- 注释
COMMENT ON TABLE hisdev.triage_candidate_exclusion IS '智能分诊排队候选池排除记录表';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.tenant_id IS '租户ID';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.exclusion_date IS '排除日期(通常为当天)';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.encounter_id IS '就诊记录ID唯一标识';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.patient_id IS '患者ID';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.patient_name IS '患者姓名';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.organization_id IS '科室ID';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.organization_name IS '科室名称';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.reason IS '排除原因ADDED_TO_QUEUE加入队列、MANUAL_REMOVE手动移除';
COMMENT ON COLUMN hisdev.triage_candidate_exclusion.delete_flag IS '删除标志0-未删除1-已删除';

View File

@@ -0,0 +1,35 @@
-- 智能分诊排队:队列持久化表(与 TriageQueueItem.java 字段一致)
-- 注意:必须在后端实际连接的 schema 中执行dev环境是 hisdevtest环境是 histestprd环境是 hisprd
-- 执行前请先确认SET search_path TO hisdev; (或对应的 schema
CREATE TABLE IF NOT EXISTS triage_queue_item (
id BIGSERIAL PRIMARY KEY,
tenant_id INTEGER NOT NULL,
queue_date DATE NOT NULL,
organization_id BIGINT NOT NULL,
organization_name VARCHAR(255),
encounter_id BIGINT NOT NULL,
patient_id BIGINT,
patient_name VARCHAR(255),
healthcare_name VARCHAR(255),
practitioner_name VARCHAR(255),
status INTEGER NOT NULL DEFAULT 0, -- 分诊队列状态: 0=WAITING(等待), 10=CALLING(叫号中), 20=IN_CLINIC(诊中), 30=COMPLETED(已完成), 40=SKIPPED(已跳过)
queue_order INTEGER NOT NULL,
create_time TIMESTAMP,
update_time TIMESTAMP,
delete_flag CHAR(1) NOT NULL DEFAULT '0'
);
-- 常用查询索引:按租户/科室/日期/状态/顺序取队列
CREATE INDEX IF NOT EXISTS idx_triage_queue_item_list
ON triage_queue_item (tenant_id, queue_date, organization_id, delete_flag, status, queue_order);
-- 防重复:同一天同租户同科室同就诊记录只能在队列里一条(未删除)
CREATE UNIQUE INDEX IF NOT EXISTS uq_triage_queue_item_encounter
ON triage_queue_item (tenant_id, queue_date, organization_id, encounter_id, delete_flag)
WHERE delete_flag = '0';
-- 就诊记录ID索引用于关联查询
CREATE INDEX IF NOT EXISTS idx_triage_queue_item_encounter_id
ON triage_queue_item (encounter_id);

View File

@@ -0,0 +1,10 @@
-- 为 sys_notice 表添加优先级字段
-- 执行前请先备份数据库
ALTER TABLE sys_notice ADD COLUMN priority VARCHAR(10) DEFAULT '2';
-- 添加注释
COMMENT ON COLUMN sys_notice.priority IS '优先级1高 2中 3低';
-- 为现有数据设置默认优先级
UPDATE sys_notice SET priority = '2' WHERE priority IS NULL;

View File

@@ -0,0 +1,30 @@
-- Bug #400 修复triage_queue_item.status 字段类型修正
-- 原 DDL 将 status 定义为 VARCHAR(50),但 Java 实体 TriageQueueItem.status 为 Integer 类型,
-- 应用层使用 TriageQueueStatus 枚举值0/10/20/30/40写入类型不匹配导致 MyBatis-Plus
-- 无法正确映射 status 字段,完诊时 status 更新为 30 失败。
--
-- 注意:必须在后端实际连接的 schema 中执行dev=hisdev, test=histest, prd=hisprd
-- 执行前请先确认SET search_path TO hisdev; (或对应的 schema
-- 1. 先将已有的字符串值转换为对应的整数值
-- 如果之前写入的是枚举 code如 'waiting'、'completed'),需要先转换
UPDATE triage_queue_item
SET status = CASE
WHEN status IN ('0', 'waiting', 'WAITING') THEN 0
WHEN status IN ('10', 'calling', 'CALLING') THEN 10
WHEN status IN ('20', 'in-clinic', 'IN_CLINIC', 'in-clinic') THEN 20
WHEN status IN ('30', 'completed', 'COMPLETED') THEN 30
WHEN status IN ('40', 'skipped', 'SKIPPED') THEN 40
WHEN status IN ('50', 'refunded', 'REFUNDED') THEN 50
WHEN status IN ('60', 'follow', 'FOLLOW') THEN 60
ELSE 0
END
WHERE status IS NOT NULL AND status !~ '^[0-9]+$';
-- 2. 修改字段类型为 INTEGER
ALTER TABLE triage_queue_item
ALTER COLUMN status TYPE INTEGER USING status::INTEGER;
-- 3. 设置默认值
ALTER TABLE triage_queue_item
ALTER COLUMN status SET DEFAULT 0;

View File

@@ -0,0 +1,94 @@
-- ============================================
-- 检查门诊划价"诊疗判断"下没有数据的原因
-- ============================================
-- 1. 检查是否有诊疗类型的收费项目context_enum = 3
SELECT
COUNT(*) AS total_activity_charge_items,
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS active_charge_items
FROM adm_charge_item
WHERE context_enum = 3; -- ACTIVITY = 3
-- 2. 检查诊疗类型的收费项目是否能关联到 wor_activity_definition
SELECT
T1.id AS charge_item_id,
T1.encounter_id,
T1.context_enum,
T1.product_id,
T1.status_enum AS charge_status,
T2.id AS activity_def_id,
T2.name AS activity_name,
T2.status_enum AS activity_status,
T2.delete_flag AS activity_delete_flag,
CASE
WHEN T2.id IS NULL THEN '❌ 无法关联到诊疗项目定义'
WHEN T2.delete_flag != '0' THEN '❌ 诊疗项目定义已删除'
WHEN T2.status_enum != 1 THEN '❌ 诊疗项目定义未激活status_enum != 1'
ELSE '✅ 正常'
END AS match_status
FROM adm_charge_item AS T1
LEFT JOIN wor_activity_definition AS T2
ON T1.context_enum = 3
AND T1.product_id = T2.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1 -- 当前查询条件
WHERE T1.context_enum = 3
AND T1.delete_flag = '0'
LIMIT 20;
-- 3. 检查如果移除 status_enum = 1 条件,能关联多少条
SELECT
COUNT(*) AS total_count,
COUNT(CASE WHEN T2.id IS NOT NULL AND T2.delete_flag = '0' AND T2.status_enum = 1 THEN 1 END) AS matched_active,
COUNT(CASE WHEN T2.id IS NOT NULL AND T2.delete_flag = '0' AND T2.status_enum != 1 THEN 1 END) AS matched_inactive,
COUNT(CASE WHEN T2.id IS NULL THEN 1 END) AS unmatched
FROM adm_charge_item AS T1
LEFT JOIN wor_activity_definition AS T2
ON T1.context_enum = 3
AND T1.product_id = T2.id
AND T2.delete_flag = '0'
WHERE T1.context_enum = 3
AND T1.delete_flag = '0';
-- 4. 检查具体某个就诊的诊疗项目(替换 encounterId 为实际值)
-- SELECT
-- T1.id AS charge_item_id,
-- T1.encounter_id,
-- T1.product_id,
-- T1.status_enum AS charge_status,
-- T2.id AS activity_def_id,
-- T2.name AS activity_name,
-- T2.status_enum AS activity_status,
-- CASE
-- WHEN T2.id IS NULL THEN '无法关联'
-- WHEN T2.status_enum != 1 THEN '诊疗项目未激活'
-- ELSE '正常'
-- END AS status
-- FROM adm_charge_item AS T1
-- LEFT JOIN wor_activity_definition AS T2
-- ON T1.context_enum = 3
-- AND T1.product_id = T2.id
-- AND T2.delete_flag = '0'
-- AND T2.status_enum = 1
-- WHERE T1.encounter_id = :encounterId -- 替换为实际的encounterId
-- AND T1.context_enum = 3
-- AND T1.delete_flag = '0';
-- 5. 如果诊疗项目 status_enum != 1查看这些项目
SELECT
T1.id AS charge_item_id,
T1.encounter_id,
T1.product_id,
T2.name AS activity_name,
T2.status_enum AS activity_status,
'诊疗项目未激活,导致无法显示' AS issue
FROM adm_charge_item AS T1
INNER JOIN wor_activity_definition AS T2
ON T1.context_enum = 3
AND T1.product_id = T2.id
AND T2.delete_flag = '0'
AND T2.status_enum != 1 -- 未激活
WHERE T1.context_enum = 3
AND T1.delete_flag = '0'
LIMIT 20;

View File

@@ -0,0 +1,142 @@
-- ============================================
-- 检查 wor_activity_definition 表中 pricing_flag = 0 的数据
-- 用途:分析哪些项目被标记为"不允许划价",是否符合业务预期
-- ============================================
-- 1. 查看所有 pricing_flag = 0 的项目详情
SELECT
id,
bus_no,
name AS activity_name,
category_code,
type_enum,
pricing_flag,
status_enum,
org_id,
location_id,
description_text,
create_time,
update_time
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0' -- 注意:字段类型是 char(1),所以是字符串 '0'
ORDER BY id;
-- 2. 统计 pricing_flag = 0 的项目数量(按状态)
SELECT
status_enum,
COUNT(*) AS count,
CASE
WHEN status_enum = 1 THEN '激活'
WHEN status_enum = 2 THEN '停用'
ELSE '其他'
END AS status_desc
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0'
GROUP BY status_enum
ORDER BY status_enum;
-- 3. 检查 pricing_flag = 0 的项目是否有关联的费用定价
SELECT
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
T1.status_enum,
T2.id AS charge_item_definition_id,
T2.charge_name,
T2.price,
T2.status_enum AS charge_status,
CASE
WHEN T2.id IS NOT NULL THEN '有费用定价但不允许划价(可能异常)'
ELSE '无费用定价,不允许划价(正常)'
END AS analysis
FROM wor_activity_definition AS T1
LEFT JOIN adm_charge_item_definition AS T2
ON T2.instance_id = T1.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1
AND T2.instance_table = 'wor_activity_definition'
WHERE T1.delete_flag = '0'
AND T1.pricing_flag = '0'
ORDER BY T1.id;
-- 4. 检查 pricing_flag = 0 的项目是否在收费项目表中被使用
SELECT
T1.id AS activity_id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
COUNT(T3.id) AS charge_item_count,
CASE
WHEN COUNT(T3.id) > 0 THEN '已被使用(可能异常:不允许划价但已有收费记录)'
ELSE '未被使用(正常)'
END AS analysis
FROM wor_activity_definition AS T1
LEFT JOIN adm_charge_item AS T3
ON T3.product_id = T1.id
AND T3.context_enum = 3 -- ACTIVITY
AND T3.delete_flag = '0'
WHERE T1.delete_flag = '0'
AND T1.pricing_flag = '0'
GROUP BY T1.id, T1.bus_no, T1.name, T1.pricing_flag
HAVING COUNT(T3.id) > 0 -- 只显示已被使用的
ORDER BY charge_item_count DESC;
-- 5. 按类别统计 pricing_flag = 0 的项目
SELECT
category_code,
COUNT(*) AS count,
STRING_AGG(name, ', ') AS activity_names -- 列出项目名称
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0'
AND status_enum = 1 -- 只统计激活的
GROUP BY category_code
ORDER BY category_code;
-- 6. 对比pricing_flag = 0 和 pricing_flag = 1 的项目特征
SELECT
pricing_flag,
COUNT(*) AS count,
COUNT(DISTINCT category_code) AS category_count,
COUNT(DISTINCT org_id) AS org_count,
STRING_AGG(DISTINCT category_code::text, ', ') AS categories
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
AND pricing_flag IN ('0', '1')
GROUP BY pricing_flag
ORDER BY pricing_flag;
-- 7. 检查是否有子项的项目childrenJson 不为空)被标记为 pricing_flag = 0
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
children_json,
CASE
WHEN children_json IS NOT NULL AND children_json != '' THEN '有子项但不允许划价(可能是套餐子项)'
ELSE '无子项'
END AS analysis
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0'
AND children_json IS NOT NULL
AND children_json != ''
ORDER BY id;
-- 8. 查看 pricing_flag 字段的所有可能值(包括 NULL
SELECT
COALESCE(pricing_flag::text, 'NULL') AS pricing_flag_value,
COUNT(*) AS count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS percentage
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
GROUP BY pricing_flag
ORDER BY pricing_flag NULLS LAST;

View File

@@ -0,0 +1,116 @@
-- 详细检查诊疗项目检索问题
-- 已知wor_activity_definition 表中有4条数据
-- 1. 检查这4条诊疗项目定义的详细信息
SELECT
id,
name,
bus_no,
delete_flag,
tenant_id,
create_time
FROM wor_activity_definition
ORDER BY id;
-- 2. 检查收费项目中是否有诊疗项目类型的记录
-- 注意ChargeItemContext.ACTIVITY.getValue() 返回的是 Integer 3
-- 但数据库中 context_enum 可能是字符串类型,需要检查是 '3' 还是 3
SELECT
COUNT(*) as total_activity_charge_items,
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) as active_activity_charge_items,
COUNT(CASE WHEN delete_flag != '0' THEN 1 END) as deleted_activity_charge_items
FROM adm_charge_item
WHERE context_enum::text = '3' OR context_enum = 3; -- 诊疗项目类型是3
-- 3. 检查收费项目中的product_id是否能匹配到诊疗项目定义
-- 注意:诊疗项目类型的 context_enum = 3ChargeItemContext.ACTIVITY.getValue()
SELECT
aci.id as charge_item_id,
aci.encounter_id,
aci.context_enum,
aci.product_id as charge_product_id,
aci.status_enum,
aci.delete_flag as charge_delete_flag,
wad.id as activity_def_id,
wad.name as activity_name,
wad.delete_flag as activity_delete_flag,
CASE
WHEN wad.id IS NULL THEN '❌ 诊疗项目定义不存在'
WHEN wad.delete_flag != '0' THEN '❌ 诊疗项目定义已删除'
WHEN aci.delete_flag != '0' THEN '❌ 收费项目已删除'
ELSE '✅ 正常'
END as match_status
FROM adm_charge_item aci
LEFT JOIN wor_activity_definition wad
ON aci.product_id = wad.id
WHERE (aci.context_enum::text = '3' OR aci.context_enum = 3) -- 诊疗项目类型是3
LIMIT 20;
-- 4. 检查context_enum的所有可能值确认诊疗项目的枚举值是什么
SELECT DISTINCT
context_enum,
COUNT(*) as count
FROM adm_charge_item
WHERE delete_flag = '0'
GROUP BY context_enum
ORDER BY context_enum;
-- 5. 检查是否有收费项目,但无法匹配到诊疗项目定义
SELECT
COUNT(*) as unmatched_count,
STRING_AGG(DISTINCT CAST(product_id AS VARCHAR), ', ') as unmatched_product_ids,
STRING_AGG(DISTINCT CAST(id AS VARCHAR), ', ') as unmatched_charge_item_ids
FROM adm_charge_item aci
WHERE (aci.context_enum::text = '3' OR aci.context_enum = 3) -- 诊疗项目类型是3
AND aci.delete_flag = '0'
AND NOT EXISTS (
SELECT 1
FROM wor_activity_definition wad
WHERE wad.id = aci.product_id
AND wad.delete_flag = '0'
);
-- 6. 检查具体某个就诊的诊疗项目如果有具体的encounterId
-- SELECT
-- T1.encounter_id,
-- T1.id as charge_item_id,
-- T1.context_enum,
-- T1.product_id,
-- T1.status_enum,
-- T1.delete_flag,
-- T2.id as activity_def_id,
-- T2.name as activity_name,
-- T2.delete_flag as activity_delete_flag
-- FROM adm_charge_item AS T1
-- LEFT JOIN wor_activity_definition AS T2
-- ON T1.product_id = T2.id
-- WHERE T1.encounter_id = :encounterId -- 替换为实际的encounterId
-- AND T1.context_enum IN ('ACTIVITY', '1', 'ACTIVITY_CODE') -- 尝试多种可能的值
-- AND T1.delete_flag = '0';
-- 7. 检查后端代码中使用的context_enum值
-- ChargeItemContext.ACTIVITY.getValue() 的实际返回值需要查看枚举类
-- 可能是:'ACTIVITY', '1', 'ACTIVITY_CODE', 或其他值
-- 建议先运行查询4查看数据库中实际使用的context_enum值
-- 8. 检查status_enum的值查询条件中需要匹配的状态
-- SQL查询中要求 status_enum IN (1, 2, 3, 4, 5, 6)
-- 检查收费项目中的状态值是否在这个范围内
SELECT
status_enum,
COUNT(*) as count,
CASE
WHEN status_enum IN (1, 2, 3, 4, 5, 6) THEN '✅ 在查询范围内'
ELSE '❌ 不在查询范围内'
END as status_check
FROM adm_charge_item
WHERE context_enum IN (
SELECT DISTINCT context_enum
FROM adm_charge_item
WHERE delete_flag = '0'
LIMIT 10
)
AND delete_flag = '0'
GROUP BY status_enum
ORDER BY status_enum;

View File

@@ -0,0 +1,52 @@
-- 创建日结结算单表
CREATE TABLE IF NOT EXISTS medication_day_end_settlement (
id BIGSERIAL PRIMARY KEY,
settlement_no VARCHAR(64) NOT NULL,
settlement_date DATE NOT NULL,
settlement_type VARCHAR(20) DEFAULT 'daily',
total_amount DECIMAL(15,2) DEFAULT 0.00,
status CHAR(1) DEFAULT '0',
remark VARCHAR(500),
create_by VARCHAR(64) DEFAULT '',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_by VARCHAR(64) DEFAULT '',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 添加注释
COMMENT ON TABLE medication_day_end_settlement IS '日结结算单表';
COMMENT ON COLUMN medication_day_end_settlement.settlement_no IS '结算单号';
COMMENT ON COLUMN medication_day_end_settlement.settlement_date IS '结算日期';
COMMENT ON COLUMN medication_day_end_settlement.settlement_type IS '结算类型 (daily, weekly, monthly)';
COMMENT ON COLUMN medication_day_end_settlement.total_amount IS '总金额';
COMMENT ON COLUMN medication_day_end_settlement.status IS '状态 (0正常 1停用)';
COMMENT ON COLUMN medication_day_end_settlement.remark IS '备注';
COMMENT ON COLUMN medication_day_end_settlement.create_by IS '创建者';
COMMENT ON COLUMN medication_day_end_settlement.create_time IS '创建时间';
COMMENT ON COLUMN medication_day_end_settlement.update_by IS '更新者';
COMMENT ON COLUMN medication_day_end_settlement.update_time IS '更新时间';
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_settlement_date ON medication_day_end_settlement(settlement_date);
CREATE INDEX IF NOT EXISTS idx_settlement_no ON medication_day_end_settlement(settlement_no);
-- 创建更新时间触发器函数
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.update_time = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- 创建更新时间触发器
DROP TRIGGER IF EXISTS update_medication_day_end_settlement_modtime ON medication_day_end_settlement;
CREATE TRIGGER update_medication_day_end_settlement_modtime
BEFORE UPDATE ON medication_day_end_settlement
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
-- 插入初始数据
INSERT INTO medication_day_end_settlement (settlement_no, settlement_date, settlement_type, total_amount, status, remark, create_by) VALUES
('DS20250201001', '2025-02-01', 'daily', 15000.00, '0', '2025年2月1日日结', 'admin'),
('DS20250201002', '2025-02-01', 'daily', 8500.50, '0', '药房日结', 'admin');

View File

@@ -0,0 +1,38 @@
CREATE TABLE IF NOT EXISTS sys_user_config (
config_id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
config_key VARCHAR(100) NOT NULL,
config_value TEXT,
remark VARCHAR(500),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 添加注释
COMMENT ON TABLE sys_user_config IS '用户配置表';
COMMENT ON COLUMN sys_user_config.config_id IS '配置ID';
COMMENT ON COLUMN sys_user_config.user_id IS '用户ID';
COMMENT ON COLUMN sys_user_config.config_key IS '配置键名';
COMMENT ON COLUMN sys_user_config.config_value IS '配置值';
COMMENT ON COLUMN sys_user_config.remark IS '备注';
COMMENT ON COLUMN sys_user_config.create_time IS '创建时间';
COMMENT ON COLUMN sys_user_config.update_time IS '更新时间';
-- 创建唯一索引
CREATE UNIQUE INDEX IF NOT EXISTS uk_user_config ON sys_user_config (user_id, config_key);
CREATE INDEX IF NOT EXISTS idx_user_id ON sys_user_config (user_id);
-- 创建更新时间触发器函数
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.update_time = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- 创建触发器
CREATE TRIGGER update_sys_user_config_updated_at
BEFORE UPDATE ON sys_user_config
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();

View File

@@ -0,0 +1,108 @@
-- ============================================
-- 调试队列日期问题
-- 用途:检查数据库中的 queue_date 字段值,找出为什么查询不到数据
-- ============================================
-- 1. 查看所有队列记录的日期分布
SELECT
queue_date,
status,
COUNT(*) AS count,
STRING_AGG(patient_name, ', ') AS patients
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
GROUP BY queue_date, status
ORDER BY queue_date DESC, status;
-- 2. 查看指定科室的所有记录(不限制日期)
SELECT
id,
queue_date,
status,
patient_name,
organization_id,
organization_name,
queue_order,
create_time
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND organization_id = 1995302136614969300
ORDER BY queue_date DESC, queue_order ASC;
-- 3. 查看今天的记录(使用 CURRENT_DATE
SELECT
id,
queue_date,
status,
patient_name,
organization_id,
queue_order
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND queue_date = CURRENT_DATE
AND organization_id = 1995302136614969300
ORDER BY queue_order ASC;
-- 4. 查看 2026-01-16 的记录
SELECT
id,
queue_date,
status,
patient_name,
organization_id,
queue_order
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND queue_date = '2026-01-16'::DATE
AND organization_id = 1995302136614969300
ORDER BY queue_order ASC;
-- 5. 查看 2025-01-16 的记录(可能是昨天的数据)
SELECT
id,
queue_date,
status,
patient_name,
organization_id,
queue_order
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND queue_date = '2025-01-16'::DATE
AND organization_id = 1995302136614969300
ORDER BY queue_order ASC;
-- 6. 查看最近的记录最近7天
SELECT
queue_date,
status,
COUNT(*) AS count
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND queue_date >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY queue_date, status
ORDER BY queue_date DESC, status;
-- 7. 检查系统当前日期PostgreSQL
SELECT CURRENT_DATE AS current_date_in_db;
-- 8. 查看所有状态为 WAITING 或 SKIPPED 的记录(不限制日期)
SELECT
id,
queue_date,
status,
patient_name,
organization_id,
queue_order
FROM hisdev.triage_queue_item
WHERE tenant_id = 1
AND delete_flag = '0'
AND status IN ('WAITING', 'SKIPPED')
AND organization_id = 1995302136614969300
ORDER BY queue_date DESC, queue_order ASC;

View File

@@ -0,0 +1,144 @@
-- ============================================
-- 查询诊疗项目 pricing_flag 字段分布情况
-- 用途:了解哪些项目允许划价,哪些不允许
-- ============================================
-- 1. 统计 pricing_flag 字段的分布情况
SELECT
COUNT(*) AS total_count,
COUNT(CASE WHEN pricing_flag = 1 THEN 1 END) AS pricing_flag_1_count, -- 允许划价
COUNT(CASE WHEN pricing_flag = 0 THEN 1 END) AS pricing_flag_0_count, -- 不允许划价
COUNT(CASE WHEN pricing_flag IS NULL THEN 1 END) AS pricing_flag_null_count, -- 未设置
ROUND(COUNT(CASE WHEN pricing_flag = 1 THEN 1 END) * 100.0 / COUNT(*), 2) AS flag_1_percent,
ROUND(COUNT(CASE WHEN pricing_flag = 0 THEN 1 END) * 100.0 / COUNT(*), 2) AS flag_0_percent,
ROUND(COUNT(CASE WHEN pricing_flag IS NULL THEN 1 END) * 100.0 / COUNT(*), 2) AS flag_null_percent
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1; -- 只统计激活状态的项目
-- 2. 查看所有允许划价的项目pricing_flag = 1 或 NULL
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
status_enum,
org_id,
category_code,
type_enum,
CASE
WHEN pricing_flag = 1 THEN '允许划价'
WHEN pricing_flag = 0 THEN '不允许划价'
WHEN pricing_flag IS NULL THEN '未设置(默认允许)'
ELSE '未知'
END AS pricing_flag_desc
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
AND (pricing_flag = 1 OR pricing_flag IS NULL) -- 之前过滤条件
ORDER BY id;
-- 3. 查看不允许划价的项目pricing_flag = 0
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
status_enum,
org_id,
category_code,
type_enum,
description_text,
'不允许划价' AS pricing_flag_desc
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
AND pricing_flag = 0 -- 这些项目之前不会显示
ORDER BY id;
-- 4. 查看未设置 pricing_flag 的项目NULL
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
status_enum,
org_id,
category_code,
type_enum,
'未设置(默认允许)' AS pricing_flag_desc
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
AND pricing_flag IS NULL
ORDER BY id;
-- 5. 按科室统计 pricing_flag 分布
SELECT
org_id,
COUNT(*) AS total_count,
COUNT(CASE WHEN pricing_flag = 1 THEN 1 END) AS flag_1_count,
COUNT(CASE WHEN pricing_flag = 0 THEN 1 END) AS flag_0_count,
COUNT(CASE WHEN pricing_flag IS NULL THEN 1 END) AS flag_null_count
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
GROUP BY org_id
ORDER BY org_id;
-- 6. 按类别统计 pricing_flag 分布
SELECT
category_code,
COUNT(*) AS total_count,
COUNT(CASE WHEN pricing_flag = 1 THEN 1 END) AS flag_1_count,
COUNT(CASE WHEN pricing_flag = 0 THEN 1 END) AS flag_0_count,
COUNT(CASE WHEN pricing_flag IS NULL THEN 1 END) AS flag_null_count
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
GROUP BY category_code
ORDER BY category_code;
-- 7. 检查是否有费用定价关联的项目,但 pricing_flag = 0
SELECT
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
T2.id AS charge_item_definition_id,
T2.charge_name,
T2.price,
'有费用定价但不允许划价' AS issue_desc
FROM wor_activity_definition AS T1
LEFT JOIN adm_charge_item_definition AS T2
ON T2.instance_id = T1.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1
AND T2.instance_table = 'wor_activity_definition'
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
AND T1.pricing_flag = 0
AND T2.id IS NOT NULL -- 有关联的费用定价
ORDER BY T1.id;
-- 8. 检查没有费用定价关联的项目,但 pricing_flag = 1
SELECT
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
T2.id AS charge_item_definition_id,
'允许划价但没有费用定价' AS issue_desc
FROM wor_activity_definition AS T1
LEFT JOIN adm_charge_item_definition AS T2
ON T2.instance_id = T1.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1
AND T2.instance_table = 'wor_activity_definition'
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
AND (T1.pricing_flag = 1 OR T1.pricing_flag IS NULL)
AND T2.id IS NULL -- 没有关联的费用定价
ORDER BY T1.id;

View File

@@ -0,0 +1,313 @@
-- ============================================
-- 智能候选池查询SQL当日已挂号患者
-- 对应接口GET /charge-manage/register/current-day-encounter
-- 用途:查询当日已挂号但未入队的患者,用于智能分诊排队管理
-- ============================================
-- 完整SQL查询包含所有关联表
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,
T9.practitioner_user_id AS practitionerUserId,
T9.practitioner_name AS practitionerName,
T9.contract_name AS contractName,
T9.patient_id AS patientId,
T9.patient_name AS patientName,
T9.phone,
T9.gender_enum AS genderEnum,
T9.id_card AS idCard,
T9.status_enum AS statusEnum,
T9.register_time AS registerTime,
T9.total_price AS totalPrice,
T9.account_name AS accountName,
T9.enterer_name AS entererName,
T9.charge_item_ids AS chargeItemIds,
T9.payment_id AS paymentId,
T9.picture_url AS pictureUrl,
T9.birth_date AS birthDate,
COALESCE(T9.identifier_no, T9.patient_bus_no, '') AS identifierNo
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,
T5.user_id AS practitioner_user_id,
T5.NAME AS practitioner_name,
T7.contract_name AS contract_name,
T8.id AS patient_id,
T8.NAME AS patient_name,
T8.phone AS phone,
T8.gender_enum AS gender_enum,
T8.id_card AS id_card,
T1.status_enum AS status_enum,
T1.create_time AS register_time,
T10.total_price,
T11."name" AS account_name,
T12."name" AS enterer_name,
T13.charge_item_ids,
T13.id AS payment_id,
ai.picture_url AS picture_url,
T8.birth_date AS birth_date,
T8.bus_no AS patient_bus_no,
T18.identifier_no AS identifier_no
FROM adm_encounter AS T1
-- 关联科室表
LEFT JOIN adm_organization AS T2
ON T1.organization_id = T2.ID
AND T2.delete_flag = '0'
-- 关联医疗服务类型表(号别)
LEFT JOIN adm_healthcare_service AS T3
ON T1.service_type_id = T3.ID
AND T3.delete_flag = '0'
-- 关联就诊参与者表(医生信息)
LEFT JOIN (
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0'
AND (
-- 如果就诊状态为"进行中",查找"接诊医生"admitter
(type_code = 'admitter' AND EXISTS(SELECT 1
FROM adm_encounter AS T1
WHERE T1.status_enum = 2 -- IN_PROGRESS
AND T1.ID = encounter_id))
OR
-- 如果就诊状态不是"进行中",查找"挂号医生"registration_doctor
(type_code = 'registration_doctor' AND NOT EXISTS(SELECT 1
FROM adm_encounter AS T1
WHERE T1.status_enum = 2 -- IN_PROGRESS
AND T1.ID = encounter_id))
)
) t
WHERE rn = 1
) AS T4 ON T1.ID = T4.encounter_id
-- 关联医生表
LEFT JOIN adm_practitioner AS T5
ON T5.ID = T4.practitioner_id
AND T5.delete_flag = '0'
-- 关联账户表
LEFT JOIN adm_account AS T6
ON T1.ID = T6.encounter_id
AND T6.delete_flag = '0'
AND T6.encounter_flag = '1'
-- 关联合同表
LEFT JOIN fin_contract AS T7
ON T6.contract_no = T7.bus_no
AND T7.delete_flag = '0'
-- 关联患者表
LEFT JOIN adm_patient AS T8
ON T1.patient_id = T8.ID
AND T8.delete_flag = '0'
-- 关联患者标识表(身份证号等)
LEFT JOIN (
SELECT patient_id,
identifier_no
FROM (
SELECT patient_id,
identifier_no,
ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn
FROM adm_patient_identifier
WHERE delete_flag = '0'
AND identifier_no IS NOT NULL
AND identifier_no != ''
) t
WHERE rn = 1
) AS T18 ON T8.id = T18.patient_id
-- 关联收费项目表(挂号费)
LEFT JOIN adm_charge_item AS T10
ON T1.id = T10.encounter_id
AND T10.delete_flag = '0'
AND T10.context_enum = 1 -- REGISTER挂号
-- 关联账户表(收费账户)
LEFT JOIN adm_account AS T11
ON T10.account_id = T11.id
AND T11.delete_flag = '0'
-- 关联医生表(收费医生)
LEFT JOIN adm_practitioner AS T12
ON T12.ID = T10.enterer_id
AND T12.delete_flag = '0'
-- 关联支付对账表(已支付)
LEFT JOIN fin_payment_reconciliation T13
ON T10.id::TEXT = ANY(string_to_array(T13.charge_item_ids,','))
AND T13.delete_flag = '0'
AND T13.status_enum = 1 -- SUCCESS支付成功
-- 关联退号记录当状态为退号时通过relation_id关联原支付记录
LEFT JOIN fin_payment_reconciliation T14
ON T13.id = T14.relation_id
AND T14.delete_flag = '0'
AND T14.status_enum = 3 -- REFUND退款
AND T14.payment_enum = 1
-- 关联退号医生
LEFT JOIN adm_practitioner AS T15
ON T15.ID = T14.enterer_id
AND T15.delete_flag = '0'
-- 关联系统用户表
LEFT JOIN sys_user AS T17
ON T17.user_id = T15.user_id
AND T17.delete_flag = '0'
-- 关联退号支付详情,获取退款方式(聚合多个支付方式)
LEFT JOIN (
SELECT reconciliation_id,
STRING_AGG(
CASE pay_enum
WHEN 220400 THEN '现金'
WHEN 220100 THEN '微信'
WHEN 220200 THEN '支付宝'
WHEN 220300 THEN '银联'
END,
','
ORDER BY pay_enum
) AS refund_method
FROM fin_payment_rec_detail
WHERE delete_flag = '0'
AND amount < 0
AND pay_enum IN (220400, 220100, 220200, 220300)
GROUP BY reconciliation_id
) AS T16 ON T14.id = T16.reconciliation_id
-- 关联发票表
LEFT JOIN adm_invoice AS ai
ON ai.reconciliation_id = T13.id
AND ai.delete_flag = '0'
WHERE T1.delete_flag = '0'
AND T1.class_enum = 1 -- 门诊AMB
AND T10.context_enum = 1 -- 挂号REGISTER
-- 动态条件(由前端传入,通过 ${ew.customSqlSegment} 注入)
-- 例如AND T1.create_time::DATE = CURRENT_DATE -- 当日挂号
-- 例如AND T1.status_enum != 6 -- 排除退号statusEnum = -1时
-- 例如AND (T8.name LIKE '%关键词%' OR T2.name LIKE '%关键词%' ...) -- 模糊搜索
) AS T9
-- 动态查询条件(由 MyBatis-Plus QueryWrapper 生成)
-- ${ew.customSqlSegment}
ORDER BY T9.register_time DESC;
-- ============================================
-- 简化版查询(仅查询核心字段,用于快速测试)
-- ============================================
SELECT
enc.id AS encounterId,
enc.patient_id AS patientId,
pt.name AS patientName,
pt.birth_date AS birthDate,
org.id AS organizationId,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime,
enc.status_enum AS statusEnum
FROM adm_encounter enc
INNER JOIN adm_patient pt
ON enc.patient_id = pt.id
AND pt.delete_flag = '0'
LEFT JOIN adm_organization org
ON enc.organization_id = org.id
AND org.delete_flag = '0'
LEFT JOIN adm_healthcare_service hcs
ON enc.service_type_id = hcs.id
AND hcs.delete_flag = '0'
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0'
AND type_code IN ('admitter', 'registration_doctor')
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
LEFT JOIN adm_practitioner pr
ON ep.practitioner_id = pr.id
AND pr.delete_flag = '0'
INNER JOIN adm_charge_item ci
ON enc.id = ci.encounter_id
AND ci.delete_flag = '0'
AND ci.context_enum = 1 -- 挂号
INNER JOIN fin_payment_reconciliation prc
ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0'
AND prc.status_enum = 1 -- 支付成功
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1 -- 门诊
AND enc.create_time::DATE = CURRENT_DATE -- 当日挂号
AND enc.status_enum != 6 -- 排除退号
ORDER BY enc.create_time DESC;
-- ============================================
-- 查询条件说明
-- ============================================
-- 1. 基础条件:
-- - enc.delete_flag = '0' -- 未删除
-- - enc.class_enum = 1 -- 门诊AMB
-- - ci.context_enum = 1 -- 挂号REGISTER
-- - prc.status_enum = 1 -- 支付成功SUCCESS
--
-- 2. 日期过滤:
-- - enc.create_time::DATE = CURRENT_DATE -- 当日挂号(由前端传入 date 参数)
--
-- 3. 状态过滤:
-- - enc.status_enum != 6 -- 排除退号(当 statusEnum = -1 时)
-- - enc.status_enum = 2 -- 进行中IN_PROGRESS用于判断医生类型
--
-- 4. 模糊搜索(由前端传入 searchKey 参数):
-- - patient_name患者姓名
-- - organization_name科室名称
-- - practitioner_name医生姓名
-- - healthcare_name号别名称
-- - identifier_no身份证号
--
-- 5. 租户过滤(由后端自动添加):
-- - tenant_id = ? -- 当前登录用户的租户ID
--
-- 6. 分页(由 MyBatis-Plus Page 对象处理):
-- - LIMIT ? OFFSET ?
-- ============================================
-- 常用查询示例
-- ============================================
-- 示例1查询今天所有已挂号患者排除退号
SELECT
enc.id AS encounterId,
pt.name AS patientName,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
LEFT JOIN adm_healthcare_service hcs ON enc.service_type_id = hcs.id AND hcs.delete_flag = '0'
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0' AND type_code IN ('admitter', 'registration_doctor')
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6
ORDER BY enc.create_time DESC;
-- 示例2查询指定科室的已挂号患者
-- 在示例1的基础上添加
-- AND enc.organization_id = ? -- 科室ID
-- 示例3按患者姓名模糊搜索
-- 在示例1的基础上添加
-- AND pt.name LIKE '%关键词%'
-- 示例4查询已加入队列的患者用于去重
SELECT DISTINCT encounter_id
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED';

View File

@@ -0,0 +1,268 @@
-- ============================================
-- 智能候选池查询SQL智能分诊排队管理页面专用
-- 页面:智能分诊排队管理 - 心内科
-- 用途:查询"已签到未入队"的患者(当日已挂号,但未加入队列)
-- ============================================
-- ============================================
-- 方案一:完整查询(包含所有字段,排除已在队列中的患者)
-- ============================================
SELECT
enc.id AS encounterId,
enc.patient_id AS patientId,
pt.name AS patientName,
pt.birth_date AS birthDate,
-- 计算年龄(前端会调用 parseAge 函数)
CASE
WHEN pt.birth_date IS NOT NULL THEN
EXTRACT(YEAR FROM AGE(pt.birth_date))::TEXT || ''
ELSE ''
END AS age,
org.id AS organizationId,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime,
enc.status_enum AS statusEnum,
-- 其他字段(如果需要)
pt.phone,
pt.gender_enum AS genderEnum,
pt.id_card AS idCard
FROM adm_encounter enc
-- 关联患者表
INNER JOIN adm_patient pt
ON enc.patient_id = pt.id
AND pt.delete_flag = '0'
-- 关联科室表
LEFT JOIN adm_organization org
ON enc.organization_id = org.id
AND org.delete_flag = '0'
-- 关联医疗服务类型表(号别)
LEFT JOIN adm_healthcare_service hcs
ON enc.service_type_id = hcs.id
AND hcs.delete_flag = '0'
-- 关联就诊参与者表(医生信息)
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0'
AND (
-- 如果就诊状态为"进行中",查找"接诊医生"admitter
(type_code = 'admitter' AND EXISTS(SELECT 1
FROM adm_encounter AS e
WHERE e.status_enum = 2 -- IN_PROGRESS
AND e.id = encounter_id))
OR
-- 如果就诊状态不是"进行中",查找"挂号医生"registration_doctor
(type_code = 'registration_doctor' AND NOT EXISTS(SELECT 1
FROM adm_encounter AS e
WHERE e.status_enum = 2 -- IN_PROGRESS
AND e.id = encounter_id))
)
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
-- 关联医生表
LEFT JOIN adm_practitioner pr
ON ep.practitioner_id = pr.id
AND pr.delete_flag = '0'
-- 关联收费项目表(挂号费)
INNER JOIN adm_charge_item ci
ON enc.id = ci.encounter_id
AND ci.delete_flag = '0'
AND ci.context_enum = 1 -- REGISTER挂号
-- 关联支付对账表(已支付)
INNER JOIN fin_payment_reconciliation prc
ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0'
AND prc.status_enum = 1 -- SUCCESS支付成功
-- 排除已在队列中的患者关键LEFT JOIN + WHERE IS NULL
LEFT JOIN hisdev.triage_queue_item tqi
ON enc.id = tqi.encounter_id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED' -- 排除已完成的状态
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1 -- 门诊AMB
AND enc.create_time::DATE = CURRENT_DATE -- 当日挂号(前端会过滤 registerTime
AND enc.status_enum != 6 -- 排除退号statusEnum = -1 时)
AND tqi.id IS NULL -- 关键:只查询不在队列中的患者
ORDER BY enc.create_time DESC;
-- ============================================
-- 方案二:简化查询(仅核心字段,便于快速测试)
-- ============================================
SELECT
enc.id AS encounterId,
enc.patient_id AS patientId,
pt.name AS patientName,
org.id AS organizationId,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
LEFT JOIN adm_healthcare_service hcs ON enc.service_type_id = hcs.id AND hcs.delete_flag = '0'
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0' AND type_code IN ('admitter', 'registration_doctor')
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
-- 排除已在队列中的患者
LEFT JOIN hisdev.triage_queue_item tqi
ON enc.id = tqi.encounter_id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6
AND tqi.id IS NULL -- 不在队列中
ORDER BY enc.create_time DESC;
-- ============================================
-- 方案三:分步查询(便于调试和理解)
-- ============================================
-- 步骤1查询当日已挂号的患者不排除队列
SELECT
enc.id AS encounterId,
pt.name AS patientName,
org.name AS organizationName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6;
-- 步骤2查询已在队列中的患者
SELECT DISTINCT encounter_id
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED';
-- 步骤3合并查询使用 NOT EXISTS 或 NOT IN
SELECT
enc.id AS encounterId,
pt.name AS patientName,
org.name AS organizationName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6
-- 排除已在队列中的患者
AND NOT EXISTS (
SELECT 1
FROM hisdev.triage_queue_item tqi
WHERE tqi.encounter_id = enc.id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
)
ORDER BY enc.create_time DESC;
-- ============================================
-- 查询条件说明
-- ============================================
-- 1. 基础条件:
-- - enc.delete_flag = '0' -- 未删除
-- - enc.class_enum = 1 -- 门诊AMB
-- - ci.context_enum = 1 -- 挂号REGISTER
-- - prc.status_enum = 1 -- 支付成功SUCCESS
--
-- 2. 日期过滤:
-- - enc.create_time::DATE = CURRENT_DATE -- 当日挂号
-- 注意:前端还会基于 registerTime 字段再次过滤今天的数据
--
-- 3. 状态过滤:
-- - enc.status_enum != 6 -- 排除退号(对应前端 statusEnum = -1
--
-- 4. 队列去重:
-- - LEFT JOIN hisdev.triage_queue_item ... WHERE tqi.id IS NULL
-- 或者
-- - NOT EXISTS (SELECT 1 FROM hisdev.triage_queue_item ...)
-- 排除已在队列中且状态不是 COMPLETED 的患者
--
-- 5. 租户过滤(如果需要):
-- - enc.tenant_id = ? -- 当前登录用户的租户ID
--
-- 6. 模糊搜索(如果需要):
-- - pt.name LIKE '%关键词%' -- 患者姓名
-- - org.name LIKE '%关键词%' -- 科室名称
-- - pr.name LIKE '%关键词%' -- 医生姓名
-- - hcs.name LIKE '%关键词%' -- 号别名称
-- ============================================
-- 调试查询(检查数据是否正确)
-- ============================================
-- 1. 检查当日已挂号患者总数
SELECT COUNT(*) AS total_registered
FROM adm_encounter enc
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6;
-- 2. 检查已在队列中的患者数量
SELECT COUNT(DISTINCT encounter_id) AS in_queue_count
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED';
-- 3. 检查候选池应该显示的患者数量(已挂号 - 已在队列)
SELECT
(SELECT COUNT(*)
FROM adm_encounter enc
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6)
-
(SELECT COUNT(DISTINCT encounter_id)
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED')
AS candidate_pool_count;
-- 4. 查看队列中的患者详情(用于对比)
SELECT
tqi.encounter_id,
tqi.patient_name,
tqi.status,
tqi.queue_order
FROM hisdev.triage_queue_item tqi
WHERE tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
ORDER BY tqi.queue_order;

View File

@@ -0,0 +1,366 @@
-- ============================================
-- 智能候选池查询SQL完整版 - 包含排除列表)
-- 页面:智能分诊排队管理 - 心内科
-- 用途:查询"已签到未入队"的患者(当日已挂号,但未加入队列,且未在排除列表中)
-- 更新日期2025-01-15
-- ============================================
-- ============================================
-- 方案一:完整查询(包含所有字段,排除已在队列和排除列表中的患者)
-- ============================================
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,
T9.practitioner_user_id AS practitionerUserId,
T9.practitioner_name AS practitionerName,
T9.contract_name AS contractName,
T9.patient_id AS patientId,
T9.patient_name AS patientName,
T9.phone,
T9.gender_enum AS genderEnum,
T9.id_card AS idCard,
T9.status_enum AS statusEnum,
T9.register_time AS registerTime,
T9.total_price AS totalPrice,
T9.account_name AS accountName,
T9.enterer_name AS entererName,
T9.charge_item_ids AS chargeItemIds,
T9.payment_id AS paymentId,
T9.picture_url AS pictureUrl,
T9.birth_date AS birthDate,
COALESCE(T9.identifier_no, T9.patient_bus_no, '') AS identifierNo,
-- 计算年龄(前端会调用 parseAge 函数)
CASE
WHEN T9.birth_date IS NOT NULL THEN
EXTRACT(YEAR FROM AGE(T9.birth_date))::TEXT || ''
ELSE ''
END AS age
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,
T5.user_id AS practitioner_user_id,
T5.NAME AS practitioner_name,
T7.contract_name AS contract_name,
T8.id AS patient_id,
T8.NAME AS patient_name,
T8.phone AS phone,
T8.gender_enum AS gender_enum,
T8.id_card AS id_card,
T1.status_enum AS status_enum,
T1.create_time AS register_time,
T10.total_price,
T11."name" AS account_name,
T12."name" AS enterer_name,
T13.charge_item_ids,
T13.id AS payment_id,
ai.picture_url AS picture_url,
T8.birth_date AS birth_date,
T8.bus_no AS patient_bus_no,
T18.identifier_no AS identifier_no
FROM adm_encounter AS T1
LEFT JOIN adm_organization AS T2 ON T1.organization_id = T2.ID AND T2.delete_flag = '0'
LEFT JOIN adm_healthcare_service AS T3 ON T1.service_type_id = T3.ID AND T3.delete_flag = '0'
LEFT JOIN (
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0'
AND (
(type_code = 'admitter' AND EXISTS(SELECT 1
FROM adm_encounter AS T1
WHERE T1.status_enum = 2 -- IN_PROGRESS
AND T1.ID = encounter_id))
OR
(type_code = 'registration_doctor' AND NOT EXISTS(SELECT 1
FROM adm_encounter AS T1
WHERE T1.status_enum = 2 -- IN_PROGRESS
AND T1.ID = encounter_id))
)
) t
WHERE rn = 1
) AS T4 ON T1.ID = T4.encounter_id
LEFT JOIN adm_practitioner AS T5 ON T5.ID = T4.practitioner_id AND T5.delete_flag = '0'
LEFT JOIN adm_account AS T6
ON T1.ID = T6.encounter_id AND T6.delete_flag = '0' AND T6.encounter_flag = '1'
LEFT JOIN fin_contract AS T7 ON T6.contract_no = T7.bus_no AND T7.delete_flag = '0'
LEFT JOIN adm_patient AS T8 ON T1.patient_id = T8.ID AND T8.delete_flag = '0'
LEFT JOIN (
SELECT patient_id,
identifier_no
FROM (
SELECT patient_id,
identifier_no,
ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY create_time ASC) AS rn
FROM adm_patient_identifier
WHERE delete_flag = '0'
AND identifier_no IS NOT NULL
AND identifier_no != ''
) t
WHERE rn = 1
) AS T18 ON T8.id = T18.patient_id
LEFT JOIN adm_charge_item AS T10 ON T1.id = T10.encounter_id AND T10.delete_flag = '0'
LEFT JOIN adm_account AS T11 ON T10.account_id = T11.id AND T11.delete_flag = '0'
LEFT JOIN adm_practitioner AS T12 ON T12.ID = T10.enterer_id AND T12.delete_flag = '0'
LEFT JOIN fin_payment_reconciliation T13
ON T10.id::TEXT = ANY(string_to_array(T13.charge_item_ids,','))
AND T13.delete_flag = '0'
AND T13.status_enum = 1 -- SUCCESS支付成功
LEFT JOIN adm_invoice AS ai
ON ai.reconciliation_id = T13.id AND ai.delete_flag = '0'
WHERE T1.delete_flag = '0'
AND T1.class_enum = 1 -- 门诊AMB
AND T1.create_time::DATE = CURRENT_DATE -- 当日挂号
AND T1.status_enum != 6 -- 排除退号
AND T10.context_enum = 1 -- REGISTER挂号
) AS T9
-- 排除已在队列中的患者关键LEFT JOIN + WHERE IS NULL
LEFT JOIN hisdev.triage_queue_item tqi
ON T9.encounter_id = tqi.encounter_id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED' -- 排除已完成的状态
-- 排除已在排除列表中的患者新增关键LEFT JOIN + WHERE IS NULL
LEFT JOIN hisdev.triage_candidate_exclusion tce
ON T9.encounter_id = tce.encounter_id
AND tce.delete_flag = '0'
AND tce.exclusion_date = CURRENT_DATE
AND tce.tenant_id = T9.tenant_id -- 按租户过滤
WHERE tqi.id IS NULL -- 关键:只查询不在队列中的患者
AND tce.id IS NULL -- 关键:只查询不在排除列表中的患者
ORDER BY T9.register_time DESC;
-- ============================================
-- 方案二:简化查询(仅核心字段,便于快速测试)
-- ============================================
SELECT
enc.id AS encounterId,
enc.patient_id AS patientId,
pt.name AS patientName,
org.id AS organizationId,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
LEFT JOIN adm_healthcare_service hcs ON enc.service_type_id = hcs.id AND hcs.delete_flag = '0'
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0' AND type_code IN ('admitter', 'registration_doctor')
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
-- 排除已在队列中的患者
LEFT JOIN hisdev.triage_queue_item tqi
ON enc.id = tqi.encounter_id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
-- 排除已在排除列表中的患者(新增)
LEFT JOIN hisdev.triage_candidate_exclusion tce
ON enc.id = tce.encounter_id
AND tce.delete_flag = '0'
AND tce.exclusion_date = CURRENT_DATE
AND tce.tenant_id = enc.tenant_id
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6
AND tqi.id IS NULL -- 不在队列中
AND tce.id IS NULL -- 不在排除列表中
ORDER BY enc.create_time DESC;
-- ============================================
-- 方案三:使用 NOT EXISTS 子查询(性能可能更好)
-- ============================================
SELECT
enc.id AS encounterId,
enc.patient_id AS patientId,
pt.name AS patientName,
org.id AS organizationId,
org.name AS organizationName,
hcs.name AS healthcareName,
pr.name AS practitionerName,
enc.create_time AS registerTime
FROM adm_encounter enc
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
LEFT JOIN adm_organization org ON enc.organization_id = org.id AND org.delete_flag = '0'
LEFT JOIN adm_healthcare_service hcs ON enc.service_type_id = hcs.id AND hcs.delete_flag = '0'
LEFT JOIN (
SELECT encounter_id, practitioner_id,
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY create_time ASC) AS rn
FROM adm_encounter_participant
WHERE delete_flag = '0' AND type_code IN ('admitter', 'registration_doctor')
) ep ON enc.id = ep.encounter_id AND ep.rn = 1
LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6
-- 排除已在队列中的患者
AND NOT EXISTS (
SELECT 1
FROM hisdev.triage_queue_item tqi
WHERE tqi.encounter_id = enc.id
AND tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
)
-- 排除已在排除列表中的患者(新增)
AND NOT EXISTS (
SELECT 1
FROM hisdev.triage_candidate_exclusion tce
WHERE tce.encounter_id = enc.id
AND tce.delete_flag = '0'
AND tce.exclusion_date = CURRENT_DATE
AND tce.tenant_id = enc.tenant_id
)
ORDER BY enc.create_time DESC;
-- ============================================
-- 查询条件说明
-- ============================================
-- 1. 基础条件:
-- - enc.delete_flag = '0' -- 未删除
-- - enc.class_enum = 1 -- 门诊AMB
-- - ci.context_enum = 1 -- 挂号REGISTER
-- - prc.status_enum = 1 -- 支付成功SUCCESS
--
-- 2. 日期过滤:
-- - enc.create_time::DATE = CURRENT_DATE -- 当日挂号
-- 注意:前端还会基于 registerTime 字段再次过滤今天的数据
--
-- 3. 状态过滤:
-- - enc.status_enum != 6 -- 排除退号(对应前端 statusEnum = -1
--
-- 4. 队列去重:
-- - LEFT JOIN hisdev.triage_queue_item ... WHERE tqi.id IS NULL
-- 或者
-- - NOT EXISTS (SELECT 1 FROM hisdev.triage_queue_item ...)
-- 排除已在队列中且状态不是 COMPLETED 的患者
--
-- 5. 排除列表去重(新增):
-- - LEFT JOIN hisdev.triage_candidate_exclusion ... WHERE tce.id IS NULL
-- 或者
-- - NOT EXISTS (SELECT 1 FROM hisdev.triage_candidate_exclusion ...)
-- 排除已在排除列表中的患者(已加入队列后被记录)
--
-- 6. 租户过滤(如果需要):
-- - enc.tenant_id = ? -- 当前登录用户的租户ID
--
-- 7. 模糊搜索(如果需要):
-- - pt.name LIKE '%关键词%' -- 患者姓名
-- - org.name LIKE '%关键词%' -- 科室名称
-- - pr.name LIKE '%关键词%' -- 医生姓名
-- - hcs.name LIKE '%关键词%' -- 号别名称
-- ============================================
-- 调试查询(检查数据是否正确)
-- ============================================
-- 1. 检查当日已挂号患者总数
SELECT COUNT(*) AS total_registered
FROM adm_encounter enc
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6;
-- 2. 检查已在队列中的患者数量
SELECT COUNT(DISTINCT encounter_id) AS in_queue_count
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED';
-- 3. 检查已在排除列表中的患者数量(新增)
SELECT COUNT(DISTINCT encounter_id) AS in_exclusion_count
FROM hisdev.triage_candidate_exclusion
WHERE delete_flag = '0'
AND exclusion_date = CURRENT_DATE;
-- 4. 检查候选池应该显示的患者数量(已挂号 - 已在队列 - 已在排除列表)
SELECT
(SELECT COUNT(*)
FROM adm_encounter enc
INNER JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
INNER JOIN fin_payment_reconciliation prc ON ci.id::TEXT = ANY(string_to_array(prc.charge_item_ids,','))
AND prc.delete_flag = '0' AND prc.status_enum = 1
WHERE enc.delete_flag = '0'
AND enc.class_enum = 1
AND enc.create_time::DATE = CURRENT_DATE
AND enc.status_enum != 6)
-
(SELECT COUNT(DISTINCT encounter_id)
FROM hisdev.triage_queue_item
WHERE delete_flag = '0'
AND queue_date = CURRENT_DATE
AND status != 'COMPLETED')
-
(SELECT COUNT(DISTINCT encounter_id)
FROM hisdev.triage_candidate_exclusion
WHERE delete_flag = '0'
AND exclusion_date = CURRENT_DATE)
AS candidate_pool_count;
-- 5. 查看队列中的患者详情(用于对比)
SELECT
tqi.encounter_id,
tqi.patient_name,
tqi.status,
tqi.queue_order
FROM hisdev.triage_queue_item tqi
WHERE tqi.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
AND tqi.status != 'COMPLETED'
ORDER BY tqi.queue_order;
-- 6. 查看排除列表中的患者详情(新增)
SELECT
tce.encounter_id,
tce.patient_name,
tce.reason,
tce.create_time
FROM hisdev.triage_candidate_exclusion tce
WHERE tce.delete_flag = '0'
AND tce.exclusion_date = CURRENT_DATE
ORDER BY tce.create_time DESC;
-- 7. 查看重叠的患者(既在队列中,又在排除列表中)
SELECT
tqi.encounter_id,
tqi.patient_name AS queue_patient_name,
tce.patient_name AS exclusion_patient_name,
tqi.status,
tce.reason
FROM hisdev.triage_queue_item tqi
INNER JOIN hisdev.triage_candidate_exclusion tce
ON tqi.encounter_id = tce.encounter_id
AND tqi.queue_date = tce.exclusion_date
AND tqi.tenant_id = tce.tenant_id
WHERE tqi.delete_flag = '0'
AND tce.delete_flag = '0'
AND tqi.queue_date = CURRENT_DATE
ORDER BY tqi.encounter_id;

View File

@@ -0,0 +1,86 @@
-- ============================================
-- 快速检查 pricing_flag = '0' 的数据问题
-- 注意pricing_flag 是 char(1) 类型,所以要用字符串 '0'
-- ============================================
-- 问题1检查是否有费用定价但 pricing_flag = '0' 的项目(可能异常)
SELECT
'异常:有费用定价但不允许划价' AS issue_type,
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
T2.charge_name,
T2.price
FROM wor_activity_definition AS T1
INNER JOIN adm_charge_item_definition AS T2
ON T2.instance_id = T1.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1
AND T2.instance_table = 'wor_activity_definition'
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
AND T1.pricing_flag = '0' -- 不允许划价,但有费用定价(矛盾)
ORDER BY T1.id;
-- 问题2检查是否已被使用但 pricing_flag = '0' 的项目(可能异常)
SELECT
'异常:已有收费记录但不允许划价' AS issue_type,
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.pricing_flag,
COUNT(DISTINCT T3.encounter_id) AS encounter_count,
COUNT(T3.id) AS charge_item_count
FROM wor_activity_definition AS T1
INNER JOIN adm_charge_item AS T3
ON T3.product_id = T1.id
AND T3.context_enum = 3 -- ACTIVITY
AND T3.delete_flag = '0'
WHERE T1.delete_flag = '0'
AND T1.pricing_flag = '0'
GROUP BY T1.id, T1.bus_no, T1.name, T1.pricing_flag
ORDER BY charge_item_count DESC;
-- 问题3查看所有 pricing_flag = '0' 的项目,判断哪些可能应该改为 '1'
SELECT
T1.id,
T1.bus_no,
T1.name AS activity_name,
T1.category_code,
T1.pricing_flag,
T1.status_enum,
CASE
WHEN T2.id IS NOT NULL THEN '有费用定价'
ELSE '无费用定价'
END AS has_charge_definition,
CASE
WHEN EXISTS (
SELECT 1 FROM adm_charge_item
WHERE product_id = T1.id
AND context_enum = 3
AND delete_flag = '0'
) THEN '已被使用'
ELSE '未使用'
END AS usage_status,
CASE
WHEN T2.id IS NOT NULL OR EXISTS (
SELECT 1 FROM adm_charge_item
WHERE product_id = T1.id
AND context_enum = 3
AND delete_flag = '0'
) THEN '建议改为 pricing_flag = ''1'''
ELSE '保持 pricing_flag = ''0''(可能正常)'
END AS suggestion
FROM wor_activity_definition AS T1
LEFT JOIN adm_charge_item_definition AS T2
ON T2.instance_id = T1.id
AND T2.delete_flag = '0'
AND T2.status_enum = 1
AND T2.instance_table = 'wor_activity_definition'
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
AND T1.pricing_flag = '0'
ORDER BY T1.id;

View File

@@ -0,0 +1,123 @@
-- ============================================
-- 将 wor_activity_definition 表中的一两条记录的 pricing_flag 改成 '1'
-- 注意pricing_flag 是 char(1) 类型,所以要用字符串 '1'
-- ============================================
-- 方式1更新前两条 pricing_flag = '0' 的记录(推荐)
UPDATE wor_activity_definition
SET pricing_flag = '1',
update_time = CURRENT_TIMESTAMP
WHERE id IN (
SELECT id
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0'
AND status_enum = 1 -- 只更新激活状态的项目
ORDER BY id
LIMIT 2
);
-- 方式2更新指定 ID 的记录(更精确,推荐使用)
-- 请将下面的 ID 替换为实际要更新的记录 ID
UPDATE wor_activity_definition
SET pricing_flag = '1',
update_time = CURRENT_TIMESTAMP
WHERE id IN (1906532604116348929, 1906544768434053121) -- 替换为实际的 ID
AND delete_flag = '0';
-- 方式3更新前两条记录不管当前 pricing_flag 值是什么)
UPDATE wor_activity_definition
SET pricing_flag = '1',
update_time = CURRENT_TIMESTAMP
WHERE id IN (
SELECT id
FROM wor_activity_definition
WHERE delete_flag = '0'
AND status_enum = 1
ORDER BY id
LIMIT 2
);
-- 方式4更新有费用定价但 pricing_flag = '0' 的前两条记录(业务逻辑更合理)
UPDATE wor_activity_definition
SET pricing_flag = '1',
update_time = CURRENT_TIMESTAMP
WHERE id IN (
SELECT wad.id
FROM wor_activity_definition wad
INNER JOIN adm_charge_item_definition acid
ON acid.instance_id = wad.id
AND acid.delete_flag = '0'
AND acid.status_enum = 1
AND acid.instance_table = 'wor_activity_definition'
WHERE wad.delete_flag = '0'
AND wad.status_enum = 1
AND wad.pricing_flag = '0'
ORDER BY wad.id
LIMIT 2
);
-- ============================================
-- 执行前可以先查询要更新的记录(验证用)
-- ============================================
-- 查询前两条 pricing_flag = '0' 的记录
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
status_enum,
create_time,
update_time
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '0'
AND status_enum = 1
ORDER BY id
LIMIT 2;
-- 查询有费用定价但 pricing_flag = '0' 的记录
SELECT
wad.id,
wad.bus_no,
wad.name AS activity_name,
wad.pricing_flag,
acid.charge_name,
acid.price
FROM wor_activity_definition wad
INNER JOIN adm_charge_item_definition acid
ON acid.instance_id = wad.id
AND acid.delete_flag = '0'
AND acid.status_enum = 1
AND acid.instance_table = 'wor_activity_definition'
WHERE wad.delete_flag = '0'
AND wad.status_enum = 1
AND wad.pricing_flag = '0'
ORDER BY wad.id
LIMIT 2;
-- ============================================
-- 执行后验证更新结果
-- ============================================
-- 验证更新是否成功
SELECT
id,
bus_no,
name AS activity_name,
pricing_flag,
update_time
FROM wor_activity_definition
WHERE id IN (
-- 这里放刚才更新的 ID或者用子查询
SELECT id
FROM wor_activity_definition
WHERE delete_flag = '0'
AND pricing_flag = '1'
AND status_enum = 1
ORDER BY update_time DESC
LIMIT 2
);