-- ============================================================================
|
-- 南华附一(nhfy):恢复被逻辑删除的满意度作答明细(2026-10-21 已执行)
|
--
|
-- 【背景】导出「问题详情占比」比「患者随访信息表单」少 10 人(370 vs 380),
|
-- 原因是这 10 个子任务的 service_subtask_detail 全部被置 del_flag='1'
|
-- (同一患者还有 2~6 份重复副本,答案完全一致)。
|
-- 详见 / 排查_问题占比与随访表单人数不一致.sql、抓现场_谁把明细置为删除_20261021.sql
|
--
|
-- 【本次执行内容】
|
-- 1) 恢复 5 个子任务(45108 45109 45110 45111 45114):每 (sub_id, scriptid) 取 MAX(id) 那一份置 del_flag='0'
|
-- -> 更新 95 行(19 题 × 5 人)
|
-- 2) 补齐此前人工恢复漏掉的题(45099 缺 4 题、45102 缺 9 题)
|
-- -> 更新 13 行
|
-- 3) 未改 update_time(保持 create_time=update_time 的取证指纹,也与此前人工恢复的行一致)
|
-- 4) 重复副本(同题同答案的多份)仍保留 del_flag='1',不影响统计:
|
-- 导出 SQL 按 (task, question, asrtext, targetvalue, value_type) 分组 + COUNT(DISTINCT s.id) 去重
|
--
|
-- 【执行结果(2026-10-21 复核)】
|
-- 表单行数 380 / 有有效明细的患者 380;19 道题逐题人数全部 380(此前 370/378/379)
|
-- 每个子任务活行题目数:44957(19) 45094(19) 45095(19) 45099(19) 45102(19)
|
-- 45108(19) 45109(19) 45110(19) 45111(19) 45114(19)
|
--
|
-- 【备份表】用于回滚
|
-- bak_ssd_20261021_nhfy = 412 行(45108/45109/45110/45111/45114 的全部明细)
|
-- bak_ssd_20261021_nhfy_2 = 114 行(45099/45102 的全部明细)
|
-- ============================================================================
|
|
|
-- ----------------------------------------------------------------------------
|
-- 【已执行】(1) 备份
|
-- ----------------------------------------------------------------------------
|
-- DROP TABLE IF EXISTS bak_ssd_20261021_nhfy;
|
-- CREATE TABLE bak_ssd_20261021_nhfy AS
|
-- SELECT * FROM service_subtask_detail WHERE sub_id IN (45108, 45109, 45110, 45111, 45114);
|
|
-- DROP TABLE IF EXISTS bak_ssd_20261021_nhfy_2;
|
-- CREATE TABLE bak_ssd_20261021_nhfy_2 AS
|
-- SELECT * FROM service_subtask_detail WHERE sub_id IN (45099, 45102);
|
|
|
-- ----------------------------------------------------------------------------
|
-- 【已执行】(2) 恢复 5 个子任务:每 (sub_id, scriptid) 留最新那份 -> 95 行
|
-- ----------------------------------------------------------------------------
|
-- UPDATE service_subtask_detail d
|
-- JOIN (SELECT sub_id, scriptid, MAX(id) AS keep_id
|
-- FROM service_subtask_detail
|
-- WHERE sub_id IN (45108, 45109, 45110, 45111, 45114)
|
-- GROUP BY sub_id, scriptid) x ON x.keep_id = d.id
|
-- SET d.del_flag = '0';
|
|
|
-- ----------------------------------------------------------------------------
|
-- 【已执行】(3) 补齐 45099 / 45102 缺的题 -> 13 行
|
-- ----------------------------------------------------------------------------
|
-- UPDATE service_subtask_detail d
|
-- JOIN (SELECT x.sub_id, x.scriptid, MAX(x.id) AS keep_id
|
-- FROM service_subtask_detail x
|
-- WHERE x.sub_id IN (45099, 45102)
|
-- AND NOT EXISTS (SELECT 1 FROM service_subtask_detail d3
|
-- WHERE d3.sub_id = x.sub_id AND d3.scriptid = x.scriptid AND d3.del_flag = 0)
|
-- GROUP BY x.sub_id, x.scriptid) k ON k.keep_id = d.id
|
-- SET d.del_flag = '0';
|
|
|
-- ----------------------------------------------------------------------------
|
-- 【校验】随时可重跑(预期 380 / 380)
|
-- ----------------------------------------------------------------------------
|
SET @expect := 380;
|
|
SELECT COUNT(*) AS form_rows,
|
COUNT(DISTINCT CASE WHEN d.live = 1 THEN d.sub_id END) AS with_live_detail
|
FROM service_subtask s
|
LEFT JOIN (SELECT sub_id, MAX(del_flag = 0) AS live FROM service_subtask_detail GROUP BY sub_id) d
|
ON d.sub_id = s.id
|
WHERE s.del_flag = '0' AND s.orgid = '20001001' AND s.campusid = '30001002'
|
AND s.service_type = 6 AND s.sendstate = 6 AND s.visit_count = 1
|
AND (s.deptcode = '40003511' OR s.leavehospitaldistrictcode = '40003514');
|
|
SELECT MIN(c) AS min_cnt, MAX(c) AS max_cnt, SUM(c <> @expect) AS not_equal
|
FROM ( SELECT COUNT(DISTINCT s.id) AS c
|
FROM service_subtask s
|
JOIN service_subtask_detail d
|
ON d.sub_id = s.id AND d.del_flag = 0
|
AND d.id = (SELECT MAX(d2.id) FROM service_subtask_detail d2
|
WHERE d2.sub_id = d.sub_id AND d2.questiontext <=> d.questiontext AND d2.del_flag = '0')
|
WHERE s.del_flag = '0' AND s.orgid = '20001001' AND s.campusid = '30001002'
|
AND s.service_type = 6 AND s.sendstate = 6 AND s.visit_count = 1
|
AND (s.deptcode = '40003511' OR s.leavehospitaldistrictcode = '40003514')
|
GROUP BY d.questiontext
|
) x;
|
|
|
-- ----------------------------------------------------------------------------
|
-- 【回滚】(需要撤销时)
|
-- ----------------------------------------------------------------------------
|
-- UPDATE service_subtask_detail d
|
-- JOIN bak_ssd_20261021_nhfy b ON b.id = d.id
|
-- SET d.del_flag = b.del_flag, d.update_time = b.update_time;
|
-- UPDATE service_subtask_detail d
|
-- JOIN bak_ssd_20261021_nhfy_2 b ON b.id = d.id
|
-- SET d.del_flag = b.del_flag, d.update_time = b.update_time;
|
|
|
-- ============================================================================
|
-- 【注意】本次只是修数据。根因(谁把明细置 1)尚未定位:
|
-- 全库被删明细的 update_time 全部等于 create_time,说明删除**没有**走
|
-- Controller->Service 那两条接口(它们会强制 NOW());用
|
-- sql/抓现场_谁把明细置为删除_20261021.sql 里的 general_log 抓一次 SQL 原文即可定案。
|
-- 在此之前,只要还有患者"重填/被补默认值",同样的问题会再次出现。
|
-- ============================================================================
|