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
142
143
144
-- ============================================================================
-- 南华附一(nhfy)满意度统计页 /smartor/serviceSubtask/getSfStatisticsCount 查不到数据
--                                                        2026-10-21
--
-- 【请求】POST /dev-api/smartor/serviceSubtask/getSfStatisticsCount
--   { "configKey":"joyCount", "statisticaltype":1, "type":"2",
--     "serviceType":[6], "deptcodes":["40003511",...], "hospitaldistrictcodes":["40003514"],
--     "startTime":"2026-07-23", "endTime":"2026-10-21", "scriptids":[] }
--   页面表格「暂无数据」。
--
-- 【根因 1(主因):时间过滤列 visit_time 全为 NULL】
--   getSfStatistics / getSfStatisticsGroupKey / getSfStatisticsCategory /
--   getSfStatisticsHyperlink / getSfStatisticsJoy(-details) 的「随访时间」条件都是
--       AND visit_time >= DATE(#{startTime}) AND visit_time < DATE_ADD(...)
--   而南华满意度子任务(type=2 + service_type 6/14/15/16)的 visit_time
--   **3811 条全部为 NULL** → 只要页面选了时间区间,就是 0 行。
--   实测(科室 40003511 / 出院 2026-07-23~2026-10-21):
--       原 SQL             = 0 行
--       仅把科室病区改 OR  = 0 行(时间条件仍然吃掉全部)
--       OR + 时间兜底      = 387 行
--
-- 【根因 2:科室 AND 病区,而满意度子任务 83% 没有病区】
--   同一条 SQL 里「科室」和「病区」是两条独立的 AND 条件:
--       AND leavehospitaldistrictcode IN (...)  AND deptcode IN (...)
--   南华满意度子任务的 leavehospitaldistrictcode 有 3236/3811 为 NULL
--   → 两个条件永远不可能同时成立。
--   修复采用**最小改动**:病区为空视为"不限"——
--       AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN (...))
--   有病区的数据行为完全不变(随访 service_type=2 的 49982 行里只有 17 行病区为空)。
--
-- 【根因 3:「满意度项目总条数 / 未采集数 / 完成率」三列恒为 0】
--   getSfStatisticsCategory 的统计口径是
--       SUM(CASE WHEN a.categoryid IN (sys_config:joyCount 里的分类) THEN 1 ELSE 0 END)
--   而 sys_config.joyCount = "62,1000000012,5,1000000015,465",
--   南华满意度作答明细的 categoryid **69599 行全部为 NULL**
--   (来源:svy_task_template_script.categoryid 也是 NULL,落库时原样带下来)
--   → 三列永远 0。
--
-- 【已做的修复】
--   代码(ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml,需发版):
--     · getSfStatistics / getSfStatisticsGroupKey / getSfStatisticsCategory /
--       getSfStatisticsHyperlink / getSfStatisticsJoy / getSfStatisticsJoydetails
--       六处:visit_time → IFNULL(visit_time, finishtime, create_time) 兜底
--     · 同六处:病区条件改为「为空即放过」
--     · getSfStatisticsScriptDetails / getSfStatisticsScriptItemDetails(点「查看详情」弹窗)
--       两处:同样把 visit_time 换成 IFNULL 兜底 —— 不改的话弹窗永远是「暂无数据」
--   数据(已执行,本脚本记录):
--     · svy_task_template_script(templateID=514) 19 行 categoryid = 62(以后新答卷自动带上)
--       备份表 bak_svy_tts_cat_20261021
--     · service_subtask_detail 69599 行 categoryid = 62(历史答卷补上)
--       备份表 bak_ssd_category_20261021
--
-- 【修复后实测(条件同截图:科室 40003511 / 病区 40003514 / 2026-07-23~2026-10-21)】
--   表格行数 1:科室 肿瘤科一病房,采集 386 人次、已完成 379
--   满意度题目总条数 7201(=379×19)、已采集 6510、完成率 ≈90%
--   弹窗「满意度指标详情」19 道题:如「是否有照顾您的护士」379/379、
--     「总体来说…打多少分」359/379、「请打出您最满意的护士」97/379、「最不满意」1/379
-- ============================================================================
 
 
-- ----------------------------------------------------------------------------
-- 【0】证据 SQL
-- ----------------------------------------------------------------------------
-- ① 时间条件的影响(三条对比)
SELECT '原 SQL(AND + visit_time)' AS version, COUNT(*) AS c
FROM service_subtask
WHERE del_flag=0 AND orgid='20001001' AND campusid='30001002'
  AND leavehospitaldistrictcode IN ('40003514') AND deptcode IN ('40003511')
  AND service_type IN (6) AND type='2'
  AND visit_time >= DATE('2026-07-23') AND visit_time < DATE_ADD(DATE('2026-10-21'), INTERVAL 1 DAY)
UNION ALL
SELECT '病区为NULL放过 + visit_time 兜底', COUNT(*)
FROM service_subtask
WHERE del_flag=0 AND orgid='20001001' AND campusid='30001002'
  AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN ('40003514'))
  AND deptcode IN ('40003511')
  AND service_type IN (6) AND type='2'
  AND IFNULL(visit_time, IFNULL(finishtime, create_time)) >= DATE('2026-07-23')
  AND IFNULL(visit_time, IFNULL(finishtime, create_time)) < DATE_ADD(DATE('2026-10-21'), INTERVAL 1 DAY);
 
-- ② 满意度明细分类回填前后的口径
SELECT 'categoryid 为空明细' AS k, COUNT(*) AS c
FROM service_subtask_detail d JOIN service_subtask s ON s.id=d.sub_id
WHERE s.del_flag=0 AND s.type='2' AND s.service_type IN ('6','14','15','16') AND d.del_flag=0 AND d.categoryid IS NULL;
 
-- ③ 页面表格与满意度三列的最终口径
SELECT COUNT(DISTINCT t.id) AS subtasks,
       SUM(CASE WHEN a.categoryid IN (62,1000000012,5,1000000015,465) THEN 1 ELSE 0 END) AS joy_all_count,
       SUM(CASE WHEN a.categoryid IN (62,1000000012,5,1000000015,465)
                 AND IFNULL(a.matchedtext,a.asrtext) IS NOT NULL AND IFNULL(a.matchedtext,a.asrtext) <> '' THEN 1 ELSE 0 END) AS joy_count
FROM service_subtask_detail a JOIN service_subtask t ON a.sub_id=t.id
WHERE a.del_flag=0 AND t.del_flag=0 AND t.orgid='20001001' AND t.campusid='30001002'
  AND (t.leavehospitaldistrictcode IS NULL OR t.leavehospitaldistrictcode IN ('40003514'))
  AND t.deptcode IN ('40003511')
  AND t.service_type IN (6) AND t.type='2'
  AND IFNULL(t.visit_time, IFNULL(t.finishtime, t.create_time)) >= DATE('2026-07-23')
  AND IFNULL(t.visit_time, IFNULL(t.finishtime, t.create_time)) < DATE_ADD(DATE('2026-10-21'), INTERVAL 1 DAY);
 
 
-- ============================================================================
-- 【数据修复记录(已执行)】
--   1) 模板题目挂到满意度分类(让以后的新答卷自带 categoryid)
--      DROP TABLE IF EXISTS bak_svy_tts_cat_20261021;
--      CREATE TABLE bak_svy_tts_cat_20261021 AS
--      SELECT id, templateID, categoryid FROM svy_task_template_script
--      WHERE templateID=514 AND categoryid IS NULL AND del_flag=0;      -- 19 行
--      UPDATE svy_task_template_script SET categoryid=62
--      WHERE templateID=514 AND categoryid IS NULL AND del_flag=0;
--
--   2) 历史作答明细补分类(69599 行,按 id 分段执行,单批 ~1.3 万行)
--      DROP TABLE IF EXISTS bak_ssd_category_20261021;
--      CREATE TABLE bak_ssd_category_20261021 AS
--      SELECT d.id, d.categoryid, d.sub_id
--      FROM service_subtask_detail d JOIN service_subtask s ON s.id=d.sub_id
--      WHERE d.categoryid IS NULL AND d.del_flag=0 AND s.del_flag=0
--        AND s.type='2' AND s.service_type IN ('6','14','15','16');
--      -- 分段(示例:按 id 每 3 万一段,共 8 段)
--      -- UPDATE service_subtask_detail d JOIN service_subtask s ON s.id=d.sub_id
--      -- SET d.categoryid=62
--      -- WHERE d.id BETWEEN 128219 AND 158218 AND d.categoryid IS NULL AND d.del_flag=0
--      --   AND s.del_flag=0 AND s.type='2' AND s.service_type IN ('6','14','15','16');
--
--   回滚:
--      UPDATE service_subtask_detail d JOIN bak_ssd_category_20261021 b ON b.id=d.id
--      SET d.categoryid = b.categoryid;
--      UPDATE svy_task_template_script t JOIN bak_svy_tts_cat_20261021 b ON b.id=t.id
--      SET t.categoryid = b.categoryid;
-- ============================================================================
 
 
-- ============================================================================
-- 【仍未解决 / 需要业务确认的两列】
-- 1) 随访率(及时率):selectTimelyRateBatch 里有
--       AND ss.visit_time IS NOT NULL
--    且用 visit_time / endtime 计算及时率;南华满意度两者都为空
--    → 这一列对满意度口径没有数据来源,会显示 0。
--    要出数必须先有「应随访时间」和「出院时间」,属于数据治理范畴。
--
-- 2) 「满意度指数」tab 调用的 getSfStatisticsJoy / getSfStatisticsJoydetails 是**语音口径**:
--       AND targetid IN (SELECT id FROM ivr_liba_target WHERE assortid IN (joyCount 配置))
--    南华满意度是问卷(svy_* 指标),targetid 与 ivr_liba_target 不是一套
--    → 即使修好时间/病区条件,这个 tab 对南华也只能是 0。
--    要么给南华做一版按 svy 指标统计的实现,要么该 tab 对南华隐藏。
-- ============================================================================