Files
zkxw/docs/sql/migrations/2026-11-09-refresh-qc-task-result-yin-yang-1-10.sql
T
zlwuandCursor e2a50b33fe chore(qc): 补充阴阳性参数变更后历史结果刷新工具
提供第 1–10 条阴/阳→阴性/阳性及空值默认回填的预览执行脚本与迁移 SQL。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 11:37:41 +08:00

349 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 质检历史结果刷新:对应 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