-- ============================================================================
|
-- 南华附一(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 对南华隐藏。
|
-- ============================================================================
|