chore(qc): 补充阴阳性参数变更后历史结果刷新工具

提供第 1–10 条阴/阳→阴性/阳性及空值默认回填的预览执行脚本与迁移 SQL。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-11-09 11:37:41 +08:00
1 parent 3d9a71da46
commit e2a50b33fe
2 files changed
+931

No files matched your search

@@ -0,0 +1,348 @@
-- 质检历史结果刷新:对应 2026-11-09 配置变更第 1–10 条
--
-- 做什么:
-- 1) 「阴/阳」→「阴性/阳性」
-- 2) 已有结果行且值为空,且模板为 select 且有默认值 → 写成默认值(一般为「阴性」)
-- 3) 值兼容时同步结果行 param_type 快照(text→select 等);定量等异形值不改
-- 不做什么:
-- - 不为「任务存在但无结果行」INSERT
-- - 不改第 11 条 HLA、不改已有定量等非空异形值(如 0.01)
--
-- 使用:先跑「一、预览」,确认条数后再跑「二、执行」。
-- 建议在事务中执行:START TRANSACTION; ... 核对 ... COMMIT; / ROLLBACK;
-- 目标库:测试库 zkxw-sc 或生产库(执行前自行确认当前库)
-- SELECT DATABASE();
-- ---------------------------------------------------------------------------
-- 公共:第 1–10 条项目参数模板
-- ---------------------------------------------------------------------------
-- 可先单独核对模板是否已是「阴性/阳性」单选:
SELECT
COALESCE(l.item_code, t.item_code) AS item_code,
COALESCE(l.item_name, t.item_name) AS item_name,
p.id AS param_id,
p.param_name,
p.param_type,
p.options,
p.default_value
FROM biz_qc_item_param p
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
WHERE p.del_flag = 0
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
)
ORDER BY item_code, p.order_num;
-- ===========================================================================
-- 一、预览(只读)
-- ===========================================================================
-- A. 已有结果行库存:空 / 阴阳旧文案 / 标准阴阳性 / 其他
SELECT
COALESCE(l.item_code, t.item_code) AS item_code,
COUNT(*) AS result_rows,
SUM(CASE WHEN r.param_value IS NULL OR TRIM(r.param_value) = '' THEN 1 ELSE 0 END) AS empty_n,
SUM(CASE WHEN r.param_value IN ('阴', '阳') THEN 1 ELSE 0 END) AS old_label_n,
SUM(CASE WHEN r.param_value IN ('阴性', '阳性') THEN 1 ELSE 0 END) AS standard_n,
SUM(
CASE
WHEN r.param_value IS NOT NULL
AND TRIM(r.param_value) <> ''
AND r.param_value NOT IN ('阴', '阳', '阴性', '阳性')
THEN 1 ELSE 0
END
) AS other_n
FROM biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
WHERE r.del_flag = 0
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
)
GROUP BY item_code
ORDER BY item_code;
-- B. 将执行:阴/阳 → 阴性/阳性
SELECT
COALESCE(l.item_code, t.item_code) AS item_code,
r.id AS result_id,
r.task_id,
r.param_value AS old_value,
CASE r.param_value WHEN '阴' THEN '阴性' WHEN '阳' THEN '阳性' END AS new_value
FROM biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
WHERE r.del_flag = 0
AND r.param_value IN ('阴', '阳')
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- C. 将执行:空结果行 → 模板 default_value(仅 select 且模板有默认值)
SELECT
COALESCE(l.item_code, t.item_code) AS item_code,
r.id AS result_id,
r.task_id,
r.param_value AS old_value,
p.default_value AS new_value,
r.param_type AS old_type,
p.param_type AS template_type
FROM biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
WHERE r.del_flag = 0
AND (r.param_value IS NULL OR TRIM(r.param_value) = '')
AND p.param_type = 'select'
AND p.default_value IS NOT NULL
AND TRIM(p.default_value) <> ''
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- D. 将执行:同步 param_type(值空,或值已是阴性/阳性,或值已落在模板 options 内)
SELECT
COALESCE(l.item_code, t.item_code) AS item_code,
r.id AS result_id,
r.task_id,
r.param_value,
r.param_type AS old_type,
p.param_type AS new_type
FROM biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
WHERE r.del_flag = 0
AND IFNULL(r.param_type, '') <> IFNULL(p.param_type, '')
AND (
r.param_value IS NULL
OR TRIM(r.param_value) = ''
OR r.param_value IN ('阴性', '阳性', '阴', '阳')
OR (
p.options IS NOT NULL
AND JSON_VALID(p.options)
AND JSON_CONTAINS(CAST(p.options AS JSON), JSON_QUOTE(TRIM(r.param_value)))
)
)
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- E. 信息:关联任务但无结果行(本脚本不会 INSERT)
SELECT 'lab' AS src, lti.item_code, COUNT(*) AS tasks_no_result
FROM biz_qc_task task
JOIN biz_qc_work_order_lab_item wi ON wi.id = task.source_line_id AND wi.del_flag = 0
JOIN biz_qc_lab_test_item lti ON lti.id = wi.lab_test_item_id AND lti.del_flag = 0
JOIN biz_qc_item_param p
ON p.item_source = 'lab' AND p.item_id = lti.id AND p.del_flag = 0
WHERE task.del_flag = 0
AND task.task_type = 'sysz'
AND lti.item_code IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
)
AND NOT EXISTS (
SELECT 1 FROM biz_qc_task_result r
WHERE r.task_id = task.id AND r.del_flag = 0
AND (r.param_id = p.id OR (p.param_code <> '' AND r.param_code = p.param_code))
)
GROUP BY lti.item_code
UNION ALL
SELECT 'third_party', tpi.item_code, COUNT(*)
FROM biz_qc_task task
JOIN biz_qc_work_order_third_item wi ON wi.id = task.source_line_id AND wi.del_flag = 0
JOIN biz_qc_third_party_item tpi ON tpi.id = wi.third_party_item_id AND tpi.del_flag = 0
JOIN biz_qc_item_param p
ON p.item_source = 'third_party' AND p.item_id = tpi.id AND p.del_flag = 0
WHERE task.del_flag = 0
AND task.task_type = 'dsfjc'
AND tpi.item_code IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
)
AND NOT EXISTS (
SELECT 1 FROM biz_qc_task_result r
WHERE r.task_id = task.id AND r.del_flag = 0
AND (r.param_id = p.id OR (p.param_code <> '' AND r.param_code = p.param_code))
)
GROUP BY tpi.item_code
ORDER BY item_code;
-- ===========================================================================
-- 二、执行(建议包在事务里)
-- ===========================================================================
-- START TRANSACTION;
-- 1) 阴/阳 → 阴性/阳性
UPDATE biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
SET
r.param_value = CASE r.param_value WHEN '阴' THEN '阴性' WHEN '阳' THEN '阳性' ELSE r.param_value END,
r.update_by = 'd3000000000000000000000000000001',
r.update_time = NOW()
WHERE r.del_flag = 0
AND r.param_value IN ('阴', '阳')
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- 2) 空结果行 → 模板默认值
UPDATE biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
SET
r.param_value = p.default_value,
r.update_by = 'd3000000000000000000000000000001',
r.update_time = NOW()
WHERE r.del_flag = 0
AND (r.param_value IS NULL OR TRIM(r.param_value) = '')
AND p.param_type = 'select'
AND p.default_value IS NOT NULL
AND TRIM(p.default_value) <> ''
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- 3) 兼容时同步 param_type 快照
-- 注意:先跑 1)2) 后,「阴/阳」已变成标准文案;定量等 other 值不会命中本条件
UPDATE biz_qc_task_result r
JOIN biz_qc_item_param p ON r.param_id = p.id AND p.del_flag = 0
LEFT JOIN biz_qc_lab_test_item l
ON p.item_source = 'lab' AND p.item_id = l.id AND l.del_flag = 0
LEFT JOIN biz_qc_third_party_item t
ON p.item_source = 'third_party' AND p.item_id = t.id AND t.del_flag = 0
SET
r.param_type = p.param_type,
r.update_by = 'd3000000000000000000000000000001',
r.update_time = NOW()
WHERE r.del_flag = 0
AND IFNULL(r.param_type, '') <> IFNULL(p.param_type, '')
AND (
r.param_value IS NULL
OR TRIM(r.param_value) = ''
OR r.param_value IN ('阴性', '阳性')
OR (
p.options IS NOT NULL
AND JSON_VALID(p.options)
AND JSON_CONTAINS(CAST(p.options AS JSON), JSON_QUOTE(TRIM(r.param_value)))
)
)
AND COALESCE(l.item_code, t.item_code) IN (
'ZKXW-QC-000-1',
'ZKXW-QC-003-18',
'ZKXW-QC-003-19',
'ZKXW-QC-003-17',
'ZKXW-QC-001-12',
'ZKXW-QC-001-11',
'ZKXW-QC-001-10',
'ZKXW-QC-001-06',
'ZKXW-QC-001-18',
'ZKXW-QC-002-02'
);
-- 执行后可再跑「一、预览」核对;确认无误再 COMMIT,否则 ROLLBACK
-- COMMIT;
-- ROLLBACK;
-- 可选:把 update_by 换成实际操作人 ID