+
+
+
-
-
-
-
候诊队列
+
-
-
-
- {{ formatPatientName(scope.row.patientName) }}
-
-
-
-
-
-
- {{ formatSerialNo(scope.row) }}
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ 加入队列 >>
+
+
+ 一键加入队列
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- {{ getStatusText(scope.row.status) }}
+
+ {{ scope.row.status }}
-
-
- {{ formatTime(scope.row.registerTime) }}
-
-
-
-
-
- 叫号
-
-
-
-
-
-
+
+
+
+ << 移出队列
+
+
+ ↑
+
+
+ ↓
+
+
+
+
+ 只显示等待
+
+
+ 显示全部状态
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
规则{{ idx + 1 }}
+
prio={{ item.priority }}
+
{{ item.name }}
+
+ 编辑
+ 删除
+ ↑
+ ↓
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ w.label }}
+
+
+
+
+
+
+
+
+
+ 快速生成器
+ 语法检查
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 清除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 清除
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 应用
+
+
+
-
diff --git a/openhis-ui-vue3/test-util-extend.js b/openhis-ui-vue3/test-util-extend.js
new file mode 100644
index 00000000..559d5521
--- /dev/null
+++ b/openhis-ui-vue3/test-util-extend.js
@@ -0,0 +1,25 @@
+// 测试util._extend是否存在
+if (typeof process !== 'undefined' && process.versions && process.versions.node) {
+ try {
+ const util = require('util');
+ console.log('util._extend存在吗?', typeof util._extend);
+ if (typeof util._extend === 'function') {
+ console.log('util._extend是一个函数');
+ } else {
+ console.log('util._extend不是一个函数,添加兼容实现');
+ util._extend = function(destination, source) {
+ for (var key in source) {
+ if (source.hasOwnProperty(key)) {
+ destination[key] = source[key];
+ }
+ }
+ return destination;
+ };
+ console.log('兼容实现添加成功');
+ }
+ } catch (e) {
+ console.error('util模块加载失败:', e);
+ }
+} else {
+ console.log('不在Node.js环境中');
+}
\ No newline at end of file
diff --git a/query_serial_number.sql b/query_serial_number.sql
new file mode 100644
index 00000000..570379f5
--- /dev/null
+++ b/query_serial_number.sql
@@ -0,0 +1,121 @@
+-- ============================================
+-- 查询流水号相关SQL语句
+-- ============================================
+
+-- 1. 查询所有挂号记录的流水号(主键ID)及相关信息
+SELECT
+ id AS 流水号,
+ display_order AS 就诊序号,
+ bus_no AS 就诊编码,
+ patient_id AS 患者ID,
+ organization_id AS 科室ID,
+ create_time AS 挂号时间,
+ status_enum AS 状态
+FROM adm_encounter
+WHERE delete_flag = '0'
+ORDER BY create_time DESC;
+
+-- 2. 根据流水号(主键ID)查询某条挂号记录的详细信息
+SELECT
+ e.id AS 流水号,
+ e.display_order AS 就诊序号,
+ e.bus_no AS 就诊编码,
+ p.name AS 患者姓名,
+ p.id_card AS 身份证号,
+ p.phone AS 联系电话,
+ o.name AS 科室名称,
+ pr.name AS 医生姓名,
+ e.create_time AS 挂号时间,
+ e.status_enum AS 状态
+FROM adm_encounter e
+LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
+LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0'
+LEFT JOIN adm_encounter_participant ep ON e.id = ep.encounter_id AND ep.delete_flag = '0' AND ep.type_code = 'PRF'
+LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
+WHERE e.id = 1234567890123456789 -- 替换为实际的流水号(主键ID)
+ AND e.delete_flag = '0';
+
+-- 3. 根据患者姓名或身份证号查询流水号
+SELECT
+ e.id AS 流水号,
+ e.display_order AS 就诊序号,
+ p.name AS 患者姓名,
+ p.id_card AS 身份证号,
+ e.create_time AS 挂号时间,
+ o.name AS 科室名称
+FROM adm_encounter e
+LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
+LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0'
+WHERE e.delete_flag = '0'
+ AND (p.name LIKE '%张三%' OR p.id_card = '110101199001011234') -- 替换为实际的患者姓名或身份证号
+ORDER BY e.create_time DESC;
+
+-- 4. 查询当日的挂号记录及流水号
+SELECT
+ e.id AS 流水号,
+ e.display_order AS 就诊序号,
+ e.bus_no AS 就诊编码,
+ p.name AS 患者姓名,
+ p.id_card AS 身份证号,
+ o.name AS 科室名称,
+ pr.name AS 医生姓名,
+ e.create_time AS 挂号时间,
+ e.status_enum AS 状态
+FROM adm_encounter e
+LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
+LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0'
+LEFT JOIN adm_encounter_participant ep ON e.id = ep.encounter_id AND ep.delete_flag = '0' AND ep.type_code = 'PRF'
+LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0'
+WHERE e.delete_flag = '0'
+ AND DATE(e.create_time) = CURRENT_DATE -- 查询当日
+ORDER BY e.display_order ASC, e.create_time ASC;
+
+-- 5. 查询指定日期范围的挂号记录及流水号
+SELECT
+ e.id AS 流水号,
+ e.display_order AS 就诊序号,
+ e.bus_no AS 就诊编码,
+ p.name AS 患者姓名,
+ p.id_card AS 身份证号,
+ o.name AS 科室名称,
+ e.create_time AS 挂号时间
+FROM adm_encounter e
+LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
+LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0'
+WHERE e.delete_flag = '0'
+ AND e.create_time >= '2024-01-01 00:00:00' -- 开始时间
+ AND e.create_time <= '2024-01-31 23:59:59' -- 结束时间
+ORDER BY e.create_time DESC;
+
+-- 6. 查询指定科室的挂号记录及流水号
+SELECT
+ e.id AS 流水号,
+ e.display_order AS 就诊序号,
+ p.name AS 患者姓名,
+ o.name AS 科室名称,
+ e.create_time AS 挂号时间
+FROM adm_encounter e
+LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0'
+LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0'
+WHERE e.delete_flag = '0'
+ AND o.name LIKE '%心内科%' -- 替换为实际的科室名称
+ AND DATE(e.create_time) = CURRENT_DATE
+ORDER BY e.display_order ASC;
+
+-- 7. 统计每日挂号数量及流水号范围
+SELECT
+ DATE(create_time) AS 日期,
+ COUNT(*) AS 挂号数量,
+ MIN(id) AS 最小流水号,
+ MAX(id) AS 最大流水号,
+ MIN(display_order) AS 最小就诊序号,
+ MAX(display_order) AS 最大就诊序号
+FROM adm_encounter
+WHERE delete_flag = '0'
+GROUP BY DATE(create_time)
+ORDER BY 日期 DESC
+LIMIT 30; -- 最近30天
+
+
+
+
diff --git a/sql/query_today_outpatient_patients.sql b/sql/query_today_outpatient_patients.sql
new file mode 100644
index 00000000..5aac3e13
--- /dev/null
+++ b/sql/query_today_outpatient_patients.sql
@@ -0,0 +1,224 @@
+-- ============================================
+-- 查询今日门诊患者数据(用于调试分诊排队页面)
+-- 简化版:直接查询,不考虑登录和租户
+-- ============================================
+
+-- 1. 最简单查询:查看今天所有的挂号记录(不关联患者表)
+SELECT
+ enc.id AS encounterId,
+ enc.patient_id AS patientId,
+ enc.start_time AS registerTime,
+ enc.status_enum AS statusEnum,
+ enc.organization_id AS departmentId,
+ enc.tenant_id AS tenantId,
+ enc.delete_flag AS deleteFlag,
+ enc.bus_no AS encounterBusNo
+FROM adm_encounter enc
+WHERE enc.delete_flag = '0'
+ AND enc.start_time::DATE = CURRENT_DATE
+ORDER BY enc.start_time DESC
+LIMIT 100;
+
+-- ============================================
+-- 2. 完整查询:直接查询患者信息(简化版,不考虑租户)
+-- ============================================
+SELECT
+ enc.id AS encounterId,
+ enc.patient_id AS patientId,
+ pt.name AS patientName,
+ pt.gender_enum AS genderEnum,
+ pt.birth_date AS birthDate,
+ pt.id_card AS idCard,
+ pt.phone AS phone,
+ enc.bus_no AS encounterBusNo,
+ enc.start_time AS registerTime,
+ enc.reception_time AS receptionTime,
+ enc.status_enum AS statusEnum,
+ enc.subject_status_enum AS subjectStatusEnum,
+ CASE
+ WHEN enc.reception_time IS NOT NULL
+ THEN EXTRACT(EPOCH FROM (enc.reception_time - enc.start_time)) / 60
+ ELSE EXTRACT(EPOCH FROM (NOW() - enc.start_time)) / 60
+ END AS waitingDuration,
+ CASE
+ WHEN enc.end_time IS NOT NULL AND enc.reception_time IS NOT NULL
+ THEN EXTRACT(EPOCH FROM (enc.end_time - enc.reception_time)) / 60
+ ELSE NULL
+ END AS visitDuration,
+ pt.type_code AS typeCode,
+ enc.important_flag AS importantFlag,
+ -- 医生信息(左关联)
+ ep.practitioner_id AS doctorId
+FROM adm_encounter enc
+INNER JOIN adm_patient pt
+ ON enc.patient_id = pt.id
+ AND pt.delete_flag = '0'
+LEFT JOIN adm_encounter_participant ep
+ ON enc.id = ep.encounter_id
+ AND ep.type_code = 'admitter'
+ AND ep.delete_flag = '0'
+WHERE enc.delete_flag = '0'
+ AND enc.start_time::DATE = CURRENT_DATE
+ORDER BY enc.start_time DESC
+LIMIT 10000;
+
+-- ============================================
+-- 3. 检查数据条件:查看可能影响查询结果的数据
+-- ============================================
+
+-- 3.1 检查今天的挂号记录总数
+SELECT
+ COUNT(*) AS total_count,
+ COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count,
+ COUNT(CASE WHEN delete_flag = '1' THEN 1 END) AS deleted_count
+FROM adm_encounter
+WHERE start_time::DATE = CURRENT_DATE;
+
+-- 3.2 检查不同租户的数据分布
+SELECT
+ tenant_id,
+ COUNT(*) AS count,
+ COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
+FROM adm_encounter
+WHERE start_time::DATE = CURRENT_DATE
+GROUP BY tenant_id
+ORDER BY tenant_id;
+
+-- 3.3 检查不同状态的数据分布
+SELECT
+ status_enum,
+ COUNT(*) AS count,
+ COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
+FROM adm_encounter
+WHERE start_time::DATE = CURRENT_DATE
+ AND delete_flag = '0'
+GROUP BY status_enum
+ORDER BY status_enum;
+
+-- 3.4 检查是否有患者数据关联
+SELECT
+ COUNT(DISTINCT enc.id) AS encounter_count,
+ COUNT(DISTINCT pt.id) AS patient_count,
+ COUNT(DISTINCT CASE WHEN pt.delete_flag = '0' THEN pt.id END) AS patient_not_deleted_count
+FROM adm_encounter enc
+LEFT JOIN adm_patient pt ON enc.patient_id = pt.id
+WHERE enc.start_time::DATE = CURRENT_DATE
+ AND enc.delete_flag = '0';
+
+-- 3.5 检查医生参与信息
+SELECT
+ COUNT(DISTINCT enc.id) AS encounter_count,
+ COUNT(DISTINCT ep.encounter_id) AS has_doctor_count,
+ COUNT(DISTINCT ep.practitioner_id) AS doctor_count
+FROM adm_encounter enc
+LEFT JOIN adm_encounter_participant ep
+ ON enc.id = ep.encounter_id
+ AND ep.type_code = 'admitter'
+ AND ep.delete_flag = '0'
+WHERE enc.start_time::DATE = CURRENT_DATE
+ AND enc.delete_flag = '0';
+
+-- ============================================
+-- 4. 快速查询:直接查看患者姓名和挂号信息(最简单)
+-- ============================================
+SELECT
+ enc.id AS 就诊记录ID,
+ pt.name AS 患者姓名,
+ pt.id_card AS 身份证号,
+ pt.phone AS 联系电话,
+ enc.start_time AS 挂号时间,
+ enc.create_time AS 创建时间,
+ enc.status_enum AS 状态,
+ enc.bus_no AS 就诊流水号
+FROM adm_encounter enc
+INNER JOIN adm_patient pt ON enc.patient_id = pt.id
+WHERE enc.delete_flag = '0'
+ AND pt.delete_flag = '0'
+ AND enc.start_time::DATE = CURRENT_DATE
+ORDER BY enc.start_time DESC;
+
+-- ============================================
+-- 4.1 使用 create_time 查询(和门诊挂号页面一致)
+-- ============================================
+SELECT
+ enc.id AS 就诊记录ID,
+ pt.name AS 患者姓名,
+ pt.id_card AS 身份证号,
+ pt.phone AS 联系电话,
+ enc.create_time AS 创建时间,
+ enc.start_time AS 开始时间,
+ enc.status_enum AS 状态,
+ enc.bus_no AS 就诊流水号
+FROM adm_encounter enc
+INNER JOIN adm_patient pt ON enc.patient_id = pt.id
+WHERE enc.delete_flag = '0'
+ AND pt.delete_flag = '0'
+ AND enc.create_time::DATE = CURRENT_DATE
+ORDER BY enc.create_time DESC;
+
+-- ============================================
+-- 4.2 完全模拟门诊挂号页面的查询(包含支付状态)
+-- ============================================
+SELECT
+ enc.id AS 就诊记录ID,
+ pt.name AS 患者姓名,
+ pt.id_card AS 身份证号,
+ pt.phone AS 联系电话,
+ enc.create_time AS 挂号时间,
+ enc.status_enum AS 状态,
+ enc.bus_no AS 就诊流水号,
+ ci.total_price AS 挂号金额,
+ pr.status_enum AS 支付状态
+FROM adm_encounter enc
+INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
+LEFT JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
+LEFT JOIN fin_payment_reconciliation pr ON ci.id::TEXT = ANY(string_to_array(pr.charge_item_ids,','))
+ AND pr.delete_flag = '0'
+ AND pr.status_enum = 1
+WHERE enc.delete_flag = '0'
+ AND enc.class_enum = 1 -- 门诊
+ AND enc.create_time::DATE = CURRENT_DATE
+ORDER BY enc.create_time DESC;
+
+-- ============================================
+-- 5. 快速检查:查看最近7天的挂号记录数量(使用 start_time)
+-- ============================================
+SELECT
+ start_time::DATE AS register_date,
+ COUNT(*) AS total_count,
+ COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
+FROM adm_encounter
+WHERE start_time::DATE >= CURRENT_DATE - INTERVAL '7 days'
+GROUP BY start_time::DATE
+ORDER BY start_time::DATE DESC;
+
+-- ============================================
+-- 5.1 快速检查:查看最近7天的挂号记录数量(使用 create_time)
+-- ============================================
+SELECT
+ create_time::DATE AS register_date,
+ COUNT(*) AS total_count,
+ COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
+FROM adm_encounter
+WHERE create_time::DATE >= CURRENT_DATE - INTERVAL '7 days'
+ AND class_enum = 1 -- 门诊
+GROUP BY create_time::DATE
+ORDER BY create_time::DATE DESC;
+
+-- ============================================
+-- 6. 对比 start_time 和 create_time 的差异
+-- ============================================
+SELECT
+ id AS 就诊记录ID,
+ start_time AS 开始时间,
+ create_time AS 创建时间,
+ (start_time::DATE) AS 开始日期,
+ (create_time::DATE) AS 创建日期,
+ status_enum AS 状态,
+ delete_flag AS 是否删除
+FROM adm_encounter
+WHERE (start_time::DATE = CURRENT_DATE OR create_time::DATE = CURRENT_DATE)
+ AND delete_flag = '0'
+ORDER BY create_time DESC
+LIMIT 20;
+
diff --git a/排查指南-字段查询问题.md b/排查指南-字段查询问题.md
new file mode 100644
index 00000000..ddebfb9e
--- /dev/null
+++ b/排查指南-字段查询问题.md
@@ -0,0 +1,284 @@
+# 排查指南:字段查询不到数据的问题
+
+## 问题类型
+**症状**:SQL 查询条件使用了某个字段,但查询结果为空,而数据库中明明有数据。
+
+**根本原因**:查询条件使用的字段在数据插入/更新时没有被设置(为 NULL 或默认值)。
+
+---
+
+## 排查步骤
+
+### 第一步:确认字段是否存在
+```sql
+-- 检查表结构,确认字段是否存在
+SELECT column_name, data_type, is_nullable, column_default
+FROM information_schema.columns
+WHERE table_name = 'adm_encounter'
+ AND column_name = 'start_time';
+```
+
+**检查点**:
+- ✅ 字段确实存在
+- ❌ 字段不存在 → 检查字段名拼写、大小写
+
+---
+
+### 第二步:检查字段是否有值
+```sql
+-- 检查字段的实际值
+SELECT
+ id,
+ start_time, -- 检查这个字段
+ create_time, -- 对比其他时间字段
+ status_enum
+FROM adm_encounter
+WHERE delete_flag = '0'
+ AND create_time::DATE = CURRENT_DATE -- 用能查到数据的条件
+LIMIT 10;
+```
+
+**检查点**:
+- ✅ `start_time` 有值 → 继续排查查询条件
+- ❌ `start_time` 为 NULL → **问题确认**:字段没有被设置
+
+---
+
+### 第三步:检查插入/更新代码
+找到创建/更新数据的 Service 方法,检查是否设置了该字段。
+
+**检查位置**:
+1. **Service 实现类**:查找 `save`、`insert`、`update` 相关方法
+2. **Mapper XML**:检查 INSERT/UPDATE 语句
+3. **Entity 类**:检查字段定义和默认值
+
+**示例检查**:
+```java
+// ❌ 错误示例:没有设置 start_time
+Encounter encounter = new Encounter();
+encounter.setBusNo("xxx");
+encounter.setPatientId(123L);
+// 没有 encounter.setStartTime(...)
+iEncounterService.save(encounter);
+
+// ✅ 正确示例:设置了 start_time
+Encounter encounter = new Encounter();
+encounter.setBusNo("xxx");
+encounter.setPatientId(123L);
+encounter.setStartTime(new Date()); // 设置了字段
+iEncounterService.save(encounter);
+```
+
+---
+
+### 第四步:对比能查到数据的方法
+找到系统中**能查到数据**的类似查询,对比差异。
+
+**对比维度**:
+1. **使用的字段**:`start_time` vs `create_time`
+2. **查询条件**:WHERE 子句的差异
+3. **关联表**:是否 JOIN 了其他表
+4. **业务逻辑**:是否过滤了特定状态
+
+**示例对比**:
+```sql
+-- ❌ 查不到数据的方法
+SELECT * FROM adm_encounter
+WHERE start_time::DATE = CURRENT_DATE; -- start_time 为 NULL
+
+-- ✅ 能查到数据的方法
+SELECT * FROM adm_encounter
+WHERE create_time::DATE = CURRENT_DATE; -- create_time 有值
+```
+
+---
+
+### 第五步:检查字段的业务含义
+确认字段的**业务含义**和**使用场景**。
+
+**常见情况**:
+- `create_time`:记录创建时间(自动设置)
+- `update_time`:记录更新时间(自动设置)
+- `start_time`:业务开始时间(需要手动设置)
+- `end_time`:业务结束时间(需要手动设置)
+
+**判断规则**:
+- 如果字段是**业务字段**(如 `start_time`),需要手动设置
+- 如果字段是**系统字段**(如 `create_time`),通常自动设置
+
+---
+
+## 调试技巧
+
+### 技巧1:打印 SQL 和参数
+在 Service 方法中添加日志,查看实际执行的 SQL:
+
+```java
+@Override
+public IPage
getTodayOutpatientPatients(...) {
+ // 打印查询条件
+ log.info("查询条件: queryDate={}, doctorId={}, departmentId={}",
+ queryDate, doctorId, departmentId);
+
+ // 执行查询
+ IPage result = mapper.getTodayOutpatientPatients(...);
+
+ // 打印结果
+ log.info("查询结果: 总数={}, 记录数={}",
+ result.getTotal(), result.getRecords().size());
+
+ return result;
+}
+```
+
+### 技巧2:直接执行 SQL 验证
+在数据库客户端直接执行 SQL,验证查询条件是否正确:
+
+```sql
+-- 1. 先查看数据
+SELECT id, start_time, create_time, status_enum
+FROM adm_encounter
+WHERE delete_flag = '0'
+LIMIT 10;
+
+-- 2. 测试查询条件
+SELECT COUNT(*)
+FROM adm_encounter
+WHERE delete_flag = '0'
+ AND start_time::DATE = CURRENT_DATE; -- 测试这个条件
+
+-- 3. 对比其他条件
+SELECT COUNT(*)
+FROM adm_encounter
+WHERE delete_flag = '0'
+ AND create_time::DATE = CURRENT_DATE; -- 对比这个条件
+```
+
+### 技巧3:使用数据库工具检查
+使用数据库管理工具(如 pgAdmin、DBeaver):
+1. 查看表结构
+2. 查看数据样本
+3. 执行测试查询
+4. 检查字段的 NULL 值比例
+
+---
+
+## 预防措施
+
+### 1. 代码审查检查清单
+在代码审查时,检查以下内容:
+
+- [ ] **插入数据时**:是否设置了所有必要的业务字段?
+- [ ] **查询条件时**:使用的字段是否在插入时被设置?
+- [ ] **字段命名**:是否遵循命名规范(`create_time` vs `start_time`)?
+- [ ] **文档注释**:字段的业务含义是否清晰?
+
+### 2. 单元测试
+编写单元测试,验证字段设置:
+
+```java
+@Test
+public void testSaveEncounter() {
+ Encounter encounter = new Encounter();
+ encounter.setPatientId(123L);
+ encounter.setBusNo("TEST001");
+ // 检查是否设置了 start_time
+ assertNotNull(encounter.getStartTime(), "start_time 应该被设置");
+
+ Long id = encounterService.saveEncounterByRegister(encounter);
+
+ // 验证数据库中的值
+ Encounter saved = encounterService.getById(id);
+ assertNotNull(saved.getStartTime(), "数据库中的 start_time 不应该为 NULL");
+}
+```
+
+### 3. 数据库约束
+在数据库层面添加约束,防止 NULL 值:
+
+```sql
+-- 如果 start_time 是必填字段,添加 NOT NULL 约束
+ALTER TABLE adm_encounter
+ALTER COLUMN start_time SET NOT NULL;
+
+-- 或者添加默认值
+ALTER TABLE adm_encounter
+ALTER COLUMN start_time SET DEFAULT CURRENT_TIMESTAMP;
+```
+
+### 4. 代码规范
+建立代码规范,明确字段使用规则:
+
+```java
+/**
+ * 保存就诊信息(门诊挂号)
+ *
+ * 注意:
+ * - create_time: 自动设置(系统字段)
+ * - start_time: 需要手动设置(业务字段,表示就诊开始时间)
+ * - 如果 start_time 为 NULL,查询时使用 create_time 作为挂号时间
+ */
+public Long saveEncounterByRegister(Encounter encounter) {
+ // 如果没有设置 start_time,使用当前时间
+ if (encounter.getStartTime() == null) {
+ encounter.setStartTime(new Date());
+ }
+ // ...
+}
+```
+
+---
+
+## 常见问题模式
+
+### 模式1:时间字段混淆
+- **问题**:使用 `start_time` 查询,但插入时没有设置
+- **解决**:使用 `create_time` 或确保插入时设置 `start_time`
+
+### 模式2:状态字段未设置
+- **问题**:使用 `status_enum` 查询,但插入时使用默认值
+- **解决**:明确设置状态值
+
+### 模式3:关联字段未设置
+- **问题**:使用 `organization_id` 查询,但插入时为 NULL
+- **解决**:确保插入时设置关联字段
+
+---
+
+## 快速排查清单
+
+遇到"查询不到数据"问题时,按以下顺序检查:
+
+1. ✅ **数据库中有数据吗?**
+ ```sql
+ SELECT COUNT(*) FROM adm_encounter WHERE delete_flag = '0';
+ ```
+
+2. ✅ **查询条件使用的字段有值吗?**
+ ```sql
+ SELECT start_time FROM adm_encounter WHERE delete_flag = '0' LIMIT 10;
+ ```
+
+3. ✅ **插入代码设置了该字段吗?**
+ - 查看 Service 的 save/insert 方法
+ - 检查是否调用了 setter 方法
+
+4. ✅ **字段的业务含义是什么?**
+ - 是系统字段(自动设置)还是业务字段(手动设置)?
+
+5. ✅ **有类似功能能查到数据吗?**
+ - 对比能查到数据的方法,找出差异
+
+---
+
+## 总结
+
+**核心原则**:
+1. **先看数据**:检查字段是否有值
+2. **再看代码**:检查插入时是否设置
+3. **对比差异**:找出能查到数据的方法
+4. **验证修复**:修改后验证数据
+
+**记住**:查询条件使用的字段,必须在数据插入/更新时被设置!
+
+