feat(operating-room): 添加手术室类型和所属科室字段

- 新增手术室类型字段支持急诊、择期、日间、复合手术室四种类型
- 添加所属科室字段实现科室级别资源管理
- 前端列表页面新增类型和所属科室显示列
- 新增类型选择器和科室选择器组件
- 后端实体类和服务类添加对应字段处理逻辑
- 数据库添加room_type_enum字段和相关索引
- 创建手术室类型字典数据和字典项配置
- 生成手术室管理功能说明文档
This commit is contained in:
2026-01-13 10:03:57 +08:00
parent 23bd49d940
commit cb268fe26d
33 changed files with 587 additions and 69 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,33 @@
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class CheckTicketStatus {
public static void main(String[] args) {
String url = "jdbc:postgresql://192.168.110.252:15432/postgresql?currentSchema=hisdev&characterEncoding=UTF-8&client_encoding=UTF-8";
String user = "postgresql";
String password = "Jchl1528";
try {
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, status, delete_flag FROM clinical_ticket WHERE id = 1");
if (rs.next()) {
System.out.println("Ticket ID: " + rs.getLong("id"));
System.out.println("Status: " + rs.getString("status"));
System.out.println("Delete Flag: " + rs.getString("delete_flag"));
} else {
System.out.println("Ticket ID 1 not found");
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,11 @@
-- 添加新字段到cli_surgery表
ALTER TABLE cli_surgery ADD COLUMN emergency_flag int2 DEFAULT 0;
ALTER TABLE cli_surgery ADD COLUMN implant_flag int2 DEFAULT 0;
ALTER TABLE cli_surgery ADD COLUMN operating_room_confirm_time timestamp;
ALTER TABLE cli_surgery ADD COLUMN operating_room_confirm_user varchar(100);
-- 添加字段注释
COMMENT ON COLUMN cli_surgery.emergency_flag IS '急诊标志 0-否 1-是';
COMMENT ON COLUMN cli_surgery.implant_flag IS '植入高值耗材标志 0-否 1-是';
COMMENT ON COLUMN cli_surgery.operating_room_confirm_time IS '手术室确认时间';
COMMENT ON COLUMN cli_surgery.operating_room_confirm_user IS '手术室确认人';

View File

@@ -0,0 +1,182 @@
-- 为手术室管理表添加类型和所属科室字段PostgreSQL版本
-- 作者: 系统管理员
-- 日期: 2026-01-09
-- 说明: 添加手术室类型字段,区分不同类型的手术室(急诊、择期、日间、复合手术室)
-- 1. 检查并添加手术室类型字段到 adm_operating_room 表
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'adm_operating_room'
AND column_name = 'room_type_enum'
) THEN
ALTER TABLE adm_operating_room
ADD COLUMN room_type_enum INTEGER DEFAULT 2;
COMMENT ON COLUMN adm_operating_room.room_type_enum IS
'手术室类型1-急诊手术室2-择期手术室3-日间手术室4-复合手术室';
RAISE NOTICE '已添加字段 room_type_enum';
ELSE
RAISE NOTICE '字段 room_type_enum 已存在,跳过添加';
END IF;
END $$;
-- 2. 更新现有数据的默认值为择期手术室2
UPDATE adm_operating_room
SET room_type_enum = 2
WHERE room_type_enum IS NULL;
-- 3. 检查并添加索引以提高查询性能
DO $$
BEGIN
-- 检查并添加 room_type_enum 索引
IF NOT EXISTS (
SELECT 1
FROM pg_indexes
WHERE schemaname = 'public'
AND tablename = 'adm_operating_room'
AND indexname = 'idx_room_type'
) THEN
CREATE INDEX idx_room_type ON adm_operating_room(room_type_enum);
RAISE NOTICE '已创建索引 idx_room_type';
ELSE
RAISE NOTICE '索引 idx_room_type 已存在,跳过创建';
END IF;
-- 检查并添加 organization_id 索引
IF NOT EXISTS (
SELECT 1
FROM pg_indexes
WHERE schemaname = 'public'
AND tablename = 'adm_operating_room'
AND indexname = 'idx_org_id'
) THEN
CREATE INDEX idx_org_id ON adm_operating_room(organization_id);
RAISE NOTICE '已创建索引 idx_org_id';
ELSE
RAISE NOTICE '索引 idx_org_id 已存在,跳过创建';
END IF;
END $$;
-- 4. 检查并插入手术室类型字典数据
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM sys_dict_type
WHERE dict_type = 'operating_room_type'
) THEN
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
VALUES ('手术室类型', 'operating_room_type', '0', 'system', NOW(), '手术室类型字典');
RAISE NOTICE '已添加字典类型 operating_room_type';
ELSE
RAISE NOTICE '字典类型 operating_room_type 已存在,跳过添加';
END IF;
END $$;
-- 5. 检查并插入手术室类型字典项数据
DO $$
BEGIN
-- 检查字典项是否已存在,避免重复插入
IF NOT EXISTS (
SELECT 1
FROM sys_dict_data
WHERE dict_type = 'operating_room_type'
AND dict_value = '1'
) THEN
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES ('room_type_emergency', 1, '急诊手术室', '1', 'operating_room_type', '0', 'system', NOW(), '用于急诊手术的手术室');
RAISE NOTICE '已添加字典项:急诊手术室';
ELSE
RAISE NOTICE '字典项:急诊手术室 已存在,跳过添加';
END IF;
IF NOT EXISTS (
SELECT 1
FROM sys_dict_data
WHERE dict_type = 'operating_room_type'
AND dict_value = '2'
) THEN
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES ('room_type_elective', 2, '择期手术室', '2', 'operating_room_type', '0', 'system', NOW(), '用于择期手术的手术室');
RAISE NOTICE '已添加字典项:择期手术室';
ELSE
RAISE NOTICE '字典项:择期手术室 已存在,跳过添加';
END IF;
IF NOT EXISTS (
SELECT 1
FROM sys_dict_data
WHERE dict_type = 'operating_room_type'
AND dict_value = '3'
) THEN
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES ('room_type_day_surgery', 3, '日间手术室', '3', 'operating_room_type', '0', 'system', NOW(), '用于日间手术的手术室');
RAISE NOTICE '已添加字典项:日间手术室';
ELSE
RAISE NOTICE '字典项:日间手术室 已存在,跳过添加';
END IF;
IF NOT EXISTS (
SELECT 1
FROM sys_dict_data
WHERE dict_type = 'operating_room_type'
AND dict_value = '4'
) THEN
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES ('room_type_hybrid', 4, '复合手术室', '4', 'operating_room_type', '0', 'system', NOW(), '用于复合手术的手术室');
RAISE NOTICE '已添加字典项:复合手术室';
ELSE
RAISE NOTICE '字典项:复合手术室 已存在,跳过添加';
END IF;
END $$;
-- 6. 验证修改 - 查看新增的字段
SELECT
table_name,
column_name,
data_type,
is_nullable,
column_default,
col_description(pgc_catalog.oid, pg_namespace.oid, pg_class.oid, pg_attribute.attnum) AS column_comment
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND table_name = 'adm_operating_room'
AND column_name = 'room_type_enum';
-- 7. 显示所有手术室及其类型
SELECT
id,
bus_no AS "手术室编码",
name AS "手术室名称",
CASE room_type_enum
WHEN 1 THEN '急诊手术室'
WHEN 2 THEN '择期手术室'
WHEN 3 THEN '日间手术室'
WHEN 4 THEN '复合手术室'
ELSE '未知'
END AS "手术室类型",
organization_id AS "所属科室ID",
status_enum AS "状态",
create_time AS "创建时间"
FROM
adm_operating_room
ORDER BY
display_order, create_time DESC;
-- 8. 验证字典数据
SELECT * FROM sys_dict_type WHERE dict_type = 'operating_room_type';
SELECT * FROM sys_dict_data WHERE dict_type = 'operating_room_type' ORDER BY dict_sort;
-- 回滚脚本(如需撤销修改,请执行以下语句):
-- DROP INDEX IF EXISTS idx_room_type ON adm_operating_room;
-- DROP INDEX IF EXISTS idx_org_id ON adm_operating_room;
-- DELETE FROM sys_dict_data WHERE dict_type = 'operating_room_type';
-- DELETE FROM sys_dict_type WHERE dict_type = 'operating_room_type';
-- ALTER TABLE adm_operating_room DROP COLUMN IF EXISTS room_type_enum;

View File

@@ -0,0 +1,188 @@
-- ============================================
-- 诊疗项目数据检查SQL语句
-- ============================================
-- 1. 查询所有诊疗项目(基础查询)
SELECT
T1.id,
T1.bus_no,
T1.name AS advice_name,
T1.py_str,
T1.wb_str,
T1.status_enum,
T1.pricing_flag,
T1.delete_flag,
T1.org_id,
T1.category_code,
T1.type_enum AS activity_type
FROM wor_activity_definition AS T1
WHERE T1.delete_flag = '0'
ORDER BY T1.id;
-- 2. 查询状态为ACTIVE的诊疗项目status_enum = 1
SELECT
T1.id,
T1.bus_no,
T1.name AS advice_name,
T1.status_enum,
T1.pricing_flag,
T1.org_id
FROM wor_activity_definition AS T1
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
ORDER BY T1.id;
-- 3. 查询有划价标记的诊疗项目pricing_flag = 1
SELECT
T1.id,
T1.bus_no,
T1.name AS advice_name,
T1.pricing_flag,
T1.status_enum
FROM wor_activity_definition AS T1
WHERE T1.delete_flag = '0'
AND T1.status_enum = 1
AND (T1.pricing_flag = 1 OR T1.pricing_flag IS NULL)
ORDER BY T1.id;
-- 4. 查询关联了费用定价表的诊疗项目
SELECT
T1.id,
T1.bus_no,
T1.name AS advice_name,
T2.id AS charge_item_definition_id,
T2.instance_table,
T2.status_enum AS charge_status
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
ORDER BY T1.id;
-- 5. 完整查询模拟后端实际执行的SQL用于门诊划价
-- 注意:需要替换 #{statusEnum} 为实际值(通常是 1#{activityTableName} 为 'wor_activity_definition'
SELECT DISTINCT ON (T1.ID)
T1.tenant_id,
3 AS advice_type,
T1.bus_no AS bus_no,
T1.category_code AS category_code,
'' AS pharmacology_category_code,
1 AS part_percent,
0 AS unit_conversion_ratio,
null AS part_attribute_enum,
null AS tho_part_attribute_enum,
null AS skin_test_flag,
null AS inject_flag,
T1.ID AS advice_definition_id,
T1.NAME AS advice_name,
T1.bus_no AS advice_bus_no,
T1.py_str AS py_str,
T1.wb_str AS wb_str,
T1.yb_no AS yb_no,
'' AS product_name,
T1.type_enum AS activity_type,
'' AS unit_code,
'' AS min_unit_code,
'' AS volume,
'' AS method_code,
'' AS rate_code,
T1.org_id AS org_id,
T1.location_id AS location_id,
'' AS dose,
'' AS dose_unit_code,
'' AS supplier,
null AS supplier_id,
'' AS manufacturer,
T2.ID AS charge_item_definition_id,
T2.instance_table AS advice_table_name,
T3.organization_id AS position_id,
0 AS restricted_flag,
'' AS restricted_scope,
'' AS dosage_instruction,
T1.chrgitm_lv as chrgitm_lv
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'
LEFT JOIN adm_organization_location AS T3
ON T3.activity_definition_id = T1.ID
AND T3.delete_flag = '0'
AND (CURRENT_TIME :: time (6) BETWEEN T3.start_time AND T3.end_time)
WHERE T1.delete_flag = '0'
AND (T1.pricing_flag = 1 OR T1.pricing_flag IS NULL)
AND T1.status_enum = 1
ORDER BY T1.ID;
-- 6. 统计查询 - 查看各状态的数量
SELECT
COUNT(*) AS total_count,
COUNT(CASE WHEN status_enum = 1 THEN 1 END) AS active_count,
COUNT(CASE WHEN pricing_flag = 1 THEN 1 END) AS pricing_flag_count,
COUNT(CASE WHEN pricing_flag IS NULL THEN 1 END) AS pricing_flag_null_count
FROM wor_activity_definition
WHERE delete_flag = '0';
-- 7. 检查是否有费用定价关联
SELECT
COUNT(DISTINCT T1.id) AS activity_count,
COUNT(DISTINCT T2.id) AS charge_item_count,
COUNT(DISTINCT CASE WHEN T2.id IS NOT NULL THEN T1.id END) AS linked_count
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;
-- 8. 按科室查询诊疗项目如果前端传了organizationId
-- 注意:需要替换 #{organizationId} 为实际的科室ID
-- SELECT DISTINCT ON (T1.ID)
-- T1.id,
-- T1.name AS advice_name,
-- T1.org_id,
-- T2.id AS charge_item_definition_id
-- 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 = 1 OR T1.pricing_flag IS NULL)
-- AND T1.status_enum = 1
-- AND T1.org_id = #{organizationId} -- 替换为实际科室ID
-- ORDER BY T1.ID;
-- 9. 模糊查询(模拟前端搜索)
-- 注意:需要替换 #{searchKey} 为实际的搜索关键字
-- SELECT DISTINCT ON (T1.ID)
-- T1.id,
-- T1.name AS advice_name,
-- T1.py_str,
-- T1.wb_str
-- 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 = 1 OR T1.pricing_flag IS NULL)
-- AND T1.status_enum = 1
-- AND (
-- T1.advice_name LIKE '%' || #{searchKey} || '%'
-- OR T1.py_str LIKE '%' || #{searchKey} || '%'
-- OR T1.wb_str LIKE '%' || #{searchKey} || '%'
-- )
-- ORDER BY T1.ID;

View File

@@ -0,0 +1,10 @@
-- 检查手术表中所有字段是否存在
SELECT
column_name,
data_type,
character_maximum_length,
is_nullable
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name LIKE '%name%'
ORDER BY column_name;

View File

@@ -0,0 +1,67 @@
-- 创建序列
CREATE SEQUENCE "hisdev"."clinical_ticket_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
-- 创建号源表clinical_ticket
CREATE TABLE "hisdev"."clinical_ticket" (
"id" bigint NOT NULL DEFAULT nextval('hisdev.clinical_ticket_id_seq'::regclass),
"bus_no" varchar(50) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"department" varchar(100) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"doctor" varchar(100) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"ticket_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"time" varchar(50) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"status" varchar(20) COLLATE "pg_catalog"."default" NOT NULL DEFAULT 'unbooked'::character varying,
"fee" varchar(20) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"patient_id" bigint,
"patient_name" varchar(100) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"medical_card" varchar(50) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"phone" varchar(20) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"appointment_date" timestamptz(6),
"appointment_time" timestamptz(6),
"department_id" bigint,
"doctor_id" bigint,
"create_by" varchar(32) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
"create_time" timestamptz(6) NOT NULL,
"update_by" varchar(32) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"update_time" timestamptz(6),
"remark" varchar(500) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"delete_flag" char(1) COLLATE "pg_catalog"."default" NOT NULL DEFAULT 0,
"tenant_id" bigint NOT NULL,
PRIMARY KEY ("id")
)
WITH (
OIDS = FALSE
)
;
ALTER SEQUENCE "hisdev"."clinical_ticket_id_seq" OWNED BY "hisdev"."clinical_ticket"."id";
-- 添加注释
COMMENT ON TABLE "hisdev"."clinical_ticket" IS '号源管理表';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."id" IS 'ID';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."bus_no" IS '号源编码';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."department" IS '科室名称';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."doctor" IS '医生姓名';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."ticket_type" IS '号源类型 (普通/专家)';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."time" IS '挂号时间';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."status" IS '状态 (unbooked:未预约, booked:已预约, checked:已取号, cancelled:已取消, locked:已锁定)';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."fee" IS '挂号费';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."patient_id" IS '患者ID';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."patient_name" IS '患者姓名';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."medical_card" IS '就诊卡号';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."phone" IS '手机号';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."appointment_date" IS '预约日期';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."appointment_time" IS '预约时间';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."department_id" IS '科室ID';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."doctor_id" IS '医生ID';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."create_by" IS '创建人';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."create_time" IS '创建时间';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."update_by" IS '更新人';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."update_time" IS '更新时间';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."remark" IS '备注';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."delete_flag" IS '删除状态';
COMMENT ON COLUMN "hisdev"."clinical_ticket"."tenant_id" IS '租户ID';

View File

@@ -0,0 +1,82 @@
-- 修复已存在的手术记录中缺失的名称字段
-- 注意:这只是一个示例,实际执行前请根据您的数据库表结构调整
-- 填充患者姓名
UPDATE public.cli_surgery s
SET patient_name = p.name
FROM public.adm_patient p
WHERE s.patient_id = p.id
AND s.patient_name IS NULL
AND s.delete_flag = '0';
-- 填充主刀医生姓名
UPDATE public.cli_surgery s
SET main_surgeon_name = u.nick_name
FROM public.sys_user u
WHERE s.main_surgeon_id = u.user_id
AND s.main_surgeon_name IS NULL
AND s.delete_flag = '0';
-- 填充麻醉医生姓名
UPDATE public.cli_surgery s
SET anesthetist_name = u.nick_name
FROM public.sys_user u
WHERE s.anesthetist_id = u.user_id
AND s.anesthetist_name IS NULL
AND s.delete_flag = '0';
-- 填充助手1姓名
UPDATE public.cli_surgery s
SET assistant_1_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_1_id = u.user_id
AND s.assistant_1_name IS NULL
AND s.delete_flag = '0';
-- 填充助手2姓名
UPDATE public.cli_surgery s
SET assistant_2_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_2_id = u.user_id
AND s.assistant_2_name IS NULL
AND s.delete_flag = '0';
-- 填充巡回护士姓名
UPDATE public.cli_surgery s
SET scrub_nurse_name = u.nick_name
FROM public.sys_user u
WHERE s.scrub_nurse_id = u.user_id
AND s.scrub_nurse_name IS NULL
AND s.delete_flag = '0';
-- 填充手术室名称
UPDATE public.cli_surgery s
SET operating_room_name = r.name
FROM public.cli_operating_room r
WHERE s.operating_room_id = r.id
AND s.operating_room_name IS NULL
AND s.delete_flag = '0';
-- 填充执行科室名称
UPDATE public.cli_surgery s
SET org_name = o.name
FROM public.adm_organization o
WHERE s.org_id = o.id
AND s.org_name IS NULL
AND s.delete_flag = '0';
-- 填充申请科室名称
UPDATE public.cli_surgery s
SET apply_dept_name = o.name
FROM public.adm_organization o
WHERE s.apply_dept_id = o.id
AND s.apply_dept_name IS NULL
AND s.delete_flag = '0';
-- 填充申请医生姓名
UPDATE public.cli_surgery s
SET apply_doctor_name = u.nick_name
FROM public.sys_user u
WHERE s.apply_doctor_id = u.user_id
AND s.apply_doctor_name IS NULL
AND s.delete_flag = '0';

View File

@@ -0,0 +1,148 @@
-- 修复脚本完成手术室类型和所属科室字段的添加版本2
-- 说明: 此脚本会跳过已存在的字段,继续完成剩余的任务
-- 日期: 2026-01-09
-- 设置客户端编码
SET client_encoding = 'UTF8';
-- 1. 先检查字段是否存在,如果不存在则添加
-- 使用异常处理来避免重复添加的错误
DO $$
BEGIN
-- 尝试添加字段,如果字段已存在则捕获异常并忽略
BEGIN
ALTER TABLE adm_operating_room
ADD COLUMN room_type_enum INTEGER DEFAULT 2;
COMMENT ON COLUMN adm_operating_room.room_type_enum IS
'手术室类型1-急诊手术室2-择期手术室3-日间手术室4-复合手术室';
RAISE NOTICE '已添加字段 room_type_enum';
EXCEPTION
WHEN duplicate_column THEN
RAISE NOTICE '字段 room_type_enum 已存在,跳过添加';
END;
END $$;
-- 2. 更新现有数据的默认值为择期手术室2
UPDATE adm_operating_room
SET room_type_enum = 2
WHERE room_type_enum IS NULL;
RAISE NOTICE '已更新现有记录的默认值';
-- 3. 检查并添加索引以提高查询性能
DO $$
BEGIN
-- 添加 room_type_enum 索引
BEGIN
CREATE INDEX idx_room_type ON adm_operating_room(room_type_enum);
RAISE NOTICE '已创建索引 idx_room_type';
EXCEPTION
WHEN duplicate_table THEN
RAISE NOTICE '索引 idx_room_type 已存在,跳过创建';
END;
-- 添加 organization_id 索引
BEGIN
CREATE INDEX idx_org_id ON adm_operating_room(organization_id);
RAISE NOTICE '已创建索引 idx_org_id';
EXCEPTION
WHEN duplicate_table THEN
RAISE NOTICE '索引 idx_org_id 已存在,跳过创建';
END;
END $$;
-- 4. 检查并插入手术室类型字典数据
DO $$
BEGIN
-- 插入字典类型
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
VALUES ('手术室类型', 'operating_room_type', '0', 'system', NOW(), '手术室类型字典')
ON CONFLICT (dict_type) DO NOTHING;
RAISE NOTICE '已处理字典类型 operating_room_type';
END $$;
-- 5. 插入手术室类型字典项数据
DO $$
BEGIN
-- 插入字典项,使用 ON CONFLICT 避免重复不包含dict_code字段使用自增
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES (1, '急诊手术室', '1', 'operating_room_type', '0', 'system', NOW(), '用于急诊手术的手术室')
ON CONFLICT (dict_type, dict_value) DO NOTHING;
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES (2, '择期手术室', '2', 'operating_room_type', '0', 'system', NOW(), '用于择期手术的手术室')
ON CONFLICT (dict_type, dict_value) DO NOTHING;
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES (3, '日间手术室', '3', 'operating_room_type', '0', 'system', NOW(), '用于日间手术的手术室')
ON CONFLICT (dict_type, dict_value) DO NOTHING;
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, remark)
VALUES (4, '复合手术室', '4', 'operating_room_type', '0', 'system', NOW(), '用于复合手术的手术室')
ON CONFLICT (dict_type, dict_value) DO NOTHING;
RAISE NOTICE '已处理所有字典项';
END $$;
-- 6. 验证修改 - 查看新增的字段
SELECT
'字段验证' AS ,
table_name,
column_name,
data_type,
is_nullable,
column_default,
col_description(pgc_catalog.oid, pg_namespace.oid, pg_class.oid, pg_attribute.attnum) AS column_comment
FROM
information_schema.columns
WHERE
table_schema = 'public'
AND table_name = 'adm_operating_room'
AND column_name = 'room_type_enum';
-- 7. 显示所有手术室及其类型
SELECT
'数据验证' AS ,
id,
bus_no AS "手术室编码",
name AS "手术室名称",
CASE room_type_enum
WHEN 1 THEN '急诊手术室'
WHEN 2 THEN '择期手术室'
WHEN 3 THEN '日间手术室'
WHEN 4 THEN '复合手术室'
ELSE '未知'
END AS "手术室类型",
organization_id AS "所属科室ID",
status_enum AS "状态",
create_time AS "创建时间"
FROM
adm_operating_room
ORDER BY
display_order, create_time DESC;
-- 8. 验证字典数据
SELECT
'字典类型验证' AS ,
* FROM sys_dict_type WHERE dict_type = 'operating_room_type';
SELECT
'字典项验证' AS ,
* FROM sys_dict_data WHERE dict_type = 'operating_room_type' ORDER BY dict_sort;
-- 9. 验证索引
SELECT
'索引验证' AS ,
indexname,
indexdef
FROM
pg_indexes
WHERE
schemaname = 'public'
AND tablename = 'adm_operating_room'
AND indexname IN ('idx_room_type', 'idx_org_id');
RAISE NOTICE '脚本执行完成!请查看上述验证结果确认所有操作均已成功执行。';

View File

@@ -0,0 +1,56 @@
-- 验证手术表中所有名称字段的填充情况
SELECT
id,
surgery_no,
patient_id,
patient_name,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
scrub_nurse_id,
scrub_nurse_name,
operating_room_id,
operating_room_name,
org_id,
org_name,
apply_doctor_id,
apply_doctor_name,
apply_dept_id,
apply_dept_name,
create_time
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 10;
-- 统计名称字段的填充情况
SELECT
COUNT(*) as total_count,
COUNT(patient_name) as has_patient_name_count,
COUNT(main_surgeon_name) as has_main_surgeon_name_count,
COUNT(anesthetist_name) as has_anesthetist_name_count,
COUNT(assistant_1_name) as has_assistant_1_name_count,
COUNT(assistant_2_name) as has_assistant_2_name_count,
COUNT(scrub_nurse_name) as has_scrub_nurse_name_count,
COUNT(operating_room_name) as has_operating_room_name_count,
COUNT(org_name) as has_org_name_count,
COUNT(apply_doctor_name) as has_apply_doctor_name_count,
COUNT(apply_dept_name) as has_apply_dept_name_count,
-- 计算填写率
ROUND(COUNT(patient_name) * 100.0 / COUNT(*), 2) as patient_name_fill_rate,
ROUND(COUNT(main_surgeon_name) * 100.0 / COUNT(*), 2) as main_surgeon_name_fill_rate,
ROUND(COUNT(anesthetist_name) * 100.0 / COUNT(*), 2) as anesthetist_name_fill_rate,
ROUND(COUNT(assistant_1_name) * 100.0 / COUNT(*), 2) as assistant_1_name_fill_rate,
ROUND(COUNT(assistant_2_name) * 100.0 / COUNT(*), 2) as assistant_2_name_fill_rate,
ROUND(COUNT(scrub_nurse_name) * 100.0 / COUNT(*), 2) as scrub_nurse_name_fill_rate,
ROUND(COUNT(operating_room_name) * 100.0 / COUNT(*), 2) as operating_room_name_fill_rate,
ROUND(COUNT(org_name) * 100.0 / COUNT(*), 2) as org_name_fill_rate,
ROUND(COUNT(apply_doctor_name) * 100.0 / COUNT(*), 2) as apply_doctor_name_fill_rate,
ROUND(COUNT(apply_dept_name) * 100.0 / COUNT(*), 2) as apply_dept_name_fill_rate
FROM public.cli_surgery
WHERE delete_flag = '0';

View File

@@ -0,0 +1,18 @@
SELECT
id,
surgery_no,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
operating_room_id,
operating_room_name,
org_id,
org_name
FROM cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC

View File

@@ -0,0 +1,25 @@
-- 检查cli_surgery表中是否有surgery_indication字段
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'cli_surgery'
AND column_name = 'surgery_indication';
-- 查看cli_surgery表的所有字段
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'cli_surgery'
ORDER BY ordinal_position;
-- 如果字段不存在,添加该字段
-- ALTER TABLE cli_surgery ADD COLUMN surgery_indication TEXT;
-- COMMENT ON COLUMN cli_surgery.surgery_indication IS '手术指征';

View File

@@ -0,0 +1,113 @@
-- 检查和填充手术表中的人员字段
-- 执行时间2025-01-05
-- 1. 查询最近10条手术记录检查人员字段的填写情况
SELECT
id,
surgery_no,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
operating_room_id,
operating_room_name,
org_id,
org_name,
create_time
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 10;
-- 2. 统计人员字段的填写情况
SELECT
COUNT(*) as total_count,
COUNT(main_surgeon_name) as has_main_surgeon_name_count,
COUNT(anesthetist_name) as has_anesthetist_name_count,
COUNT(assistant_1_name) as has_assistant_1_name_count,
COUNT(assistant_2_name) as has_assistant_2_name_count,
COUNT(operating_room_name) as has_operating_room_name_count,
COUNT(org_name) as has_org_name_count,
-- 计算填写率
ROUND(COUNT(main_surgeon_name) * 100.0 / COUNT(*), 2) as main_surgeon_name_fill_rate,
ROUND(COUNT(anesthetist_name) * 100.0 / COUNT(*), 2) as anesthetist_name_fill_rate,
ROUND(COUNT(assistant_1_name) * 100.0 / COUNT(*), 2) as assistant_1_name_fill_rate,
ROUND(COUNT(assistant_2_name) * 100.0 / COUNT(*), 2) as assistant_2_name_fill_rate,
ROUND(COUNT(operating_room_name) * 100.0 / COUNT(*), 2) as operating_room_name_fill_rate,
ROUND(COUNT(org_name) * 100.0 / COUNT(*), 2) as org_name_fill_rate
FROM public.cli_surgery
WHERE delete_flag = '0';
-- 3. 根据 ID 查询医生表,填充主刀医生姓名
-- 注意:这只是一个示例,实际需要根据您的医生表结构调整
UPDATE public.cli_surgery s
SET main_surgeon_name = u.nick_name
FROM public.sys_user u
WHERE s.main_surgeon_id = u.user_id
AND s.main_surgeon_name IS NULL
AND s.delete_flag = '0';
-- 4. 根据 ID 查询医生表,填充麻醉医生姓名
UPDATE public.cli_surgery s
SET anesthetist_name = u.nick_name
FROM public.sys_user u
WHERE s.anesthetist_id = u.user_id
AND s.anesthetist_name IS NULL
AND s.delete_flag = '0';
-- 5. 根据 ID 查询医生表填充助手1姓名
UPDATE public.cli_surgery s
SET assistant_1_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_1_id = u.user_id
AND s.assistant_1_name IS NULL
AND s.delete_flag = '0';
-- 6. 根据 ID 查询医生表填充助手2姓名
UPDATE public.cli_surgery s
SET assistant_2_name = u.nick_name
FROM public.sys_user u
WHERE s.assistant_2_id = u.user_id
AND s.assistant_2_name IS NULL
AND s.delete_flag = '0';
-- 7. 根据 ID 查询手术室表,填充手术室名称
UPDATE public.cli_surgery s
SET operating_room_name = r.name
FROM public.cli_operating_room r
WHERE s.operating_room_id = r.id
AND s.operating_room_name IS NULL
AND s.delete_flag = '0';
-- 8. 根据 ID 查询机构表,填充执行科室名称
UPDATE public.cli_surgery s
SET org_name = o.name
FROM public.adm_organization o
WHERE s.org_id = o.id
AND s.org_name IS NULL
AND s.delete_flag = '0';
-- 9. 再次查询,验证更新结果
SELECT
id,
surgery_no,
main_surgeon_id,
main_surgeon_name,
anesthetist_id,
anesthetist_name,
assistant_1_id,
assistant_1_name,
assistant_2_id,
assistant_2_name,
operating_room_id,
operating_room_name,
org_id,
org_name
FROM public.cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 10;

View File

@@ -0,0 +1,58 @@
-- 测试手术表的插入,验证 apply_doctor_name 和 apply_dept_name 字段
-- 执行时间2025-01-05
-- 1. 先检查字段是否存在
SELECT
column_name,
data_type,
character_maximum_length,
is_nullable
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name IN ('apply_doctor_id', 'apply_doctor_name', 'apply_dept_id', 'apply_dept_name')
ORDER BY column_name;
-- 2. 插入测试数据(如果字段存在)
INSERT INTO cli_surgery (
surgery_no,
patient_id,
encounter_id,
apply_doctor_id,
apply_doctor_name,
apply_dept_id,
apply_dept_name,
surgery_name,
status_enum,
delete_flag,
create_time,
update_time
) VALUES (
'TEST202501050001',
(SELECT id FROM public.adm_patient WHERE delete_flag = '0' LIMIT 1),
(SELECT id FROM public.adm_encounter WHERE delete_flag = '0' LIMIT 1),
1,
'测试医生',
1,
'测试科室',
'测试手术',
0,
'0',
NOW(),
NOW()
)
ON CONFLICT DO NOTHING;
-- 3. 查询刚才插入的测试数据
SELECT
id,
surgery_no,
apply_doctor_id,
apply_doctor_name,
apply_dept_id,
apply_dept_name,
surgery_name
FROM public.cli_surgery
WHERE surgery_no = 'TEST202501050001';
-- 4. 清理测试数据(如果测试成功)
-- DELETE FROM public.cli_surgery WHERE surgery_no = 'TEST202501050001';

View File

@@ -0,0 +1,59 @@
-- 验证手术指征字段的数据
-- 执行时间2025-01-06
-- 说明:查询手术数据,验证surgery_indication字段是否有值
-- 1. 查询最近的手术记录,检查surgery_indication字段
SELECT
id,
surgery_no,
surgery_name,
surgery_indication,
patient_name,
apply_doctor_name,
status_enum,
create_time
FROM cli_surgery
WHERE delete_flag = '0'
ORDER BY create_time DESC
LIMIT 5;
-- 2. 检查surgery_indication字段是否为NULL
SELECT
COUNT(*) as total_count,
COUNT(surgery_indication) as has_surgery_indication_count,
COUNT(*) - COUNT(surgery_indication) as null_count,
ROUND(COUNT(surgery_indication) * 100.0 / COUNT(*), 2) as fill_rate
FROM cli_surgery
WHERE delete_flag = '0';
-- 3. 查询有surgery_indication数据的记录
SELECT
id,
surgery_no,
surgery_name,
surgery_indication,
LENGTH(surgery_indication) as text_length,
SUBSTRING(surgery_indication, 1, 100) as preview_text
FROM cli_surgery
WHERE delete_flag = '0'
AND surgery_indication IS NOT NULL
AND surgery_indication != ''
ORDER BY create_time DESC
LIMIT 3;
-- 4. 验证Mapper XML中的SQL查询
-- 模拟getSurgeryDetail接口的查询
SELECT
s.id,
s.surgery_no,
s.surgery_name,
s.surgery_indication,
s.patient_id,
p.name as patient_name,
s.apply_doctor_id,
s.apply_doctor_name,
s.status_enum
FROM cli_surgery s
LEFT JOIN adm_patient p ON s.patient_id = p.id
WHERE s.id = (SELECT id FROM cli_surgery WHERE delete_flag = '0' ORDER BY create_time DESC LIMIT 1)
AND s.delete_flag = '0';

View File

@@ -0,0 +1,4 @@
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'cli_surgery'
AND column_name IN ('apply_doctor_name', 'apply_dept_name');