76 门诊预约挂号

This commit is contained in:
ljj
2026-01-09 11:33:03 +08:00
parent 062c4a92b8
commit 8c74d45332
42 changed files with 8627 additions and 258 deletions

View File

@@ -0,0 +1,115 @@
-- 创建序列
CREATE SEQUENCE order_main_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
-- 创建订单主表
CREATE TABLE "order_main" (
-- 主键字段
"id" int8 NOT NULL DEFAULT nextval('order_main_id_seq'::regclass),
-- 业务核心字段
"order_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 订单号
"patient_id" int8, -- 患者ID
"patient_name" varchar(50) COLLATE "pg_catalog"."default", -- 患者姓名
"medical_card" varchar(32) COLLATE "pg_catalog"."default", -- 就诊卡号
"phone" varchar(20) COLLATE "pg_catalog"."default", -- 手机号
"gender" int4, -- 性别1-男2-女)
"schedule_id" int8, -- 排班ID
"slot_id" int8, -- 号源ID
"department_id" int8, -- 科室ID
"department_name" varchar(100) COLLATE "pg_catalog"."default", -- 科室名称
"doctor_id" int8, -- 医生ID
"doctor_name" varchar(50) COLLATE "pg_catalog"."default", -- 医生姓名
"reg_type" varchar(10) COLLATE "pg_catalog"."default", -- 号别(普通/专家)
"fee" numeric(10,2), -- 挂号费
"appointment_date" timestamptz(6), -- 预约日期
"appointment_time" timestamptz(6), -- 预约时间
"cancel_time" timestamptz(6), -- 取消时间
"cancel_reason" varchar(200) COLLATE "pg_catalog"."default", -- 取消原因
"status" int4 NOT NULL DEFAULT 1, -- 状态1-预约中2-已完成3-已取消)
"pay_status" int4 NOT NULL DEFAULT 0, -- 支付状态0-未支付1-已支付)
"version" int4 NOT NULL DEFAULT 0, -- 版本号(乐观锁)
-- 继承HisBaseEntity的审计字段
"tenant_id" int8 NOT NULL, -- 租户ID
"delete_flag" char(1) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '0', -- 删除标志0-未删除1-已删除)
"create_by" varchar(32) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '', -- 创建人
"create_time" timestamptz(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
"update_by" varchar(32) COLLATE "pg_catalog"."default", -- 更新人
"update_time" timestamptz(6), -- 更新时间
-- 主键约束
CONSTRAINT "order_main_pkey" PRIMARY KEY ("id")
);
-- 设置表所有者根据实际数据库用户修改如果不存在postgres角色可注释掉此行
-- ALTER TABLE "order_main" OWNER TO "postgres";
-- 表及字段注释
COMMENT ON TABLE "order_main" IS '订单主表:存储门诊预约挂号订单信息';
COMMENT ON COLUMN "order_main"."id" IS '主键ID';
COMMENT ON COLUMN "order_main"."order_no" IS '订单号:唯一标识订单,系统自动生成';
COMMENT ON COLUMN "order_main"."patient_id" IS '患者ID关联adm_patient表';
COMMENT ON COLUMN "order_main"."patient_name" IS '患者姓名:冗余字段,便于查询';
COMMENT ON COLUMN "order_main"."medical_card" IS '就诊卡号:患者就诊卡编号';
COMMENT ON COLUMN "order_main"."phone" IS '手机号:患者联系电话';
COMMENT ON COLUMN "order_main"."gender" IS '性别1-男2-女';
COMMENT ON COLUMN "order_main"."schedule_id" IS '排班ID关联排班表';
COMMENT ON COLUMN "order_main"."slot_id" IS '号源ID关联clinical_ticket表';
COMMENT ON COLUMN "order_main"."department_id" IS '科室ID关联科室表';
COMMENT ON COLUMN "order_main"."department_name" IS '科室名称:冗余字段,便于查询';
COMMENT ON COLUMN "order_main"."doctor_id" IS '医生ID关联医生表';
COMMENT ON COLUMN "order_main"."doctor_name" IS '医生姓名:冗余字段,便于查询';
COMMENT ON COLUMN "order_main"."reg_type" IS '号别:普通/专家';
COMMENT ON COLUMN "order_main"."fee" IS '挂号费:挂号费用金额';
COMMENT ON COLUMN "order_main"."appointment_date" IS '预约日期:患者预约的就诊日期';
COMMENT ON COLUMN "order_main"."appointment_time" IS '预约时间:患者预约的具体时间';
COMMENT ON COLUMN "order_main"."cancel_time" IS '取消时间:订单取消的时间';
COMMENT ON COLUMN "order_main"."cancel_reason" IS '取消原因:订单取消的原因说明';
COMMENT ON COLUMN "order_main"."status" IS '状态1-预约中2-已完成3-已取消';
COMMENT ON COLUMN "order_main"."pay_status" IS '支付状态0-未支付1-已支付';
COMMENT ON COLUMN "order_main"."version" IS '版本号:乐观锁,防止并发冲突';
COMMENT ON COLUMN "order_main"."tenant_id" IS '租户ID多租户系统隔离字段';
COMMENT ON COLUMN "order_main"."delete_flag" IS '删除标志0-未删除1-已删除';
COMMENT ON COLUMN "order_main"."create_by" IS '创建人:存储创建者用户名';
COMMENT ON COLUMN "order_main"."create_time" IS '创建时间:默认当前时间,带时区';
COMMENT ON COLUMN "order_main"."update_by" IS '更新人:存储更新者用户名';
COMMENT ON COLUMN "order_main"."update_time" IS '更新时间:带时区';
-- 创建索引
CREATE INDEX "idx_order_main_order_no"
ON "order_main" ("order_no")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_patient_id"
ON "order_main" ("patient_id")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_slot_id"
ON "order_main" ("slot_id")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_department_id"
ON "order_main" ("department_id")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_doctor_id"
ON "order_main" ("doctor_id")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_status"
ON "order_main" ("status")
WHERE "delete_flag" = '0';
CREATE INDEX "idx_order_main_tenant_id"
ON "order_main" ("tenant_id", "create_time")
WHERE "delete_flag" = '0';
-- 向迁移历史表插入记录
INSERT INTO __MigrationsHistory (MigrationId, ProductVersion)
VALUES ('202512301200add_table_order_main', '1.0.0');

View File

@@ -0,0 +1,51 @@
-- 验证order_main表是否创建成功
-- 1. 查看表结构
\d order_main;
-- 2. 查看表注释
SELECT
obj_description('order_main'::regclass) AS table_comment;
-- 3. 查看字段注释使用pg_catalog.pg_description
SELECT
a.attname AS column_name,
d.description AS column_comment
FROM pg_attribute a
LEFT JOIN pg_catalog.pg_description d
ON d.objoid = a.attrelid
AND d.objsubid = a.attnum
WHERE a.attrelid = 'order_main'::regclass
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum;
-- 4. 查看索引
SELECT
indexname AS index_name,
indexdef AS index_definition
FROM pg_indexes
WHERE tablename = 'order_main';
-- 5. 查看迁移历史
SELECT * FROM __MigrationsHistory
WHERE MigrationId = '202512301200add_table_order_main';
-- 6. 查看表的所有约束
SELECT
conname AS constraint_name,
contype AS constraint_type
FROM pg_constraint
WHERE conrelid = 'order_main'::regclass;
-- 7. 查看序列
SELECT
sequencename AS sequence_name,
last_value,
start_value,
increment_by
FROM pg_sequences
WHERE sequencename = 'order_main_id_seq';
-- 8. 统计表记录数
SELECT COUNT(*) AS record_count FROM order_main;

View File

@@ -0,0 +1,202 @@
# 门诊预约挂号功能测试数据使用指南
## 1. 准备工作
### 1.1 数据库环境准备
- 确保已安装并启动PostgreSQL数据库
- 确保已创建`hisdev`模式(或根据实际情况修改脚本中的模式名)
- 确保已创建相关表结构:
- clinical_ticket (号源表)
- adm_practitioner (医生表)
- adm_patient (患者表)
- cli_reservation_record (预约记录表)
### 1.2 验证表结构
执行以下查询验证核心表是否存在:
```sql
SELECT table_name FROM information_schema.tables WHERE table_schema = 'hisdev';
```
## 2. 执行测试数据脚本
### 2.1 脚本位置
`d:\work\门诊预约测试数据插入.sql`
### 2.2 执行方式
**方式一通过pgAdmin执行**
1. 打开pgAdmin连接到数据库
2. 选择`hisdev`模式
3. 打开SQL编辑器粘贴脚本内容
4. 点击执行按钮或按F5
**方式二:通过命令行执行**
```bash
psql -h localhost -U username -d database_name -f "d:\work\门诊预约测试数据插入.sql"
```
## 3. 测试数据说明
### 3.1 号源数据 (clinical_ticket)
#### 3.1.1 未预约状态的号源(用于测试正常预约流程)
- 号源数量10个普通号 + 5个专家号
- 日期:当前系统日期
- 医生:张三(内科)
- 状态:`unbooked`
#### 3.1.2 已预约状态的号源(用于测试取消预约流程)
- 号源数量2个
- 日期:当前系统日期
- 医生:张三(内科)
- 状态:`booked`
- 患者患者A、患者B
#### 3.1.3 已取号状态的号源(用于测试逆向用例)
- 号源数量1个
- 日期:当前系统日期
- 医生:张三(内科)
- 状态:`checked`
- 患者患者C
#### 3.1.4 明天日期的号源(用于测试日期选择功能)
- 号源数量10个普通号
- 日期:当前系统日期 + 1天
- 医生:王五(外科)
- 状态:`unbooked`
### 3.2 预约记录数据 (cli_reservation_record)
- 记录数量2条
- 患者患者A、患者B
- 医生:张三
## 4. 测试用例执行指南
### 4.1 正向测试用例
#### 4.1.1 号源日期选择器-默认值
- **测试步骤**
1. 打开门诊预约挂号界面
2. 检查号源日期选择器的默认值
- **预期结果**:默认值为当前系统日期
#### 4.1.2 状态筛选下拉框-默认值
- **测试步骤**
1. 打开门诊预约挂号界面
2. 检查状态筛选下拉框的默认值
- **预期结果**:默认值为"未预约"
#### 4.1.3 号源预约功能-正常流程
- **测试步骤**
1. 双击状态为"未预约"的号源卡片
2. 在弹出的患者选择弹窗中选择患者
3. 点击"确定"按钮
- **预期结果**:卡片状态更新为"已预约",显示患者信息
- **可用测试数据**当前日期的未预约号源TICKET000001-TICKET000010
#### 4.1.4 取消预约功能-正常流程
- **测试步骤**
1. 右键状态为"已预约"的号源卡片
2. 选择"取消预约"选项
3. 在二次确认弹窗中点击"确认"按钮
- **预期结果**:号源状态恢复为"未预约",清除患者信息
- **可用测试数据**已预约号源TICKET000011、TICKET000012
#### 4.1.5 医生搜索框-实时搜索
- **测试步骤**
1. 在左侧边栏的医生搜索框中输入医生姓名
2. 观察医生列表的实时更新
- **预期结果**:医生列表根据输入内容实时筛选显示
- **可用测试数据**:张三、王五
#### 4.1.6 号源类型切换-联动过滤
- **测试步骤**
1. 在左侧边栏切换号源类型为"专家号"
2. 观察右侧号源卡片和左侧医生列表
- **预期结果**:仅显示专家号的号源和医生
- **可用测试数据**专家号TICKET000014-TICKET000018
### 4.2 逆向测试用例
#### 4.2.1 号源预约功能-未选择患者
- **测试步骤**
1. 双击状态为"未预约"的号源卡片
2. 不选择患者直接点击"确定"按钮
- **预期结果**:提示"请选择患者"
#### 4.2.2 取消预约功能-已取号状态
- **测试步骤**
1. 右键状态为"已取号"的号源卡片
- **预期结果**:右键菜单不显示"取消预约"选项
- **可用测试数据**已取号源TICKET000013
#### 4.2.3 患者信息搜索框组-无效输入
- **测试步骤**
1. 在患者信息搜索框组中输入无效的姓名、就诊卡号或手机号
2. 点击查询按钮
- **预期结果**:返回无结果或提示"未找到匹配的患者"
- **可用测试数据**:输入不存在的姓名(如"测试患者")、就诊卡号(如"PAT999")或手机号(如"13999999999"
#### 4.2.4 日期选择器-无效日期
- **测试步骤**
1. 在号源日期选择器中输入无效日期(如过去日期或格式错误)
2. 尝试查询号源
- **预期结果**:提示"请输入有效日期"
#### 4.2.5 医生搜索框-无匹配结果
- **测试步骤**
1. 在医生搜索框中输入不存在的医生姓名
2. 观察医生列表
- **预期结果**:显示"无匹配结果"或空列表
- **可用测试数据**:输入不存在的医生姓名(如"李四"
## 5. 测试结果记录
| 用例名 | 测试步骤 | 预期结果 | 实际结果 | 测试时间 | 测试人 |
|-------|---------|---------|---------|---------|-------|
| 号源日期选择器-默认值 | 1. 打开门诊预约挂号界面<br>2. 检查号源日期选择器的默认值 | 默认值为当前系统日期 | | | |
| 状态筛选下拉框-默认值 | 1. 打开门诊预约挂号界面<br>2. 检查状态筛选下拉框的默认值 | 默认值为"未预约" | | | |
| 号源预约功能-正常流程 | 1. 双击状态为"未预约"的号源卡片<br>2. 在弹出的患者选择弹窗中选择患者<br>3. 点击"确定"按钮 | 卡片状态更新为"已预约",显示患者信息 | | | |
| 取消预约功能-正常流程 | 1. 右键状态为"已预约"的号源卡片<br>2. 选择"取消预约"选项<br>3. 在二次确认弹窗中点击"确认"按钮 | 号源状态恢复为"未预约",清除患者信息 | | | |
| 医生搜索框-实时搜索 | 1. 在左侧边栏的医生搜索框中输入医生姓名<br>2. 观察医生列表的实时更新 | 医生列表根据输入内容实时筛选显示 | | | |
| 号源类型切换-联动过滤 | 1. 在左侧边栏切换号源类型为"专家号"<br>2. 观察右侧号源卡片和左侧医生列表 | 仅显示专家号的号源和医生 | | | |
| 号源预约功能-未选择患者 | 1. 双击状态为"未预约"的号源卡片<br>2. 不选择患者直接点击"确定"按钮 | 提示"请选择患者" | | | |
| 取消预约功能-已取号状态 | 1. 右键状态为"已取号"的号源卡片 | 右键菜单不显示"取消预约"选项 | | | |
| 患者信息搜索框组-无效输入 | 1. 在患者信息搜索框组中输入无效的姓名、就诊卡号或手机号<br>2. 点击查询按钮 | 返回无结果或提示"未找到匹配的患者" | | | |
| 日期选择器-无效日期 | 1. 在号源日期选择器中输入无效日期(如过去日期或格式错误)<br>2. 尝试查询号源 | 提示"请输入有效日期" | | | |
| 医生搜索框-无匹配结果 | 1. 在医生搜索框中输入不存在的医生姓名<br>2. 观察医生列表 | 显示"无匹配结果"或空列表 | | | |
## 6. 注意事项
1. **数据唯一性**:脚本使用条件判断避免重复插入数据
2. **日期更新**:脚本中的日期会自动使用当前系统日期
3. **依赖关系**:号源数据依赖于医生和患者的基础数据,请确保系统中已有相关记录
4. **测试顺序**:建议先执行正向测试,再执行逆向测试
5. **数据清理**测试完成后可使用以下SQL清理测试数据
```sql
DELETE FROM clinical_ticket WHERE bus_no LIKE 'TICKET%';
DELETE FROM cli_reservation_record WHERE patient_name IN ('患者A', '患者B');
```
## 7. 常见问题
### 7.1 执行脚本时提示表不存在
- 检查数据库连接是否正确
- 检查是否已创建相关表结构
- 检查模式名是否为`hisdev`
### 7.2 测试数据不显示
- 检查日期选择器是否选择了正确的日期
- 检查状态筛选条件是否为"未预约"
- 检查医生选择是否正确
### 7.3 预约功能无法正常工作
- 检查患者选择弹窗是否能正常加载患者数据
- 检查网络连接是否正常
- 检查浏览器控制台是否有错误信息
---
**版本1.0**
**创建时间2025-12-31**
**更新记录:**
- 2025-12-31初始版本完成测试数据说明和测试指南

View File

@@ -0,0 +1,89 @@
-- 门诊预约挂号功能测试数据插入脚本
-- 执行前请确保已创建相关表结构
-- 设置当前模式
SET search_path TO hisdev;
-- ====================================
-- 说明:
-- 1. 此脚本主要包含号源表(clinical_ticket)的测试数据
-- 2. 其他相关表(医生、患者、科室等)请确保系统中已有基础数据
-- 3. 如需要完整测试,建议先在系统中创建相应的医生和患者信息
-- ====================================
-- ====================================
-- 注意:以下是可选的表结构验证
-- 如果不确定表结构是否正确,请先执行这些查询
-- ====================================
-- SELECT column_name FROM information_schema.columns WHERE table_name = 'clinical_ticket';
-- SELECT column_name FROM information_schema.columns WHERE table_name = 'adm_practitioner';
-- SELECT column_name FROM information_schema.columns WHERE table_name = 'adm_patient';
-- ====================================
-- 5. 号源数据 (clinical_ticket)
-- 包含不同状态的号源:未预约、已预约、已取号
-- ====================================
-- 获取当前日期和明天日期
DO $$
DECLARE
current_date DATE := CURRENT_DATE;
tomorrow_date DATE := CURRENT_DATE + INTERVAL '1 day';
BEGIN
-- 当前日期号源
-- 未预约状态的号源(用于测试正常预约流程)
INSERT INTO clinical_ticket (bus_no, department, doctor, ticket_type, time, status, fee, appointment_date, appointment_time, department_id, doctor_id, create_time, tenant_id, delete_flag)
SELECT
'TICKET' || lpad(i::text, 6, '0'),
'内科', '张三', '普通', '08:00-' || (7 + i) || ':50',
'unbooked', '50', current_date, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'
FROM generate_series(1, 10) i
WHERE NOT EXISTS (SELECT 1 FROM clinical_ticket WHERE bus_no = 'TICKET' || lpad(i::text, 6, '0'));
-- 已预约状态的号源(用于测试取消预约流程)
INSERT INTO clinical_ticket (bus_no, department, doctor, ticket_type, time, status, fee, patient_id, patient_name, medical_card, phone, appointment_date, appointment_time, department_id, doctor_id, create_time, tenant_id, delete_flag)
VALUES
('TICKET000011', '内科', '张三', '普通', '09:00-09:50', 'booked', '50', 1, '患者A', 'PAT001', '13900139001', current_date, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'),
('TICKET000012', '内科', '张三', '普通', '09:50-10:40', 'booked', '50', 2, '患者B', 'PAT002', '13900139002', current_date, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0');
-- 已取号状态的号源(用于测试逆向用例:取消已取号的预约)
INSERT INTO clinical_ticket (bus_no, department, doctor, ticket_type, time, status, fee, patient_id, patient_name, medical_card, phone, appointment_date, appointment_time, department_id, doctor_id, create_time, tenant_id, delete_flag)
VALUES
('TICKET000013', '内科', '张三', '普通', '10:40-11:30', 'checked', '50', 3, '患者C', 'PAT003', '13900139003', current_date, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0');
-- 专家号源(用于测试号源类型切换功能)
INSERT INTO clinical_ticket (bus_no, department, doctor, ticket_type, time, status, fee, appointment_date, appointment_time, department_id, doctor_id, create_time, tenant_id, delete_flag)
VALUES
('TICKET000014', '内科', '张三', '专家', '08:00-08:50', 'unbooked', '150', CURRENT_DATE, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'),
('TICKET000015', '内科', '张三', '专家', '09:00-09:50', 'unbooked', '150', CURRENT_DATE, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'),
('TICKET000016', '内科', '张三', '专家', '10:00-10:50', 'unbooked', '150', CURRENT_DATE, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'),
('TICKET000017', '内科', '张三', '专家', '11:00-11:50', 'unbooked', '150', CURRENT_DATE, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0'),
('TICKET000018', '内科', '张三', '专家', '14:00-14:50', 'unbooked', '150', CURRENT_DATE, CURRENT_TIMESTAMP, 1, 1, CURRENT_TIMESTAMP, 1, '0');
-- 明天日期的号源(用于测试日期选择功能)
INSERT INTO clinical_ticket (bus_no, department, doctor, ticket_type, time, status, fee, appointment_date, appointment_time, department_id, doctor_id, create_time, tenant_id, delete_flag)
SELECT
'TICKET' || lpad((20 + i)::text, 6, '0'),
'外科', '王五', '普通', '08:00-' || (7 + i) || ':50',
'unbooked', '60', tomorrow_date, CURRENT_TIMESTAMP, 2, 3, CURRENT_TIMESTAMP, 1, '0'
FROM generate_series(1, 10) i
WHERE NOT EXISTS (SELECT 1 FROM clinical_ticket WHERE bus_no = 'TICKET' || lpad((20 + i)::text, 6, '0'));
END $$;
-- ====================================
-- 6. 预约记录数据 (cli_reservation_record)
-- 用于测试预约历史查询
-- ====================================
INSERT INTO cli_reservation_record (patient_name, patient_tel, chief_complaint, reservation_time, org_id, practitioner_id, tenant_id, create_time, create_by, update_time, update_by)
VALUES
('患者A', '13900139001', '感冒发烧', CURRENT_TIMESTAMP, 1, 1, 1, CURRENT_TIMESTAMP, 'system', CURRENT_TIMESTAMP, 'system'),
('患者B', '13900139002', '腹痛', CURRENT_TIMESTAMP, 1, 1, 1, CURRENT_TIMESTAMP, 'system', CURRENT_TIMESTAMP, 'system');
-- ====================================
-- 数据插入完成提示
-- ====================================
SELECT '门诊预约测试数据插入完成!' AS message;
SELECT '未预约号源数量:' || COUNT(*) FROM clinical_ticket WHERE status = 'unbooked';
SELECT '已预约号源数量:' || COUNT(*) FROM clinical_ticket WHERE status = 'booked';
SELECT '已取号号源数量:' || COUNT(*) FROM clinical_ticket WHERE status = 'checked';