提供第 1–10 条阴/阳→阴性/阳性及空值默认回填的预览执行脚本与迁移 SQL。 Co-authored-by: Cursor <cursoragent@cursor.com>
349 lines
11 KiB
SQL
349 lines
11 KiB
SQL
-- 质检历史结果刷新:对应 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
|