liusheng
6 天以前 fb89df539c6293a41933e445df25fa9b8047ba18
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
-- ============================================================================
-- 南华附一(nhfy)满意度统计 /smartor/satisfaction/statistics 查不出数据 —— 定位与修复
--                                                        2026-10-21
--
-- 【请求】POST /prod-api/smartor/satisfaction/statistics
--   { "type":2, "startTime":"2026-07-23", "endTime":"2026-10-21",
--     "deptcodes":["40003511"], "hospitaldistrictcodes":["40003514"],
--     "scriptids":[], "templateid":null }
--   结果:页面一行数据都没有。
--
-- 【根因】三个问题叠加,任何一个都会让接口返回空:
--
--   ① 科室/病区被写成 AND(代码 Bug)
--      SatisfactionMapper.xml#selectSatisfactionSubtaskTypes
--      原来是「leavehospitaldistrictcode IN(...) AND deptcode IN(...)」两条独立条件。
--      但满意度子任务(type=2 + service_type 6/14/15/16)在南华**只写 deptcode**,
--      leavehospitaldistrictcode 全为 NULL(实测 3803 条全部 NULL)→ 两个条件永远不可能同时成立
--      → types 查空 → hasVoice / hasQuestionnaire 都 false → 整个接口直接返回空。
--      同一个页面的另外 3 条 SQL(sendCount / FillPersonCountByQuestion / FillStatByMatchedtext)
--      用的都是「科室 OR 病区」,只有这一条写成了 AND,属于重构时漏改。
--
--   ② 时间过滤列 visit_time 全为 NULL(数据问题)
--      统计的 4 条 SQL 都用 `visit_time >= startTime AND visit_time < endTime+1d`,
--      而南华的满意度子任务 visit_time **3803 条全部为 NULL**(今天的也在写 NULL)
--      → 即使 ① 修好,日期条件仍然把数据全部排除。
--
--   ③ 问卷题目没有挂到「满意度(myd)」分类(配置问题)
--      统计页的题目清单来自 svy_lib_script_category 中 type 含 myd 的分类 →
--      svy_lib_template_script.categoryid IN (这些分类)。
--      南华 myd 分类只有 1 个(id=62,name=满意度),里面是 6 道老题(svyid 51/97/102/103/154/156,
--      属于其它问卷模板),而真正在填的 19 道题(svyid=200 / 模板 514)**categoryid 全是 NULL**
--      → 即使 ① ② 修好,页面也只会列出那 6 道没有数据的老题。
--
-- 【已做的修复】
--   代码(需发版):
--     SatisfactionMapper.xml
--       · selectSatisfactionSubtaskTypes:科室/病区改为 OR,与其余三条统计 SQL 口径一致
--       · 4 条统计 SQL 的时间条件改为
--         IFNULL(visit_time, IFNULL(finishtime, create_time))(visit_time 为空时按完成/创建时间兜底)
--   数据(已执行,本脚本记录):
--     · 把模板 200 的 19 道题挂到满意度分类 id=62(19 行)
--       备份表:bak_svy_lts_cat_20261021
--
-- 【修复后实测(2026-10-21,条件同截图)】
--   types = ['2'];发送人数 387;19 道题逐题答题人数 380(答题率 98.2%)
--
-- 【回滚】
--   UPDATE svy_lib_template_script t
--     JOIN bak_svy_lts_cat_20261021 b ON b.id = t.id
--   SET t.categoryid = b.categoryid;
-- ============================================================================
 
 
-- ----------------------------------------------------------------------------
-- 【0】故障复现(修复前这三条要能说明问题)
-- ----------------------------------------------------------------------------
-- ① 类型探测:修复前返回 0 行
SELECT DISTINCT type
FROM service_subtask
WHERE del_flag = 0
  AND leavehospitaldistrictcode IN ('40003514')
  AND deptcode IN ('40003511')            -- 与上一行是 AND,故永远不成立
  AND service_type IN ('6', '14', '15', '16')
  AND visit_time >= '2026-07-23'
  AND visit_time < date_add('2026-10-21', interval 1 day);
 
-- ② 满意度子任务的时间/科室字段现状
SELECT COUNT(*)                              AS rows_total,
       SUM(visit_time IS NULL)               AS visit_time_null,
       SUM(leavehospitaldistrictcode IS NULL) AS district_null,
       SUM(deptcode IS NOT NULL)             AS has_deptcode
FROM service_subtask
WHERE del_flag = 0 AND type = '2' AND service_type IN ('6', '14', '15', '16');
 
-- ③ 修复前 myd 分类里只有 6 道老题(svyid 不含 200)
SELECT COUNT(*) AS myd_questions, GROUP_CONCAT(DISTINCT svyid) AS svyids
FROM svy_lib_template_script
WHERE categoryid = 62 AND del_flag = 0;
 
 
-- ----------------------------------------------------------------------------
-- 【1】已执行:把模板 200 的 19 道题挂到满意度分类 62
-- ----------------------------------------------------------------------------
-- DROP TABLE IF EXISTS bak_svy_lts_cat_20261021;
-- CREATE TABLE bak_svy_lts_cat_20261021 AS
-- SELECT id, svyid, categoryid, script_content
-- FROM svy_lib_template_script
-- WHERE svyid = 200 AND categoryid IS NULL AND del_flag = 0;      -- 19 行
--
-- UPDATE svy_lib_template_script
-- SET categoryid = 62
-- WHERE svyid = 200 AND categoryid IS NULL AND del_flag = 0;      -- 19 行
 
 
-- ----------------------------------------------------------------------------
-- 【2】修复后校验:页面上每道题的 发送人数 / 答题人数
--      预期:19 道 svyid=200 的题都是 387 / 380;6 道老题 0 / 0
-- ----------------------------------------------------------------------------
SELECT s.id AS script_id, s.svyid,
       LEFT(s.script_content, 18) AS question,
       (SELECT COUNT(DISTINCT ss.id)
          FROM service_subtask ss
         WHERE ss.del_flag = 0 AND ss.type = '2' AND ss.libtemplateid = s.svyid
           AND ss.service_type IN ('6', '14', '15', '16')
           AND IFNULL(ss.visit_time, IFNULL(ss.finishtime, ss.create_time)) >= '2026-07-23 00:00:00'
           AND IFNULL(ss.visit_time, IFNULL(ss.finishtime, ss.create_time)) < date_add('2026-10-21 00:00:00', interval 1 day)
           AND (ss.leavehospitaldistrictcode IN ('40003514') OR ss.deptcode IN ('40003511'))) AS send_person,
       (SELECT COUNT(DISTINCT ss.id)
          FROM service_subtask ss
          JOIN service_subtask_detail d ON d.sub_id = ss.id AND d.del_flag = 0
         WHERE ss.del_flag = 0 AND ss.type = '2' AND ss.libtemplateid = s.svyid
           AND ss.service_type IN ('6', '14', '15', '16')
           AND IFNULL(ss.visit_time, IFNULL(ss.finishtime, ss.create_time)) >= '2026-07-23 00:00:00'
           AND IFNULL(ss.visit_time, IFNULL(ss.finishtime, ss.create_time)) < date_add('2026-10-21 00:00:00', interval 1 day)
           AND (ss.leavehospitaldistrictcode IN ('40003514') OR ss.deptcode IN ('40003511'))
           AND d.questiontext = s.script_content) AS answer_person
FROM svy_lib_template_script s
WHERE s.categoryid = 62 AND s.del_flag = 0
ORDER BY s.svyid, s.id;
 
 
-- ============================================================================
-- 【后续建议(可选)】
-- 1) visit_time 补数据(让所有按 visit_time 过滤的报表都能查到满意度数据,
--    也能走索引;代码里的 IFNULL 兜底是保险,不等于数据本身正确):
--      UPDATE service_subtask
--      SET visit_time = IFNULL(finishtime, create_time)
--      WHERE del_flag = 0 AND type = '2' AND service_type IN ('6','14','15','16')
--        AND visit_time IS NULL;                       -- 实测 3803 行
--    ⚠️ 与「随访完成时间」口径相关的看板会受影响,建议先确认业务口径再执行。
--
-- 2) 分类里那 6 道老题(svyid 51/97/102/103/154/156)现在会以 0/0 显示——
--    它们属于其它问卷模板、不参与满意度统计但被挂在了 myd 分类上。
--    想让页面只显示 19 道真题的话,把它们从分类里摘掉即可:
--      UPDATE svy_lib_template_script SET categoryid = NULL
--      WHERE categoryid = 62 AND svyid <> 200 AND del_flag = 0;   -- 6 行(先备份)
--
-- 3) 前端请求里带了 scriptids: [] 和 templateid: null,
--    但后端 PatSatisfactionReqVO 没有 scriptids 字段(会被忽略)、statistics 也不用 templateid,
--    如果要按题目/模板筛选,需要前后端一起补。
-- ============================================================================