-- ============================================================
|
-- 设备使用记录历史数据回填(数据修复,非结构变更)
|
-- 生成日期: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 = ?;
|