liusheng
6 天以前 279d50c151d14d04cb6680b10c82bf32b72968cb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
-- ============================================================================
-- 南华附一(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 原文即可定案。
--   在此之前,只要还有患者"重填/被补默认值",同样的问题会再次出现。
-- ============================================================================