1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
-- ============================================================
-- 设备使用记录历史数据回填(数据修复,非结构变更)
-- 生成日期:2026-11-06
--
-- 背景:旧版本自动生成使用记录时只写设备、样品和使用人,
--   没有写使用日期、起止时间和温湿度,导致使用记录页面这些列为空。
--   新版本在保存原始记录时会自动带出,但不会回头修改历史数据。
--
-- 回填口径(按客户确认的规则):
--   1. 只处理 use_start_date 为空的历史记录,已手工填写的不动;
--   2. 通过 ins_order_template_device 找到该订单、该设备对应的
--      原始记录快照 ins_order_standard_template;
--   3. 同一设备在同一订单对应多个模板时,取检测日期最早的一条;
--   4. 使用开始日期 = 检测开始日期 10:00:00;
--      使用结束日期 = 检测结束日期 19:30:00;
--      没有检测结束日期时按开始日期当天 19:30:00;
--   5. 温度取原始记录快照温度,已有的不覆盖;
--   6. 原始记录没有湿度字段,湿度不回填;
--   7. 找不到原始记录设备关联的手工记录保持为空,由实验人员补填。
--
-- 数据来源均为库中已存在的原始记录快照,仅 10:00 / 19:30
-- 为按客户规则填入的默认时间。
--
-- 脚本可重复执行(幂等)。
-- ============================================================
 
-- 1. 备份使用记录表(首次执行创建,重复执行不覆盖)
CREATE TABLE IF NOT EXISTS `device_record_bak_20261106` AS
SELECT * FROM `device_record`;
 
-- 2. 回填前统计
-- 2.1 空记录总数
SELECT COUNT(*) AS blank_total
FROM device_record
WHERE use_start_date IS NULL;
 
-- 2.2 能匹配到原始记录条件的空记录数
SELECT COUNT(*) AS matchable_total
FROM device_record dr
WHERE dr.use_start_date IS NULL
  AND EXISTS (
      SELECT 1
      FROM ins_order_template_device t
      JOIN ins_order_standard_template s
        ON s.ins_order_id = t.ins_order_id AND s.template_id = t.template_id
      WHERE t.ins_order_id = dr.ins_order_id
        AND t.device_id = dr.device_id
        AND s.detection_time IS NOT NULL
  );
 
-- 2.3 匹配不到、将保持为空的记录(人工补填)
SELECT dr.id, dr.ins_order_id, dr.device_id, dr.sample_code
FROM device_record dr
WHERE dr.use_start_date IS NULL
  AND NOT EXISTS (
      SELECT 1
      FROM ins_order_template_device t
      JOIN ins_order_standard_template s
        ON s.ins_order_id = t.ins_order_id AND s.template_id = t.template_id
      WHERE t.ins_order_id = dr.ins_order_id
        AND t.device_id = dr.device_id
        AND s.detection_time IS NOT NULL
  );
 
-- 3. 回填
START TRANSACTION;
 
UPDATE device_record dr
JOIN (
    SELECT t.ins_order_id, t.device_id,
           s.temperature, s.detection_time, s.detection_end_time
    FROM ins_order_template_device t
    JOIN ins_order_standard_template s
      ON s.ins_order_id = t.ins_order_id AND s.template_id = t.template_id
    WHERE s.detection_time IS NOT NULL
      AND s.id = (
          SELECT s2.id
          FROM ins_order_template_device t2
          JOIN ins_order_standard_template s2
            ON s2.ins_order_id = t2.ins_order_id AND s2.template_id = t2.template_id
          WHERE t2.ins_order_id = t.ins_order_id
            AND t2.device_id = t.device_id
            AND s2.detection_time IS NOT NULL
          ORDER BY s2.detection_time ASC, s2.id ASC
          LIMIT 1
      )
) picked ON picked.ins_order_id = dr.ins_order_id AND picked.device_id = dr.device_id
SET dr.use_start_date = TIMESTAMP(picked.detection_time, '10:00:00'),
    dr.use_end_date = TIMESTAMP(COALESCE(picked.detection_end_time, picked.detection_time), '19:30:00'),
    dr.temperature = COALESCE(NULLIF(dr.temperature, ''), picked.temperature)
WHERE dr.use_start_date IS NULL;
 
COMMIT;
 
-- 4. 校验(执行完可人工核对)
-- 4.1 回填前后对比:备份表空格数 - 现表空格数 = 本次回填条数
-- SELECT
--     (SELECT COUNT(*) FROM device_record_bak_20261106 WHERE use_start_date IS NULL) AS blank_before,
--     (SELECT COUNT(*) FROM device_record WHERE use_start_date IS NULL) AS blank_after;
--
-- 4.2 抽查某订单的回填结果
-- SELECT id, device_id, ins_order_id, sample_code, temperature, use_start_date, use_end_date, use_person
-- FROM device_record
-- WHERE ins_order_id = ?;