From fb89df539c6293a41933e445df25fa9b8047ba18 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 09 十一月 2026 14:30:52 +0800
Subject: [PATCH] 补充数据库修复/排查脚本,新增 .gitignore

---
 sql/fix_service_subtask_campusid_20260928.sql              |   80 
 .gitignore                                                 |   41 
 sql/sync_svy_lib_default_value_to_task_20261106.sql        |  282 ++
 sql/cleanup_unused_tables_20260923.sql                     |  336 +++
 sql/rename_service_subtask_dims_20261106.sql               |  105 +
 sql/perf_sf_statistics_details_20261102.sql                |  105 +
 sql/fix_nhfy_随访病区统一为出院病区_20261029.sql                      |  186 +
 sql/任务开关_sys_config.sql                                    |   40 
 sql/tracedeallist_index_optimize.sql                       |   68 
 sql/fix_service_subtask_campusid_20260924.sql              |  108 +
 sql/patinhosp_select_list_slow_diagnose.sql                |  222 ++
 sql/create_pat_med_outhosp_error.sql                       |   44 
 sql/fix_nhfy_patitem_slow_20261106.sql                     |  302 ++
 sql/修复_nhfy_满意度明细被逻辑删除_20261021.sql                        |  128 +
 sql/service_subtask_index_opt.sql                          |  146 +
 sql/v_sf_statistics_ward.sql                               |  603 +++++
 sql/数据采集开关_sys_config.sql                                  |   47 
 sql/diag_admin_dept_ward_20261106.sql                      |  105 +
 sql/在院信息刷新_sys_job.sql                                     |   59 
 sql/index_service_subtask_detail_unique_20261021.sql       |  124 +
 sql/fix_nhfy_sf_statistics_count_20261021.sql              |  144 +
 sql/fix_nhfy_出院随访任务院区病区回填_20261029.sql                     |  165 +
 sql/ivr_script_missing_columns_20260928.sql                |   88 
 sql/fix_nhfy_satisfaction_statistics_20261021.sql          |  141 +
 sql/diag_出院随访少生成_原因排查.sql                                  |  166 +
 sql/service_out_path_radix_shortcode_20261106.sql          |   31 
 sql/门急诊与手术随访开关_sys_config.sql                              |   91 
 sql/排查_问题占比与随访表单人数不一致.sql                                  |  168 +
 sql/fix_admin_dept_ward_missing_20261106.sql               |  150 +
 sql/电话开关_sys_config.sql                                    |   56 
 sql/fix_nhfy_sltd_satisfaction_endpoints_20261021.sql      |  153 +
 sql/满意度开关_sys_config.sql                                   |   39 
 sql/fix_nhfy_ssd_delflag_20261021.sql                      |  110 +
 sql/backfill_service_subtask_dept_from_inhosp_20261106.sql |  290 ++
 sql/ivr_assort_columns_20260928.sql                        |  148 +
 sql/patinhosp_select_list_index_optimize.sql               |  202 ++
 sql/模板开关_sys_config.sql                                    |   65 
 sql/pat_med_outhosp_serialnum_index.sql                    |  184 +
 sql/sltdMydTotalByDimension_index_20260924.sql             |  139 +
 sql/抓现场_谁把明细置为删除_20261021.sql                              |  173 +
 sql/排查_导出问题占比人数与任务数不一致_20261029.sql                        |  108 +
 sql/出入院随访开关_sys_config.sql                                 |  114 +
 42 files changed, 6,056 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..00a4493
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,41 @@
+# ==================== 鏋勫缓浜х墿 ====================
+target/
+out/
+*.class
+
+# ==================== IDE / 缂栬緫鍣� ====================
+.idea/
+*.iml
+*.ipr
+*.iws
+.vscode/
+.settings/
+.project
+.classpath
+
+# ==================== 涓存椂鐩綍 ====================
+tmp/
+.tmp/
+_backups/
+recovered/
+__pycache__/
+*.pyc
+
+# ==================== 澶囦唤涓庝复鏃舵枃浠� ====================
+*.bak
+*.bak[0-9]
+*.bak-*
+*.bak[0-9]-*
+*.orig
+*.rej
+*~
+
+# ==================== 涓�娆℃�ф帓鏌ヨ剼鏈� / 鎺㈤拡 / 鏃ュ織锛堜笉鍏ュ簱锛� ====================
+sql/_probe/
+*.log
+_dbcheck.txt
+package-lock.json
+
+# ==================== 鏈湴涓存椂閰嶇疆 ====================
+ruoyi-admin/src/main/resources/tempfile_*.yml
+ruoyi-admin/src/main/resources/logback-backup.xml
diff --git a/sql/backfill_service_subtask_dept_from_inhosp_20261106.sql b/sql/backfill_service_subtask_dept_from_inhosp_20261106.sql
new file mode 100644
index 0000000..e08ffff
--- /dev/null
+++ b/sql/backfill_service_subtask_dept_from_inhosp_20261106.sql
@@ -0,0 +1,290 @@
+-- ============================================================================
+-- 鎶� pat_med_inhosp 鐨勩�岀瀹� / 鐥呭尯銆嶅洖濉埌 service_subtask锛堝湪闄� 4 鍒� + 绂婚櫌 4 鍒楋級
+-- 鐢熸垚鏃ユ湡锛�2026-11-06锛坴2锛氫慨姝� join 閿� + 鍚堝苟绂婚櫌缁村害锛�
+-- 閫傜敤锛歁ySQL 8.0 / 5.7锛堟湭鐢� CTE銆佺獥鍙e嚱鏁帮級
+--
+-- 鈿狅笍 鍓嶇疆鏉′欢锛氬厛鎵ц杩� sql/rename_service_subtask_dims_20261106.sql锛堝垪宸叉敼鍚嶏級銆�
+--
+-- 鈿狅笍鈿狅笍 join 閿紙v1 鍐欓敊杩囷紝杩欓噷鏇存锛夛細
+--     service_subtask.inhospid 瀛樼殑鏄� **pat_med_inhosp.inhospid**锛堜笟鍔′富閿級锛屼笉鏄� id銆�
+--     璇佹嵁锛歏isitInhospMapper.xml#selectForScan 鏌ョ殑鏄� b.inhospid锛�
+--           VisitSubtaskFactory 閲屾槸 d.setInhospid(inhosp.getInhospid())銆�
+--     闂ㄨ瘖渚т緥澶栵細PatMedOuthospServiceDelegatingImpl 鐢ㄧ殑鏄� pat_med_outhosp.getId()锛�
+--     鎵�浠� pat_med_outhosp 鐨� id 浼氬拰 pat_med_inhosp.inhospid 鎾炲彿 鈫� 蹇呴』鎺掗櫎 service_type='3'銆�
+--
+-- 瀛楁鏄犲皠锛�8 鍒楋紝娉ㄦ剰銆屽湪闄㈢梾鍖恒�嶅拰銆屽嚭闄㈢梾鍖恒�嶄笉鏄竴鍥炰簨锛�
+--   鍦ㄩ櫌缁村害锛堟湰娆℃柊澧炲垪锛�
+--     service_subtask.hospitaldistrictcode/name      鈫� pat_med_inhosp.hospitaldistrictcode/name      锛堝湪闄㈢梾鍖猴級
+--     service_subtask.deptcode/name                   鈫� pat_med_inhosp.deptcode/name                  锛堝湪闄㈢瀹わ級
+--   绂婚櫌/鍑洪櫌缁村害锛堣�佸垪锛屽師 deptcode/deptname 鏀瑰悕鑰屾潵锛�
+--     service_subtask.leaveldeptcode/name             鈫� pat_med_inhosp.leaveldeptcode/name            锛堝嚭闄㈢瀹わ級
+--     service_subtask.leavehospitaldistrictcode/name  鈫� pat_med_inhosp.leavehospitaldistrictcode/name 锛堝嚭闄㈢梾鍖猴級
+--
+-- 瀹夊叏绛栫暐
+--   1) 鍏ㄩ儴鐢� COALESCE銆岀洰鏍囧垪涓虹┖鎵嶅啓銆嶁啋 **涓嶈鐩栦换浣曞凡鏈夊��**锛屽彲閲嶅鎵ц锛�
+--   2) 鏇存柊鍓嶅厛澶囦唤鍙楀奖鍝嶈鐨勮繖 8 鍒楁棫鍊硷紙搂2锛夛紱
+--   3) 澶ц〃鍒嗘壒妯℃澘瑙� 搂6銆�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 0) 鍓嶇疆鑷煡
+-- ----------------------------------------------------------------------------
+SHOW FULL COLUMNS FROM service_subtask LIKE '%dept%';
+SHOW FULL COLUMNS FROM service_subtask LIKE 'hospitaldistrict%';
+SHOW FULL COLUMNS FROM pat_med_inhosp LIKE '%dept%';
+SHOW FULL COLUMNS FROM pat_med_inhosp LIKE 'hospitaldistrict%';
+
+
+-- ----------------------------------------------------------------------------
+-- 1) 褰卞搷闈㈣瘎浼帮紙鍏堢湅鏁帮紝鍐嶅姩鎵嬶級
+-- ----------------------------------------------------------------------------
+
+-- 1.1 鑳� join 涓婄殑瀛愪换鍔℃暟 + 8 鍒楅噷鍚勬湁澶氬皯鏄┖鐨�
+SELECT COUNT(*)                                                                   AS joined_rows,
+       SUM(hospitaldistrictcode      IS NULL OR hospitaldistrictcode      = '')    AS hd_code_empty,
+       SUM(hospitaldistrictname      IS NULL OR hospitaldistrictname      = '')    AS hd_name_empty,
+       SUM(deptcode                  IS NULL OR deptcode                  = '')    AS dept_code_empty,
+       SUM(deptname                  IS NULL OR deptname                  = '')    AS dept_name_empty,
+       SUM(leaveldeptcode            IS NULL OR leaveldeptcode            = '')    AS lv_dept_code_empty,
+       SUM(leaveldeptname            IS NULL OR leaveldeptname            = '')    AS lv_dept_name_empty,
+       SUM(leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')    AS lv_hd_code_empty,
+       SUM(leavehospitaldistrictname IS NULL OR leavehospitaldistrictname = '')    AS lv_hd_name_empty
+  FROM service_subtask s
+  JOIN pat_med_inhosp b
+    ON b.inhospid = s.inhospid
+   AND b.patid   = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+   AND (s.hosp_type IS NULL OR s.hosp_type <> '8');
+
+-- 1.2 鎸� service_type 鐪嬪垎甯冿紙2/13 鍑洪櫌闅忚銆�17/18 鍏ラ櫌瀹f暀/鍏ラ櫌闅忚銆�6/14/15/16 婊℃剰搴﹀瓙浠诲姟锛�
+SELECT s.service_type,
+       COUNT(*)                                                                  AS cnt,
+       SUM(s.deptcode            IS NULL OR s.deptcode            = '')          AS dept_empty,
+       SUM(s.hospitaldistrictcode IS NULL OR s.hospitaldistrictcode = '')        AS hd_empty,
+       SUM(s.leaveldeptcode      IS NULL OR s.leaveldeptcode      = '')          AS lv_dept_empty,
+       SUM(s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = '') AS lv_hd_empty
+  FROM service_subtask s
+  JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+ GROUP BY s.service_type
+ ORDER BY cnt DESC;
+
+-- 1.3 join 涓嶄笂鐨勮瘖鏂細inhospid 鏈夊�笺�佷絾 patid 瀵逛笉涓�
+SELECT s.service_type,
+       COUNT(*) AS unmatched
+  FROM service_subtask s
+  LEFT JOIN pat_med_inhosp b
+         ON b.inhospid = s.inhospid
+        AND b.patid   = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+   AND b.inhospid IS NULL
+ GROUP BY s.service_type
+ ORDER BY unmatched DESC;
+
+-- 1.4 婧愯〃 inhospid 鏄惁鍞竴锛堜笉鍞竴浼氳 UPDATE 鍙栧埌鍏朵腑涓�琛岋紝缁撴灉涓嶇‘瀹氾級
+SELECT inhospid, COUNT(*) AS c, COUNT(DISTINCT patid) AS pats
+  FROM pat_med_inhosp
+ WHERE inhospid IS NOT NULL
+ GROUP BY inhospid
+HAVING c > 1
+ ORDER BY c DESC
+ LIMIT 20;
+
+-- 1.5 涓�鏉″瓙浠诲姟鏄惁浼氳澶氳婧愭暟鎹懡涓紙搴斾负 0锛涙湁鍊煎氨鍏堟妸 搂1.4 鐨勯噸澶嶅鐞嗗共鍑�锛�
+SELECT COUNT(*) AS subtask_rows, COUNT(*) - COUNT(DISTINCT s.id) AS dup_hit
+  FROM service_subtask s
+  JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3';
+
+
+-- ----------------------------------------------------------------------------
+-- 2) 澶囦唤鍙楀奖鍝嶈鐨� 8 鍒楁棫鍊硷紙鍥炴粴瑙� 搂7锛�
+-- ----------------------------------------------------------------------------
+CREATE TABLE bak_service_subtask_dept_20261106 AS
+SELECT s.id,
+       s.service_type,
+       s.hosp_type,
+       s.inhospid,
+       s.patid,
+       s.leaveldeptcode,
+       s.leaveldeptname,
+       s.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname,
+       s.hospitaldistrictcode,
+       s.hospitaldistrictname,
+       s.deptcode,
+       s.deptname
+  FROM service_subtask s
+  JOIN pat_med_inhosp b
+    ON b.inhospid = s.inhospid
+   AND b.patid   = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+   AND (s.hosp_type IS NULL OR s.hosp_type <> '8')
+   AND (  NULLIF(TRIM(s.hospitaldistrictcode), '')       IS NULL
+       OR NULLIF(TRIM(s.hospitaldistrictname), '')       IS NULL
+       OR NULLIF(TRIM(s.deptcode), '')                   IS NULL
+       OR NULLIF(TRIM(s.deptname), '')                   IS NULL
+       OR NULLIF(TRIM(s.leaveldeptcode), '')             IS NULL
+       OR NULLIF(TRIM(s.leaveldeptname), '')             IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictcode), '')  IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictname), '')  IS NULL );
+
+SELECT COUNT(*) AS backup_rows FROM bak_service_subtask_dept_20261106;
+
+
+-- ----------------------------------------------------------------------------
+-- 3) 涓诲洖濉細鍦ㄩ櫌 4 鍒� + 绂婚櫌 4 鍒楋紙鍙ˉ绌猴紝涓嶈鐩栵紱鍙噸澶嶆墽琛岋級
+-- ----------------------------------------------------------------------------
+UPDATE service_subtask s
+  JOIN pat_med_inhosp b
+    ON b.inhospid = s.inhospid
+   AND b.patid   = s.patid
+   SET s.hospitaldistrictcode      = COALESCE(NULLIF(TRIM(s.hospitaldistrictcode), ''),      b.hospitaldistrictcode),
+       s.hospitaldistrictname      = COALESCE(NULLIF(TRIM(s.hospitaldistrictname), ''),      b.hospitaldistrictname),
+       s.deptcode                  = COALESCE(NULLIF(TRIM(s.deptcode), ''),                  b.deptcode),
+       s.deptname                  = COALESCE(NULLIF(TRIM(s.deptname), ''),                  b.deptname),
+       s.leaveldeptcode            = COALESCE(NULLIF(TRIM(s.leaveldeptcode), ''),            b.leaveldeptcode),
+       s.leaveldeptname            = COALESCE(NULLIF(TRIM(s.leaveldeptname), ''),            b.leaveldeptname),
+       s.leavehospitaldistrictcode = COALESCE(NULLIF(TRIM(s.leavehospitaldistrictcode), ''), b.leavehospitaldistrictcode),
+       s.leavehospitaldistrictname = COALESCE(NULLIF(TRIM(s.leavehospitaldistrictname), ''), b.leavehospitaldistrictname)
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'                        -- 闂ㄨ瘖闅忚鐨� inhospid 鏄� pat_med_outhosp.id
+   AND (s.hosp_type IS NULL OR s.hosp_type <> '8')  -- 鎵爜鐢熸垚鐨勮櫄鎷熸偅鑰�
+   AND (  NULLIF(TRIM(s.hospitaldistrictcode), '')      IS NULL
+       OR NULLIF(TRIM(s.hospitaldistrictname), '')      IS NULL
+       OR NULLIF(TRIM(s.deptcode), '')                  IS NULL
+       OR NULLIF(TRIM(s.deptname), '')                  IS NULL
+       OR NULLIF(TRIM(s.leaveldeptcode), '')            IS NULL
+       OR NULLIF(TRIM(s.leaveldeptname), '')            IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictcode), '') IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictname), '') IS NULL );
+
+
+-- ----------------------------------------------------------------------------
+-- 4) 鍙e緞璇存槑 + 鍙�夌殑"寮哄埗鏀瑰啓"
+--
+--    4.1 涓轰粈涔堢闄� 4 鍒椾篃鐢ㄣ�屽彧琛ョ┖銆嶏細
+--        service_type = 17/18锛堝叆闄㈠鏁�/鍏ラ櫌闅忚锛夌敓鎴愭椂璧� type 4/5 鍒嗘敮锛�
+--        `leaveldeptcode/name` 閲屽瓨鐨勫叾瀹炴槸**鍏ラ櫌绉戝**锛坉.setLeaveldeptcode(inhosp.getDeptcode())锛夈��
+--        杩欎簺琛岄潪绌� 鈫� 搂3 涓嶄細鍔ㄥ畠浠紱鑻ヤ负绌哄垯浼氳琛ユ垚 pat_med_inhosp.leaveldeptcode
+--        锛堜綇闄㈡偅鑰呴�氬父涓虹┖ 鈫� 绛変簬娌″彉锛夈��
+--        鍑洪櫌闅忚锛�2/13锛変笌婊℃剰搴﹀瓙浠诲姟锛�6/14/15/16锛夌殑绂婚櫌 4 鍒楃敓鎴愭椂鏈潵灏卞彇鑷�
+--        pat_med_inhosp锛屽彧鍙兘鏄巻鍙茶剰鏁版嵁涓虹┖锛岃ˉ绌哄嵆淇暟鎹��
+--
+--    4.2 濡傛灉浣犺鐨勬槸"17/18 涔熺粺涓�鎴愬嚭闄㈢瀹ゅ彛寰�"锛岀敤涓嬮潰杩欐锛�**浼氳鐩�**锛屽厛璺� 搂2 澶囦唤锛夛細
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+--    SET s.leaveldeptcode            = b.leaveldeptcode,
+--        s.leaveldeptname            = b.leaveldeptname,
+--        s.leavehospitaldistrictcode = b.leavehospitaldistrictcode,
+--        s.leavehospitaldistrictname = b.leavehospitaldistrictname
+--  WHERE s.inhospid IS NOT NULL
+--    AND s.service_type IN ('17', '18')
+--    AND (NULLIF(TRIM(b.leaveldeptcode), '') IS NOT NULL
+--         OR NULLIF(TRIM(b.leavehospitaldistrictcode), '') IS NOT NULL);
+
+
+-- ----------------------------------------------------------------------------
+-- 5) 銆愬彲閫夈�戝叏閮藉己鍒惰鐩栫増锛�"鍘熸潵鏈夊�间絾鏄敊鐨�"鏃剁敤锛�
+--    鎶� 搂3 鐨� COALESCE(...) 鎹㈡垚鐩存帴璧嬪�硷紝骞跺幓鎺� WHERE 閲岄偅涓层�岀洰鏍囧垪涓虹┖銆嶆潯浠讹細
+--      SET s.hospitaldistrictcode = b.hospitaldistrictcode,
+--          s.hospitaldistrictname = b.hospitaldistrictname,
+--          s.deptcode = b.deptcode, s.deptname = b.deptname,
+--          s.leaveldeptcode = b.leaveldeptcode, s.leaveldeptname = b.leaveldeptname,
+--          s.leavehospitaldistrictcode = b.leavehospitaldistrictcode,
+--          s.leavehospitaldistrictname = b.leavehospitaldistrictname
+--    鈿狅笍 pat_med_inhosp.dept* 浼氳銆屽湪闄俊鎭埛鏂般�嶅畾鏃朵换鍔℃寜 HIS 褰撳墠绉戝鏀瑰啓锛�
+--       瑕嗙洊鍚庡彲鑳芥妸"鍑洪櫌褰撴椂鐨勭瀹�"鏀规垚"鐜板湪 HIS 閲岀殑绉戝"銆傝鐩栧墠鍔″繀鍏堝浠姐��
+-- ----------------------------------------------------------------------------
+
+
+-- ----------------------------------------------------------------------------
+-- 6) 澶ц〃鍒嗘壒妯℃澘锛堝琛� UPDATE 涓嶆敮鎸� LIMIT锛岀敤 id 鍖洪棿锛涙瘡娈靛崟鐙彁浜わ級
+--    鍏堟煡鑼冨洿锛歋ELECT MIN(id), MAX(id) FROM service_subtask;
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+--    SET s.hospitaldistrictcode      = COALESCE(NULLIF(TRIM(s.hospitaldistrictcode), ''),      b.hospitaldistrictcode),
+--        s.hospitaldistrictname      = COALESCE(NULLIF(TRIM(s.hospitaldistrictname), ''),      b.hospitaldistrictname),
+--        s.deptcode                  = COALESCE(NULLIF(TRIM(s.deptcode), ''),                  b.deptcode),
+--        s.deptname                  = COALESCE(NULLIF(TRIM(s.deptname), ''),                  b.deptname),
+--        s.leaveldeptcode            = COALESCE(NULLIF(TRIM(s.leaveldeptcode), ''),            b.leaveldeptcode),
+--        s.leaveldeptname            = COALESCE(NULLIF(TRIM(s.leaveldeptname), ''),            b.leaveldeptname),
+--        s.leavehospitaldistrictcode = COALESCE(NULLIF(TRIM(s.leavehospitaldistrictcode), ''), b.leavehospitaldistrictcode),
+--        s.leavehospitaldistrictname = COALESCE(NULLIF(TRIM(s.leavehospitaldistrictname), ''), b.leavehospitaldistrictname)
+--  WHERE s.id > 1 AND s.id <= 50000
+--    AND s.inhospid IS NOT NULL
+--    AND s.service_type <> '3'
+--    AND (s.hosp_type IS NULL OR s.hosp_type <> '8')
+--    AND (  NULLIF(TRIM(s.hospitaldistrictcode), '')      IS NULL
+--        OR NULLIF(TRIM(s.hospitaldistrictname), '')      IS NULL
+--        OR NULLIF(TRIM(s.deptcode), '')                  IS NULL
+--        OR NULLIF(TRIM(s.deptname), '')                  IS NULL
+--        OR NULLIF(TRIM(s.leaveldeptcode), '')            IS NULL
+--        OR NULLIF(TRIM(s.leaveldeptname), '')            IS NULL
+--        OR NULLIF(TRIM(s.leavehospitaldistrictcode), '') IS NULL
+--        OR NULLIF(TRIM(s.leavehospitaldistrictname), '') IS NULL );
+
+
+-- ----------------------------------------------------------------------------
+-- 7) 鍥炴粴锛堟寜 搂2 澶囦唤琛ㄨ繕鍘� 8 鍒楋級
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN bak_service_subtask_dept_20261106 k ON k.id = s.id
+--    SET s.hospitaldistrictcode      = k.hospitaldistrictcode,
+--        s.hospitaldistrictname      = k.hospitaldistrictname,
+--        s.deptcode                  = k.deptcode,
+--        s.deptname                  = k.deptname,
+--        s.leaveldeptcode            = k.leaveldeptcode,
+--        s.leaveldeptname            = k.leaveldeptname,
+--        s.leavehospitaldistrictcode = k.leavehospitaldistrictcode,
+--        s.leavehospitaldistrictname = k.leavehospitaldistrictname;
+
+
+-- ----------------------------------------------------------------------------
+-- 8) 鍥炲~鍚庢牳瀵�
+-- ----------------------------------------------------------------------------
+
+-- 8.1 杩樺墿澶氬皯绌猴紙搴旀帴杩� 0锛涘墿涓嬬殑鍩烘湰鏄� 搂1.3/搂1.4 鍛戒腑涓嶄簡鐨勶級
+SELECT COUNT(*)                                                                    AS still_empty_rows,
+       SUM(hospitaldistrictcode      IS NULL OR hospitaldistrictcode      = '')     AS hd_code_empty,
+       SUM(hospitaldistrictname      IS NULL OR hospitaldistrictname      = '')     AS hd_name_empty,
+       SUM(deptcode                  IS NULL OR deptcode                  = '')     AS dept_code_empty,
+       SUM(deptname                  IS NULL OR deptname                  = '')     AS dept_name_empty,
+       SUM(leaveldeptcode            IS NULL OR leaveldeptcode            = '')     AS lv_dept_code_empty,
+       SUM(leaveldeptname            IS NULL OR leaveldeptname            = '')     AS lv_dept_name_empty,
+       SUM(leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')     AS lv_hd_code_empty,
+       SUM(leavehospitaldistrictname IS NULL OR leavehospitaldistrictname = '')     AS lv_hd_name_empty
+  FROM service_subtask s
+  JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+   AND (s.hosp_type IS NULL OR s.hosp_type <> '8')
+   AND (  NULLIF(TRIM(s.hospitaldistrictcode), '')      IS NULL
+       OR NULLIF(TRIM(s.hospitaldistrictname), '')      IS NULL
+       OR NULLIF(TRIM(s.deptcode), '')                  IS NULL
+       OR NULLIF(TRIM(s.deptname), '')                  IS NULL
+       OR NULLIF(TRIM(s.leaveldeptcode), '')            IS NULL
+       OR NULLIF(TRIM(s.leaveldeptname), '')            IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictcode), '') IS NULL
+       OR NULLIF(TRIM(s.leavehospitaldistrictname), '') IS NULL );
+
+-- 8.2 閫愯瀵圭収鎶芥锛堜袱杈规槸鍚︿竴鑷达級
+SELECT s.id, s.service_type, s.inhospid,
+       s.deptcode                  AS sub_dept,    b.deptcode                  AS inhosp_dept,
+       s.hospitaldistrictcode      AS sub_hd,      b.hospitaldistrictcode      AS inhosp_hd,
+       s.leaveldeptcode            AS sub_lv_dept, b.leaveldeptcode            AS inhosp_lv_dept,
+       s.leavehospitaldistrictcode AS sub_lv_hd,   b.leavehospitaldistrictcode AS inhosp_lv_hd
+  FROM service_subtask s
+  JOIN pat_med_inhosp b ON b.inhospid = s.inhospid AND b.patid = s.patid
+ WHERE s.inhospid IS NOT NULL
+   AND s.service_type <> '3'
+ ORDER BY s.id DESC
+ LIMIT 50;
diff --git a/sql/cleanup_unused_tables_20260923.sql b/sql/cleanup_unused_tables_20260923.sql
new file mode 100644
index 0000000..83ed367
--- /dev/null
+++ b/sql/cleanup_unused_tables_20260923.sql
@@ -0,0 +1,336 @@
+-- ============================================================================
+-- smartor_nhfy 鏁版嵁搴� 鏈娇鐢ㄨ〃娓呯悊鑴氭湰
+-- 鐢熸垚鏃ユ湡: 20260923
+-- 鏉ユ簮: 涓庝唬鐮佸叏閲忔瘮瀵癸紙178 涓� Mapper XML + 鍏ㄩ儴 Java 婧愮爜锛�
+-- 鑼冨洿: 132 寮犱唬鐮侀浂寮曠敤鐨勮〃锛堢┖琛� 110 寮� + 鏈夋暟鎹殑澶囦唤琛� 22 寮狅級
+-- 娉ㄦ剰: 浠ヤ笅琛ㄥ凡琚帓闄わ紝璇峰嬁鍒犻櫎:
+--   * qrtz_*  (Quartz 妗嗘灦琛紝杩愯鏃朵娇鐢�)
+--   * magic_config (magic-api 妗嗘灦琛�)
+--   * pat_med_outhosp_20260406 (鍒嗚〃鏈哄埗+瀛樺偍杩囩▼+瑙嗗浘 v_pat_med_outhosp 浣跨敤)
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 銆愰噸瑕併�戞墽琛屽墠鍔″繀鍏堝浠姐�傛湰搴撶枒浼煎绯荤粺鍏辩敤锛屽缓璁厛纭鏃犲叾浠栫▼搴忚鍐欍��
+-- 鏈夋暟鎹殑 22 寮犺〃寤鸿鍏堟墽琛屼笅鏂� mysqldump 澶囦唤锛�
+--   mysqldump -h192.168.99.192 -P3306 -uroot -p smartor_nhfy \
+--     icd10_copy1 \
+--     pat_archive-old \
+--     pat_archive_copy1 \
+--     pat_archive_copy6 \
+--     pat_med_inhosp-old \
+--     pat_med_inhosp_0710 \
+--     pat_med_inhosp_0814 \
+--     pat_med_inhosp_copy1 \
+--     service_subtask_0710 \
+--     service_subtask_copy1 \
+--     service_subtask_copy2 \
+--     service_subtask_copy3 \
+--     service_subtask_copy4 \
+--     service_subtask_copy5 \
+--     service_subtask_detail_copy1 \
+--     service_subtask_detail_copy2 \
+--     service_task_260806 \
+--     service_taskdept_260806 \
+--     service_taskdiag_copy4 \
+--     svy_lib_template_targetoption_copy1 \
+--     svy_task_template_targetoption_copy1 \
+--     sys_user-old
+--   > backup_unused_tables_20260923.sql
+-- ----------------------------------------------------------------------------
+
+USE `smartor_nhfy`;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ============================================================================
+-- 绗� 0 閮ㄥ垎锛氶妫�鏌ワ紙鍙锛屼笉浼氭敼浠讳綍鏁版嵁锛�
+-- 璇存槑: information_schema.tables.table_rows 瀵� InnoDB 鏄及绠楀�硷紝
+--       涓嬮潰鐨� UNION ALL 鏄簿纭� COUNT锛屾墽琛屽悗搴旂湅鍒版墍鏈� cnt 鍧囦负 0銆�
+-- 鑻ユ煇琛� cnt > 0锛岃鏄庤琛ㄤ粛鏈夋暟鎹紝璇峰厛浠庛�岀 1 閮ㄥ垎銆嶄腑绉婚櫎璇ヨ〃鐨� DROP 璇彞銆�
+-- ============================================================================
+SELECT 'xxx' AS tbl, 0 AS cnt WHERE 1=0
+UNION ALL SELECT '_base_dept', COUNT(*) FROM `_base_dept`
+UNION ALL SELECT '_base_dict', COUNT(*) FROM `_base_dict`
+UNION ALL SELECT '_base_dict_item', COUNT(*) FROM `_base_dict_item`
+UNION ALL SELECT '_base_dict_medarea', COUNT(*) FROM `_base_dict_medarea`
+UNION ALL SELECT '_base_permission', COUNT(*) FROM `_base_permission`
+UNION ALL SELECT '_base_permissionresources', COUNT(*) FROM `_base_permissionresources`
+UNION ALL SELECT '_base_role', COUNT(*) FROM `_base_role`
+UNION ALL SELECT 'ai_conversation', COUNT(*) FROM `ai_conversation`
+UNION ALL SELECT 'ai_message', COUNT(*) FROM `ai_message`
+UNION ALL SELECT 'base_applydisease', COUNT(*) FROM `base_applydisease`
+UNION ALL SELECT 'base_dict_disease', COUNT(*) FROM `base_dict_disease`
+UNION ALL SELECT 'base_dict_drug', COUNT(*) FROM `base_dict_drug`
+UNION ALL SELECT 'base_dict_inspect', COUNT(*) FROM `base_dict_inspect`
+UNION ALL SELECT 'base_dict_physicalpackage', COUNT(*) FROM `base_dict_physicalpackage`
+UNION ALL SELECT 'base_dict_surgery', COUNT(*) FROM `base_dict_surgery`
+UNION ALL SELECT 'base_dict_test', COUNT(*) FROM `base_dict_test`
+UNION ALL SELECT 'base_person', COUNT(*) FROM `base_person`
+UNION ALL SELECT 'base_pushtemplate', COUNT(*) FROM `base_pushtemplate`
+UNION ALL SELECT 'base_scoringway', COUNT(*) FROM `base_scoringway`
+UNION ALL SELECT 'base_scoringwaydetail', COUNT(*) FROM `base_scoringwaydetail`
+UNION ALL SELECT 'base_sequence', COUNT(*) FROM `base_sequence`
+UNION ALL SELECT 'base_taskvariable', COUNT(*) FROM `base_taskvariable`
+UNION ALL SELECT 'base_template', COUNT(*) FROM `base_template`
+UNION ALL SELECT 'base_templatecategory', COUNT(*) FROM `base_templatecategory`
+UNION ALL SELECT 'base_wxaccount', COUNT(*) FROM `base_wxaccount`
+UNION ALL SELECT 'bpbj', COUNT(*) FROM `bpbj`
+UNION ALL SELECT 'chat_friend', COUNT(*) FROM `chat_friend`
+UNION ALL SELECT 'chat_friend_group', COUNT(*) FROM `chat_friend_group`
+UNION ALL SELECT 'chat_group_chat', COUNT(*) FROM `chat_group_chat`
+UNION ALL SELECT 'chat_group_members', COUNT(*) FROM `chat_group_members`
+UNION ALL SELECT 'chat_message', COUNT(*) FROM `chat_message`
+UNION ALL SELECT 'chat_message_statistics', COUNT(*) FROM `chat_message_statistics`
+UNION ALL SELECT 'chat_user', COUNT(*) FROM `chat_user`
+UNION ALL SELECT 'crm_complaint', COUNT(*) FROM `crm_complaint`
+UNION ALL SELECT 'cti_callseats', COUNT(*) FROM `cti_callseats`
+UNION ALL SELECT 'dev_bug', COUNT(*) FROM `dev_bug`
+UNION ALL SELECT 'dev_checkrecords', COUNT(*) FROM `dev_checkrecords`
+UNION ALL SELECT 'dev_equipmentinfo', COUNT(*) FROM `dev_equipmentinfo`
+UNION ALL SELECT 'dev_repairpl', COUNT(*) FROM `dev_repairpl`
+UNION ALL SELECT 'dev_repairtype', COUNT(*) FROM `dev_repairtype`
+UNION ALL SELECT 'dev_rprecords', COUNT(*) FROM `dev_rprecords`
+UNION ALL SELECT 'flw_channel_definition', COUNT(*) FROM `flw_channel_definition`
+UNION ALL SELECT 'flw_ev_databasechangelog', COUNT(*) FROM `flw_ev_databasechangelog`
+UNION ALL SELECT 'flw_ev_databasechangeloglock', COUNT(*) FROM `flw_ev_databasechangeloglock`
+UNION ALL SELECT 'flw_event_definition', COUNT(*) FROM `flw_event_definition`
+UNION ALL SELECT 'flw_event_deployment', COUNT(*) FROM `flw_event_deployment`
+UNION ALL SELECT 'flw_event_resource', COUNT(*) FROM `flw_event_resource`
+UNION ALL SELECT 'flw_ru_batch', COUNT(*) FROM `flw_ru_batch`
+UNION ALL SELECT 'flw_ru_batch_part', COUNT(*) FROM `flw_ru_batch_part`
+UNION ALL SELECT 'ivr_task_singlerecords', COUNT(*) FROM `ivr_task_singlerecords`
+UNION ALL SELECT 'ivr_taskdetail1', COUNT(*) FROM `ivr_taskdetail1`
+UNION ALL SELECT 'pat_med_apointment', COUNT(*) FROM `pat_med_apointment`
+UNION ALL SELECT 'pat_tube_feek', COUNT(*) FROM `pat_tube_feek`
+UNION ALL SELECT 'pat_tube_feek_medicine', COUNT(*) FROM `pat_tube_feek_medicine`
+UNION ALL SELECT 'patientinfo', COUNT(*) FROM `patientinfo`
+UNION ALL SELECT 'questionnaire_advise', COUNT(*) FROM `questionnaire_advise`
+UNION ALL SELECT 'questionnaire_question', COUNT(*) FROM `questionnaire_question`
+UNION ALL SELECT 'questionnaire_questionnaire', COUNT(*) FROM `questionnaire_questionnaire`
+UNION ALL SELECT 'questionnaire_questionoption', COUNT(*) FROM `questionnaire_questionoption`
+UNION ALL SELECT 'questionnaire_questiontype', COUNT(*) FROM `questionnaire_questiontype`
+UNION ALL SELECT 'questionnaire_result', COUNT(*) FROM `questionnaire_result`
+UNION ALL SELECT 'questionnaire_resultdetail', COUNT(*) FROM `questionnaire_resultdetail`
+UNION ALL SELECT 'questionnairequestion', COUNT(*) FROM `questionnairequestion`
+UNION ALL SELECT 'questionnairequestionoption', COUNT(*) FROM `questionnairequestionoption`
+UNION ALL SELECT 'scheme_taskrecord_callrecord', COUNT(*) FROM `scheme_taskrecord_callrecord`
+UNION ALL SELECT 'service_scheme', COUNT(*) FROM `service_scheme`
+UNION ALL SELECT 'service_taskdiagnose', COUNT(*) FROM `service_taskdiagnose`
+UNION ALL SELECT 'sms_account', COUNT(*) FROM `sms_account`
+UNION ALL SELECT 'soline', COUNT(*) FROM `soline`
+UNION ALL SELECT 'sopaymentterm', COUNT(*) FROM `sopaymentterm`
+UNION ALL SELECT 'student', COUNT(*) FROM `student`
+UNION ALL SELECT 'svr_plan', COUNT(*) FROM `svr_plan`
+UNION ALL SELECT 'svr_prj', COUNT(*) FROM `svr_prj`
+UNION ALL SELECT 'svr_prjtask', COUNT(*) FROM `svr_prjtask`
+UNION ALL SELECT 'svr_prjtaskline', COUNT(*) FROM `svr_prjtaskline`
+UNION ALL SELECT 'svr_task', COUNT(*) FROM `svr_task`
+UNION ALL SELECT 'svr_taskrecord', COUNT(*) FROM `svr_taskrecord`
+UNION ALL SELECT 'svy_lib_resultrule', COUNT(*) FROM `svy_lib_resultrule`
+UNION ALL SELECT 'svy_task_template_rule', COUNT(*) FROM `svy_task_template_rule`
+UNION ALL SELECT 'sys_deploy_form', COUNT(*) FROM `sys_deploy_form`
+UNION ALL SELECT 'sys_expression', COUNT(*) FROM `sys_expression`
+UNION ALL SELECT 'sys_form', COUNT(*) FROM `sys_form`
+UNION ALL SELECT 'sys_listener', COUNT(*) FROM `sys_listener`
+UNION ALL SELECT 'sys_task_form', COUNT(*) FROM `sys_task_form`
+UNION ALL SELECT 'sys_user_dept_import', COUNT(*) FROM `sys_user_dept_import`
+UNION ALL SELECT 'sys_variable', COUNT(*) FROM `sys_variable`
+UNION ALL SELECT 't_delid', COUNT(*) FROM `t_delid`
+UNION ALL SELECT 'table_svy', COUNT(*) FROM `table_svy`
+UNION ALL SELECT 'tabledesc', COUNT(*) FROM `tabledesc`
+UNION ALL SELECT 'tools', COUNT(*) FROM `tools`
+UNION ALL SELECT 'treatment_plan', COUNT(*) FROM `treatment_plan`
+UNION ALL SELECT 'treatment_plandetail', COUNT(*) FROM `treatment_plandetail`
+UNION ALL SELECT 'treatment_plantemplate', COUNT(*) FROM `treatment_plantemplate`
+UNION ALL SELECT 'treatment_plantemplatedetail', COUNT(*) FROM `treatment_plantemplatedetail`
+UNION ALL SELECT 'wechat_accesstoken', COUNT(*) FROM `wechat_accesstoken`
+UNION ALL SELECT 'wechat_function', COUNT(*) FROM `wechat_function`
+UNION ALL SELECT 'wechat_function_jumpurl', COUNT(*) FROM `wechat_function_jumpurl`
+UNION ALL SELECT 'wechat_functiontype', COUNT(*) FROM `wechat_functiontype`
+UNION ALL SELECT 'wechat_jssdk_ticket', COUNT(*) FROM `wechat_jssdk_ticket`
+UNION ALL SELECT 'wechat_menu', COUNT(*) FROM `wechat_menu`
+UNION ALL SELECT 'wechat_pay_success', COUNT(*) FROM `wechat_pay_success`
+UNION ALL SELECT 'wechat_qrcode', COUNT(*) FROM `wechat_qrcode`
+UNION ALL SELECT 'wechat_respmessage', COUNT(*) FROM `wechat_respmessage`
+UNION ALL SELECT 'wechat_respmessage_key', COUNT(*) FROM `wechat_respmessage_key`
+UNION ALL SELECT 'wechat_sendrecord', COUNT(*) FROM `wechat_sendrecord`
+UNION ALL SELECT 'wechat_subscribeqrcode', COUNT(*) FROM `wechat_subscribeqrcode`
+UNION ALL SELECT 'wechat_subscribesend', COUNT(*) FROM `wechat_subscribesend`
+UNION ALL SELECT 'wechat_templatemessage_templatelist', COUNT(*) FROM `wechat_templatemessage_templatelist`
+UNION ALL SELECT 'wechat_userinfo', COUNT(*) FROM `wechat_userinfo`
+UNION ALL SELECT 'wechat_userinfo_subscribeinfo', COUNT(*) FROM `wechat_userinfo_subscribeinfo`
+ORDER BY cnt DESC;
+
+-- ============================================================================
+-- 绗� 1 閮ㄥ垎锛氬垹闄ょ┖琛紙110 寮狅紝宸叉牳瀵瑰潎涓� 0 琛岋級
+-- 浣跨敤 IF EXISTS锛屽彲閲嶅鎵ц锛屼笉浼氭姤閿�
+-- ============================================================================
+DROP TABLE IF EXISTS `_base_dept`;
+DROP TABLE IF EXISTS `_base_dict`;
+DROP TABLE IF EXISTS `_base_dict_item`;
+DROP TABLE IF EXISTS `_base_dict_medarea`;
+DROP TABLE IF EXISTS `_base_permission`;
+DROP TABLE IF EXISTS `_base_permissionresources`;
+DROP TABLE IF EXISTS `_base_role`;
+DROP TABLE IF EXISTS `ai_conversation`;
+DROP TABLE IF EXISTS `ai_message`;
+DROP TABLE IF EXISTS `base_applydisease`;
+DROP TABLE IF EXISTS `base_dict_disease`;
+DROP TABLE IF EXISTS `base_dict_drug`;
+DROP TABLE IF EXISTS `base_dict_inspect`;
+DROP TABLE IF EXISTS `base_dict_physicalpackage`;
+DROP TABLE IF EXISTS `base_dict_surgery`;
+DROP TABLE IF EXISTS `base_dict_test`;
+DROP TABLE IF EXISTS `base_person`;
+DROP TABLE IF EXISTS `base_pushtemplate`;
+DROP TABLE IF EXISTS `base_scoringway`;
+DROP TABLE IF EXISTS `base_scoringwaydetail`;
+DROP TABLE IF EXISTS `base_sequence`;
+DROP TABLE IF EXISTS `base_taskvariable`;
+DROP TABLE IF EXISTS `base_template`;
+DROP TABLE IF EXISTS `base_templatecategory`;
+DROP TABLE IF EXISTS `base_wxaccount`;
+DROP TABLE IF EXISTS `bpbj`;
+DROP TABLE IF EXISTS `chat_friend`;
+DROP TABLE IF EXISTS `chat_friend_group`;
+DROP TABLE IF EXISTS `chat_group_chat`;
+DROP TABLE IF EXISTS `chat_group_members`;
+DROP TABLE IF EXISTS `chat_message`;
+DROP TABLE IF EXISTS `chat_message_statistics`;
+DROP TABLE IF EXISTS `chat_user`;
+DROP TABLE IF EXISTS `crm_complaint`;
+DROP TABLE IF EXISTS `cti_callseats`;
+DROP TABLE IF EXISTS `dev_bug`;
+DROP TABLE IF EXISTS `dev_checkrecords`;
+DROP TABLE IF EXISTS `dev_equipmentinfo`;
+DROP TABLE IF EXISTS `dev_repairpl`;
+DROP TABLE IF EXISTS `dev_repairtype`;
+DROP TABLE IF EXISTS `dev_rprecords`;
+DROP TABLE IF EXISTS `flw_channel_definition`;
+DROP TABLE IF EXISTS `flw_ev_databasechangelog`;
+DROP TABLE IF EXISTS `flw_ev_databasechangeloglock`;
+DROP TABLE IF EXISTS `flw_event_definition`;
+DROP TABLE IF EXISTS `flw_event_deployment`;
+DROP TABLE IF EXISTS `flw_event_resource`;
+DROP TABLE IF EXISTS `flw_ru_batch`;
+DROP TABLE IF EXISTS `flw_ru_batch_part`;
+DROP TABLE IF EXISTS `ivr_task_singlerecords`;
+DROP TABLE IF EXISTS `ivr_taskdetail1`;
+DROP TABLE IF EXISTS `pat_med_apointment`;
+DROP TABLE IF EXISTS `pat_tube_feek`;
+DROP TABLE IF EXISTS `pat_tube_feek_medicine`;
+DROP TABLE IF EXISTS `patientinfo`;
+DROP TABLE IF EXISTS `questionnaire_advise`;
+DROP TABLE IF EXISTS `questionnaire_question`;
+DROP TABLE IF EXISTS `questionnaire_questionnaire`;
+DROP TABLE IF EXISTS `questionnaire_questionoption`;
+DROP TABLE IF EXISTS `questionnaire_questiontype`;
+DROP TABLE IF EXISTS `questionnaire_result`;
+DROP TABLE IF EXISTS `questionnaire_resultdetail`;
+DROP TABLE IF EXISTS `questionnairequestion`;
+DROP TABLE IF EXISTS `questionnairequestionoption`;
+DROP TABLE IF EXISTS `scheme_taskrecord_callrecord`;
+DROP TABLE IF EXISTS `service_scheme`;
+DROP TABLE IF EXISTS `service_taskdiagnose`;
+DROP TABLE IF EXISTS `sms_account`;
+DROP TABLE IF EXISTS `soline`;
+DROP TABLE IF EXISTS `sopaymentterm`;
+DROP TABLE IF EXISTS `student`;
+DROP TABLE IF EXISTS `svr_plan`;
+DROP TABLE IF EXISTS `svr_prj`;
+DROP TABLE IF EXISTS `svr_prjtask`;
+DROP TABLE IF EXISTS `svr_prjtaskline`;
+DROP TABLE IF EXISTS `svr_task`;
+DROP TABLE IF EXISTS `svr_taskrecord`;
+DROP TABLE IF EXISTS `svy_lib_resultrule`;
+DROP TABLE IF EXISTS `svy_task_template_rule`;
+DROP TABLE IF EXISTS `sys_deploy_form`;
+DROP TABLE IF EXISTS `sys_expression`;
+DROP TABLE IF EXISTS `sys_form`;
+DROP TABLE IF EXISTS `sys_listener`;
+DROP TABLE IF EXISTS `sys_task_form`;
+DROP TABLE IF EXISTS `sys_user_dept_import`;
+DROP TABLE IF EXISTS `sys_variable`;
+DROP TABLE IF EXISTS `t_delid`;
+DROP TABLE IF EXISTS `table_svy`;
+DROP TABLE IF EXISTS `tabledesc`;
+DROP TABLE IF EXISTS `tools`;
+DROP TABLE IF EXISTS `treatment_plan`;
+DROP TABLE IF EXISTS `treatment_plandetail`;
+DROP TABLE IF EXISTS `treatment_plantemplate`;
+DROP TABLE IF EXISTS `treatment_plantemplatedetail`;
+DROP TABLE IF EXISTS `wechat_accesstoken`;
+DROP TABLE IF EXISTS `wechat_function`;
+DROP TABLE IF EXISTS `wechat_function_jumpurl`;
+DROP TABLE IF EXISTS `wechat_functiontype`;
+DROP TABLE IF EXISTS `wechat_jssdk_ticket`;
+DROP TABLE IF EXISTS `wechat_menu`;
+DROP TABLE IF EXISTS `wechat_pay_success`;
+DROP TABLE IF EXISTS `wechat_qrcode`;
+DROP TABLE IF EXISTS `wechat_respmessage`;
+DROP TABLE IF EXISTS `wechat_respmessage_key`;
+DROP TABLE IF EXISTS `wechat_sendrecord`;
+DROP TABLE IF EXISTS `wechat_subscribeqrcode`;
+DROP TABLE IF EXISTS `wechat_subscribesend`;
+DROP TABLE IF EXISTS `wechat_templatemessage_templatelist`;
+DROP TABLE IF EXISTS `wechat_userinfo`;
+DROP TABLE IF EXISTS `wechat_userinfo_subscribeinfo`;
+
+-- ============================================================================
+-- 绗� 2 閮ㄥ垎锛氭湁鏁版嵁鐨勫浠借〃锛�22 寮狅級
+-- 涓哄畨鍏ㄨ捣瑙侊紝榛樿鍙仛銆屾敼鍚嶅綊妗c�嶏紙鍙殢鏃舵敼鍥烇級锛岃瀵熶竴娈垫椂闂村悗鍐嶅垹闄わ細
+--   * 褰掓。鍚庤〃鍚嶅墠缂�涓� zzz_del_锛屾帓鍦ㄥ簱鍒楄〃鏈熬锛屼笉褰卞搷涓氬姟
+--   * 鎭㈠鏂规硶: RENAME TABLE `zzz_del_xxx_20260923` TO `xxx`;
+--   * 纭鏃犺鍚庯紝鎵ц鏈枃浠舵湯灏捐娉ㄩ噴鎺夌殑 DROP 璇彞褰诲簳鍒犻櫎
+-- ============================================================================
+RENAME TABLE `icd10_copy1` TO `zzz_del_icd10_copy1_20260923`;
+RENAME TABLE `pat_archive-old` TO `zzz_del_pat_archive-old_20260923`;
+RENAME TABLE `pat_archive_copy1` TO `zzz_del_pat_archive_copy1_20260923`;
+RENAME TABLE `pat_archive_copy6` TO `zzz_del_pat_archive_copy6_20260923`;
+RENAME TABLE `pat_med_inhosp-old` TO `zzz_del_pat_med_inhosp-old_20260923`;
+RENAME TABLE `pat_med_inhosp_0710` TO `zzz_del_pat_med_inhosp_0710_20260923`;
+RENAME TABLE `pat_med_inhosp_0814` TO `zzz_del_pat_med_inhosp_0814_20260923`;
+RENAME TABLE `pat_med_inhosp_copy1` TO `zzz_del_pat_med_inhosp_copy1_20260923`;
+RENAME TABLE `service_subtask_0710` TO `zzz_del_service_subtask_0710_20260923`;
+RENAME TABLE `service_subtask_copy1` TO `zzz_del_service_subtask_copy1_20260923`;
+RENAME TABLE `service_subtask_copy2` TO `zzz_del_service_subtask_copy2_20260923`;
+RENAME TABLE `service_subtask_copy3` TO `zzz_del_service_subtask_copy3_20260923`;
+RENAME TABLE `service_subtask_copy4` TO `zzz_del_service_subtask_copy4_20260923`;
+RENAME TABLE `service_subtask_copy5` TO `zzz_del_service_subtask_copy5_20260923`;
+RENAME TABLE `service_subtask_detail_copy1` TO `zzz_del_service_subtask_detail_copy1_20260923`;
+RENAME TABLE `service_subtask_detail_copy2` TO `zzz_del_service_subtask_detail_copy2_20260923`;
+RENAME TABLE `service_task_260806` TO `zzz_del_service_task_260806_20260923`;
+RENAME TABLE `service_taskdept_260806` TO `zzz_del_service_taskdept_260806_20260923`;
+RENAME TABLE `service_taskdiag_copy4` TO `zzz_del_service_taskdiag_copy4_20260923`;
+RENAME TABLE `svy_lib_template_targetoption_copy1` TO `zzz_del_svy_lib_template_targetoption_copy1_20260923`;
+RENAME TABLE `svy_task_template_targetoption_copy1` TO `zzz_del_svy_task_template_targetoption_copy1_20260923`;
+RENAME TABLE `sys_user-old` TO `zzz_del_sys_user-old_20260923`;
+
+-- ----------------------------------------------------------------------------
+-- 褰诲簳鍒犻櫎锛堣瀵熸湡缁撴潫銆佺‘璁ゅ綊妗f棤璇悗锛屽彇娑堜笅闈㈡敞閲婃墽琛岋級
+-- ----------------------------------------------------------------------------
+-- DROP TABLE IF EXISTS `zzz_del_icd10_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_archive-old_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_archive_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_archive_copy6_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_med_inhosp-old_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_med_inhosp_0710_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_med_inhosp_0814_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_pat_med_inhosp_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_0710_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_copy2_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_copy3_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_copy4_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_copy5_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_detail_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_subtask_detail_copy2_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_task_260806_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_taskdept_260806_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_service_taskdiag_copy4_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_svy_lib_template_targetoption_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_svy_task_template_targetoption_copy1_20260923`;
+-- DROP TABLE IF EXISTS `zzz_del_sys_user-old_20260923`;
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+-- =============================== 鑴氭湰缁撴潫 ====================================
diff --git a/sql/create_pat_med_outhosp_error.sql b/sql/create_pat_med_outhosp_error.sql
new file mode 100644
index 0000000..6b216a1
--- /dev/null
+++ b/sql/create_pat_med_outhosp_error.sql
@@ -0,0 +1,44 @@
+-- ============================================================================
+-- 鐪佺珛鍚屽痉闂ㄦ�ヨ瘖閲囬泦澶辫触璁板綍琛�
+--
+-- 鑳屾櫙锛欻IS 闂ㄦ�ヨ瘖鏁版嵁鍙兘鎸夊ぉ鏌ワ紝閲囬泦浠诲姟姣忓崐灏忔椂鎶婂綋澶╁叏閲忥紙涓�涓囧鏉★級鎷変竴閬嶃��
+--       鍗曟潯璁板綍濡傛灉杞崲澶辫触/妗f澶勭悊澶辫触/鍏ュ簱澶辫触锛屽師鏉ヤ細鏁撮〉澶辫触骞跺崱浣忛噰闆嗚繘搴︺��
+--       鐜板湪鏀逛负鍐欏叆鏈〃浜ょ粰浜哄伐澶勭悊锛岄噰闆嗚繘搴︿笉鍙楀奖鍝嶃��
+--
+-- 鍚屼竴鏉¤褰曞悓涓�绫婚敊璇彧淇濈暀涓�琛岋細鍞竴绱㈠紩 uk_serialnum_type(serialnum, error_type)锛�
+-- 閲嶅澶辫触绱姞 fail_count锛堝彲浠ョ湅鍑哄畠杩炵画澶辫触浜嗗灏戣疆锛夛紝寮傚父淇℃伅鍜屽師濮� JSON 浼氳鏈�鏂颁竴娆¤鐩栥��
+-- 浜哄伐鎶� handle_status 鏀规垚 1锛堝凡澶勭悊锛夊悗濡傛灉璇ヨ褰曞啀娆″け璐ワ紝浼氳嚜鍔ㄥ洖鍒� 0锛堝緟澶勭悊锛夛紱
+-- 鏀规垚 2锛堝凡蹇界暐锛夌殑涓嶄細鍐嶈鎵撴壈銆�
+--
+-- 浜哄伐澶勭悊甯哥敤 SQL锛�
+--   鏌ョ湅寰呭鐞嗭細select * from pat_med_outhosp_error where handle_status = '0' order by fail_count desc, id;
+--   鐪嬪師濮嬫暟鎹細select serialnum, error_type, error_msg, raw_data from pat_med_outhosp_error where handle_status = '0';
+--   鏍囪宸插鐞嗭細update pat_med_outhosp_error set handle_status = '1', handle_remark = '鍘熷洜+澶勭悊浜�' where id = ?;
+-- ============================================================================
+
+CREATE TABLE IF NOT EXISTS pat_med_outhosp_error
+(
+    id            BIGINT       NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+    serialnum     VARCHAR(64)           DEFAULT NULL COMMENT '璇婄枟璁板綍鍙凤紙healthcareRecordNo锛�',
+    outhospno     VARCHAR(64)           DEFAULT NULL COMMENT '闂ㄨ瘖鍙�',
+    patname       VARCHAR(100)          DEFAULT NULL COMMENT '鎮h�呭鍚�',
+    patno         VARCHAR(64)           DEFAULT NULL COMMENT '鐥呭巻鍙�',
+    campusid      VARCHAR(32)           DEFAULT NULL COMMENT '闄㈠尯ID',
+    orgid         VARCHAR(32)           DEFAULT NULL COMMENT '鏈烘瀯ID',
+    admitdate     DATETIME              DEFAULT NULL COMMENT '灏辫瘖鏃堕棿',
+    gather_date   VARCHAR(20)           DEFAULT NULL COMMENT '閲囬泦鏃ユ湡 yyyy-MM-dd',
+    error_type    VARCHAR(20)  NOT NULL COMMENT '閿欒绫诲瀷锛欳ONVERT-鏁版嵁杞崲澶辫触 ARCHIVE-鎮h�呮。妗堝鐞嗗け璐� INSERT-鍏ュ簱澶辫触',
+    error_msg     VARCHAR(1000)         DEFAULT NULL COMMENT '寮傚父淇℃伅',
+    raw_data      TEXT COMMENT '鎺ュ彛杩斿洖鐨勫師濮嬭褰旿SON锛屼汉宸ヤ慨澶嶅悗鍙嵁姝ら噸鎺�',
+    fail_count    INT          NOT NULL DEFAULT 1 COMMENT '绱澶辫触娆℃暟',
+    handle_status CHAR(1)      NOT NULL DEFAULT '0' COMMENT '澶勭悊鐘舵�侊細0寰呭鐞� 1宸插鐞� 2宸插拷鐣�',
+    handle_remark VARCHAR(500)          DEFAULT NULL COMMENT '澶勭悊澶囨敞',
+    create_time   DATETIME              DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+    update_time   DATETIME              DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+    PRIMARY KEY (id),
+    UNIQUE KEY uk_serialnum_type (serialnum, error_type),
+    KEY idx_handle_status (handle_status),
+    KEY idx_error_type (error_type),
+    KEY idx_create_time (create_time)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='鐪佺珛鍚屽痉闂ㄦ�ヨ瘖閲囬泦澶辫触璁板綍锛堜汉宸ュ鐞嗭級';
diff --git a/sql/diag_admin_dept_ward_20261106.sql b/sql/diag_admin_dept_ward_20261106.sql
new file mode 100644
index 0000000..361e315
--- /dev/null
+++ b/sql/diag_admin_dept_ward_20261106.sql
@@ -0,0 +1,105 @@
+-- =====================================================================================
+-- 璇婃柇锛歛dmin 鐧诲綍/鍒涘缓浠诲姟鏃剁湅涓嶅埌鍏ㄩ儴绉戝鐥呭尯 + belongDepts/belongWards 鏌ヨ鎱�
+-- 鏃ユ湡锛�2026-11-06   搴擄細smartor_nhfy锛�192.168.99.192:3306锛�
+--
+-- 浠g爜閾捐矾锛堝凡纭锛夛細
+--   GET /getInfo            鈫� SysLoginController#getInfo锛圠243-254锛�
+--                                 鈫� ISysDeptService#selectLeafSysDeptListBySysUserDept
+--   GET /system/user/getInfo 鈫� SysUserController#getInfo锛圠151-165锛夛紝鍚屾牱涓よ
+--                                 鈫� SysDeptServiceImpl#selectLeafSysDeptListBySysUserDept锛圠335-341锛�
+--                                     鈫� SysDeptMapper#selectSysDeptListBySysUserDept锛圫ysDeptMapper.xml L286-298锛�
+--                                         鈫� TreeUtils.getLeafDepts锛堝彧鐣欏彾瀛愶級
+--   鍓嶇銆屽垱寤轰换鍔°�嶇殑绉戝/鐥呭尯涓嬫媺灏辨槸鐢ㄨ繖涓や釜杩斿洖鐨� belongDepts / belongWards銆�
+--
+-- 鍏抽敭鐐癸紙鍚屼竴娈� SQL 鍚屾椂閫犳垚銆岀湅涓嶅埌銆嶅拰銆屾參銆嶏級锛�
+--   1) 鍒楄〃鏉ヨ嚜 sys_dept INNER JOIN sys_user_dept ON dept_code 鈬� 鍙湁銆岃嚦灏戣鏌愪釜鐢ㄦ埛鍏宠仈杩囥�嶇殑
+--      绉戝/鐥呭尯鎵嶄細鍑虹幇锛沘dmin 鍦� /getInfo 閲屽悓鏍峰甫 userId锛岀瓑浜庡彧鐪嬭嚜宸辫鍒嗛厤鐨勯儴闂ㄣ��
+--   2) 璇� SQL 杩樺甫 `and d.campusid = 鐧诲綍鐢ㄦ埛闄㈠尯`锛圠295锛夛紝sys_dept.campusid 涓虹┖鎴栦笌鐧诲綍闄㈠尯
+--      涓嶄竴鑷寸殑閮ㄩ棬浼氳杩囨护鎺夈��
+--   3) 缁撴灉鍐嶈繃 TreeUtils.getLeafDepts锛屽嚒鏄�岃鍒殑閮ㄩ棬褰撴垚 parent_id銆嶇殑閮ㄩ棬閮戒笉杩斿洖銆�
+--   4) 鎱細admin 鍒嗘敮锛圫ysUserServiceImpl#selectLeafSysDeptForAdmin锛変笉甯� userId锛�
+--      杩欐潯 join 灏卞彉鎴愩�岀瀹� 脳 鍏宠仈璇ョ瀹ょ殑鎵�鏈夌敤鎴枫�嶇殑绗涘崱灏旀斁澶э紱涓や釜鏌ヨ涓茶銆佹瘡琛岃繕瑕�
+--      BeanUtils.copyProperties 杞竴娆°�佽繕琚寘鍦� 50 绉掕秴鏃堕噷銆�
+-- =====================================================================================
+
+-- 1. admin 鍦� sys_user_dept 閲屽埌搴曟湁澶氬皯鏉″叧绯伙紙灏� 鈫� 涓嬫媺灏卞皯锛�
+SELECT u.user_id, u.user_name, u.orgid, u.campusid, u.searchscope,
+       (SELECT COUNT(*) FROM sys_user_dept ud
+         WHERE ud.user_id = u.user_id AND ud.del_flag = '0' AND ud.dept_type = '1') AS ks_cnt,
+       (SELECT COUNT(*) FROM sys_user_dept ud
+         WHERE ud.user_id = u.user_id AND ud.del_flag = '0' AND ud.dept_type = '2') AS bq_cnt
+FROM sys_user u
+WHERE u.user_name IN ('admin')          -- 鎹㈡垚瀹為檯鐧诲綍璐﹀彿
+   OR u.user_id IN (SELECT ud.user_id FROM sys_user_dept ud GROUP BY ud.user_id ORDER BY COUNT(*) DESC LIMIT 5);
+
+-- 2. 璇ユ満鏋勩�屽簲璇ユ湁銆嶅灏戠瀹�/鐥呭尯锛坰ys_dept 鍏ㄩ噺锛�
+SELECT orgid, dept_type, COUNT(*) AS rows_, COUNT(DISTINCT dept_code) AS codes
+FROM sys_dept
+WHERE del_flag = '0' AND orgid = '20001001'      -- 鎹㈡垚瀹為檯 orgid
+GROUP BY orgid, dept_type;
+
+-- 3. 銆岃兘鏌ュ嚭鏉ャ�嶅灏戯細join 鍚� + 甯� campusid 杩囨护锛屽姣旂 2 姝ワ紝宸灏戝氨鏄涪浜嗗灏�
+SELECT '鏁翠綋(涓嶉檺闄㈠尯)' AS scope, d.dept_type,
+       COUNT(*) AS join_rows, COUNT(DISTINCT d.dept_code) AS dept_codes,
+       COUNT(DISTINCT d.dept_id) AS dept_ids
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'
+GROUP BY d.dept_type
+UNION ALL
+SELECT CONCAT('闄愰櫌鍖� ', u.campusid) AS scope, d.dept_type,
+       COUNT(*), COUNT(DISTINCT d.dept_code), COUNT(DISTINCT d.dept_id)
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+         JOIN sys_user u ON u.user_id = ud.user_id
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'
+  AND d.campusid = u.campusid
+GROUP BY u.campusid, d.dept_type;
+
+-- 4. campusid 鏄惁瀵逛笉涓婏紙sys_dept 渚т负绌� / 涓庣櫥褰曢櫌鍖轰笉鍚岋級
+SELECT IFNULL(d.campusid, '(NULL)') AS dept_campusid, d.dept_type, COUNT(*) AS rows_
+FROM sys_dept d
+WHERE d.del_flag = '0' AND d.orgid = '20001001'
+GROUP BY d.campusid, d.dept_type
+ORDER BY rows_ DESC;
+
+-- 5. 鍙跺瓙杩囨护浼氫涪鎺夊灏戯紙鍚屼竴 dept_type 鍐咃紝鏈夊瓙閮ㄩ棬鐨勯儴闂ㄤ笉绠楀彾瀛愶級
+SELECT d.dept_type,
+       COUNT(*) AS all_rows,
+       SUM(CASE WHEN EXISTS (SELECT 1 FROM sys_dept c
+                              WHERE c.parent_id = d.dept_id AND c.del_flag = '0') THEN 1 ELSE 0 END) AS not_leaf,
+       SUM(CASE WHEN NOT EXISTS (SELECT 1 FROM sys_dept c
+                              WHERE c.parent_id = d.dept_id AND c.del_flag = '0') THEN 1 ELSE 0 END) AS leaf
+FROM sys_dept d
+WHERE d.del_flag = '0' AND d.orgid = '20001001'
+GROUP BY d.dept_type;
+
+-- 6. 鎱㈢殑閲忓寲锛氳繖鏉� join 姣忔閮借繑鍥炲灏戣锛堣鏁板氨鏄紶杈撻噺 + BeanUtils 杞崲娆℃暟锛�
+SELECT COUNT(*) AS join_rows_without_user
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'
+  AND d.dept_type = '1';
+-- 鏈熸湜锛氳繙澶т簬 sys_dept 閲岀瀹ょ湡瀹炴潯鏁般�傝繖灏辨槸 admin 鍒嗘敮鎱紙selectLeafSysDeptForAdmin锛夌殑鍏ㄩ儴鍘熷洜銆�
+
+-- 7. 鐩稿叧绱㈠紩鐜扮姸锛堜笅闈㈠缓璁殑绱㈠紩缂哄摢涓ˉ鍝釜锛�
+SELECT table_name, index_name, seq_in_index, column_name
+FROM information_schema.statistics
+WHERE table_schema = DATABASE() AND table_name IN ('sys_dept', 'sys_user_dept')
+ORDER BY table_name, index_name, seq_in_index;
+
+-- 8. 寤鸿绱㈠紩锛堝厛鐪� 7 鍐嶆墽琛岋級
+-- ALTER TABLE sys_user_dept ADD INDEX idx_sud_code_org_type (dept_code, orgid, dept_type, del_flag, user_id);
+-- ALTER TABLE sys_user_dept ADD INDEX idx_sud_user_type (user_id, dept_type, orgid, del_flag, dept_code);
+-- ALTER TABLE sys_dept      ADD INDEX idx_sd_org_type_campus (orgid, dept_type, campusid, del_flag, dept_code);
+-- ALTER TABLE sys_dept      ADD INDEX idx_sd_code_org (dept_code, orgid, del_flag);
+
+-- 9. 淇畬鍚庤嚜妫�锛歛dmin 搴旇鑳界湅鍒拌鏈烘瀯鍏ㄩ儴绉戝/鐥呭尯锛堟暟閲忕瓑浜庣 2 姝ョ殑 codes锛�
+SELECT d.dept_type, COUNT(DISTINCT d.dept_code) AS visible_codes
+FROM sys_dept d
+WHERE d.del_flag = '0' AND d.orgid = '20001001'
+  AND (d.campusid IS NULL OR d.campusid = '30001002')   -- 涓庣櫥褰曢櫌鍖轰繚鎸佷竴鑷�
+GROUP BY d.dept_type;
diff --git "a/sql/diag_\345\207\272\351\231\242\351\232\217\350\256\277\345\260\221\347\224\237\346\210\220_\345\216\237\345\233\240\346\216\222\346\237\245.sql" "b/sql/diag_\345\207\272\351\231\242\351\232\217\350\256\277\345\260\221\347\224\237\346\210\220_\345\216\237\345\233\240\346\216\222\346\237\245.sql"
new file mode 100644
index 0000000..b389649
--- /dev/null
+++ "b/sql/diag_\345\207\272\351\231\242\351\232\217\350\256\277\345\260\221\347\224\237\346\210\220_\345\216\237\345\233\240\346\216\222\346\237\245.sql"
@@ -0,0 +1,166 @@
+-- ============================================================================
+-- 鍑洪櫌闅忚銆屽皯鐢熸垚銆嶆帓鏌ヨ剼鏈紙鍗楀崕闄勪竴 / nhfy锛夆�斺�� **鍙**锛屽叏閮ㄦ槸 SELECT
+-- ----------------------------------------------------------------------------
+-- 缁撹鍏堣锛�2026-10-29 鍦� nhfy 绾夸笂搴撳疄娴嬶細鐥呭尯=楠ㄧ涓績涓�鐥呭尯 40011020锛屽嚭闄㈡棩鏈� 2026-07-01~09-30锛夛細
+--   鍑洪櫌鐧昏 475 鏉�  鈫�  闅忚浠诲姟鍏跺疄 **475 鏉′竴鏉℃病灏�**锛坰ervice_subtask.service_type='2'锛�
+--   椤甸潰鍙樉绀� 443 鏉★紙浣犳埅鍥炬椂 444锛夛紝宸鏄�岄〉闈㈡煡涓嶅埌銆嶏紝涓嶆槸銆屾病鐢熸垚銆嶏細
+--     鈶� 25 鏉� service_subtask.campusid 涓� NULL
+--        鈥斺�� ServiceSubtaskController#patItem 寮哄埗 setCampusid(鐧诲綍鐢ㄦ埛闄㈠尯)锛�
+--           SQL 鏉′欢 `and campusid = #{campusid}`锛屾墍浠ラ櫌鍖轰负绌虹殑浠诲姟瀵逛换浣曚汉閮戒笉鏄剧ず
+--     鈶�  7 鏉� service_subtask.leavehospitaldistrictcode 涓嶆槸鏈梾鍖�
+--        锛�4 鏉′负绌� / 2 鏉¢绉戜簩鐥呭尯 / 1 鏉¢绉戜笁鐥呭尯锛夆啋 鎸夌梾鍖鸿繃婊ゆ椂鐪嬩笉鍒�
+--     鈶�  475 - 25 - 7 = 443
+--
+-- 鈶犵殑鎴愬洜锛堝凡鏍稿埌琛岋級锛�
+--   杩� 25 鏉″嚭闄㈣褰� 2026-07-14~07-29 鍏ュ簱鏃� pat_med_inhosp.campusid 涓虹┖锛�
+--   2026-07-29~07-31 鍑屾櫒鎵弿鐢熸垚浠诲姟鏃讹紝VisitSubtaskFactory#boxedServiceSubtask 閲�
+--   `d.setCampusid(inhosp.getCampusid())` 鐢ㄥ嚭闄㈣褰曠殑闄㈠尯瑕嗙洊浜嗕换鍔¤嚜甯︾殑闄㈠尯 鈫� 钀藉簱 NULL锛�
+--   2026-10-24 鍑屾櫒閲囬泦鎵嶆妸 pat_med_inhosp.campusid 琛ユ垚 30001002锛屼絾 service_subtask 鏃犱汉鍥炲~銆�
+--
+-- 鐢ㄦ硶锛氭湰鑴氭湰鎶婂弬鏁板啓鎴愬瓧闈㈤噺锛堜笉鐢� SET @鍙橀噺锛岄伩鍏� MySQL8 鐢ㄦ埛鍙橀噺鐨� collation 鍐茬獊锛夈��
+--       瑕佹崲鑼冨洿锛屾妸涓嬮潰 4 涓�煎叏鏂囨浛鎹㈠嵆鍙細
+--          orgid  = '20001001'
+--          campus = '30001002'
+--          ward   = '40011020'      -- 楠ㄧ涓績涓�鐥呭尯
+--          鍑洪櫌鏃堕棿 = ['2026-07-01 00:00:00', '2026-10-01 00:00:00')
+-- ============================================================================
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 0锛氣殸锔� 鍏堢‘璁や綘椤甸潰鐢ㄧ殑鏄摢涓彛寰�
+--   鍑洪櫌鐧昏椤垫敮鎸併�岀瀹ゅ悕绉� / 鐥呭尯 / 鏌ユ埧闄㈠尯銆嶅绉嶈繃婊わ紝鍚屼竴涓梾鍖烘崲涓彛寰勫氨鏄� 469 / 475锛�
+--   鎷夸笉鍚屽彛寰勭殑涓や釜鏁扮浉鍑忥紝浼氬嚟绌哄鍑轰竴绗�"宸"銆傚厛鐪嬭繖閲屽摢涓�琛岀瓑浜庝綘椤甸潰涓婄殑鎬绘暟銆�
+-- ---------------------------------------------------------------------------
+SELECT '0_鍙e緞瀵圭収_鍑洪櫌璁板綍' AS 鍒嗙粍,
+       (SELECT COUNT(*) FROM (SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.leavehospitaldistrictcode = '40011020'
+            AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+          GROUP BY b.inhospid) x) AS 鎸夌闄㈢梾鍖�,
+       (SELECT COUNT(*) FROM (SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.leaveldeptcode = '40011021'
+            AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+          GROUP BY b.inhospid) x) AS 鎸夌闄㈢瀹�,
+       (SELECT COUNT(*) FROM (SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.hospitaldistrictcode = '40011020'
+            AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+          GROUP BY b.inhospid) x) AS 鎸夊湪闄㈢梾鍖�,
+       (SELECT COUNT(*) FROM (SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.deptcode = '40011021'
+            AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+          GROUP BY b.inhospid) x) AS 鎸夊湪闄㈢瀹�,
+       (SELECT COUNT(*) FROM service_subtask s WHERE s.del_flag=0 AND s.service_type='2'
+          AND s.leavehospitaldistrictcode = '40011020'
+          AND s.endtime >= '2026-07-01 00:00:00' AND s.endtime < '2026-10-01 00:00:00') AS 浠诲姟_鎸夌闄㈢梾鍖�,
+       (SELECT COUNT(*) FROM service_subtask s WHERE s.del_flag=0 AND s.service_type='2'
+          AND s.leaveldeptcode = '40011021'
+          AND s.endtime >= '2026-07-01 00:00:00' AND s.endtime < '2026-10-01 00:00:00') AS 浠诲姟_鎸夌闄㈢瀹�;
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 1锛氬埌搴曟湁娌℃湁"娌$敓鎴�"
+--   鏈熸湜锛氭病鐢熸垚 = 0銆傝嫢 > 0锛屽啀鐪嬬粨鏋� 4銆�
+-- ---------------------------------------------------------------------------
+SELECT '1_鎬绘暟鏍稿' AS 鍒嗙粍,
+       COUNT(*) AS 鍑洪櫌璁板綍鏁�,
+       SUM(CASE WHEN s.inhospid IS NOT NULL THEN 1 ELSE 0 END) AS 鏈夊嚭闄㈤殢璁夸换鍔�,
+       SUM(CASE WHEN s.inhospid IS NULL THEN 1 ELSE 0 END) AS 娌$敓鎴愪换鍔$殑璁板綍
+FROM (
+  SELECT b.inhospid
+  FROM pat_med_inhosp b
+  JOIN pat_archive a ON a.id = b.patid
+  WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+    AND b.inhospstate = '1' AND b.orgid = '20001001'
+    AND b.leavehospitaldistrictcode = '40011020'
+    AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+  GROUP BY b.inhospid
+) r
+LEFT JOIN (
+  SELECT DISTINCT inhospid FROM service_subtask
+  WHERE del_flag = 0 AND service_type = '2' AND inhospid IS NOT NULL
+) s ON s.inhospid = r.inhospid;
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 2锛氶〉闈㈠彲瑙佹�� 鈥斺�� 鐢熸垚浜嗕絾椤甸潰鏌ヤ笉鍒扮殑閭i儴鍒�
+--   椤甸潰鍙 = 闄㈠尯 + 鐥呭尯閮藉尮閰嶏紝杩欐墠鏄�"鎮h�呮湇鍔℃�婚噺"璇ユ湁鐨勬暟
+-- ---------------------------------------------------------------------------
+SELECT '2_椤甸潰鍙鎬�' AS 鍒嗙粍,
+       COUNT(*) AS 浠诲姟鎬绘暟,
+       SUM(CASE WHEN (s.campusid IS NULL OR s.campusid = '') THEN 1 ELSE 0 END) AS 闄㈠尯涓虹┖_涓嶅彲瑙�,
+       SUM(CASE WHEN (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode <> '40011020')
+                THEN 1 ELSE 0 END) AS 鐥呭尯涓嶅尮閰峗涓嶅彲瑙�,
+       SUM(CASE WHEN s.campusid = '30001002' AND s.leavehospitaldistrictcode = '40011020'
+                THEN 1 ELSE 0 END) AS 椤甸潰鍙,
+       SUM(CASE WHEN s.campusid = '30001002' AND s.leavehospitaldistrictcode = '40011020'
+                 AND s.sendstate = 4 THEN 1 ELSE 0 END) AS 鍙涓棤闇�闅忚,
+       SUM(CASE WHEN s.campusid = '30001002' AND s.leavehospitaldistrictcode = '40011020'
+                 AND s.sendstate = 6 THEN 1 ELSE 0 END) AS 鍙涓凡瀹屾垚
+FROM (
+  SELECT DISTINCT b.inhospid
+  FROM pat_med_inhosp b
+  JOIN pat_archive a ON a.id = b.patid
+  WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+    AND b.inhospstate = '1' AND b.orgid = '20001001'
+    AND b.leavehospitaldistrictcode = '40011020'
+    AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+) r
+JOIN service_subtask s ON s.inhospid = r.inhospid AND s.del_flag = 0 AND s.service_type = '2';
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 3锛氫笉鍙鏄庣粏锛堥櫌鍖轰负绌� / 鐥呭尯涓嶅尮閰嶏級锛屽彲鐩存帴瀵圭収淇ˉ
+-- ---------------------------------------------------------------------------
+SELECT '3_涓嶅彲瑙佹槑缁�' AS 鍒嗙粍, s.id AS 瀛愪换鍔D, s.inhospid, s.sendname AS 濮撳悕,
+       DATE_FORMAT(s.endtime, '%Y-%m-%d') AS 鍑洪櫌鏃ユ湡,
+       s.task_name AS 闅忚浠诲姟, s.sendstate,
+       s.campusid AS 浠诲姟闄㈠尯, s.leavehospitaldistrictcode AS 浠诲姟鐥呭尯,
+       b.campusid AS 璁板綍闄㈠尯, b.leavehospitaldistrictcode AS 璁板綍鐥呭尯,
+       DATE_FORMAT(s.create_time, '%Y-%m-%d %H:%i') AS 鐢熸垚鏃堕棿
+FROM service_subtask s
+JOIN pat_med_inhosp b ON b.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND s.endtime >= '2026-07-01 00:00:00' AND s.endtime < '2026-10-01 00:00:00'
+  AND (s.campusid IS NULL OR s.campusid = ''
+       OR s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode <> '40011020')
+  AND b.leavehospitaldistrictcode = '40011020'
+ORDER BY s.create_time;
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 4锛氱湡鐨勬病鐢熸垚鐨勮褰� + 鍘熷洜锛堜粎褰撶粨鏋� 1 鐨�"娌$敓鎴�" > 0 鏃舵墠闇�瑕佺湅锛�
+--   fuflag鈮�1 鈫� 鎵弿鍣ㄤ笉澶勭悊杩欑被璁板綍锛�
+--   deptcheck_flag=2 + long_task_reason 鈫� 鎵弿杩囷紝浣嗙瀹�/鐥呭尯/鐤剧梾閮芥病鍖归厤鍒伴暱鏈熶换鍔�
+-- ---------------------------------------------------------------------------
+SELECT '4_鐪熺殑娌$敓鎴�' AS 鍒嗙粍, b.inhospid, b.patname AS 濮撳悕,
+       DATE_FORMAT(b.endtime, '%Y-%m-%d') AS 鍑洪櫌鏃ユ湡,
+       b.leaveldeptname AS 绉戝, b.leavediagname AS 涓昏瘖鏂�,
+       b.fuflag AS 闅忚鏍囪瘑, b.deptcheck_flag AS 绉戝鏍囧織, b.wardcheck_flag AS 鐥呭尯鏍囧織,
+       b.diagcheck_flag AS 鐤剧梾鏍囧織, LEFT(b.long_task_reason, 80) AS 鏈敓鎴愬師鍥�
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+  AND b.inhospstate = '1' AND b.orgid = '20001001'
+  AND b.leavehospitaldistrictcode = '40011020'
+  AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+  AND NOT EXISTS (
+        SELECT 1 FROM service_subtask s
+        WHERE s.inhospid = b.inhospid AND s.del_flag = 0 AND s.service_type = '2')
+ORDER BY b.endtime DESC;
+
+-- ---------------------------------------------------------------------------
+-- 缁撴灉 5锛堝弬鑰冿級锛氫慨澶嶇敤 SQL 鈥斺�� **榛樿娉ㄩ噴鎺夛紝纭鍚庡啀鍗曠嫭鎵ц**
+--   鍙ˉ"绌虹殑"闄㈠尯/鐥呭尯锛屼笉鍔ㄤ笟鍔¤〃銆佷笉鍔ㄥ凡鏈夊��
+-- ---------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN pat_med_inhosp b ON b.inhospid = s.inhospid
+--    SET s.campusid = b.campusid
+--  WHERE s.del_flag = 0 AND s.service_type = '2'
+--    AND (s.campusid IS NULL OR s.campusid = '')
+--    AND b.campusid IS NOT NULL AND b.campusid <> '';
+--
+-- UPDATE service_subtask s
+--   JOIN pat_med_inhosp b ON b.inhospid = s.inhospid
+--    SET s.leavehospitaldistrictcode = b.leavehospitaldistrictcode,
+--        s.leavehospitaldistrictname = b.leavehospitaldistrictname
+--  WHERE s.del_flag = 0 AND s.service_type = '2'
+--    AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = '')
+--    AND b.leavehospitaldistrictcode IS NOT NULL AND b.leavehospitaldistrictcode <> '';
diff --git a/sql/fix_admin_dept_ward_missing_20261106.sql b/sql/fix_admin_dept_ward_missing_20261106.sql
new file mode 100644
index 0000000..2c6395a
--- /dev/null
+++ b/sql/fix_admin_dept_ward_missing_20261106.sql
@@ -0,0 +1,150 @@
+-- =====================================================================================
+-- 銆愬凡鏀逛负浠g爜淇锛屾湰鏂囦欢鐨� INSERT 涓嶉渶瑕佹墽琛屻��
+--   2026-11-06 鍐冲畾锛氱鐞嗗憳澶╃劧鎷ユ湁鍏ㄩ儴绉戝鏉冮檺锛岀洿鎺ユ煡 sys_dept锛屼笉鍐嶅線 sys_user_dept 琛ユ暟鎹��
+--   浠g爜鏀瑰姩瑙侊細
+--     SysDeptMapper.xml#selectSysDeptListBySysUserDept锛坲serId 涓虹┖鏃跺彧鏌� sys_dept锛�
+--     SysDeptServiceImpl#selectLeafSysDeptListBySysUserDept锛坲serId 涓虹┖鏃朵笉鍋氬彾瀛愯繃婊わ級
+--     SysUserServiceImpl#selectLeafSysDeptList / selectLeafSysDeptForAdmin / selectUserByUserName
+--     SysLoginController#getInfo锛堢鐞嗗憳涓嶄紶 userId銆佷笉鎸夐櫌鍖鸿繃婊わ級
+--   鏈枃浠朵繚鐣欎笅鏉ュ彧浣滀负銆岃瘖鏂彛寰勩�嶅弬鑰冿細绗� 0 姝ュ拰绗� 3 姝ョ殑鏌ヨ浠嶅彲鐢ㄤ簬鏍稿
+--   銆屾煇涓敤鎴峰埌搴曡兘鏌ュ埌澶氬皯绉戝/鐥呭尯銆嶏紝绗� 1銆�2 姝ョ殑鍐欏叆鍙互蹇界暐銆�
+-- =====================================================================================
+
+-- =====================================================================================
+-- 淇锛歛dmin 鐧诲綍鍚庢病鏈夌瀹�/鐥呭尯锛坆elongDepts / belongWards 涓虹┖锛夛紝鍒涘缓浠诲姟閫変笉鍒扮瀹ょ梾鍖�
+-- 鏃ユ湡锛�2026-11-06   搴擄細smartor_nhfy
+--
+-- 缁撹锛堜唬鐮� + 鏁版嵁閾捐矾宸叉牳瀵癸紝鍔犵储寮曚笉浼氭敼鍙樼粨鏋滐紝鍥犱负杩欎笉鏄參锛屾槸鏌ヤ笉鍒帮級锛�
+--   鍓嶇涓嬫媺鐢ㄧ殑鏄� /getInfo 杩斿洖鐨� belongDepts / belongWards锛�
+--     SysLoginController#getInfo锛圠243-254锛�
+--       鈫� SysDeptServiceImpl#selectLeafSysDeptListBySysUserDept锛圠335-341锛�
+--         鈫� SysDeptMapper#selectSysDeptListBySysUserDept锛圫ysDeptMapper.xml L286-298锛�
+--           鏍稿績鏄� INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+--           骞朵笖杩欐甯︿笂浜� userId锛坰ysUserDept.setUserId(user.getUserId())锛夈��
+--   鑰� HIS 閲囬泦鍐欏叆 sys_user_dept 鏃舵槑纭帓闄や簡 admin锛�
+--     CollectHISMapper.xml yhyksxx锛圠494锛�/ yhybfxx锛圠513锛�/ yhyyqxx锛圠536锛夐兘鏈� `ud.user_id != 'admin'`
+--   鎵�浠� admin 鍦� sys_user_dept 閲屾病鏈変换浣曡 鈫� 涓婇潰杩欐潯 join 杩斿洖 0 琛� 鈫� 涓や釜鍒楄〃閮芥槸绌恒��
+--   锛堢櫥褰� token 璧扮殑閭f潯 selectUserByUserName2 閲� admin 鍒嗘敮涓嶅甫 userId锛屾墍浠ラ偅鏉″弽鑰屾槸鏈夋暟鎹殑锛�
+--     杩欎篃鏄负浠�涔堚�滅櫥褰曟垚鍔熶絾杩樻槸娌℃湁绉戝鐥呭尯鈥濃�斺�旂櫥褰曡繑鍥炵殑鍜� /getInfo 瑕嗙洊鐨勪笉涓�鑷淬�傦級
+--
+--   椤哄甫涓や釜鍧戯細
+--     a) sys_dept.campusid 涓虹┖鐨勯儴闂ㄤ細琚� `and d.campusid = #{campusid}` 杩囨护鎺夛紱
+--     b) sys_config 閲屾病鏈� sys.authority.campus.all锛堝凡鏌ヨ瘉涓虹┖锛夛紝鎵�浠� admin 鐨� campusid 涓嶄細琚竻绌恒��
+-- =====================================================================================
+
+
+-- -------------------------------------------------------------------------------------
+-- 绗� 0 姝ワ細鍏堢‘璁わ紙鍙锛涜繖涓夋潯璺戝畬灏辩煡閬撴槸涓嶆槸杩欎釜鍘熷洜锛�
+-- -------------------------------------------------------------------------------------
+-- 0.1 admin 鍦� sys_user_dept 閲屽埌搴曟湁娌℃湁鏁版嵁锛堥鏈� 0 琛岋級
+SELECT u.user_id, u.user_name, u.orgid, u.campusid, u.searchscope,
+       (SELECT COUNT(*) FROM sys_user_dept ud
+         WHERE ud.user_id = u.user_id AND ud.del_flag = '0')                     AS 鏈夋晥鍏崇郴鏁�,
+       (SELECT COUNT(*) FROM sys_user_dept ud WHERE ud.user_id = u.user_id)      AS 鍚凡鍒犲叧绯绘暟
+FROM sys_user u
+WHERE u.user_name = 'admin';
+
+-- 0.2 澶嶅埢 /getInfo 鐨� SQL锛堝甫 userId锛夆�斺�� 棰勬湡 0 琛�
+SELECT d.dept_type, COUNT(*) AS rows_, COUNT(DISTINCT d.dept_code) AS codes
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'      -- 鎹㈡垚 admin 鐨� orgid
+  AND ud.user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin')
+  AND d.campusid = '30001002'                              -- 鎹㈡垚 admin 鐨� campusid
+GROUP BY d.dept_type;
+
+-- 0.3 鍚屼竴濂� SQL 鍘绘帀 userId / campusid 涔嬪悗鑳芥煡鍒板灏戯紙棰勬湡鍑犵櫨琛� = 搴旇鐪嬪埌鐨勯噺锛�
+SELECT d.dept_type, COUNT(*) AS rows_, COUNT(DISTINCT d.dept_code) AS codes
+FROM sys_dept d
+WHERE d.del_flag = '0' AND d.orgid = '20001001'
+GROUP BY d.dept_type;
+
+
+-- -------------------------------------------------------------------------------------
+-- 绗� 1 姝ワ紙鎺ㄨ崘锛岀珛鍒荤敓鏁堛�佷笉鐢ㄥ彂鐗堬級锛氱粰 admin 琛ュ叏 sys_user_dept
+--   鎶婅鏈烘瀯涓嬫墍鏈夌瀹�(dept_type='1')鍜岀梾鍖�(dept_type='2')閮芥寕鍒� admin 鍚嶄笅锛�
+--   涔嬪悗 /getInfo 閭f潯 join 灏辨湁鏁版嵁浜嗭紱閰嶅悎鍒氬姞鐨勭储寮曪紝鏌ヨ涔熸槸姣绾с��
+--   骞傜瓑锛氶噸澶嶆墽琛屼笉浼氭彃閲嶅琛岋紙NOT EXISTS 鎸� user_id + dept_code + dept_type 鍒ら噸锛夈��
+-- -------------------------------------------------------------------------------------
+-- 1.1 鍏堢湅浼氭彃澶氬皯琛岋紙涓嶆彃锛屽厛纭鏁伴噺鍚堢悊锛�
+SELECT u.user_name, d.dept_type, COUNT(*) AS will_insert
+FROM sys_user u
+         JOIN sys_dept d ON d.del_flag = '0'
+    AND d.orgid = u.orgid
+    AND d.dept_type IN ('1', '2')
+WHERE u.user_name = 'admin'
+  AND NOT EXISTS (SELECT 1 FROM sys_user_dept x
+                  WHERE x.user_id = u.user_id
+                    AND x.dept_code = d.dept_code
+                    AND x.dept_type = d.dept_type
+                    AND IFNULL(x.orgid, '') = IFNULL(d.orgid, ''))
+GROUP BY u.user_name, d.dept_type;
+
+-- 1.2 姝e紡鎻掑叆锛堣璺ㄩ櫌鍖虹湅鍏ㄩ儴灏辨妸 campusid 涓�骞舵寜 sys_dept 甯﹁繃鍘伙級
+INSERT INTO sys_user_dept
+(user_id, dept_id, dept_code, dept_name, dept_type, orgid, campusid, del_flag, create_time, update_time)
+SELECT u.user_id, d.dept_id, d.dept_code, d.dept_name, d.dept_type, d.orgid, d.campusid,
+       '0', NOW(), NOW()
+FROM sys_user u
+         JOIN sys_dept d ON d.del_flag = '0'
+    AND d.orgid = u.orgid
+    AND d.dept_type IN ('1', '2')
+WHERE u.user_name = 'admin'
+  AND NOT EXISTS (SELECT 1 FROM sys_user_dept x
+                  WHERE x.user_id = u.user_id
+                    AND x.dept_code = d.dept_code
+                    AND x.dept_type = d.dept_type
+                    AND IFNULL(x.orgid, '') = IFNULL(d.orgid, ''));
+
+-- 1.3 鍥炴粴 1.2锛堝鏋滄彃澶氫簡锛夛細鎸夋彃鍏ユ椂闂寸簿纭垹
+-- DELETE FROM sys_user_dept
+--  WHERE user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin')
+--    AND create_time >= '2026-11-06 00:00:00'
+--    AND update_time = create_time;
+
+
+-- -------------------------------------------------------------------------------------
+-- 绗� 2 姝ワ紙鍙�夛紝璁╁畠鐪嬪埌鍏ㄩ儴闄㈠尯锛夛細鎶� admin 鍔犺繘銆屼笉闄愰櫌鍖恒�嶇櫧鍚嶅崟
+--   SysLoginController#getInfo L227-233 浼氳杩欎釜閰嶇疆锛屽懡涓氨鎶� campusid 缃┖锛�
+--   浜庢槸 `and d.campusid = #{campusid}` 杩欐潯杩囨护涓嶅啀鎷硷紝璺ㄩ櫌鍖虹殑绉戝鐥呭尯涔熻兘鍑烘潵銆�
+--   鐜板湪 sys_config 閲屾病鏈夎繖涓� key锛堝凡鏌ヨ瘉锛夛紝闇�瑕佹墜宸ュ姞涓�鏉°��
+-- -------------------------------------------------------------------------------------
+-- INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+-- VALUES ('涓嶉檺闄㈠尯鐨勮处鍙�', 'sys.authority.campus.all', 'admin', 'N', 'admin', NOW(),
+--         '澶氫釜璐﹀彿鐢ㄨ嫳鏂囬�楀彿鍒嗛殧锛屽懡涓悗鐧诲綍涓嶆寜闄㈠尯杩囨护');
+-- 鏀瑰畬瑕佹竻缂撳瓨锛氶噸鍚垨璋冪敤 /system/config/refreshCache锛堣嫢鍓嶇鏈夎鎸夐挳锛夈��
+
+
+-- -------------------------------------------------------------------------------------
+-- 绗� 3 姝ワ細楠岃瘉锛堥噸鍚�/鍒锋柊鍓嶇鍚庤窇锛涙湡鏈涗袱鏉¢兘鏈夊嚑鐧炬潯锛�
+-- -------------------------------------------------------------------------------------
+-- 3.1 妯℃嫙 /getInfo 鐨勪袱涓煡璇�
+SELECT d.dept_type, COUNT(DISTINCT d.dept_code) AS visible_codes
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'
+  AND ud.user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin')
+  AND d.campusid = '30001002'
+GROUP BY d.dept_type;
+
+-- 3.2 鐩存帴鐪嬬瀹�/鐥呭尯鍚嶅瓧鍓� 10 鏉★紝纭鏄湡瀹炵瀹よ�屼笉鏄祴璇曟暟鎹�
+SELECT d.dept_type, d.dept_code, d.dept_name
+FROM sys_dept d
+         INNER JOIN sys_user_dept ud ON d.dept_code = ud.dept_code
+WHERE d.del_flag = '0' AND ud.del_flag = '0'
+  AND d.orgid = '20001001' AND ud.orgid = '20001001'
+  AND ud.user_id = (SELECT user_id FROM sys_user WHERE user_name = 'admin')
+  AND d.campusid = '30001002'
+  AND d.dept_type = '1'
+LIMIT 10;
+
+
+-- -------------------------------------------------------------------------------------
+-- 绗� 4 姝ワ紙鏍规不锛屽彂鐗堟椂鍋氾級锛氫唬鐮侀噷 admin 涓嶈璧� sys_user_dept
+--   4.1 SysDeptMapper.xml L286 鎸� userId 鍒嗘敮锛氭棤 userId 鏃剁洿鎺ユ煡 sys_dept锛堣瀵硅瘽閲岀殑 diff锛�
+--   4.2 /getInfo 涓� /system/user/getInfo 閲屽垽 admin锛屼笉浼� userId
+--   4.3 campusid 鏉′欢鏀规垚 and (d.campusid is null or d.campusid = #{campusid})
+--   4.4 鍒楄〃涓虹┖鏃跺厹搴曪細鍐嶆寜 orgid 鏌ヤ竴娆″叏閲忥紝閬垮厤浠ュ悗鍐嶅嚭鐜般�岀櫥褰曟垚鍔熶絾涓嬫媺绌恒��
+-- -------------------------------------------------------------------------------------
diff --git a/sql/fix_nhfy_patitem_slow_20261106.sql b/sql/fix_nhfy_patitem_slow_20261106.sql
new file mode 100644
index 0000000..c5c7437
--- /dev/null
+++ b/sql/fix_nhfy_patitem_slow_20261106.sql
@@ -0,0 +1,302 @@
+-- =====================================================================================
+-- 鍗楀崕绾夸笂锛坰martor_nhfy @ 192.168.99.192锛夐殢璁垮垪琛� /smartor/serviceSubtask/patItem 鎱㈡煡璇慨澶�
+-- 缂栧啓鏃ユ湡锛�2026-11-06    瀹炴祴鐜锛歁ySQL 8.0.22 Win64锛屽簱 2277MB锛宻ervice_subtask 61,645 琛� / 71.8MB
+--
+-- 涓�銆佸疄娴嬬粨璁猴紙涓嬮潰绗� 0 姝ョ殑 SQL 鍙師鏍烽噸璺戝鐜帮級
+--   patItem 涓�娆¤姹傚疄闄呰窇鐨勬槸 3 绫� SQL + 姣忚 2 娆″崟鏉℃煡璇細
+--     鈶� select id ... order by endtime desc limit 10      鈫� 鎱㈢殑灏卞湪杩欙紝2.4~3.4 s
+--        鎵ц璁″垝锛歩ndex_merge(sort_union(idx_service_subtask_district_visit_time,
+--                  idx_service_subtask_dept_visit_time)) + Using filesort
+--        EXPLAIN ANALYZE锛氬疄闄� 2915 ms锛屽彧涓鸿繑鍥� 10 琛�
+--     鈶� select <100 鍒�> where id in (10 涓� id)            鈫� 27 ms锛屾甯�
+--     鈶� countByCondition锛圧edis 鏈懡涓椂锛�                 鈫� 2.5~3.0 s
+--     鈶� 寰幆閲屾瘡琛� 2 娆″崟鏉℃煡璇紙pat_med_inhosp / pat_archive 鎸変富閿級鈫� 鍚勭害 25 ms锛�10 琛屸増500 ms
+--   鍚堣绾� 6~7 s锛屼笌銆屾煡璇㈠緢鎱€�嶄竴鑷淬��
+--
+--   鏇村簳灞傜殑鍘熷洜锛堟寜褰卞搷鎺掑簭锛夛細
+--   (1) 銆愭渶鑷村懡銆慚ySQL 瀹炰緥 innodb_buffer_pool_size = 8 MB锛堥粯璁ゅ�硷紝512 椤碉紝pages_free=0锛夛紝
+--       鑰屽叏搴� 2277 MB銆傜瓑浜庢瘡娆℃煡璇㈤兘鍦ㄥ喎鐩樹笂璇伙細
+--         路 select count(*) from service_subtask锛�6 涓囪锛夎 9.3~12.5 s  鈫� 鏈夋晥璇婚�熺害 7 MB/s
+--         路 performance_schema 閲� 100 鍒楃殑鍒楄〃鏌ヨ avg 653 ms锛�29.9 涓囨锛岀疮璁� 19.5 涓囩锛�
+--   (2) service_subtask 涓婃病鏈夈�屾満鏋�+闄㈠尯+绫诲瀷+鎺掑簭銆嶇殑鑱斿悎绱㈠紩锛宒eptOrDistrict=2 鏃�
+--       (leavehospitaldistrictcode IN .. OR leaveldeptcode IN ..) 鍙兘璧� index_merge + filesort锛�
+--       瑕佹壂 1200~54000 琛屽苟涓斿ぇ閲忓洖琛ㄣ��
+--   (3) 搴撻噷鏈� 25 寮� copy/bak 鍨冨溇琛紝鍚堣绾� 1.6 GB锛堝崰鍏ㄥ簱 70%锛夛紝鎸ゅ崰纾佺洏涓庣紦瀛樸��
+--   (4) pat_archive 娌℃湁 patientno 绱㈠紩锛歚where ?=? and del_flag=? and patientno=?` 姣忔鍏ㄨ〃鎵�
+--       5.6 涓囪锛�37.4 涓囨璋冪敤銆佺疮璁℃壂鎻� 184 浜胯銆乤vg 457 ms銆�
+--
+--   鍗曠嫭鍋氱殑鏁堟灉锛堥兘鍦ㄥ壇鏈〃 service_subtask_copy6 涓婂疄娴嬭繃锛屾暟鎹噺鍚岄噺绾э級锛�
+--     路 鍙缓绱㈠紩銆丼QL 涓嶆敼    鈫� 浼樺寲鍣ㄤ粛閫� index_merge锛�2.8~3.5 s锛堟病鐢級
+--     路 鍙敼 SQL(UNION)銆佷笉寤虹储寮� 鈫� 1.5~1.7 s锛堟湁鐢ㄤ絾涓嶅锛�
+--     路 绱㈠紩 + 鏀瑰啓涓�璧蜂笂      鈫� 26~27 ms锛堢害 110 鍊嶏級
+--     路 鎶� OR 鍘熸牱 FORCE INDEX 鍒板崟鑷傜储寮� 鈫� 28~33 s锛堝崈涓囧埆杩欎箞骞诧級
+--
+-- 浜屻�佷慨澶嶆楠わ紙鎸夋�т环姣旓紝1 鍜� 2 鍋氬畬杩欐潯 SQL 灏变粠 3.1 s 鎺夊埌 27 ms锛�
+--   绗� 1 姝ワ紙涓嶆敼浠g爜锛屾敹鐩婃渶澶э級锛氳皟澶� innodb_buffer_pool_size锛�8MB 鈫� 4G锛�
+--   绗� 2 姝ワ紙涓嶅姞绱㈠紩涔熻兘璺戯級锛氬姞涓や釜銆屽垎鏀�嶈鐩栫储寮�
+--   绗� 3 姝ワ紙鏀� SQL / 鏀� mapper锛夛細鎶� OR 鏀瑰啓鎴愪袱鍒嗘敮 UNION锛堝凡瀹炴祴 3.1 s 鈫� 26 ms锛岀粨鏋滈�愭潯涓�鑷达級
+--   绗� 4 姝ワ細缁熻 count 鏀瑰啓銆乸at_archive.patientno 绱㈠紩銆佹竻鍨冨溇琛�
+-- =====================================================================================
+
+
+-- -------------------------------------------------------------------------------------
+-- 0. 鐜扮姸璇婃柇锛堝彧璇伙紝鍙殢鏃堕噸璺戯紱杩欓噷鐨� EXPLAIN ANALYZE 浼氱湡璺戜竴娆★紝鑰楁椂 3 s 宸﹀彸锛�
+-- -------------------------------------------------------------------------------------
+-- 0.1 缂撳啿姹� / 纾佺洏鐩稿叧鍙傛暟锛堝叧閿細buf_mb = 8锛�
+SELECT @@version                                AS version,
+       @@version_compile_os                    AS os,
+       @@innodb_buffer_pool_size / 1024 / 1024 AS buf_mb,
+       @@innodb_buffer_pool_instances          AS bp_instances,
+       @@innodb_io_capacity                    AS io_capacity,
+       @@innodb_log_file_size / 1024 / 1024    AS log_mb;
+
+-- 0.2 缂撳啿姹犳槸涓嶆槸鍏ㄦ弧锛坧ages_free = 0 琛ㄧず涓�鐐逛綑閲忛兘娌℃湁锛岃鍏ㄨ蛋纾佺洏锛�
+SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages%';
+
+-- 0.3 鍐疯鏈夊鎱細6 涓囪鐨� count 瑕� 10 绉掑氨璇存槑涓�鍒�
+SELECT COUNT(*) FROM service_subtask;
+
+-- 0.4 浣犺繖鏉¤姹傜殑瀹為檯鎵ц璁″垝锛堟妸 orgid/campusid/绉戝鐥呭尯鎹㈡垚鐪熷疄鍊硷級
+EXPLAIN ANALYZE
+SELECT id
+FROM service_subtask
+WHERE del_flag = '0'
+  AND orgid = '20001001' AND campusid = '30001002'
+  AND service_type = '2' AND visit_count = 1
+  AND (leavehospitaldistrictcode IN ('40003309') OR leaveldeptcode IN ('40003307'))
+ORDER BY endtime DESC
+LIMIT 10 OFFSET 0;
+-- 鏈熸湜鐪嬪埌鐨勯棶棰橈細index_merge(...) + Using filesort锛宎ctual time 鈮� 2900 ms
+
+-- 0.5 绾夸笂鏈�杩戝埌搴曞摢浜涜鍙ユ渶鑰楁椂锛坧erformance_schema锛�
+SELECT SUBSTRING(DIGEST_TEXT, 1, 120)  AS sql_,
+       COUNT_STAR                      AS cnt,
+       ROUND(AVG_TIMER_WAIT / 1e9, 1)  AS avg_ms,
+       ROUND(MAX_TIMER_WAIT / 1e9, 0)  AS max_ms,
+       SUM_ROWS_EXAMINED               AS rows_examined
+FROM performance_schema.events_statements_summary_by_digest
+WHERE SCHEMA_NAME = 'smartor_nhfy'
+ORDER BY SUM_TIMER_WAIT DESC
+LIMIT 15;
+
+
+-- -------------------------------------------------------------------------------------
+-- 1. 绱㈠紩锛氱粰 OR 鐨勪袱涓垎鏀悇閰嶄竴涓�屽埌 endtime 鏈夊簭銆佷笖鑳借鐩栨煡璇€�嶇殑绱㈠紩
+--
+--    涓轰粈涔堜笉鏄櫘閫氳仈鍚堢储寮曪紵
+--      瀹炴祴鍔� (orgid, campusid, del_flag, service_type, visit_count, endtime) 鍚庯紝
+--      浼樺寲鍣ㄤ緷鏃ч�� index_merge + filesort锛岃�楁椂 2.8~3.5 s锛岀瓑浜庣櫧鍔犮��
+--    涓轰粈涔堣甯� leavehospitaldistrictcode / leaveldeptcode 鍦� endtime 鍓嶉潰锛�
+--      杩欐牱鍒嗘敮鏌ヨ鏄�岀瓑鍊� + 绛夊�� + ... + 鎸� endtime 鏈夊簭銆嶏紝鍙互鍙嶅悜鎵储寮曞彇鍓� 10 琛岋紝
+--      select 鍒楄〃鍙湁 id锛孖nnoDB 浜岀骇绱㈠紩鑷甫涓婚敭 鈫� Using index 瀹屽叏瑕嗙洊锛岄浂鍥炶〃銆�
+--      瀹炴祴鍗曞垎鏀� 27 ms銆�
+-- -------------------------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_patitem_ward (orgid, campusid, del_flag, service_type, visit_count, leavehospitaldistrictcode, endtime),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+ALTER TABLE service_subtask
+    ADD INDEX idx_patitem_dept (orgid, campusid, del_flag, service_type, visit_count, leaveldeptcode, endtime),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+ANALYZE TABLE service_subtask;
+-- 瀹炴祴寤虹储寮曞悇绾� 3.8 s锛�1 涓囪/绉掔骇鍒紝鍥犱负鐩樻參锛夛紝涓氬姟鏃犳劅銆�
+
+-- 璇存槑锛氱储寮曢噷 visit_count 鍦� endtime 涔嬪墠锛屾槸鍥犱负鍒楄〃璇锋眰閮戒細甯︺�岄殢璁挎鏁般�嶏紱
+--       濡傛灉鏌愪簺鍦烘櫙涓嶅甫 visit_count锛岃繖涓储寮曞彧鑳界敤鍒� service_type 鍓嶇紑锛屾帓搴忎粛浼� filesort锛�
+--       閭g鍦烘櫙鍐嶅崟鐙姞锛�
+-- ALTER TABLE service_subtask
+--     ADD INDEX idx_patitem_ward_novc (orgid, campusid, del_flag, service_type, leavehospitaldistrictcode, endtime),
+--     ADD INDEX idx_patitem_dept_novc (orgid, campusid, del_flag, service_type, leaveldeptcode, endtime);
+
+
+-- -------------------------------------------------------------------------------------
+-- 2. 鍒楄〃 SQL 鏀瑰啓锛歄R 鎷嗘垚涓や釜鍒嗘敮 UNION锛堝幓閲嶏級
+--
+--    瀹炴祴锛坰ervice_subtask_copy6锛屽悓鏍锋暟鎹噺锛夛細
+--      鍘� OR 鍐欐硶                    锛�3102 / 3266 / 2984 ms
+--      鏀瑰啓鍚� offset 0  / 100 / 500  锛�26 / 27 / 27 ms
+--      涓夋。缁撴灉涓庡師鍐欐硶閫愭潯涓�鑷达紙id 椤哄簭瀹屽叏鐩稿悓锛�
+--    娉ㄦ剰锛�
+--      路 鍒嗘敮鍐呭繀椤诲悇鑷甫 limit (offset + pageSize)锛屽灞傚啀 limit pageSize offset offset锛�
+--      路 鐢� UNION锛堝幓閲嶏級锛屼笉瑕佺敤 UNION ALL + 鈥滄帓闄ら噸鍙犫�濋偅绉嶅啓娉曪紝
+--        鍚庤�呬細鐮村潖瑕嗙洊绱㈠紩锛屽疄娴嬮��鍖栧埌 987 ms~1.1 s锛�
+--      路 涓や釜鍒嗘敮閲岀殑鍏叡 where 蹇呴』涓庡師鏉ョ殑 serviceSubtaskWhere 瀹屽叏涓�鑷达紙閫愬瓧鐩稿悓锛夛紝
+--        鍚﹀垯绗� 2 闃舵鎸� id 鍥炶〃鏃朵細鍑虹幇琛屾暟瀵逛笉涓娿��
+-- -------------------------------------------------------------------------------------
+-- 2.1 鍙彇褰撻〉 id锛堟浛鎹� mapper 閲岀殑 selectServiceSubtaskIdsPage锛屼粎鍦� deptOrDistrict = '2' 鏃惰蛋杩欐潯锛�
+SELECT id
+FROM (
+         (SELECT id, endtime
+          FROM service_subtask
+          WHERE del_flag = '0'
+            AND orgid = '20001001' AND campusid = '30001002'
+            AND service_type = '2' AND visit_count = 1
+            AND leavehospitaldistrictcode IN ('40003309')
+          ORDER BY endtime DESC
+          LIMIT 10 OFFSET 0)
+         UNION
+         (SELECT id, endtime
+          FROM service_subtask
+          WHERE del_flag = '0'
+            AND orgid = '20001001' AND campusid = '30001002'
+            AND service_type = '2' AND visit_count = 1
+            AND leaveldeptcode IN ('40003307')
+          ORDER BY endtime DESC
+          LIMIT 10 OFFSET 0)
+     ) t
+ORDER BY endtime DESC
+LIMIT 10 OFFSET 0;
+-- 娣辩炕椤垫椂锛氬垎鏀唴 LIMIT (pageNum + pageSize) OFFSET 0锛屽灞� LIMIT pageSize OFFSET pageNum銆�
+-- 瀹炴祴 offset 100 / 500 閮芥槸 27 ms 涓旂粨鏋滄纭��
+
+-- 2.2 瀵圭収锛氬悓鏍风殑鏉′欢銆佸師鏉ョ殑 OR 鍐欐硶锛堢敤鏉ュ姣旇�楁椂 / 鏍¢獙缁撴灉锛�
+SELECT id
+FROM service_subtask
+WHERE del_flag = '0'
+  AND orgid = '20001001' AND campusid = '30001002'
+  AND service_type = '2' AND visit_count = 1
+  AND (leavehospitaldistrictcode IN ('40003309') OR leaveldeptcode IN ('40003307'))
+ORDER BY endtime DESC
+LIMIT 10 OFFSET 0;
+
+-- 2.3 缁撴灉涓�鑷存�ф牎楠岋紙涓よ竟 id 闆嗗悎蹇呴』瀹屽叏鐩稿悓锛�
+SELECT (SELECT GROUP_CONCAT(id ORDER BY id) FROM (SELECT id FROM service_subtask
+         WHERE del_flag='0' AND orgid='20001001' AND campusid='30001002'
+           AND service_type='2' AND visit_count=1
+           AND (leavehospitaldistrictcode IN ('40003309') OR leaveldeptcode IN ('40003307'))
+         ORDER BY endtime DESC LIMIT 10) a) AS old_ids,
+       (SELECT GROUP_CONCAT(id ORDER BY id) FROM (
+         SELECT id FROM (
+             (SELECT id, endtime FROM service_subtask
+              WHERE del_flag='0' AND orgid='20001001' AND campusid='30001002'
+                AND service_type='2' AND visit_count=1
+                AND leavehospitaldistrictcode IN ('40003309')
+              ORDER BY endtime DESC LIMIT 10)
+             UNION
+             (SELECT id, endtime FROM service_subtask
+              WHERE del_flag='0' AND orgid='20001001' AND campusid='30001002'
+                AND service_type='2' AND visit_count=1
+                AND leaveldeptcode IN ('40003307')
+              ORDER BY endtime DESC LIMIT 10)
+         ) t ORDER BY endtime DESC LIMIT 10) b) AS new_ids;
+
+-- 2.4 鎺掑簭瀛楁璇存槑锛歴ort=0/1 鏄� endtime锛堥粯璁わ級锛宻ort=2/3/7/8 鏄� visit_time銆�
+--     涓婇潰涓や釜绱㈠紩鏄寜 endtime 鎺掔殑锛涘鏋滃父鐢ㄣ�岄殢璁挎椂闂淬�嶆帓搴忥紝闇�瑕佸啀琛ヤ竴瀵规妸 endtime 鎹㈡垚 visit_time锛�
+-- ALTER TABLE service_subtask
+--     ADD INDEX idx_patitem_ward_vt (orgid, campusid, del_flag, service_type, visit_count, leavehospitaldistrictcode, visit_time),
+--     ADD INDEX idx_patitem_dept_vt (orgid, campusid, del_flag, service_type, visit_count, leaveldeptcode, visit_time);
+
+
+-- -------------------------------------------------------------------------------------
+-- 3. 椤堕儴缁熻锛坈ountByCondition锛変篃瑕佽窡鐫�鏀癸細鎷嗕袱涓垎鏀啀姹囨��
+--    鐜扮姸锛歊edis 鏈懡涓椂 2.5~3.0 s锛堟瘡娆″叏閲忚仛鍚堣繖濂� where锛�
+--    鏀规硶锛氫袱涓垎鏀悇鑷仛鍚堬紝澶栧眰鎶婄粨鏋滅浉鍔犮�傚垎鏀噷鍒楀嚭鐨勫垪閮藉湪绱㈠紩閲� 鈫� 涓嶅洖琛ㄣ��
+-- -------------------------------------------------------------------------------------
+SELECT SUM(wzx) AS wzx, SUM(ywc) AS ywc, SUM(total) AS total
+FROM (
+         (SELECT SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END) AS wzx,
+                 SUM(CASE WHEN sendstate = 6 THEN 1 ELSE 0 END) AS ywc,
+                 COUNT(1)                                       AS total
+          FROM service_subtask
+          WHERE del_flag = '0'
+            AND orgid = '20001001' AND campusid = '30001002'
+            AND service_type = '2' AND visit_count = 1
+            AND leavehospitaldistrictcode IN ('40003309'))
+         UNION ALL
+         (SELECT SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END),
+                 SUM(CASE WHEN sendstate = 6 THEN 1 ELSE 0 END),
+                 COUNT(1)
+          FROM service_subtask
+          WHERE del_flag = '0'
+            AND orgid = '20001001' AND campusid = '30001002'
+            AND service_type = '2' AND visit_count = 1
+            AND leaveldeptcode IN ('40003307'))
+     ) t;
+-- 娉ㄦ剰锛氫袱涓垎鏀細閲嶅缁熻銆屾棦灞炰簬璇ョ梾鍖哄張灞炰簬璇ョ瀹ゃ�嶇殑琛岋紙鍚屼竴琛屼袱涓潯浠堕兘鍛戒腑锛夈��
+-- 鍘熸湁 countByCondition 鏄 OR 鍚庣殑缁撴灉闆嗙粺璁★紝涓嶉噸澶嶃��
+-- 绾夸笂瀹炴祴杩欎袱涓瀹�/鐥呭尯鏄竴涓�瀵瑰簲鐨勶紙leaveldeptcode=40003307 鈬� leavehospitaldistrictcode=40003309锛夛紝
+-- 鎵�浠ヨ繖閲岀敤 UNION ALL 涔熶笉浼氶噸澶嶏紱濡傛灉瀛樺湪璺ㄧ鍏辩敤鐥呭尯鐨勬儏鍐碉紝鏀规垚
+-- 鈥滃垎鏀�2 鍔犱笂 AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode NOT IN (...))鈥濓紝
+-- 鎴栬�呭共鑴嗕繚鐣欏師鏉ョ殑 OR 鍐欐硶锛堢粺璁℃湁 Redis 缂撳瓨 60~120 鍒嗛挓锛屾敼瀹岀 1 姝ュ弬鏁板悗涔熷氨鍑犲崄 ms锛夈��
+
+
+-- -------------------------------------------------------------------------------------
+-- 4. 椤哄甫淇紙鍜� patItem 鎱㈢浉鍏筹紝浣嗕笉鏄悓涓�鏉� SQL锛�
+-- -------------------------------------------------------------------------------------
+-- 4.1 pat_archive 娌℃湁 patientno 绱㈠紩锛歚where ?=? and del_flag=? and patientno=?` 姣忚窇涓�娆″叏琛ㄦ壂 5.6 涓囪
+--     锛坧erformance_schema锛�37.4 涓囨銆佺疮璁℃壂鎻� 184 浜胯銆乤vg 457 ms锛�
+ALTER TABLE pat_archive
+    ADD INDEX idx_pat_archive_patientno (patientno, del_flag),
+    ALGORITHM = INPLACE, LOCK = NONE;
+--     鍙﹀閭f潯 SQL 閲屾湁涓� `? = ?`锛堝父閲忓甯搁噺锛夌殑鏉′欢锛岀湅鐫�鍍忔嫾鍙傛暟鏃跺皯浜嗕釜鍒楀悕锛屽缓璁唬鐮佷晶涓�璧风湅涓�涓嬨��
+
+-- 4.2 patItem 鐨勫洖濉槸銆屾瘡琛� 2 娆″崟鏉℃煡璇€�嶏紙pat_med_inhosp / pat_archive 鍚勪竴娆★紝鎸変富閿級銆�
+--     10 琛屽氨鏄� 20 娆¢殢鏈� I/O锛堝喎鐩樹竴娆$害 25 ms锛夈�傚缓璁敼鎴� IN 鎵归噺鏌ヤ袱娆°��
+--     杩欐潯鏄唬鐮佹敼鍔紝涓嶆槸 SQL锛涘綋鍓嶆瘡椤� 10 琛屽奖鍝嶇害 0.3~0.5 s銆�
+
+-- 4.3 搴撻噷鏈� 25 寮� copy/bak 鍨冨溇琛紝鍚堣绾� 1.6 GB锛堝崰鍏ㄥ簱 70%锛夛紝瀵� 8 MB 鐨勭紦鍐叉睜鏄函璐熸媴锛�
+--     pat_med_inhosp_copy1..copy5锛堢害 1.24 GB锛夈�乻ervice_subtask_copy1..copy6锛堢害 0.30 GB锛夌瓑銆�
+--     纭鏃犵敤鍚庡厛鏀瑰悕鍐嶅垹锛岄伩鍏嶈鍒狅紙绀轰緥锛岄�愬紶纭鍚庡啀鎵ц锛夛細
+--     RENAME TABLE pat_med_inhosp_copy4 TO zzz_del_pmi_copy4_20261106;
+--     DROP TABLE zzz_del_pmi_copy4_20261106;
+
+
+-- -------------------------------------------------------------------------------------
+-- 5. 鏈嶅姟鍣ㄥ弬鏁帮紙鏀剁泭鏈�澶х殑涓�姝ワ紝闇�瑕佹敼 my.ini 鍚庨噸鍚� MySQL锛涗篃鍙厛 SET GLOBAL 鍦ㄧ嚎鏀惧ぇ缂撳啿姹狅級
+--    鐜扮姸锛歩nnodb_buffer_pool_size = 8 MB锛堥粯璁ゅ�硷級锛屽叏搴� 2277 MB 鈫� 姣忔鏌ヨ閮藉湪鍐风洏涓婅窇
+--    鐩爣锛�
+--      innodb_buffer_pool_size      = 4G      锛堟寜鐗╃悊鍐呭瓨 50%~70% 缁欙紱鑷冲皯 2G锛岃兘瑁呬笅鐑〃锛�
+--      innodb_buffer_pool_instances = 4       锛堢紦鍐叉睜 鈮� 1G 鏃舵墠鏈夋剰涔夛級
+--      innodb_io_capacity           = 2000
+--      innodb_io_capacity_max       = 4000
+--      innodb_flush_method          = unbuffered / O_DIRECT锛圵indows 鐢� unbuffered锛�
+--      table_open_cache             = 4000
+--      innodb_log_file_size         = 512M
+--    鍦ㄧ嚎楠岃瘉锛堜笉鐢ㄩ噸鍚紝MySQL 5.7+ 鏀寔鍔ㄦ�佽皟鏁达紱纭鏈哄櫒鍐呭瓨澶熷啀鎵ц锛夛細
+--      SET GLOBAL innodb_buffer_pool_size = 2 * 1024 * 1024 * 1024;
+--      鐒跺悗閲嶈窇 0.3 鐨� count(*)锛氬簲浠� ~10 s 鎺夊埌鍑犲崄~涓�涓ょ櫨 ms銆�
+--    杩欎竴姝ュ仛瀹岋紝绗� 2銆�3 姝ョ殑鏀剁泭浼氳繘涓�姝ユ斁澶э紙绱㈠紩椤靛叏鍦ㄥ唴瀛橈紝27 ms 杩樿兘鍐嶉檷锛夈��
+
+
+-- -------------------------------------------------------------------------------------
+-- 6. 楠岃瘉锛堟敼瀹岄�愭潯璺戯級
+-- -------------------------------------------------------------------------------------
+-- 6.1 鍗曞垎鏀槸鍚﹁蛋瑕嗙洊绱㈠紩锛堟湡鏈� key = idx_patitem_ward/dept锛孍xtra 鍚� Using index锛�
+--     娌℃湁 Using filesort锛屼篃娌℃湁 Using where 涔嬪鐨勫洖琛級
+EXPLAIN
+SELECT id
+FROM service_subtask
+WHERE del_flag = '0'
+  AND orgid = '20001001' AND campusid = '30001002'
+  AND service_type = '2' AND visit_count = 1
+  AND leavehospitaldistrictcode IN ('40003309')
+ORDER BY endtime DESC
+LIMIT 10;
+
+-- 6.2 鏀瑰啓鍚庢暣浣撹�楁椂锛堟湡鏈� 30 ms 閲忕骇锛岃�屼笉鏄� 3000 ms锛�
+EXPLAIN ANALYZE
+SELECT id FROM (
+    (SELECT id, endtime FROM service_subtask
+     WHERE del_flag='0' AND orgid='20001001' AND campusid='30001002'
+       AND service_type='2' AND visit_count=1 AND leavehospitaldistrictcode IN ('40003309')
+     ORDER BY endtime DESC LIMIT 10)
+    UNION
+    (SELECT id, endtime FROM service_subtask
+     WHERE del_flag='0' AND orgid='20001001' AND campusid='30001002'
+       AND service_type='2' AND visit_count=1 AND leaveldeptcode IN ('40003307')
+     ORDER BY endtime DESC LIMIT 10)
+) t ORDER BY endtime DESC LIMIT 10;
+
+-- 6.3 鏀跺熬
+ANALYZE TABLE service_subtask;
+ANALYZE TABLE pat_archive;
+
+
+-- -------------------------------------------------------------------------------------
+-- 7. 鍥炴粴
+-- -------------------------------------------------------------------------------------
+-- ALTER TABLE service_subtask DROP INDEX idx_patitem_ward;
+-- ALTER TABLE service_subtask DROP INDEX idx_patitem_dept;
+-- ALTER TABLE pat_archive   DROP INDEX idx_pat_archive_patientno;
+-- 锛圫QL / 浠g爜鏀瑰啓鍥炴粴鐩存帴杩樺師 mapper 鍗冲彲锛涘弬鏁板洖婊氭妸 innodb_buffer_pool_size 璋冨洖鍘熷�硷級
diff --git a/sql/fix_nhfy_satisfaction_statistics_20261021.sql b/sql/fix_nhfy_satisfaction_statistics_20261021.sql
new file mode 100644
index 0000000..cb90d52
--- /dev/null
+++ b/sql/fix_nhfy_satisfaction_statistics_20261021.sql
@@ -0,0 +1,141 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夋弧鎰忓害缁熻 /smartor/satisfaction/statistics 鏌ヤ笉鍑烘暟鎹� 鈥斺�� 瀹氫綅涓庝慨澶�
+--                                                        2026-10-21
+--
+-- 銆愯姹傘�慞OST /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
+--      鍘熸潵鏄�宭eavehospitaldistrictcode IN(...) AND deptcode IN(...)銆嶄袱鏉$嫭绔嬫潯浠躲��
+--      浣嗘弧鎰忓害瀛愪换鍔★紙type=2 + service_type 6/14/15/16锛夊湪鍗楀崕**鍙啓 deptcode**锛�
+--      leavehospitaldistrictcode 鍏ㄤ负 NULL锛堝疄娴� 3803 鏉″叏閮� NULL锛夆啋 涓や釜鏉′欢姘歌繙涓嶅彲鑳藉悓鏃舵垚绔�
+--      鈫� types 鏌ョ┖ 鈫� hasVoice / hasQuestionnaire 閮� false 鈫� 鏁翠釜鎺ュ彛鐩存帴杩斿洖绌恒��
+--      鍚屼竴涓〉闈㈢殑鍙﹀ 3 鏉� SQL锛坰endCount / 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锛宯ame=婊℃剰搴︼級锛岄噷闈㈡槸 6 閬撹�侀锛坰vyid 51/97/102/103/154/156锛�
+--      灞炰簬鍏跺畠闂嵎妯℃澘锛夛紝鑰岀湡姝e湪濉殑 19 閬撻锛坰vyid=200 / 妯℃澘 514锛�**categoryid 鍏ㄦ槸 NULL**
+--      鈫� 鍗充娇 鈶� 鈶� 淇ソ锛岄〉闈篃鍙細鍒楀嚭閭� 6 閬撴病鏈夋暟鎹殑鑰侀銆�
+--
+-- 銆愬凡鍋氱殑淇銆�
+--   浠g爜锛堥渶鍙戠増锛夛細
+--     SatisfactionMapper.xml
+--       路 selectSatisfactionSubtaskTypes锛氱瀹�/鐥呭尯鏀逛负 OR锛屼笌鍏朵綑涓夋潯缁熻 SQL 鍙e緞涓�鑷�
+--       路 4 鏉$粺璁� SQL 鐨勬椂闂存潯浠舵敼涓�
+--         IFNULL(visit_time, IFNULL(finishtime, create_time))锛坴isit_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 閬撹�侀锛坰vyid 涓嶅惈 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 杩囨护鐨勬姤琛ㄩ兘鑳芥煡鍒版弧鎰忓害鏁版嵁锛�
+--    涔熻兘璧扮储寮曪紱浠g爜閲岀殑 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 琛�
+--    鈿狅笍 涓庛�岄殢璁垮畬鎴愭椂闂淬�嶅彛寰勭浉鍏崇殑鐪嬫澘浼氬彈褰卞搷锛屽缓璁厛纭涓氬姟鍙e緞鍐嶆墽琛屻��
+--
+-- 2) 鍒嗙被閲岄偅 6 閬撹�侀锛坰vyid 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 瀛楁锛堜細琚拷鐣ワ級銆乻tatistics 涔熶笉鐢� templateid锛�
+--    濡傛灉瑕佹寜棰樼洰/妯℃澘绛涢�夛紝闇�瑕佸墠鍚庣涓�璧疯ˉ銆�
+-- ============================================================================
diff --git a/sql/fix_nhfy_sf_statistics_count_20261021.sql b/sql/fix_nhfy_sf_statistics_count_20261021.sql
new file mode 100644
index 0000000..63b2e71
--- /dev/null
+++ b/sql/fix_nhfy_sf_statistics_count_20261021.sql
@@ -0,0 +1,144 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夋弧鎰忓害缁熻椤� /smartor/serviceSubtask/getSfStatisticsCount 鏌ヤ笉鍒版暟鎹�
+--                                                        2026-10-21
+--
+-- 銆愯姹傘�慞OST /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銆�
+--
+-- 銆愬凡鍋氱殑淇銆�
+--   浠g爜锛坮uoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml锛岄渶鍙戠増锛夛細
+--     路 getSfStatistics / getSfStatisticsGroupKey / getSfStatisticsCategory /
+--       getSfStatisticsHyperlink / getSfStatisticsJoy / getSfStatisticsJoydetails
+--       鍏锛歷isit_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 '鐥呭尯涓篘ULL鏀捐繃 + 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);
+
+-- 鈶� 婊℃剰搴︽槑缁嗗垎绫诲洖濉墠鍚庣殑鍙e緞
+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) 闅忚鐜囷紙鍙婃椂鐜囷級锛歴electTimelyRateBatch 閲屾湁
+--       AND ss.visit_time IS NOT NULL
+--    涓旂敤 visit_time / endtime 璁$畻鍙婃椂鐜囷紱鍗楀崕婊℃剰搴︿袱鑰呴兘涓虹┖
+--    鈫� 杩欎竴鍒楀婊℃剰搴﹀彛寰勬病鏈夋暟鎹潵婧愶紝浼氭樉绀� 0銆�
+--    瑕佸嚭鏁板繀椤诲厛鏈夈�屽簲闅忚鏃堕棿銆嶅拰銆屽嚭闄㈡椂闂淬�嶏紝灞炰簬鏁版嵁娌荤悊鑼冪暣銆�
+--
+-- 2) 銆屾弧鎰忓害鎸囨暟銆峵ab 璋冪敤鐨� getSfStatisticsJoy / getSfStatisticsJoydetails 鏄�**璇煶鍙e緞**锛�
+--       AND targetid IN (SELECT id FROM ivr_liba_target WHERE assortid IN (joyCount 閰嶇疆))
+--    鍗楀崕婊℃剰搴︽槸闂嵎锛坰vy_* 鎸囨爣锛夛紝targetid 涓� ivr_liba_target 涓嶆槸涓�濂�
+--    鈫� 鍗充娇淇ソ鏃堕棿/鐥呭尯鏉′欢锛岃繖涓� tab 瀵瑰崡鍗庝篃鍙兘鏄� 0銆�
+--    瑕佷箞缁欏崡鍗庡仛涓�鐗堟寜 svy 鎸囨爣缁熻鐨勫疄鐜帮紝瑕佷箞璇� tab 瀵瑰崡鍗庨殣钘忋��
+-- ============================================================================
diff --git a/sql/fix_nhfy_sltd_satisfaction_endpoints_20261021.sql b/sql/fix_nhfy_sltd_satisfaction_endpoints_20261021.sql
new file mode 100644
index 0000000..689be61
--- /dev/null
+++ b/sql/fix_nhfy_sltd_satisfaction_endpoints_20261021.sql
@@ -0,0 +1,153 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夛細婊℃剰搴︾粺璁� 4 涓帴鍙�"鏁版嵁涓嶅" 鈥斺�� 瀹氫綅涓庝慨澶�
+--   路 POST /smartor/serviceSubtaskDetail/sltdMydTotalByScore
+--   路 POST /smartor/serviceSubtaskDetail/statQuestionOptionByKsOrBq  (椤甸潰璋冧簡 3 娆�)
+--                                                        2026-10-21
+--
+-- 銆愭牴鍥狅紙3 涓紝鍧囧凡鍦ㄥ簱涓婇噺鍖栵級銆�
+--
+--   鈶� 鍑洪櫌鏃堕棿杩囨护鐢ㄧ殑鏄� endtime锛岃�屽崡鍗庢弧鎰忓害瀛愪换鍔$殑 endtime 澶ч噺涓虹┖
+--      service_subtask.endtime锛�3803 鏉℃弧鎰忓害瀛愪换鍔′腑 3151 鏉′负 NULL锛�83%锛夈��
+--      鑰� selectMydSubtaskRefs / statQuestionOption / statQuestionOptionBySubtaskIds
+--      鍥涗釜 statement 鐨�"鍑洪櫌鏃堕棿鍖洪棿"閮界洿鎺� date_format(s.endtime,...) 杩囨护
+--      鈫� 椤甸潰涓�閫夊嚭闄㈡棩鏈燂紝鏁版嵁灏辫绛涙帀澶у崐锛堝疄娴嬶細鍔� 2026-07-23~2026-10-21 鍚� refs = 0锛夈��
+--      淇锛氱粺涓�鏀逛负 IFNULL(s.endtime, IFNULL(s.finishtime, s.create_time)) 鍏滃簳銆�
+--      淇鍚庡悓涓�鏉′欢 refs = 387锛�= 婊℃剰搴� sendstate=6 鐨� 380 + 鏈畬鎴� 7锛夈��
+--
+--   鈶� statQuestionOptionByKsOrBq 鐨勩�岀瀹� OR 鐥呭尯銆嶅皯浜嗘嫭鍙凤紙鐪� Bug锛屽悓寰蜂篃閿欙級
+--      鍘� SQL锛坉eptOrDistrict==2 鍒嗘敮锛夛細
+--          AND leavehospitaldistrictcode IN (...) OR deptcode IN (...)
+--      AND 浼樺厛绾ч珮浜� OR锛屽疄闄呯瓑浠蜂簬
+--          (鎵�鏈� AND 鏉′欢 AND 鐥呭尯 IN ...) OR 绉戝 IN ...
+--      鈫� "绉戝鍛戒腑"閭d竴鏀畬鍏ㄧ粫杩囦簡 service_type / 鏃ユ湡 / del_flag 鏉′欢銆�
+--      瀹炴祴锛堝崡鍗庛�佺瀹� 40003511銆�2026-07-23~2026-10-21锛夛細
+--          淇鍓� 17604 琛�   淇鍚� 7220 琛�   锛堝绠椾簡 2.4 鍊嶏紝鍏ㄦ槸鍘嗗彶/鍏跺畠浠诲姟绫诲瀷锛�
+--      淇锛氭敼鎴� AND (鐥呭尯 IN (...) OR 绉戝 IN (...))銆�
+--
+--   鈶� 缁煎悎寰楀垎鍙e緞鍐欐鎴愮渷绔嬪悓寰凤紙SLTD锛変簲妗f枃妗�
+--      SltdSatisfactionController#calcMydScore 閲� resolve(SatisfactionSites.SLTD) 鏄‖缂栫爜銆�
+--      鍚屽痉鍙e緞闈犻�夐」鏂囨 "寰堟弧鎰�/婊℃剰/涓�鑸�/涓嶆弧鎰�/寰堜笉婊℃剰" 鍒ゆ。锛�
+--      鑰屽崡鍗庨棶鍗凤紙妯℃澘 514 / libtemplateid 200锛夌殑閫夐」鏄�屾槸锛堟湁锛�/锛堟�绘槸锛夊緢瀹夐潤/寰堢啛缁�/涓诲姩璁茶繃鈥︺��
+--      鈫� 涓�鏉¢兘鍖归厤涓嶄笂 鈫� 寰楀垎鎭掍负 "0.00"銆�
+--      淇锛氱珯鐐规敼鐢� sys_config: satisfaction.site 鍐冲畾锛堥粯璁� sltd锛屼繚鎸佸悓寰蜂笉鍙橈級锛�
+--            鍗楀崕鍙厤 common锛�= 鎸夋槑缁� score 姹傚钩鍧囷級銆�
+--
+--      鈿狅笍 浣嗚娉ㄦ剰锛氬崡鍗庤繖涓棶鍗�**鏍规湰娌¢厤鍒嗗��**
+--         svy_task_template_script.score锛堟ā鏉�514锛�19棰橈級  = '00000000000'
+--         svy_task_template_targetoption.score锛�58涓�夐」锛� = 0
+--         service_subtask_detail.score锛�63108 琛岋級         = 0 / '00000000000'
+--         鎵�浠ュ嵆渚垮垏鍒� common 鍙e緞锛岀患鍚堝緱鍒嗕粛鐒舵槸 0.00銆�
+--         瑕佸嚭寰楀垎锛屽繀椤诲厛缁欓�夐」/棰樼洰閰嶅垎鍊硷紙涓氬姟閰嶇疆锛夛紝鍚﹀垯杩欎釜鍒楀鍗楀崕娌℃湁鎰忎箟銆�
+--
+-- 銆愬凡鏀圭殑浠g爜銆憆uoyi-satisfaction
+--   路 SatisfactionMapper.xml
+--       - selectMydSubtaskRefs / statQuestionOption / statQuestionOptionBySubtaskIds锛�
+--         鍑洪櫌鏃堕棿 endtime 鈫� IFNULL(endtime, finishtime, create_time)
+--       - selectMydSubtaskRefs锛歞eptOrDistrict 琛ヤ笂 2锛圤R锛夊垎鏀紙鍘熸潵鍙湪 1 鏃舵嫾鐥呭尯锛岀瀹ゅ嵈鏃犳潯浠舵嫾锛�
+--       - statQuestionOptionByKsOrBq锛歞eptOrDistrict==2 鐨� OR 琛ユ嫭鍙�
+--   路 SatisfactionSwitch锛氭柊澧� site()锛岃 sys_config: satisfaction.site锛�10 绉掕繘绋嬪唴缂撳瓨锛�
+--   路 SltdSatisfactionController#calcMydScore锛氭敼涓� resolve(satisfactionSwitch.site())
+--
+-- 銆愪慨澶嶅悗瀹炴祴锛堟潯浠讹細绉戝 40003511 / 鐥呭尯 40003514 / 2026-07-23~2026-10-21锛夈��
+--   refs = 387锛涙寜绉戝鍒嗙粍閫夐」鍒嗗竷姝e父锛屼緥濡傘�岃偪鐦ょ涓�鐥呮埧銆嶆瘡棰� 379 浜�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�0銆戣瘉鎹� SQL锛堥殢鏃跺彲閲嶈窇锛�
+-- ----------------------------------------------------------------------------
+-- 鈶� 鍑洪櫌鏃堕棿涓虹┖鐨勬瘮渚�
+SELECT COUNT(*)                    AS rows_total,
+       SUM(endtime IS NULL)        AS endtime_null,
+       SUM(leavehospitaldistrictname IS NULL OR leavehospitaldistrictname = '') AS district_name_empty
+FROM service_subtask
+WHERE del_flag = 0 AND type = '2' AND service_type IN ('6', '14', '15', '16');
+
+-- 鈶� OR 婕忔嫭鍙风殑褰卞搷闈紙淇鍓� vs 淇鍚庯級
+SELECT '淇鍓�(鏃犳嫭鍙�)' AS version, COUNT(*) AS rows_cnt
+FROM service_subtask_detail d
+JOIN service_subtask s ON d.sub_id = s.id
+WHERE s.del_flag = 0 AND d.del_flag = 0 AND s.service_type IN ('6', '14')
+  AND d.create_time >= '2026-07-23 00:00:00'
+  AND d.create_time < date_add('2026-10-21', interval 1 day)
+  AND s.leavehospitaldistrictcode IN ('40003514') OR s.deptcode IN ('40003511');
+
+SELECT '淇鍚�(鎷彿鍖呬綇 OR)' AS version, COUNT(*) AS rows_cnt
+FROM service_subtask_detail d
+JOIN service_subtask s ON d.sub_id = s.id
+WHERE s.del_flag = 0 AND d.del_flag = 0 AND s.service_type IN ('6', '14')
+  AND d.create_time >= '2026-07-23 00:00:00'
+  AND d.create_time < date_add('2026-10-21', interval 1 day)
+  AND (s.leavehospitaldistrictcode IN ('40003514') OR s.deptcode IN ('40003511'));
+
+-- 鈶� 鍒嗗�煎埌搴曟湁娌℃湁閰嶏紙涓変釜灞傞潰閮界湅涓�鐪硷級
+SELECT '棰樼洰鍒嗗��' AS layer, score, COUNT(*) AS cnt
+FROM svy_task_template_script WHERE templateID = 514 AND del_flag = 0 GROUP BY score
+UNION ALL
+SELECT '閫夐」鍒嗗��', o.score, COUNT(*)
+FROM svy_task_template_targetoption o
+JOIN svy_task_template_script s ON s.id = o.scriptid
+WHERE s.templateID = 514 AND s.del_flag = 0 GROUP BY o.score
+UNION ALL
+SELECT '鏄庣粏鍒嗗��', d.score, COUNT(*)
+FROM service_subtask_detail d
+JOIN service_subtask ss ON ss.id = d.sub_id
+WHERE ss.type = '2' AND ss.service_type IN ('6', '14') AND d.del_flag = 0
+GROUP BY d.score;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆戝彲閫夐厤缃細缁煎悎寰楀垎鍙e緞绔欑偣锛堜笉鏀逛篃鑳借窇锛屽彧鏄緱鍒嗗彛寰勬寜鍚屽痉锛�
+--     鍚屽痉锛氫繚鎸侀粯璁� sltd锛堟垨鏄惧紡閰嶇疆 sltd锛�
+--     鍗楀崕锛氶厤 common 鈥斺�� 鈿狅笍 鍓嶆彁鏄棶鍗烽�夐」/棰樼洰閰嶄簡鍒嗗�硷紝鍚﹀垯寰楀垎浠嶆槸 0.00
+-- ----------------------------------------------------------------------------
+-- INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+-- VALUES ('婊℃剰搴︾患鍚堝緱鍒嗗彛寰�', 'satisfaction.site', 'common', 'Y', 'admin', sysdate(),
+--         'sltd=鐪佺珛鍚屽痉浜旀。鏂囨鍔犳潈锛堥粯璁わ級锛沜ommon/nanhua=鎸夋槑缁� score 姹傚钩鍧�');
+
+-- 鏍¢獙
+-- SELECT config_key, config_value FROM sys_config WHERE config_key = 'satisfaction.site';
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆戝彲閫夋暟鎹�/閰嶇疆锛氳銆岀患鍚堝緱鍒嗐�嶅鍗楀崕鏈夋剰涔�
+--     褰撳墠妯℃澘 514 鐨� 19 閬撻銆�58 涓�夐」鍒嗗�煎叏鏄� 0锛屼换浣曞彛寰勯兘绠椾笉鍑哄垎銆�
+--     鑻ュ尰闄㈡帴鍙�"浜旀。涔嬪鎸� 婊¤冻/閮ㄥ垎婊¤冻/涓嶆弧瓒� 鎵撳垎"锛岃涓氬姟鍦�
+--     銆岄棶鍗锋ā鏉� 鈫� 棰樼洰閫夐」銆嶉噷缁欐瘡涓�夐」閰嶇疆鍒嗗�硷紝涔嬪悗锛�
+--       路 绔欑偣鍙e緞寤鸿閰� common锛堟寜鏄庣粏 score 姹傚钩鍧囷紝鐧惧垎鍒讹級
+--       路 鍘嗗彶鏄庣粏鐨� score 涓嶄細鑷姩鍥炲~锛岄渶鍙﹁璇勪及瑕佷笉瑕佹寜閫夐」琛ュ巻鍙插垎鍊�
+-- ----------------------------------------------------------------------------
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戦獙璇侊細淇鍚庣殑 refs 涓庢寜绉戝鐨勯�夐」鍒嗗竷
+-- ----------------------------------------------------------------------------
+SELECT COUNT(*) AS refs
+FROM service_subtask
+WHERE del_flag = 0
+  AND orgid = '20001001' AND campusid = '30001002'
+  AND service_type = '6'
+  AND date_format(IFNULL(endtime, IFNULL(finishtime, create_time)), '%y%m%d') >= date_format('2026-07-23', '%y%m%d')
+  AND date_format(IFNULL(endtime, IFNULL(finishtime, create_time)), '%y%m%d') <= date_format('2026-10-21', '%y%m%d')
+  AND (leavehospitaldistrictcode IN ('40003514') OR deptcode IN ('40003511'));
+
+SELECT s.deptname, d.questiontext, d.asrtext, COUNT(*) AS cnt
+FROM service_subtask_detail d
+JOIN service_subtask s ON d.sub_id = s.id
+WHERE s.del_flag = 0 AND d.del_flag = 0 AND s.service_type IN ('6', '14')
+  AND d.create_time >= '2026-07-23 00:00:00'
+  AND d.create_time < date_add('2026-10-21', interval 1 day)
+  AND (s.leavehospitaldistrictcode IN ('40003514') OR s.deptcode IN ('40003511'))
+GROUP BY s.deptname, d.questiontext, d.asrtext
+ORDER BY cnt DESC
+LIMIT 5;
+
+
+-- ============================================================================
+-- 銆愬彟闇�娉ㄦ剰锛堟湭鏀癸紝灞炰骇鍝佸彛寰勶級銆�
+-- 1) statQuestionOptionByKsOrBq 鐨� Java 渚ф寜 deptname / leavehospitaldistrictname 鍒嗙粍锛�
+--    鍒嗙粍鍚嶄负绌虹洿鎺ヨ烦杩囥�傚崡鍗庢弧鎰忓害瀛愮殑 leavehospitaldistrictname 鏈� 3228/3803 涓虹┖锛�
+--    鎵�浠ラ〉闈笂銆屾寜鐥呭尯銆嶈繖涓淮搴﹀鍗楀崕鍩烘湰鏄┖鐨勨�斺�斾笉鏄彇鏁伴敊锛屾槸鏁版嵁閲屾病鏈夌梾鍖恒��
+-- 2) 鍚屼竴椤甸潰鐨� mydTrend / sltdMydTotalByDimension / mzMydScoreRank 涔熼兘鏄悓寰峰彛寰�
+--    锛堝嚭闄㈡椂闂淬�佺梾鍖虹淮搴︼級锛屽崡鍗庤鐢ㄩ渶鎸夊悓鏍锋�濊矾閫愪釜鏍稿銆�
+-- ============================================================================
diff --git a/sql/fix_nhfy_ssd_delflag_20261021.sql b/sql/fix_nhfy_ssd_delflag_20261021.sql
new file mode 100644
index 0000000..680e80d
--- /dev/null
+++ b/sql/fix_nhfy_ssd_delflag_20261021.sql
@@ -0,0 +1,110 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夛細鎭㈠琚�昏緫鍒犻櫎鐨勬弧鎰忓害浣滅瓟鏄庣粏锛�2026-10-21 宸叉墽琛岋級
+--
+-- 銆愯儗鏅�戝鍑恒�岄棶棰樿鎯呭崰姣斻�嶆瘮銆屾偅鑰呴殢璁夸俊鎭〃鍗曘�嶅皯 10 浜猴紙370 vs 380锛夛紝
+--         鍘熷洜鏄繖 10 涓瓙浠诲姟鐨� service_subtask_detail 鍏ㄩ儴琚疆 del_flag='1'
+--         锛堝悓涓�鎮h�呰繕鏈� 2~6 浠介噸澶嶅壇鏈紝绛旀瀹屽叏涓�鑷达級銆�
+--         璇﹁ / 鎺掓煡_闂鍗犳瘮涓庨殢璁胯〃鍗曚汉鏁颁笉涓�鑷�.sql銆佹姄鐜板満_璋佹妸鏄庣粏缃负鍒犻櫎_20261021.sql
+--
+-- 銆愭湰娆℃墽琛屽唴瀹广��
+--   1) 鎭㈠ 5 涓瓙浠诲姟锛�45108 45109 45110 45111 45114锛夛細姣� (sub_id, scriptid) 鍙� MAX(id) 閭d竴浠界疆 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 / 鏈夋湁鏁堟槑缁嗙殑鎮h�� 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 閭d袱鏉℃帴鍙o紙瀹冧滑浼氬己鍒� NOW()锛夛紱鐢�
+--   sql/鎶撶幇鍦篲璋佹妸鏄庣粏缃负鍒犻櫎_20261021.sql 閲岀殑 general_log 鎶撲竴娆� SQL 鍘熸枃鍗冲彲瀹氭銆�
+--   鍦ㄦ涔嬪墠锛屽彧瑕佽繕鏈夋偅鑰�"閲嶅~/琚ˉ榛樿鍊�"锛屽悓鏍风殑闂浼氬啀娆″嚭鐜般��
+-- ============================================================================
diff --git "a/sql/fix_nhfy_\345\207\272\351\231\242\351\232\217\350\256\277\344\273\273\345\212\241\351\231\242\345\214\272\347\227\205\345\214\272\345\233\236\345\241\253_20261029.sql" "b/sql/fix_nhfy_\345\207\272\351\231\242\351\232\217\350\256\277\344\273\273\345\212\241\351\231\242\345\214\272\347\227\205\345\214\272\345\233\236\345\241\253_20261029.sql"
new file mode 100644
index 0000000..5aa160b
--- /dev/null
+++ "b/sql/fix_nhfy_\345\207\272\351\231\242\351\232\217\350\256\277\344\273\273\345\212\241\351\231\242\345\214\272\347\227\205\345\214\272\345\233\236\345\241\253_20261029.sql"
@@ -0,0 +1,165 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夛細鍑洪櫌闅忚浠诲姟銆岄櫌鍖� / 鐥呭尯銆嶅洖濉剼鏈�
+-- ----------------------------------------------------------------------------
+-- 鏍瑰洜锛�2026-10-29 鎺掓煡纭锛夛細
+--   鍑洪櫌闅忚浠诲姟鐢熸垚鏃讹紝VisitSubtaskFactory#boxedServiceSubtask 鏃犳潯浠舵墽琛�
+--   `d.setCampusid(inhosp.getCampusid())`锛屽綋 pat_med_inhosp.campusid 涓虹┖鏃讹紝
+--   浼氭妸浠庨暱鏈熶换鍔℃惉鏉ョ殑闄㈠尯瑕嗙洊鎴� NULL 鈫� service_subtask.campusid 钀界┖銆�
+--   鑰岄殢璁垮垪琛ㄦ帴鍙� ServiceSubtaskController#patItem 寮哄埗 setCampusid(鐧诲綍鐢ㄦ埛闄㈠尯)锛�
+--   SQL 鏉′欢 `and campusid = #{campusid}`锛孨ULL 涓嶅尮閰嶄换浣曞��
+--   鈫� 杩欎簺浠诲姟"搴撻噷瀛樺湪銆侀〉闈笂姘歌繙鏌ヤ笉鍒�"锛堝氨鏄�"鍑洪櫌 475 鏉°�侀殢璁垮彧鏈� 444 鏉�"鐨勭洿鎺ュ師鍥狅級銆�
+--   浠g爜宸插湪 VisitSubtaskFactory 涓慨澶嶏紙鍑洪櫌璁板綍鏈夐櫌鍖烘墠瑕嗙洊锛夛紝鏈剼鏈彧淇巻鍙叉暟鎹��
+--
+-- 鏈瀹炴祴锛�2026-10-29锛宻martor_nhfy锛夛細
+--   路 service_type='2' 涓� campusid 涓虹┖锛�**314 鏉�**
+--       鈥斺�� 鍏ㄩ儴鏄�屽啀娆¢殢璁� / 鎵嬪伐鏂板銆嶄骇鐢熺殑琛岋紙is_visit_again=1銆乮nhospid 涓虹┖銆乽pid 涓虹┖锛夛細
+--          313 鏉� create_by=鏇规収鐜层�乼askid=108銆屾秷鍖栦竴鍖洪殢璁裤�嶃��2026-06 鐢熸垚锛�
+--          1 鏉� taskid=177銆屼换鍔℃祴璇�0624銆嶃��
+--          **杩欐壒鏃犳硶浠庡嚭闄㈣褰曞洖濉�**锛坕nhospid 鏄┖鐨勶紝涔熸病鏈夌埗浠诲姟鍙户鎵匡級锛�
+--          鍙兘閫�鍒版偅鑰呮。妗� pat_archive.campusid锛�314 鏉″叏閮芥湁鍊硷級銆�
+--   路 service_type='2' 涓� leaveldeptcode 涓虹┖锛�**303 鏉�**
+--       鈥斺�� 鍏朵腑 294 鏉″氨鏄笂闈㈤偅鎵癸紙inhospid 绌猴級锛屽彟 9 鏉℃湁 inhospid銆佸彲浠庡嚭闄㈣褰曞洖濉�
+--          锛�9 鏉¢兘鏄�屽啀娆¢殢璁裤�嶏紝taskid=11锛宑reate_by=瓒呯骇绠$悊鍛橈紝2026-10-19~21 鐢熸垚锛夈��
+--   路 service_type='2' 涓� leavehospitaldistrictcode 涓虹┖锛�**10 鏉�**锛堝嚭闄㈣褰曢噷閮芥湁鍊硷紝鍙洖濉級
+--   路 鐥呭尯"涓嶄负绌轰絾涓庡嚭闄㈣褰曚笉涓�鑷�"鐨勶細57 鏉★紙澶氫负杞/杞梾鍖猴級锛�**涓嶈嚜鍔ㄤ慨**锛岃 STEP 0-D
+--   路 楠ㄧ涓績涓�鐥呭尯锛�40011020锛�2026-07 閭� 25 鏉★紙鎵弿閾捐矾 campusid 钀界┖锛夊凡鍏堟墜宸ュ洖濉紝
+--     椤甸潰鍙鏁� 443 鈫� 468锛岀幇鍦� 468 = 468 宸插畬鍏ㄥ榻愶紙鍙洿鎺ョ敤 STEP 4-B 澶嶆牳锛�
+--
+-- 鈿狅笍 鍙e緞鎻愰啋锛氬悓涓�鎵瑰嚭闄㈣褰曪紝銆屾寜绂婚櫌鐥呭尯銆嶆槸 475 鏉°�併�屾寜绂婚櫌绉戝銆嶆槸 469 鏉�
+--   锛堝樊 6锛�475 閲屾湁 7 鏉$梾鍖哄湪楠ㄧ涓績涓�浣嗙瀹ゅ睘浜庡埆鐨勭瀹わ紱鍙︽湁 1 鏉$瀹ゅ湪楠ㄧ涓績涓�浣嗙梾鍖烘槸鐤肩棝绉戠梾鍖猴級銆�
+--   瀵瑰簲鐨勪换鍔℃暟鏄� 468锛堢梾鍖猴級/ 465锛堢瀹わ級銆�**鍏堢‘璁ら〉闈㈢敤鐨勬槸鍝釜鍙e緞鍐嶅鏁�**锛�
+--   鍚﹀垯浼氬嚟绌哄鍑轰竴绗斿樊棰濄��
+--
+-- 鎵ц椤哄簭锛歋TEP 0 棰勬 鈫� STEP 1 澶囦唤 鈫� STEP 2 鍥炲~闄㈠尯 鈫� STEP 3 鍥炲~鐥呭尯
+--           鈫� STEP 4 鏍¢獙 鈫� 锛堝闇�鎾ら攢锛塖TEP 5 鍥炴粴
+-- 寤鸿锛氫笟鍔′綆宄版湡鎵ц锛涙瘡鏉� UPDATE 閮藉甫 LIMIT 鍒嗘壒鐨勮瘽锛岄噸澶嶆墽琛屽埌褰卞搷 0 琛屼负姝紙骞傜瓑锛夈��
+-- ============================================================================
+
+-- ---------------------------------------------------------------------------
+-- STEP 0锛氶妫�锛堝彧璇伙紱鍙嶅鎵ц瀹夊叏锛屽厛鐪嬫竻褰卞搷闈㈠啀鍔級
+-- ---------------------------------------------------------------------------
+SELECT '0-A 寰呬慨鏁版嵁閲�' AS step,
+       (SELECT COUNT(*) FROM service_subtask
+          WHERE del_flag = 0 AND service_type = '2' AND (campusid IS NULL OR campusid = '')) AS 寰呰ˉ闄㈠尯,
+       (SELECT COUNT(*) FROM service_subtask
+          WHERE del_flag = 0 AND service_type = '2'
+            AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')) AS 寰呰ˉ鐥呭尯;
+
+SELECT '0-B 闄㈠尯鏉ユ簮鏄惁澶熺敤' AS step,
+       COUNT(*) AS 寰呰ˉ鏉℃暟,
+       SUM(CASE WHEN i.campusid IS NOT NULL AND i.campusid <> '' THEN 1 ELSE 0 END) AS 鍑洪櫌璁板綍鏈夐櫌鍖�,
+       SUM(CASE WHEN a.campusid IS NOT NULL AND a.campusid <> '' THEN 1 ELSE 0 END) AS 鎮h�呮。妗堟湁闄㈠尯,
+       SUM(CASE WHEN (i.campusid IS NULL OR i.campusid = '')
+                 AND (a.campusid IS NULL OR a.campusid = '') THEN 1 ELSE 0 END) AS 涓ゅ閮芥病鏈塤闇�浜哄伐
+FROM service_subtask s
+LEFT JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+LEFT JOIN pat_archive a ON a.id = s.patid
+WHERE s.del_flag = 0 AND s.service_type = '2' AND (s.campusid IS NULL OR s.campusid = '');
+
+SELECT '0-C 寰呰ˉ闄㈠尯鎸夌梾鍖哄垎甯�' AS step, leavehospitaldistrictcode, leavehospitaldistrictname, COUNT(*) AS 鏉℃暟
+FROM service_subtask
+WHERE del_flag = 0 AND service_type = '2' AND (campusid IS NULL OR campusid = '')
+GROUP BY leavehospitaldistrictcode, leavehospitaldistrictname
+ORDER BY 鏉℃暟 DESC;
+
+-- 鐥呭尯"涓嶄负绌轰絾涓庡嚭闄㈣褰曚笉涓�鑷�"鐨勶紝**涓嶅湪鏈剼鏈嚜鍔ㄤ慨**锛堝彲鑳芥槸杞/杞梾鍖虹殑姝e父涓氬姟锛夛紝
+-- 鍙垪鍑烘潵浜哄伐纭锛堚殸锔� 杩欐潯杈冩參锛屽疄娴嬬害 70s锛屾斁鍒版渶鍚庤窇鎴栫洿鎺ヨ烦杩囷級锛�
+SELECT '0-D 鐥呭尯涓嶄竴鑷確浜哄伐纭' AS step, s.id AS 瀛愪换鍔D, s.inhospid, s.sendname AS 濮撳悕,
+       DATE_FORMAT(s.endtime, '%Y-%m-%d') AS 鍑洪櫌鏃ユ湡,
+       s.leavehospitaldistrictcode AS 浠诲姟鐥呭尯, i.leavehospitaldistrictcode AS 璁板綍鐥呭尯,
+       i.leavehospitaldistrictname AS 璁板綍鐥呭尯鍚�
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND s.leavehospitaldistrictcode IS NOT NULL AND s.leavehospitaldistrictcode <> ''
+  AND i.leavehospitaldistrictcode IS NOT NULL AND i.leavehospitaldistrictcode <> ''
+  AND s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode
+LIMIT 200;
+
+-- ---------------------------------------------------------------------------
+-- STEP 1锛氬浠斤紙鍙浠�"灏嗚淇敼"鐨勮锛涘缓琛ㄥ悗璇风‘璁よ鏁颁笌 STEP 0-A 涓�鑷达級
+-- ---------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS bak_service_subtask_campusward_20261029 AS
+SELECT s.id,
+       s.campusid,
+       s.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname,
+       s.update_time AS old_update_time
+FROM service_subtask s
+WHERE s.del_flag = 0
+  AND s.service_type = '2'
+  AND (s.campusid IS NULL OR s.campusid = ''
+       OR s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = '');
+
+SELECT '1 澶囦唤琛屾暟' AS step, COUNT(*) AS backup_rows
+FROM bak_service_subtask_campusward_20261029;
+
+-- ---------------------------------------------------------------------------
+-- STEP 2锛氬洖濉櫌鍖猴紙鍏堝彇鍑洪櫌璁板綍锛屽彇涓嶅埌閫�鍥炴偅鑰呮。妗堬紱涓や釜鏉ユ簮閮芥病鏈夌殑鐣欑潃涓嶅姩锛�
+-- ---------------------------------------------------------------------------
+UPDATE service_subtask s
+  JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+   SET s.campusid = i.campusid
+ WHERE s.del_flag = 0 AND s.service_type = '2'
+   AND (s.campusid IS NULL OR s.campusid = '')
+   AND i.campusid IS NOT NULL AND i.campusid <> '';
+
+UPDATE service_subtask s
+  JOIN pat_archive a ON a.id = s.patid
+   SET s.campusid = a.campusid
+ WHERE s.del_flag = 0 AND s.service_type = '2'
+   AND (s.campusid IS NULL OR s.campusid = '')
+   AND a.campusid IS NOT NULL AND a.campusid <> '';
+
+-- ---------------------------------------------------------------------------
+-- STEP 3锛氬洖濉梾鍖� / 绉戝锛�**鍙ˉ绌虹殑**锛屼笉鍔ㄥ凡鏈夊�硷級
+--   路 inhospid 涓虹┖鐨勯偅鎵癸紙314 鏉°�屽啀娆¢殢璁裤�嶏級鍦ㄨ繖閲岃ˉ涓嶅埌锛屽彧鑳介潬 STEP 2 鐨勬。妗堝厹搴曡ˉ闄㈠尯
+-- ---------------------------------------------------------------------------
+UPDATE service_subtask s
+  JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+   SET s.leavehospitaldistrictcode = i.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname = i.leavehospitaldistrictname
+ WHERE s.del_flag = 0 AND s.service_type = '2'
+   AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = '')
+   AND i.leavehospitaldistrictcode IS NOT NULL AND i.leavehospitaldistrictcode <> '';
+
+UPDATE service_subtask s
+  JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+   SET s.leaveldeptcode = i.leaveldeptcode,
+       s.leaveldeptname = i.leaveldeptname
+ WHERE s.del_flag = 0 AND s.service_type = '2'
+   AND (s.leaveldeptcode IS NULL OR s.leaveldeptcode = '')
+   AND i.leaveldeptcode IS NOT NULL AND i.leaveldeptcode <> '';
+
+-- ---------------------------------------------------------------------------
+-- STEP 4锛氭牎楠岋紙鏈熸湜锛氬墿浣� 0 / 0锛屼笖椤甸潰鍙鏁颁笌鍑洪櫌璁板綍鏁板榻愶級
+-- ---------------------------------------------------------------------------
+SELECT '4-A 鍓╀綑鏈慨' AS step,
+       (SELECT COUNT(*) FROM service_subtask
+          WHERE del_flag = 0 AND service_type = '2' AND (campusid IS NULL OR campusid = '')) AS 浠嶇┖闄㈠尯,
+       (SELECT COUNT(*) FROM service_subtask
+          WHERE del_flag = 0 AND service_type = '2'
+            AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')) AS 浠嶇┖鐥呭尯;
+
+-- 鐢ㄩ绉戜腑蹇冧竴鐥呭尯涓句緥鏍稿锛氫换鍔℃�绘暟搴� = 椤甸潰鍙鏁帮紙璇存槑涓嶅啀鏈�"鏌ヤ笉鍒�"鐨勶級
+SELECT '4-B 楠ㄧ涓績涓�鐥呭尯鏍稿' AS step,
+       COUNT(*) AS 浠诲姟鎬绘暟,
+       SUM(CASE WHEN s.campusid = '30001002' AND s.leavehospitaldistrictcode = '40011020'
+                THEN 1 ELSE 0 END) AS 椤甸潰鍙
+FROM service_subtask s
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND s.leavehospitaldistrictcode = '40011020'
+  AND s.endtime >= '2026-07-01 00:00:00' AND s.endtime < '2026-10-01 00:00:00';
+
+-- ---------------------------------------------------------------------------
+-- STEP 5锛氬洖婊氾紙浠呮挙閿�鏈鏀瑰姩锛涘彧鍥炴粴鍊肩‘瀹炶鏀硅繃鐨勮锛�
+-- ---------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN bak_service_subtask_campusward_20261029 b ON b.id = s.id
+--    SET s.campusid = b.campusid,
+--        s.leavehospitaldistrictcode = b.leavehospitaldistrictcode,
+--        s.leavehospitaldistrictname = b.leavehospitaldistrictname;
+--
+-- 鍥炴粴鍚庡缓璁啀璺戜竴閬� STEP 4-A 纭鍥炲埌淇鍓嶇姸鎬侊紙闄㈠尯 314 / 鐥呭尯 10锛夈��
+-- 纭鏁版嵁绋冲畾銆佹棤闇�鍥炴粴鍚庯紝鍐嶈�冭檻鍒犻櫎澶囦唤琛細
+-- DROP TABLE bak_service_subtask_campusward_20261029;
diff --git "a/sql/fix_nhfy_\351\232\217\350\256\277\347\227\205\345\214\272\347\273\237\344\270\200\344\270\272\345\207\272\351\231\242\347\227\205\345\214\272_20261029.sql" "b/sql/fix_nhfy_\351\232\217\350\256\277\347\227\205\345\214\272\347\273\237\344\270\200\344\270\272\345\207\272\351\231\242\347\227\205\345\214\272_20261029.sql"
new file mode 100644
index 0000000..034b8df
--- /dev/null
+++ "b/sql/fix_nhfy_\351\232\217\350\256\277\347\227\205\345\214\272\347\273\237\344\270\200\344\270\272\345\207\272\351\231\242\347\227\205\345\214\272_20261029.sql"
@@ -0,0 +1,186 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夛細鎶娿�屽嚭闄㈤殢璁夸换鍔$殑鐥呭尯銆嶇粺涓�涓恒�屽嚭闄㈣褰曠殑鐥呭尯銆�
+-- ----------------------------------------------------------------------------
+-- 鍙e緞锛�2026-10-29 涓氬姟纭锛夛細鍑洪櫌璁板綍 pat_med_inhosp.leavehospitaldistrictcode/name 鏄敮涓�鏉冨▉锛�
+--   闅忚浠诲姟 service_subtask 涓�寰嬪悜瀹冨榻� 鈥斺�� 涓嶅啀鎸夋偅鑰呮。妗堝弽鎺ㄣ�佷篃涓嶇敤鍓嶇浼犲叆鐨勫�笺��
+--
+-- 涓轰粈涔堜箣鍓嶄細涓嶄竴鑷达細
+--   鈶� 鎵弿鐢熸垚锛堝嚭闄㈤殢璁夸富閾捐矾锛夋湰鏉ュ氨鏄彇鍑洪櫌璁板綍鐨勭梾鍖猴紝娌¢棶棰橈紱
+--   鈶� 銆屽啀娆¢殢璁� / 鎵嬪伐鏂板銆嶏紙/serviceSubtask/addSubTask銆�/addSubTaskAgain锛夋槸鐩存帴鎸夊墠绔�
+--      浼犳潵鐨勫瓧娈佃惤搴撶殑锛屽墠绔笉甯﹀氨鏄┖ 鈫� 杩欎簺浠诲姟鍦ㄦ寜鐥呭尯杩囨护鐨勯殢璁垮垪琛ㄩ噷鏌ヤ笉鍒帮紱
+--   鈶� 鍑洪櫌鍚� HIS 鍙堣兘鏇存鐥呭尯锛堣浆绉�/杞梾鍖猴級锛屽凡鐢熸垚鐨勪换鍔′笉浼氳窡鐫�鍙� 鈫� 鍑虹幇"涓よ竟涓嶄竴鏍�"銆�
+--   浠g爜渚у凡鍦� ServiceSubtaskServiceImpl 鍔� alignDischargeWardFromInhosp() 鍏滀綇 鈶★紝
+--   鏈剼鏈慨鍘嗗彶鏁版嵁锛堚憼浠ュ鐨� 鈶♀憿 涓ょ被锛夈��
+--
+-- 鏈瀹炴祴锛�2026-10-29锛宻martor_nhfy锛宒el_flag=0 + service_type='2'锛夛細
+--   路 闇�瑕佺粺涓�鐨勶細**67 鏉�**
+--       - 鍘熸潵鐥呭尯涓虹┖鐨� 10 鏉�
+--       - 鍘熸潵鐥呭尯涓庡嚭闄㈣褰曚笉涓�鑷寸殑 57 鏉�
+--   路 鏃犳硶缁熶竴鐨勶細0 鏉★紙杩� 67 鏉¢兘鑳藉畾浣嶅埌鍑洪櫌璁板綍锛屼笖鍑洪櫌璁板綍鐨勭梾鍖洪兘闈炵┖锛�
+--   路 鍙︿竴鎵� 314 鏉°�屽啀娆¢殢璁裤�嶈鏄�**闄㈠尯**锛坈ampusid锛変负绌恒�佺梾鍖烘湰韬湁鍊笺�乮nhospid 涓虹┖锛�
+--     涓庢湰鑴氭湰鏃犲叧锛岀敱 fix_nhfy_鍑洪櫌闅忚浠诲姟闄㈠尯鐥呭尯鍥炲~_20261029.sql 澶勭悊
+--   路 椤哄甫鍙戠幇锛氱瀹わ紙leaveldeptcode锛変笌鍑洪櫌璁板綍涓嶄竴鑷存垨涓虹┖鐨勮繕鏈� 12 鏉★紝
+--     鏈剼鏈粯璁�**涓嶅姩**锛岃 STEP 2B锛堢‘璁ゅ悗鍙竴璧风粺涓�锛�
+--
+-- 鎵ц璁板綍锛�
+--   **2026-10-29 宸叉墽琛�** STEP 1 + STEP 2锛氬浠� 67 琛岋紙bak_service_subtask_ward_20261029锛夛紝
+--   UPDATE 褰卞搷 67 琛岋紱STEP 3-A 銆屽墿浣欎笉涓�鑷寸殑鐥呭尯銆�= 0锛�
+--   楠ㄧ涓績涓� 鍙e緞瀵圭収鐢� 475 / 468 鍙樹负 **475 / 475**锛堝嚭闄㈣褰曟寜鐥呭尯 = 闅忚浠诲姟鎸夌梾鍖猴級銆�
+--   STEP 2B锛堢瀹わ級**鏈墽琛�**锛岀瓑浣犵‘璁ゃ��
+--
+-- 鎵ц椤哄簭锛歋TEP 0 棰勬 鈫� STEP 1 澶囦唤 鈫� STEP 2 缁熶竴鐥呭尯 鈫� STEP 3 鏍¢獙 鈫掞紙濡傞渶锛塖TEP 4 鍥炴粴
+-- 娉ㄦ剰锛氶妫�鐨勪袱鏉� SQL 闇�瑕佹妸闅忚浠诲姟鍜屽嚭闄㈣褰曞叏閲忔瘮瀵癸紝瀹炴祴鍚勭害 1 鍒嗛挓锛屽睘姝e父銆�
+-- ============================================================================
+
+-- ---------------------------------------------------------------------------
+-- STEP 0锛氶妫�锛堝彧璇伙級
+-- ---------------------------------------------------------------------------
+SELECT '0-A 寰呯粺涓�鐥呭尯鐨勬�婚噺' AS step, COUNT(*) AS 寰呮敼鏉℃暟,
+       SUM(CASE WHEN s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+                THEN 1 ELSE 0 END) AS 鍘熺梾鍖轰负绌�,
+       SUM(CASE WHEN s.leavehospitaldistrictcode IS NOT NULL AND s.leavehospitaldistrictcode <> ''
+                THEN 1 ELSE 0 END) AS 鍘熺梾鍖轰笉涓�鑷�
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+       OR s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode);
+
+SELECT '0-B 鏀瑰姩鏄犲皠锛堜粠 鈫� 鍒帮級' AS step,
+       IFNULL(s.leavehospitaldistrictcode, '(绌�)') AS 鍘熺梾鍖虹爜,
+       IFNULL(s.leavehospitaldistrictname, '(绌�)') AS 鍘熺梾鍖哄悕,
+       i.leavehospitaldistrictcode AS 缁熶竴涓�,
+       i.leavehospitaldistrictname AS 缁熶竴涓虹梾鍖哄悕,
+       COUNT(*) AS 鏉℃暟
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+       OR s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode)
+GROUP BY s.leavehospitaldistrictcode, s.leavehospitaldistrictname,
+         i.leavehospitaldistrictcode, i.leavehospitaldistrictname
+ORDER BY 鏉℃暟 DESC;
+
+-- 寰呯粺涓�鐨� 67 鏉¢噷锛屽嚭闄㈣褰曡嚜宸辩殑鐥呭尯涔熸槸绌虹殑锛堣繖绫绘棤娉曠粺涓�锛屾湡鏈� 0锛�
+SELECT '0-C 寰呯粺涓�琛岄噷鍑洪櫌璁板綍鐥呭尯涓虹┖' AS step, COUNT(*) AS 鏃犳硶缁熶竴
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+       OR s.leavehospitaldistrictcode <> IFNULL(i.leavehospitaldistrictcode, ''))
+  AND (i.leavehospitaldistrictcode IS NULL OR i.leavehospitaldistrictcode = '');
+
+-- 涓嶅湪鏈剼鏈寖鍥达細娌℃湁鍑洪櫌璁板綍ID锛坕nhospid 涓虹┖锛変笖鐥呭尯涓虹┖鐨勮锛�
+-- 鏃犳硶鎸夊嚭闄㈣褰曠粺涓�锛岃 fix_nhfy_鍑洪櫌闅忚浠诲姟闄㈠尯鐥呭尯鍥炲~_20261029.sql
+SELECT '0-D 涓嶅湪鏈鑼冨洿' AS step, COUNT(*) AS 鏃犲嚭闄㈣褰旾D涓旂梾鍖轰负绌�
+FROM service_subtask s
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND (s.inhospid IS NULL OR s.inhospid = 0)
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = '');
+
+-- ---------------------------------------------------------------------------
+-- STEP 1锛氬浠斤紙鍙浠藉皢琚慨鏀圭殑琛岋級
+-- ---------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS bak_service_subtask_ward_20261029 AS
+SELECT s.id,
+       s.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname,
+       s.leaveldeptcode,
+       s.leaveldeptname,
+       s.update_time AS old_update_time
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+       OR s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode);
+
+SELECT '1 澶囦唤琛屾暟锛堟湡鏈� 67锛�' AS step, COUNT(*) AS backup_rows
+FROM bak_service_subtask_ward_20261029;
+
+-- ---------------------------------------------------------------------------
+-- STEP 2锛氱粺涓�鐥呭尯锛堢爜 + 鍚嶇О锛屼竴寰嬩互鍑洪櫌璁板綍涓哄噯锛�
+--   鍙奖鍝� service_type='2'锛堝嚭闄㈤殢璁匡級锛涚瀹よ STEP 2B锛堥粯璁ゆ敞閲婏級
+-- ---------------------------------------------------------------------------
+UPDATE service_subtask s
+  JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+   SET s.leavehospitaldistrictcode = i.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname = i.leavehospitaldistrictname
+ WHERE s.del_flag = 0 AND s.service_type = '2'
+   AND i.leavehospitaldistrictcode IS NOT NULL AND i.leavehospitaldistrictcode <> ''
+   AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+        OR s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode);
+
+-- ---------------------------------------------------------------------------
+-- STEP 2B锛堝彲閫夛紝**榛樿娉ㄩ噴**锛夛細绉戝涓�璧锋寜鍑洪櫌璁板綍缁熶竴锛堝彟鏈� 12 鏉★級
+--   瀹炴祴锛�2026-10-29锛夛細12 鏉¢噷 10 鏉″凡鍦� bak_service_subtask_ward_20261029 閲岋紝
+--   鍙� 2 鏉★紙瀛愪换鍔� 33755 楗惰彶銆�34120 闆锋槬姊咃級闇�鍏堢敤 2B-1 鍗曠嫭澶囦唤銆�
+--   纭"绉戝涔熶互鍑洪櫌璁板綍涓哄噯"涔嬪悗鍐嶆墦寮�鎵ц銆�
+-- ---------------------------------------------------------------------------
+-- 2B-1 澶囦唤绉戝寰呮敼琛�
+-- CREATE TABLE IF NOT EXISTS bak_service_subtask_dept_20261029 AS
+-- SELECT s.id, s.leaveldeptcode, s.leaveldeptname, s.update_time AS old_update_time
+-- FROM service_subtask s
+-- JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+-- WHERE s.del_flag = 0 AND s.service_type = '2'
+--   AND i.leaveldeptcode IS NOT NULL AND i.leaveldeptcode <> ''
+--   AND (s.leaveldeptcode IS NULL OR s.leaveldeptcode = '' OR s.leaveldeptcode <> i.leaveldeptcode);
+--
+-- 2B-2 鏇存柊绉戝
+-- UPDATE service_subtask s
+--   JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+--    SET s.leaveldeptcode = i.leaveldeptcode,
+--        s.leaveldeptname = i.leaveldeptname
+--  WHERE s.del_flag = 0 AND s.service_type = '2'
+--    AND i.leaveldeptcode IS NOT NULL AND i.leaveldeptcode <> ''
+--    AND (s.leaveldeptcode IS NULL OR s.leaveldeptcode = ''
+--         OR s.leaveldeptcode <> i.leaveldeptcode);
+--
+-- 2B-3 鍥炴粴绉戝锛堝闇�锛�
+-- UPDATE service_subtask s
+--   JOIN bak_service_subtask_dept_20261029 b ON b.id = s.id
+--    SET s.leaveldeptcode = b.leaveldeptcode,
+--        s.leaveldeptname = b.leaveldeptname;
+
+-- ---------------------------------------------------------------------------
+-- STEP 3锛氭牎楠�
+-- ---------------------------------------------------------------------------
+-- 3-A 搴斾负 0
+SELECT '3-A 鍓╀綑涓嶄竴鑷寸殑鐥呭尯' AS step, COUNT(*) AS 浠嶄笉涓�鑷�
+FROM service_subtask s
+JOIN pat_med_inhosp i ON i.inhospid = s.inhospid
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND i.leavehospitaldistrictcode IS NOT NULL AND i.leavehospitaldistrictcode <> ''
+  AND (s.leavehospitaldistrictcode IS NULL OR s.leavehospitaldistrictcode = ''
+       OR s.leavehospitaldistrictcode <> i.leavehospitaldistrictcode);
+
+-- 3-B 楠ㄧ涓績涓�鐥呭尯/绉戝 涓や釜鍙e緞瀵规暟锛堢粺涓�鍚庣梾鍖轰换鍔℃暟搴旂瓑浜庢湰鐥呭尯鍑洪櫌璁板綍鏁帮級
+SELECT '3-B 楠ㄧ涓績涓� 鍙e緞瀵圭収' AS step,
+       (SELECT COUNT(*) FROM (
+          SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.leavehospitaldistrictcode = '40011020'
+            AND b.endtime >= '2026-07-01' AND b.endtime < '2026-10-01'
+          GROUP BY b.inhospid) x) AS 鍑洪櫌璁板綍_鎸夌梾鍖�,
+       (SELECT COUNT(*) FROM service_subtask s WHERE s.del_flag=0 AND s.service_type='2'
+          AND s.leavehospitaldistrictcode = '40011020'
+          AND s.endtime >= '2026-07-01' AND s.endtime < '2026-10-01') AS 闅忚浠诲姟_鎸夌梾鍖�,
+       (SELECT COUNT(*) FROM (
+          SELECT b.inhospid FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+          WHERE a.del_flag='0' AND b.del_flag='0' AND a.idcardno IS NOT NULL AND b.inhospstate='1'
+            AND b.leaveldeptcode = '40011021'
+            AND b.endtime >= '2026-07-01' AND b.endtime < '2026-10-01'
+          GROUP BY b.inhospid) x) AS 鍑洪櫌璁板綍_鎸夌瀹�,
+       (SELECT COUNT(*) FROM service_subtask s WHERE s.del_flag=0 AND s.service_type='2'
+          AND s.leaveldeptcode = '40011021'
+          AND s.endtime >= '2026-07-01' AND s.endtime < '2026-10-01') AS 闅忚浠诲姟_鎸夌瀹�;
+
+-- ---------------------------------------------------------------------------
+-- STEP 4锛氬洖婊氾紙浠呮挙閿�鏈鏀瑰姩锛�
+-- ---------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--   JOIN bak_service_subtask_ward_20261029 b ON b.id = s.id
+--    SET s.leavehospitaldistrictcode = b.leavehospitaldistrictcode,
+--        s.leavehospitaldistrictname = b.leavehospitaldistrictname;
+--
+-- 鍥炴粴鍚庤窇 STEP 0-A锛屽簲鍥炲埌 67 鏉″緟鏀广��
+-- 纭鏃犻渶鍥炴粴鍚庡啀鍒犲浠借〃锛欴ROP TABLE bak_service_subtask_ward_20261029;
diff --git a/sql/fix_service_subtask_campusid_20260924.sql b/sql/fix_service_subtask_campusid_20260924.sql
new file mode 100644
index 0000000..396f92d
--- /dev/null
+++ b/sql/fix_service_subtask_campusid_20260924.sql
@@ -0,0 +1,108 @@
+-- =============================================================================
+-- 鐪佺珛鍚屽痉锛氭弧鎰忓害瀛愪换鍔� campusid 涓虹┖鐨勬暟鎹慨澶嶏紙2026-09-24锛�
+--
+-- 鑳屾櫙锛�/sltdMydTotalByScore锛堟弧鎰忓害缁熻锛夌瓑鎺ュ彛甯� @AddOrgId锛屼細鎸夌櫥褰曠敤鎴风殑
+--      campusid锛坅dmin = 30001002锛夎繃婊� service_subtask锛宑ampusid 涓� NULL 鐨勫瓙浠诲姟
+--      浼氳闈欓粯涓㈡帀锛屽鑷撮〉闈€�屽悇鏈嶅姟椤圭洰婊℃剰搴︾粺璁°�嶅拰 service_subtask_detail 鏄庣粏
+--      瀵逛笉涓婏紙濡傘�屾寕鍙�/灏辫瘖/妫�楠�/妫�鏌ョ瓑鐜妭绛夊�欐椂闂淬�嶉〉闈� 6 椤� vs 鏄庣粏 13 琛岋級銆�
+--
+-- 鐜扮姸锛歰rgid=20001001 涓� service_type IN ('6','14') 鐨勫瓙浠诲姟鍏� 767 鏉★紝
+--      campusid='30001002' 642 鏉°��'30001003' 1 鏉°�丯ULL 124 鏉★紙鏈瑕佽ˉ鐨勫氨鏄繖 124 鏉★級銆�
+--      杩� 124 鏉″垎甯冨湪鍜� 30001002 鐩稿悓鐨勭梾鍖恒�佺浉鍚岀殑鏃堕棿鍖洪棿锛�2025-12-23 ~ 2026-09-12锛夛紝
+--      灞炰簬鍐欏簱鏃舵紡鍐欓櫌鍖猴紝涓嶆槸鍒殑闄㈠尯鐨勬暟鎹紱service_task.campusid 涓�寰嬫槸 '1'锛屼笉鑳戒綔涓洪櫌鍖烘潵婧愩��
+--
+-- 鎵ц椤哄簭锛�1) 鐪嬫竻鍗� 鈫� 2) 澶囦唤 鈫� 3) 鏇存柊 鈫� 4) 鏍¢獙
+-- 娉ㄦ剰锛氱敓浜у簱鎵ц鍓嶅厛澶囦唤锛屼笖璇风‘璁よ繖浜涘瓙浠诲姟纭疄閮藉睘浜� 30001002 闄㈠尯銆�
+-- =============================================================================
+
+-- -----------------------------------------------------------------------------
+-- 1) 寰呰ˉ娓呭崟锛�124 鏉★級锛氱‘璁ょ梾鍖�/绉戝鏄惁閮藉睘浜� 30001002 闄㈠尯
+-- -----------------------------------------------------------------------------
+SELECT s.id,
+       s.taskid,
+       s.service_type,
+       s.sendstate,
+       s.deptcode,
+       s.deptname,
+       s.leavehospitaldistrictcode,
+       s.leavehospitaldistrictname,
+       date_format(s.create_time, '%Y-%m-%d %H:%i:%s') AS create_time,
+       date_format(s.finishtime, '%Y-%m-%d %H:%i:%s')  AS finishtime
+FROM service_subtask s
+WHERE s.del_flag = 0
+  AND s.service_type IN ('6', '14')
+  AND s.campusid IS NULL
+ORDER BY s.leavehospitaldistrictcode, s.id;
+
+-- 鐥呭尯/绉戝缁村害姹囨�伙紙鍒ゆ柇闄㈠尯褰掑睘鐢紱鐥呭尯/绉戝閮戒负绌虹殑 40 鏉ユ潯闇�瑕佷汉宸ョ‘璁わ級
+SELECT s.leavehospitaldistrictcode AS district,
+       s.deptcode,
+       s.service_type,
+       COUNT(*) AS campus_null_cnt
+FROM service_subtask s
+WHERE s.del_flag = 0
+  AND s.service_type IN ('6', '14')
+  AND s.campusid IS NULL
+GROUP BY s.leavehospitaldistrictcode, s.deptcode, s.service_type
+ORDER BY campus_null_cnt DESC;
+
+-- -----------------------------------------------------------------------------
+-- 2) 澶囦唤锛堝彧澶囦唤瑕佹敼鐨勫瓧娈碉級
+-- -----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS bak_service_subtask_campusid_20260924 AS
+SELECT id, campusid, update_time
+FROM service_subtask
+WHERE del_flag = 0
+  AND service_type IN ('6', '14')
+  AND campusid IS NULL;
+
+SELECT COUNT(*) AS backup_rows FROM bak_service_subtask_campusid_20260924;
+
+-- -----------------------------------------------------------------------------
+-- 3) 鏇存柊锛堢‘璁ゆ竻鍗曟棤璇悗鎵ц锛涢鏈熷奖鍝� 124 琛岋級
+-- -----------------------------------------------------------------------------
+UPDATE service_subtask
+SET campusid    = '30001002',
+    update_time = NOW()
+WHERE del_flag = 0
+  AND service_type IN ('6', '14')
+  AND campusid IS NULL;
+
+-- 濡傛灉鐥呭尯/绉戝涓虹┖鐨勯偅浜涜鏃犳硶纭畾闄㈠尯锛屽彧鎯宠ˉ鏈夋槑纭梾鍖虹殑锛岀敤涓嬮潰杩欐潯锛�
+-- UPDATE service_subtask
+-- SET campusid = '30001002', update_time = NOW()
+-- WHERE del_flag = 0 AND service_type IN ('6','14') AND campusid IS NULL
+--   AND leavehospitaldistrictcode IS NOT NULL AND leavehospitaldistrictcode <> '';
+
+-- -----------------------------------------------------------------------------
+-- 4) 鏍¢獙锛氶櫌鍖哄垎甯� + 鍗曡溅鏍稿銆屾寕鍙�/灏辫瘖/妫�楠�/妫�鏌ョ瓑鐜妭绛夊�欐椂闂淬��
+-- -----------------------------------------------------------------------------
+SELECT s.campusid, s.service_type, COUNT(*) AS c
+FROM service_subtask s
+WHERE s.del_flag = 0 AND s.service_type IN ('6', '14')
+GROUP BY s.campusid, s.service_type
+ORDER BY c DESC;
+
+-- 棰勬湡锛堣ˉ榻愬悗锛宎dmin 鐧诲綍椤甸潰锛�= 寰堟弧鎰� 1銆佷笉婊℃剰 3銆佸緢涓嶆弧鎰� 4銆佸緢婊℃剰(闅忚浠诲姟) 涓嶈鍏�
+-- 椤甸潰鍙e緞锛歴endstate=6 + service_type 6/14 + finishtime 鍦ㄦ墍閫夊尯闂� + 鍚屼竴瀛愪换鍔″悓涓�棰樺彧鍙栨渶鏂颁竴鏉� + 鏈綔绛斾笉璁�
+SELECT d.asrtext AS optionresult, COUNT(*) AS page_cnt
+FROM service_subtask_detail d
+INNER JOIN service_subtask s ON s.id = d.sub_id
+WHERE d.questiontext = '鎸傚彿/灏辫瘖/妫�楠�/妫�鏌ョ瓑鐜妭绛夊�欐椂闂�'
+  AND d.del_flag = 0
+  AND s.del_flag = 0
+  AND s.sendstate = 6
+  AND s.service_type IN ('6', '14')
+  AND s.campusid = '30001002'
+  AND date_format(s.finishtime, '%y%m%d') >= '260625'
+  AND date_format(s.finishtime, '%y%m%d') <= '260924'
+  AND d.asrtext IS NOT NULL AND TRIM(d.asrtext) <> ''
+  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')
+GROUP BY d.asrtext
+ORDER BY page_cnt DESC;
+-- 鏀归�犲墠锛氬緢涓嶆弧鎰� 4銆佷笉婊℃剰 1銆佸緢婊℃剰 1锛堥〉闈㈠嵆姝ょ粨鏋滐級
+-- 琛ラ綈鍚庯細寰堜笉婊℃剰 4銆佷笉婊℃剰 4銆佸緢婊℃剰 1  鈫� 9 椤癸紱鏄庣粏琛ㄩ噷鍙﹀ 4 琛屼粛涓嶄細杩涢〉闈紝鍘熷洜瑙佷笅 鈫�
+--   taskid 144(涓�鑸�)   finishtime 2026-06-23锛屾棭浜庨〉闈㈡墍閫夊尯闂� 2026-06-25
+--   taskid 152(寰堜笉婊℃剰) / 156(寰堟弧鎰�)  service_type=2锛堝嚭闄㈤殢璁夸换鍔★級锛屼笉鏄弧鎰忓害
+--   taskid 175(绌�)     鏈綔绛旓紙asrtext 涓虹┖锛夛紝鏃笉绠楅�夐」涔熶笉杩涘垎姣�
diff --git a/sql/fix_service_subtask_campusid_20260928.sql b/sql/fix_service_subtask_campusid_20260928.sql
new file mode 100644
index 0000000..e13b594
--- /dev/null
+++ b/sql/fix_service_subtask_campusid_20260928.sql
@@ -0,0 +1,80 @@
+-- ============================================================================
+-- 鐪佺珛鍚屽痉锛氭弧鎰忓害瀛愪换鍔� campusid 涓虹┖鐨勬暟鎹慨澶嶏紙2026-09-28锛屽凡鎵ц锛�
+--
+-- 銆愮幇璞°��/sltdMydTotalByScore銆�/satisfactionGraph 绛夋帴鍙f煡涓嶅埌鏁版嵁锛屼絾鎵嬪伐鏌ュ簱鏈夋暟鎹��
+--
+-- 銆愭牴鍥犮��
+--   1) 鍐欏簱澶� ServiceSubtaskAnswerServiceImpl 鏋勯�犳弧鎰忓害瀛愪换鍔★紙service_type 6/14锛夋椂
+--      dept/ward/orgid 閮藉啓浜嗭紝鍞嫭婕忓啓 campusid 鈫� 钀藉簱涓� NULL锛�
+--      锛堝悓椤圭洰鍏跺畠鍐欏簱澶勯兘鏈夊啓锛歅atMedInhospServiceImpl:1146 鍙栦綇闄㈣褰曢櫌鍖恒��
+--        PatMedOuthospServiceImpl:486 鍙栦换鍔¢櫌鍖猴紝鏈宸叉寜鍚屾牱鎬濊矾缁欒澶勮ˉ涓婏級
+--   2) 杩欎簺缁熻鎺ュ彛甯� @AddOrgId(campusField="campusid")锛孲etOrgIdAspect 浼氭妸鐧诲綍鐢ㄦ埛鐨勯櫌鍖�
+--      娉ㄥ叆鏌ヨ鏉′欢锛汼erviceSubtaskMapper.selectServiceSubtaskList 閲屾槸
+--      `and campusid = #{campusid}`锛孨ULL 涓嶅尮閰嶄换浣曞�� 鈫� 杩欎簺瀛愪换鍔¤闈欓粯涓㈡帀锛�
+--      浼犵粰鏄庣粏缁熻锛坰tatQuestionOptionBySubtaskIds锛夌殑瀛愪换鍔� id 閲屾病鏈夊畠浠� 鈫� 椤甸潰绌恒��
+--
+-- 銆愪慨澶嶅墠瀹炴祴銆憇ervice_type IN ('6','14') 涓� campusid IS NULL 鍏� 122 琛岋細
+--   - 58 琛屾偅鑰呮。妗� pat_archive.campusid 鏈夊�硷紙57 琛� 30001002銆�1 琛� 30001004锛�
+--   - 64 琛屾偅鑰呮。妗堥櫌鍖轰篃涓虹┖锛堝叾涓鏁扮梾鍖�/绉戝涓� "1"/"2" 鎴栫┖锛屽睘鎶曡瘔寤鸿娴佺▼鍐欏簱鏃跺瓧娈电己澶憋級
+--   - pat_med_inhosp.campusid 鍦ㄨ繖 122 琛屼笂鍏ㄤ负绌猴紝涓嶈兘浣滀负闄㈠尯鏉ユ簮
+--
+-- 銆愭墽琛岀粨鏋滐紙2026-09-28锛夈��
+--   澶囦唤琛� bak_service_subtask_campusid_20260928 = 122 琛�
+--   A) 鎸夋偅鑰呮。妗堥櫌鍖鸿ˉ锛�58 琛�
+--   B) 妗f涔熶负绌虹殑鎸夊師 20260924 鑴氭湰缁撹鍏滃簳 30001002锛�64 琛�
+--   鏍¢獙锛歴ervice_type IN ('6','14') 宸叉棤 campusid 涓� NULL 鐨勮
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆戝浠斤紙宸叉墽琛岋紝浠呭浠借鏀瑰瓧娈碉紝鐢ㄤ簬鍥炴粴锛�
+-- ----------------------------------------------------------------------------
+-- CREATE TABLE IF NOT EXISTS bak_service_subtask_campusid_20260928 AS
+-- SELECT id, campusid, update_time FROM service_subtask
+-- WHERE del_flag = 0 AND service_type IN ('6','14') AND campusid IS NULL;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆戞洿鏂帮紙宸叉墽琛岋級
+-- ----------------------------------------------------------------------------
+-- A) 鎮h�呮。妗堥噷鏈夐櫌鍖虹殑锛屾寜鎮h�呭綊灞為櫌鍖鸿ˉ锛�58 琛岋級
+-- UPDATE service_subtask s
+--     JOIN pat_archive a ON a.id = s.patid
+-- SET s.campusid = a.campusid, s.update_time = NOW()
+-- WHERE s.del_flag = 0 AND s.service_type IN ('6','14')
+--   AND s.campusid IS NULL AND a.campusid IS NOT NULL AND a.campusid <> '';
+
+-- B) 鎮h�呮。妗堜篃娌℃湁闄㈠尯鐨勶紝鍏滃簳 30001002锛�64 琛岋紱涓庡師 fix_service_subtask_campusid_20260924.sql 缁撹涓�鑷达級
+-- UPDATE service_subtask SET campusid = '30001002', update_time = NOW()
+-- WHERE del_flag = 0 AND service_type IN ('6','14') AND campusid IS NULL;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戞牎楠�
+-- ----------------------------------------------------------------------------
+SELECT IFNULL(campusid,'(浠嶄负绌�)') AS campusid, service_type, COUNT(*) AS cnt
+FROM service_subtask
+WHERE del_flag = 0 AND service_type IN ('6','14')
+GROUP BY campusid, service_type
+ORDER BY cnt DESC;
+-- 鎵ц鍚庨鏈燂細30001002/6=709銆�30001002/14=56銆�30001004/14=1銆�30001003/14=1锛屾棤 NULL
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戝洖婊氾紙濡傞渶鎾ら攢锛屽厛鍥炴粴瀛楁鍊硷紝鍐嶅垹澶囦唤琛紱浠呮仮澶嶈鏈鏀瑰姩鐨� 122 琛岋級
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask s
+--     JOIN bak_service_subtask_campusid_20260928 b ON b.id = s.id
+-- SET s.campusid = b.campusid, s.update_time = b.update_time;
+-- DROP TABLE bak_service_subtask_campusid_20260928;
+
+
+-- ============================================================================
+-- 銆愰噸瑕佹彁閱掋��
+-- 1) 鍙ˉ鏁版嵁涓嶅锛氬啓搴撳宸插悓姝ヤ慨锛圫erviceSubtaskAnswerServiceImpl 琛� setCampusid锛夛紝
+--    璇ユ敼鍔ㄩ渶瑕侀噸鏂板彂甯冨悗绔墠鐢熸晥锛屽惁鍒欐柊浜х敓鐨勬弧鎰忓害瀛愪换鍔¤繕浼氭槸 NULL銆�
+-- 2) 閭� 1 琛屾寜鎮h�呮。妗堣ˉ鎴愪簡 30001004锛堜笉鏄� 30001002锛夛紝濡傜‘璁よ鐥呭尯瀹為檯灞炴湰閮紝
+--    鍙崟鐙敼鍥烇細SELECT * FROM bak_service_subtask_campusid_20260928 WHERE id = ?;
+-- 3) 鐥呭尯/绉戝涓虹┖銆佹。妗堜篃鏃犻櫌鍖虹殑琛屼竴寰嬫寜 30001002 鍏滃簳锛涜嫢鍚庣画瑕佸仛澶氶櫌鍖哄彛寰勶紝
+--    寤鸿鎶� leavehospitaldistrictcode/deptcode 涔熶竴璧锋不鐞嗐��
+-- ============================================================================
diff --git a/sql/index_service_subtask_detail_unique_20261021.sql b/sql/index_service_subtask_detail_unique_20261021.sql
new file mode 100644
index 0000000..1edcd0e
--- /dev/null
+++ b/sql/index_service_subtask_detail_unique_20261021.sql
@@ -0,0 +1,124 @@
+-- ============================================================================
+-- (sub_id, scriptid) 鍘婚噸 + 鍞竴绱㈠紩 鈥斺�� 鏍规不"鍚屼竴鎮h�呭悓涓�棰樺爢鍑哄浠介噸澶嶆槑缁�"
+--                                    鍗楀崕闄勪竴锛坣hfy锛�2026-10-21
+--
+-- 銆愪负浠�涔堣鍋氥��
+--   淇濆瓨绛旀/琛ラ粯璁ゅ�肩殑 upsert 璧� isExistServiceSubtaskDetail锛屽巻鍙蹭笂鍙湅 del_flag=0锛�
+--   鏄庣粏涓�鏃﹁閫昏緫鍒犻櫎灏辨煡涓嶅埌 鈫� 涓嬩竴娆′繚瀛樺繀鐒� INSERT锛屽壇鏈秺绉秺澶�
+--   锛�2026-09-08 閭� 10 浣嶆偅鑰呭悇鍫嗕簡 2~6 浠斤紝绛旀瀹屽叏鐩稿悓锛夈��
+--   浠g爜渚у凡鏀逛负銆屽拷鐣ュ垹闄ゆ爣璁板彇鏈�鏂颁竴琛� + 鏇存柊鍚� reviveServiceSubtaskDetail 澶嶆椿銆嶏紝
+--   鏈剼鏈啀浠庢暟鎹簱灞傚姞涓�閬撳敮涓�绾︽潫鍏滃簳銆�
+--
+-- 銆愮幇鐘讹紙2026-10-21 瀹炴祴 smartor_nhfy锛夈��
+--   鏄庣粏鎬绘暟 346,628锛泂ub_id / scriptid 鍧囨棤 NULL
+--   閲嶅缁勶紙鍚� sub_id+scriptid 澶氫簬 1 琛岋級锛�5,389 缁勶紝娑夊強 12,680 琛�
+--   鑻�"姣忕粍鍙暀 1 琛�"锛岄渶瑕佺墿鐞嗗垹闄� 7,291 琛岋紙缁濆ぇ澶氭暟鏄� del_flag=1 鐨勫巻鍙插壇鏈級
+--
+-- 銆愭墽琛岄『搴忋�戝缓璁綆宄版湡锛屾寜 0 鈫� 4 椤哄簭鎵ц锛涚 3 姝ユ槸鐗╃悊鍒犻櫎锛屽姟蹇呭厛璺戠 2 姝ュ浠�
+-- 銆愬洖婊氥�戠 5 姝ワ紱鍒犳帀鐨勮璧� bak_ssd_dup_20261021 杩樺師
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�0銆戣瘎浼帮紙鍙锛岄殢鏃跺彲璺戯級
+-- ----------------------------------------------------------------------------
+SELECT COUNT(*)                                   AS dup_groups,
+       SUM(rows_cnt)                              AS rows_in_dup_groups,
+       SUM(rows_cnt - 1)                          AS rows_to_delete_if_keep_one
+FROM (SELECT sub_id, scriptid, COUNT(*) AS rows_cnt
+      FROM service_subtask_detail
+      WHERE sub_id IS NOT NULL AND scriptid IS NOT NULL
+      GROUP BY sub_id, scriptid
+      HAVING COUNT(*) > 1) x;
+
+-- 閲嶅鏈�澶氱殑 10 缁勶紝鐪嬬湅鏄笉鏄兘闀夸竴涓牱
+SELECT sub_id, scriptid, COUNT(*) AS rows_cnt,
+       SUM(del_flag = 0) AS live_cnt,
+       COUNT(DISTINCT COALESCE(asrtext, '')) AS distinct_answers
+FROM service_subtask_detail
+GROUP BY sub_id, scriptid
+HAVING COUNT(*) > 1
+ORDER BY rows_cnt DESC
+LIMIT 10;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆戝浠�"灏嗚鍒犻櫎"鐨勮锛堢害 7,291 琛岋級
+--      淇濈暀瑙勫垯锛氬悓涓� (sub_id, scriptid) 淇濈暀 1 琛� 鈥斺�� 浼樺厛 del_flag=0锛屽叾娆� id 鏈�澶�
+-- ----------------------------------------------------------------------------
+-- DROP TABLE IF EXISTS bak_ssd_dup_20261021;
+-- CREATE TABLE bak_ssd_dup_20261021 AS
+-- SELECT d.*
+-- FROM service_subtask_detail d
+-- JOIN (SELECT sub_id, scriptid,
+--              SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (del_flag = 0) DESC, id DESC), ',', 1) AS keep_id
+--       FROM service_subtask_detail
+--       WHERE sub_id IS NOT NULL AND scriptid IS NOT NULL
+--       GROUP BY sub_id, scriptid
+--       HAVING COUNT(*) > 1) k
+--   ON k.sub_id = d.sub_id AND k.scriptid = d.scriptid
+-- WHERE d.id <> k.keep_id;
+-- SELECT COUNT(*) FROM bak_ssd_dup_20261021;   -- 棰勬湡 鈮� 7291
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆戝浠借嚜妫�锛堢‘璁ゅ浠借〃閲屾病鏈�"姣忕粍閮藉簲璇ヤ繚鐣欑殑閭d竴琛�"锛�
+-- ----------------------------------------------------------------------------
+-- SELECT COUNT(*) AS wrong_rows
+-- FROM bak_ssd_dup_20261021 b
+-- JOIN (SELECT sub_id, scriptid,
+--              SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (del_flag = 0) DESC, id DESC), ',', 1) AS keep_id
+--       FROM service_subtask_detail
+--       GROUP BY sub_id, scriptid) k
+--   ON k.sub_id = b.sub_id AND k.scriptid = b.scriptid
+-- WHERE b.id = k.keep_id;   -- 棰勬湡 0
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戠墿鐞嗗垹闄ら噸澶嶈锛堟瘡缁勪繚鐣� 1 琛岋級
+-- ----------------------------------------------------------------------------
+-- DELETE d
+-- FROM service_subtask_detail d
+-- JOIN (SELECT sub_id, scriptid,
+--              SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (del_flag = 0) DESC, id DESC), ',', 1) AS keep_id
+--       FROM service_subtask_detail
+--       WHERE sub_id IS NOT NULL AND scriptid IS NOT NULL
+--       GROUP BY sub_id, scriptid
+--       HAVING COUNT(*) > 1) k
+--   ON k.sub_id = d.sub_id AND k.scriptid = d.scriptid
+-- WHERE d.id <> k.keep_id;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戝姞鍞竴绱㈠紩
+--      鈿狅笍 鍓嶆彁锛氱 3 姝ュ凡璺戣繃锛堝惁鍒欏繀鐒� ORA/1062 澶辫触锛�
+--      鈿狅笍 346k 琛岀殑 ADD UNIQUE 浼氱煭鏃堕攣琛紝寤鸿浣庡嘲鎵ц锛�
+--         濡傛灉鐢熶骇鐗堟湰 MySQL 鏀寔 online DDL锛屽彲鐢� ALGORITHM=INPLACE, LOCK=NONE
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE service_subtask_detail
+--     ADD UNIQUE KEY uk_ssd_sub_script (sub_id, scriptid),
+--     ALGORITHM = INPLACE, LOCK = NONE;
+
+-- 鏍¢獙
+-- SHOW INDEX FROM service_subtask_detail WHERE Key_name = 'uk_ssd_sub_script';
+-- SELECT COUNT(*) AS dup_groups_should_be_0 FROM (
+--   SELECT sub_id, scriptid FROM service_subtask_detail
+--   GROUP BY sub_id, scriptid HAVING COUNT(*) > 1) x;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�5銆戝洖婊�
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE service_subtask_detail DROP INDEX uk_ssd_sub_script;
+-- INSERT INTO service_subtask_detail SELECT * FROM bak_ssd_dup_20261021;
+-- DROP TABLE bak_ssd_dup_20261021;
+
+
+-- ============================================================================
+-- 銆愬姞绱㈠紩涔嬪悗蹇呴』娉ㄦ剰銆�
+--   鍞竴绱㈠紩鐢熸晥鍚庯紝骞跺彂淇濆瓨鍚屼竴 (sub_id, scriptid) 鏃�"鍚庡埌鐨勯偅涓�鏉� INSERT"浼氭姏
+--   DuplicateKeyException銆備唬鐮佷晶宸茬粡鍋氫簡涓や欢浜嬮檷浣庨闄╋細
+--     鈶� isExistServiceSubtaskDetail 鏀逛负"蹇界暐 del_flag 鍙栨渶鏂颁竴琛�"鈫� 姝e父淇濆瓨璧� UPDATE锛屼笉浼� INSERT锛�
+--     鈶� /smartor/subtaskAnswer/saveQuestionAnswer 鍔犱簡 Redis 骞傜瓑鍗犱綅锛�60 绉掞紝鍚屼竴 pid+tid+subid 鍙鐞嗕竴娆★級銆�
+--   浣嗗鏋滃皢鏉ヨ繕鏈夊埆鐨勫啓鍏ヨ矾寰勭洿鎺� INSERT 鏄庣粏锛屽缓璁湪鎻掑叆澶� catch DuplicateKeyException 鍚庤浆 UPDATE銆�
+-- ============================================================================
diff --git a/sql/ivr_assort_columns_20260928.sql b/sql/ivr_assort_columns_20260928.sql
new file mode 100644
index 0000000..0489a10
--- /dev/null
+++ b/sql/ivr_assort_columns_20260928.sql
@@ -0,0 +1,148 @@
+-- ============================================================================
+-- smartor_sltd 鏁版嵁搴擄細璇煶闂鐩稿叧琛ㄧ殑鍒楀悕瀵归綈 / 鏂板鍒楄剼鏈�
+-- 鐢熸垚鏃ユ湡: 20260928
+-- 鐩爣搴�  : smartor_sltd锛坮uoyi-admin/src/main/resources/application-druid.yml锛宲rofile=druid锛�
+-- 鐩殑    : 璁� ivr_liba_template_script / ivr_task_template_script 鐨勫垪鍚嶄笌
+--           IvrLibaTemplateScriptMapper.xml / IvrTaskTemplateScriptMapper.xml 涓�鑷�
+--           锛堣繖涓や釜 mapper 閲屾煡鐨勬槸 script_assortname銆乻cript_assortid锛�
+--
+-- 銆愭墽琛屽墠瀹炴祴鐜扮姸锛�20260928锛宻martor_sltd锛夈��
+--   ivr_liba_script_assort   : 35 琛�
+--       index_assort_name varchar(255) NOT NULL  娉ㄩ噴鈥滄寚鏍囧垎绫诲悕绉扳��
+--       type              varchar(255) NULL      鈫� 璇ュ垪銆愬凡瀛樺湪銆戯紝35 琛屽叏涓� NULL锛屾棤娉ㄩ噴
+--   ivr_liba_template_script : 121 琛岋紙del_flag=0 鐨� 54 琛岋級
+--       categoryName varchar(50) NULL  娉ㄩ噴鈥滅被鍒悕鈥濓紝121 琛屽叏涓� NULL
+--       娌℃湁 assortid 鍒楋紝涔熸病鏈� script_assortid 鍒�
+--   ivr_task_template_script : 1221 琛�
+--       categoryName varchar(50) NULL  娉ㄩ噴鈥滅被鍒悕鈥濓紝浠� 26 琛岄潪绌�
+--       娌℃湁 assortid 鍒楋紝涔熸病鏈� script_assortid 鍒�
+--
+--   鈬� 绗� 3 椤癸紙assortid 鈫� script_assortid锛夊湪杩欎袱涓〃閲岄兘涓嶆槸鈥滄敼鍚嶁�濓紝
+--     涓や釜琛ㄦ牴鏈病鏈� assortid 鍒楋紝鍙兘鈥滄柊澧炲垪 + 鍥炲~鈥濄��
+--   鈬� 鍥炲~鏉ユ簮鐢ㄧ埗妯℃澘鐨� assortid锛�
+--        ivr_liba_template_script.templateid 鈫� ivr_liba_template.id.assortid        锛�121/121 琛屽彲鍥炲~锛�
+--        ivr_task_template_script.templateID 鈫� ivr_task_template.id.assortid        锛�358/1221 琛屽彲鍥炲~锛�
+--          鍙� 825 琛� templateID 鍦� ivr_task_template 涓笉瀛樺湪銆�38 琛� templateID 涓� NULL锛屼繚鎸� NULL锛�
+--   鈬� 渚濊禆妫�鏌ワ細鏈簱娌℃湁寮曠敤杩欎袱寮犺〃鐨勫瓨鍌ㄨ繃绋� / 瑙嗗浘 / 瑙﹀彂鍣紙宸叉煡
+--      information_schema.ROUTINES / VIEWS / TRIGGERS锛屽潎涓� 0 鏉★級锛屾敼鍒楀悕涓嶅奖鍝� DB 渚у璞°��
+--   鈬� 浠g爜渚у奖鍝嶏細IvrLibaTemplateScriptMapper銆両vrTaskTemplateScriptMapper 鏈潵灏卞湪鐢�
+--      script_assortname / script_assortid锛屾敼瀹屽悗杩欎袱涓� mapper 鎵嶇湡姝h兘鏌ラ�氾紱
+--      涓や釜 mapper 閮芥病鏈夊紩鐢� categoryName锛屾墍浠ユ敼鍚嶄笉浼氬奖鍝嶇幇鏈夊姛鑳姐��
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�0銆戞墽琛屽墠妫�鏌ワ紙纭涓庝笂闈㈢殑瀹炴祴涓�鑷达紝姝e父搴旂湅鍒� categoryName銆佷笖娌℃湁 assort 鍒楋級
+-- ----------------------------------------------------------------------------
+-- SHOW COLUMNS FROM ivr_liba_template_script LIKE '%assort%';
+-- SHOW COLUMNS FROM ivr_liba_template_script LIKE 'categoryName';
+-- SHOW COLUMNS FROM ivr_task_template_script LIKE 'categoryName';
+-- SHOW COLUMNS FROM ivr_liba_script_assort LIKE 'type';
+-- SELECT COUNT(*) FROM ivr_liba_template_script;      -- 121
+-- SELECT COUNT(*) FROM ivr_task_template_script;      -- 1221
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆慶ategoryName 鈫� script_assortname锛堜袱寮犺〃锛屼繚鐣欏師绫诲瀷 varchar(50) NULL 鍜屽師娉ㄩ噴鈥滅被鍒悕鈥濓級
+--      121 / 1221 琛岀殑灏忚〃锛岀绾у畬鎴愶紱CHANGE COLUMN 鍙敼鍚嶅彲璧� INPLACE锛屼笉闃诲璇诲啓銆�
+-- ----------------------------------------------------------------------------
+ALTER TABLE ivr_liba_template_script
+    CHANGE COLUMN categoryName script_assortname varchar(50) NULL COMMENT '绫诲埆鍚�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+ALTER TABLE ivr_task_template_script
+    CHANGE COLUMN categoryName script_assortname varchar(50) NULL COMMENT '绫诲埆鍚�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆慽vr_liba_script_assort.type
+--      璇ュ垪鏈潵灏辨湁锛坴archar(255)锛屾棤娉ㄩ噴锛�35 琛屽叏 NULL锛夛紝杩欓噷鍙寜闇�姹傝ˉ娉ㄩ噴骞舵妸闀垮害鏀规垚 100銆�
+--      娉ㄦ剰锛歷archar(255) 鈫� varchar(100) 灞炰簬绫诲瀷鏀剁獎锛岄渶瑕侀噸寤鸿〃锛屼笉鑳界敤 INPLACE/LOCK=NONE锛�
+--      鏈〃鍙湁 35 琛岋紝鐩存帴鎵ц鍗冲彲锛堣嫢涓嶆兂鍔ㄩ暱搴︼紝鍙墽琛屽甫 COMMENT 鐨� MODIFY 涔熶竴鏍烽渶瑕侀噸寤猴紝
+--      鍥犱负鏀规敞閲婃湰韬氨鏄� COPY锛夈�傝嫢鍙兂鍔犳敞閲娿�佷笉鏀归暱搴︼紝鎶� varchar(100) 鎹㈡垚 varchar(255)銆�
+-- ----------------------------------------------------------------------------
+ALTER TABLE ivr_liba_script_assort
+    MODIFY COLUMN type varchar(100) NULL COMMENT '闂绫诲瀷锛堜緥濡�,闂ㄨ瘖婊℃剰搴︼細mzmyd     浣忛櫌婊℃剰搴︼細zymyd  ...锛�';
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戞柊澧� script_assortid 鍒� + 鐢ㄧ埗妯℃澘鐨� assortid 鍥炲~
+--      澶囨敞閲屽師鏈啓鐨勨�渋vr_liba_script_ssort鈥濆簲涓衡�渋vr_liba_script_assort鈥濓紝涓嬮潰鎸夋纭〃鍚嶅啓銆�
+-- ----------------------------------------------------------------------------
+ALTER TABLE ivr_liba_template_script
+    ADD COLUMN script_assortid int(11) NULL COMMENT '璇煶闂绫诲埆ID锛堝搴旂殑鏄痠vr_liba_script_assort锛�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+ALTER TABLE ivr_task_template_script
+    ADD COLUMN script_assortid int(11) NULL COMMENT '璇煶闂绫诲埆ID锛堝搴旂殑鏄痠vr_liba_script_assort锛�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+-- 鍥炲~锛�121/121 琛�
+UPDATE ivr_liba_template_script s
+    JOIN ivr_liba_template t ON t.id = s.templateid
+SET s.script_assortid = t.assortid;
+
+-- 鍥炲~锛�358/1221 琛岋紙鍏朵綑涓哄鍎挎暟鎹紝淇濇寔 NULL锛�
+UPDATE ivr_task_template_script s
+    JOIN ivr_task_template t ON t.id = s.templateID
+SET s.script_assortid = t.assortid;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戝彲閫夛細鎶� script_assortname 涔熻ˉ涓婏紙褰撳墠涓よ〃鐨� categoryName 鍩烘湰鍏ㄦ槸 NULL锛�
+--      鏀瑰悕鍚� script_assortname 浠嶆槸 NULL锛岃�� satisfactionGraph 鐨勮闊冲垎鏀槸鎸�
+--      script_assortname 鍒嗙粍鐨勶紝涓嶈ˉ鐨勮瘽璇煶鍒嗙被浠嶇劧鍑轰笉鏉ワ級
+--      鏁版嵁婧愶細鐖舵ā鏉� assortid 鈫� ivr_liba_script_assort.index_assort_name
+--      纭瑕佽ˉ鍐嶆墽琛岃繖娈碉紱涓嶉渶瑕佸氨璺宠繃銆�
+-- ----------------------------------------------------------------------------
+-- UPDATE ivr_liba_template_script s
+--     JOIN ivr_liba_template t ON t.id = s.templateid
+--     JOIN ivr_liba_script_assort a ON a.id = t.assortid
+-- SET s.script_assortname = a.index_assort_name
+-- WHERE s.script_assortname IS NULL OR s.script_assortname = '';
+--
+-- UPDATE ivr_task_template_script s
+--     JOIN ivr_task_template t ON t.id = s.templateID
+--     JOIN ivr_liba_script_assort a ON a.id = t.assortid
+-- SET s.script_assortname = a.index_assort_name
+-- WHERE s.script_assortname IS NULL OR s.script_assortname = '';
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�5銆戝彲閫夛細缁� ivr_liba_script_assort.type 濉�硷紙褰撳墠 35 琛屽叏 NULL锛�
+--      鑰屼唬鐮侀噷 mydIdList 鏄寜 type 鍚� "myd" 杩囨护鐨勶紝涓嶅~鍊艰闊冲垎鏀氨姘歌繙鏄� 0 涓垎绫伙級
+--      濉�煎彛寰勯渶瑕佷笟鍔$‘璁わ紝涓嬮潰鍙槸鎸夌幇鏈夊垎绫诲悕缁欑殑绀轰緥锛岀‘璁ゅ悗鍐嶆墽琛岋細
+--        婊℃剰搴︾浉鍏筹紙濡� id=12 婊℃剰搴﹁皟鏌ャ�乮d=9 鏈嶅姟璇勪环锛夆啋 mzmyd / zymyd
+--        鍏朵綑鍒嗙被                                            鈫� 鐣欑┖鎴栨寜涓氬姟鑷畾涔�
+--      锛堟湰搴� ivr_liba_script_assort 閲岀殑鍒嗙被鍚嶏細鏈垎绫�/鎮h�呬俊鎭�/浣撳緛/鐤剧梾/鐥囩姸/鐢熸椿鏂瑰紡/
+--        鐢ㄨ嵂渚濅粠鎬�/涓嶈壇鍙嶅簲/閫氱煡鎻愰啋/鏈嶅姟璇勪环/妫�鏌ョ被/妫�楠岀被/婊℃剰搴﹁皟鏌�/鑶抽绫�/杩愬姩绫�/鐫$湢绫�/
+--        鎶界儫鍠濋厭/韬珮/浣撻噸/瑙嗗姏/鍚姏/鎰忚寤鸿/妫�楠屾鏌ョ被/闅忚鎸囨爣/韬唤纭/澶嶈瘖閫氱煡/澶嶆煡閫氱煡/
+--        鏄惁鏂逛究/鍑洪櫌瀹f暀/淇吇鍦�/璇煶棰樼洰/璇煶棰樼洰娴嬭瘯 鈥︼級
+-- ----------------------------------------------------------------------------
+-- UPDATE ivr_liba_script_assort SET type = 'zymyd' WHERE id = 12;   -- 渚嬶細婊℃剰搴﹁皟鏌�
+-- UPDATE ivr_liba_script_assort SET type = 'mzmyd' WHERE id = 9;    -- 渚嬶細鏈嶅姟璇勪环
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�6銆戦獙璇�
+-- ----------------------------------------------------------------------------
+-- SHOW COLUMNS FROM ivr_liba_template_script LIKE '%assort%';
+-- SHOW COLUMNS FROM ivr_task_template_script LIKE '%assort%';
+-- SHOW COLUMNS FROM ivr_liba_script_assort LIKE 'type';
+-- SELECT COUNT(*) AS liba_script_rows, SUM(script_assortid IS NULL) AS assortid_null FROM ivr_liba_template_script;      -- 鏈熸湜 121 / 0
+-- SELECT COUNT(*) AS task_script_rows, SUM(script_assortid IS NULL) AS assortid_null FROM ivr_task_template_script;      -- 鏈熸湜 1221 / 863
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�7銆戝洖婊�
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE ivr_liba_template_script CHANGE COLUMN script_assortname categoryName varchar(50) NULL COMMENT '绫诲埆鍚�';
+-- ALTER TABLE ivr_task_template_script CHANGE COLUMN script_assortname categoryName varchar(50) NULL COMMENT '绫诲埆鍚�';
+-- ALTER TABLE ivr_liba_template_script DROP COLUMN script_assortid;
+-- ALTER TABLE ivr_task_template_script DROP COLUMN script_assortid;
+-- ALTER TABLE ivr_liba_script_assort MODIFY COLUMN type varchar(255) NULL COMMENT '';
diff --git a/sql/ivr_script_missing_columns_20260928.sql b/sql/ivr_script_missing_columns_20260928.sql
new file mode 100644
index 0000000..16a93a0
--- /dev/null
+++ b/sql/ivr_script_missing_columns_20260928.sql
@@ -0,0 +1,88 @@
+-- ============================================================================
+-- smartor_sltd 鏁版嵁搴擄細ivr 璇煶闂涓ゅ紶琛ㄨˉ榻� mapper 闇�瑕佺殑 6 涓垪锛堢浜屾壒锛�
+-- 鐢熸垚鏃ユ湡: 20260928
+--
+-- 銆愪负浠�涔堥渶瑕併��
+--   20260928 绗竴鎵瑰凡鎶� categoryName 鈫� script_assortname銆佸苟鏂板 script_assortid锛�
+--   浣� IvrLibaTemplateScriptMapper / IvrTaskTemplateScriptMapper 鐨� select / insert / update
+--   璇彞閲岃繕寮曠敤浜嗕笅闈� 6 涓垪锛岃�� ivr_liba_template_script銆乮vr_task_template_script 涓や釜琛�
+--   鍦ㄦ湰搴撲腑閮戒笉瀛樺湪杩欎簺鍒楋紙svy_lib_template_script 閲屾槸鏈夌殑锛屽畾涔夌収鎶勫嵆鍙級锛�
+--       dimension          varchar(50)  闂缁村害
+--       is_myd_exception   varchar(50)  婊℃剰搴︽剰瑙佸紓甯革紙鍙拡瀵规枃鏈級
+--       duty_dept_name     text         璐d换绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�
+--       duty_dept_code     text         璐d换绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�
+--       report_dept_name   text         鎶ュ绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�
+--       report_dept_code   text         鎶ュ绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�
+--   鈬� 涓嶈ˉ鐨勮瘽锛宻atisfactionGraph 鐨勮闊冲垎鏀紙type=1 鎴� type=null锛夋墽琛�
+--      IvrLibaTemplateScriptMapper.queryLibTemplateIds 鏃朵粛浼氭姏
+--      Unknown column 'is_myd_exception' in 'field list'銆�
+--      锛堢涓�鎵逛箣鍓嶆姤鐨勬槸 script_assortname锛岄偅涓や釜鍒楀凡缁忚ˉ濂姐�傦級
+--
+-- 銆愭牎楠屾柟寮忋��
+--   宸茬敤鑴氭湰閫愬垪姣斿锛氫袱寮犺〃鐨� mapper 璇彞锛坰elect 鐗囨 55 鍒� + insert/update 54 鍒楋級
+--   涓庢湰搴撳疄闄呭垪鍋氬樊闆嗭紝缂哄け鐨勫氨鏄笂闈㈣繖 6 涓紝鍒棤鍏跺畠銆�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�0銆戞墽琛屽墠妫�鏌ワ紙搴旂‘璁よ繖 6 鍒椾笉瀛樺湪锛�
+-- ----------------------------------------------------------------------------
+-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
+--  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ivr_liba_template_script'
+--    AND COLUMN_NAME IN ('dimension','is_myd_exception','duty_dept_name','duty_dept_code','report_dept_name','report_dept_code');
+-- SELECT COLUMN_NAME FROM information_schema.COLUMNS
+--  WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ivr_task_template_script'
+--    AND COLUMN_NAME IN ('dimension','is_myd_exception','duty_dept_name','duty_dept_code','report_dept_name','report_dept_code');
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆慽vr_liba_template_script 琛� 6 鍒楋紙121 琛岋紝INPLACE 涓嶉樆濉炶鍐欙級
+-- ----------------------------------------------------------------------------
+ALTER TABLE ivr_liba_template_script
+    ADD COLUMN dimension varchar(50) NULL COMMENT '闂缁村害',
+    ADD COLUMN is_myd_exception varchar(50) NULL COMMENT '婊℃剰搴︽剰瑙佸紓甯革紙鍙拡瀵规枃鏈級',
+    ADD COLUMN duty_dept_name text NULL COMMENT '璐d换绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN duty_dept_code text NULL COMMENT '璐d换绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN report_dept_name text NULL COMMENT '鎶ュ绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN report_dept_code text NULL COMMENT '鎶ュ绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆慽vr_task_template_script 琛� 6 鍒楋紙1221 琛岋級
+-- ----------------------------------------------------------------------------
+ALTER TABLE ivr_task_template_script
+    ADD COLUMN dimension varchar(50) NULL COMMENT '闂缁村害',
+    ADD COLUMN is_myd_exception varchar(50) NULL COMMENT '婊℃剰搴︽剰瑙佸紓甯革紙鍙拡瀵规枃鏈級',
+    ADD COLUMN duty_dept_name text NULL COMMENT '璐d换绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN duty_dept_code text NULL COMMENT '璐d换绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN report_dept_name text NULL COMMENT '鎶ュ绉戝鍚嶇О锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ADD COLUMN report_dept_code text NULL COMMENT '鎶ュ绉戝缂栫爜锛堝鏋滃涓瀹ょ敤閫楀彿鍒嗗壊锛�',
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戦獙璇侊細杩欎袱鏉� mapper 鐨� select 鐗囨搴旇兘姝e父杩斿洖
+--   绛変环 SQL锛圡yBatis 閲屽氨鏄繖娈碉級锛�
+--     select id, scriptno, is_myd_exception, ..., script_assortname, ..., script_assortid, ...
+--       from ivr_liba_template_script where del_flag=0
+-- ----------------------------------------------------------------------------
+-- SELECT COUNT(*) FROM (
+--   SELECT id, scriptno, is_myd_exception, dimension, script_assortname, script_assortid,
+--          duty_dept_name, duty_dept_code, report_dept_name, report_dept_code,
+--          duty_dept_person_name, duty_dept_person_code, report_dept_person_code, report_dept_person_name,
+--          circulation_dept_person_code, circulation_dept_person_name
+--   FROM ivr_liba_template_script WHERE del_flag = 0) t;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戝洖婊�
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE ivr_liba_template_script
+--     DROP COLUMN dimension, DROP COLUMN is_myd_exception, DROP COLUMN duty_dept_name,
+--     DROP COLUMN duty_dept_code, DROP COLUMN report_dept_name, DROP COLUMN report_dept_code;
+-- ALTER TABLE ivr_task_template_script
+--     DROP COLUMN dimension, DROP COLUMN is_myd_exception, DROP COLUMN duty_dept_name,
+--     DROP COLUMN duty_dept_code, DROP COLUMN report_dept_name, DROP COLUMN report_dept_code;
diff --git a/sql/pat_med_outhosp_serialnum_index.sql b/sql/pat_med_outhosp_serialnum_index.sql
new file mode 100644
index 0000000..b22e9b5
--- /dev/null
+++ b/sql/pat_med_outhosp_serialnum_index.sql
@@ -0,0 +1,184 @@
+-- ============================================================================
+-- pat_med_outhosp 绯诲垪琛ㄦ寜 serialnum 鍔犵储寮曪紙閰嶅悎闂ㄦ�ヨ瘖鎸夊ぉ鍏ㄩ噺閲囬泦锛�
+--
+-- 涓轰粈涔堣鍔狅細
+--   1) 閲囬泦浠诲姟姣忎釜鍗婂皬鏃舵妸褰撳ぉ涓婁竾涓瘖鐤楄褰曟暣杞媺涓�閬嶏紝闈�"鏁撮〉鎵归噺鏌ラ噸"杩囨护宸插叆搴撶殑锛�
+--      鏌ラ噸 SQL 鏄� where serialnum in (500涓�)銆傛病鏈夌储寮曞氨鏄叏琛ㄦ壂鎻忥紝瀛e害鍒嗚〃鍑犵櫨涓囪鏃朵竴娆″氨寰堟參锛�
+--   2) 鍞竴绱㈠紩鏄�"涓嶉噸澶�"鐨勬渶鍚庝竴閬撻槻绾匡細鏋佺骞跺彂銆佹柇鐐瑰洖閫�銆佸垎椤靛亸绉婚兘涓嶄細鎻掑嚭閲嶅璁板綍銆�
+--
+-- 鎵ц椤哄簭锛�
+--   绗� 1 姝�  鐪嬫竻鏈夊摢浜涜〃銆佺幇鍦ㄦ湁娌℃湁绱㈠紩
+--   绗� 2 姝�  鏌ラ噸澶嶆暟鎹紙鏈夐噸澶嶇殑璇濈 3 姝ュ姞鍞竴绱㈠紩浼氬け璐ワ紝鍏堝鐞嗛噸澶嶏級
+--   绗� 3 姝�  鍔犲敮涓�绱㈠紩 uk_serialnum锛堣剼鏈細鑷姩璺宠繃宸叉湁鍞竴绱㈠紩鐨勮〃锛�
+--   绗� 4 姝�  鏍¢獙缁撴灉
+--
+-- 娉ㄦ剰锛欰DD INDEX 璧� online DDL锛圓LGORITHM=INPLACE, LOCK=NONE锛夛紝涓嶉樆濉炶鍐欙紝
+--       浣嗗ぇ琛ㄤ粛浼氭秷鑰� IO锛屽缓璁斁鍦ㄤ笟鍔′綆宄版墽琛屻�傛暟鎹噺澶ф椂鍒嗚〃涓�寮犱竴寮犳潵涔熷彲浠ャ��
+--       濡傛灉鏌愬紶琛ㄦ姤閿欙紝鍏堝崟鐙墽琛岀 2 姝ョ湅瀹冩湁娌℃湁閲嶅鏁版嵁銆�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 1 姝ワ細鐪嬫湁鍝簺 pat_med_outhosp 琛紝浠ュ強 serialnum 涓婄殑绱㈠紩鎯呭喌
+--   has_unique_index = 1 琛ㄧず宸茬粡鏈夊敮涓�绱㈠紩锛堜笉鐢ㄥ啀鍔狅級
+--   has_any_index    = 0 琛ㄧず瀹屽叏娌$储寮曪紙鏌ヨ浼氬緢鎱紝蹇呴』鍔狅級
+-- ----------------------------------------------------------------------------
+SELECT t.TABLE_NAME,
+       t.TABLE_ROWS,
+       (SELECT COUNT(*)
+          FROM information_schema.STATISTICS s
+         WHERE s.TABLE_SCHEMA = t.TABLE_SCHEMA
+           AND s.TABLE_NAME = t.TABLE_NAME
+           AND s.COLUMN_NAME = 'serialnum'
+           AND s.NON_UNIQUE = 0) AS has_unique_index,
+       (SELECT COUNT(*)
+          FROM information_schema.STATISTICS s
+         WHERE s.TABLE_SCHEMA = t.TABLE_SCHEMA
+           AND s.TABLE_NAME = t.TABLE_NAME
+           AND s.COLUMN_NAME = 'serialnum') AS has_any_index
+FROM information_schema.TABLES t
+WHERE t.TABLE_SCHEMA = DATABASE()
+  AND (t.TABLE_NAME = 'pat_med_outhosp' OR t.TABLE_NAME REGEXP '^pat_med_outhosp_[0-9]{4,8}$')
+ORDER BY t.TABLE_NAME;
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 2 姝ワ細鏌ラ噸澶嶇殑 serialnum锛堟湁閲嶅灏卞繀椤诲厛娓呯悊锛屽惁鍒欏敮涓�绱㈠紩寤轰笉涓婏級
+--   鎵ц鍚庡厛鐪� dup_serialnum_total锛岀瓑浜� 0 灏卞彲浠ョ洿鎺ヨ繘绗� 3 姝�
+-- ----------------------------------------------------------------------------
+DROP PROCEDURE IF EXISTS check_outhosp_serialnum_dup;
+DELIMITER $$
+CREATE PROCEDURE check_outhosp_serialnum_dup()
+BEGIN
+    DECLARE done INT DEFAULT 0;
+    DECLARE tbl VARCHAR(64);
+    DECLARE cur CURSOR FOR
+        SELECT TABLE_NAME
+          FROM information_schema.TABLES
+         WHERE TABLE_SCHEMA = DATABASE()
+           AND (TABLE_NAME = 'pat_med_outhosp' OR TABLE_NAME REGEXP '^pat_med_outhosp_[0-9]{4,8}$');
+    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
+
+    DROP TEMPORARY TABLE IF EXISTS tmp_dup_serialnum;
+    CREATE TEMPORARY TABLE tmp_dup_serialnum
+    (
+        table_name VARCHAR(64),
+        serialnum  VARCHAR(64),
+        cnt        INT
+    );
+
+    OPEN cur;
+    read_loop:
+    LOOP
+        FETCH cur INTO tbl;
+        IF done THEN
+            LEAVE read_loop;
+        END IF;
+        SET @s = CONCAT('INSERT INTO tmp_dup_serialnum SELECT ''', tbl,
+                        ''', serialnum, COUNT(*) FROM `', tbl,
+                        '` WHERE serialnum IS NOT NULL AND serialnum <> ''''',
+                        ' GROUP BY serialnum HAVING COUNT(*) > 1');
+        PREPARE st FROM @s;
+        EXECUTE st;
+        DEALLOCATE PREPARE st;
+    END LOOP;
+    CLOSE cur;
+
+    SELECT * FROM tmp_dup_serialnum ORDER BY cnt DESC LIMIT 200;
+    SELECT COUNT(*) AS dup_serialnum_total FROM tmp_dup_serialnum;
+END$$
+DELIMITER ;
+
+CALL check_outhosp_serialnum_dup();
+-- 鏌ュ畬鍙互鍒犳帀杩欎釜杩囩▼锛欴ROP PROCEDURE IF EXISTS check_outhosp_serialnum_dup;
+
+-- 濡傛灉鏈夐噸澶嶏紝鎸変笅闈㈢殑鎬濊矾娓呯悊锛堜繚鐣� id 鏈�灏忕殑閭f潯锛屽厛澶囦唤鍐嶅垹锛夛細
+--   CREATE TABLE bak_dup_<琛ㄥ悕>_<鏃ユ湡> AS
+--   SELECT * FROM `pat_med_outhosp_20261012`
+--    WHERE serialnum IN ('閲嶅鐨剆erialnum1','閲嶅鐨剆erialnum2');
+--   DELETE t1 FROM `pat_med_outhosp_20261012` t1
+--     JOIN `pat_med_outhosp_20261012` t2
+--       ON t1.serialnum = t2.serialnum AND t1.id > t2.id
+--    WHERE t1.serialnum IN ('閲嶅鐨剆erialnum1','閲嶅鐨剆erialnum2');
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 3 姝ワ細缁欐墍鏈� pat_med_outhosp 琛ㄥ姞鍞竴绱㈠紩 uk_serialnum
+--   宸叉湁鍞竴绱㈠紩鐨勮〃鑷姩璺宠繃锛涘鏋滀箣鍓嶅缓杩囧悓鍚嶇殑鏅�氱储寮� idx_serialnum锛屼細鍏堝垹鎺夊啀寤哄敮涓�鐨�
+-- ----------------------------------------------------------------------------
+DROP PROCEDURE IF EXISTS add_outhosp_serialnum_index;
+DELIMITER $$
+CREATE PROCEDURE add_outhosp_serialnum_index()
+BEGIN
+    DECLARE done INT DEFAULT 0;
+    DECLARE tbl VARCHAR(64);
+    DECLARE has_unique INT DEFAULT 0;
+    DECLARE has_normal INT DEFAULT 0;
+    DECLARE cur CURSOR FOR
+        SELECT TABLE_NAME
+          FROM information_schema.TABLES
+         WHERE TABLE_SCHEMA = DATABASE()
+           AND (TABLE_NAME = 'pat_med_outhosp' OR TABLE_NAME REGEXP '^pat_med_outhosp_[0-9]{4,8}$');
+    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
+
+    OPEN cur;
+    add_loop:
+    LOOP
+        FETCH cur INTO tbl;
+        IF done THEN
+            LEAVE add_loop;
+        END IF;
+
+        SELECT COUNT(*) INTO has_unique
+          FROM information_schema.STATISTICS
+         WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl
+           AND COLUMN_NAME = 'serialnum' AND NON_UNIQUE = 0;
+
+        IF has_unique > 0 THEN
+            SELECT CONCAT('[璺宠繃] ', tbl, ' 宸叉湁 serialnum 鍞竴绱㈠紩') AS msg;
+        ELSE
+            -- 鍏堟竻鎺夊彲鑳藉瓨鍦ㄧ殑闈炲敮涓�绱㈠紩锛堜繚鐣欏敮涓�绱㈠紩涓�涓氨澶燂級
+            SELECT COUNT(*) INTO has_normal
+              FROM information_schema.STATISTICS
+             WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl
+               AND COLUMN_NAME = 'serialnum' AND NON_UNIQUE = 1 AND INDEX_NAME = 'idx_serialnum';
+            IF has_normal > 0 THEN
+                SET @s = CONCAT('ALTER TABLE `', tbl, '` DROP INDEX idx_serialnum');
+                PREPARE st FROM @s;
+                EXECUTE st;
+                DEALLOCATE PREPARE st;
+            END IF;
+
+            SET @s = CONCAT('ALTER TABLE `', tbl, '` ADD UNIQUE INDEX uk_serialnum (serialnum)');
+            PREPARE st FROM @s;
+            EXECUTE st;
+            DEALLOCATE PREPARE st;
+            SELECT CONCAT('[瀹屾垚] ', tbl, ' 宸叉坊鍔犲敮涓�绱㈠紩 uk_serialnum') AS msg;
+        END IF;
+    END LOOP;
+    CLOSE cur;
+END$$
+DELIMITER ;
+
+CALL add_outhosp_serialnum_index();
+-- 瀹屾垚鍚庡垹鎺夎繃绋嬶細DROP PROCEDURE IF EXISTS add_outhosp_serialnum_index;
+
+-- 濡傛灉鏌愬紶琛ㄦ姤 "Duplicate entry ... for key 'uk_serialnum'"锛岃鏄庡畠杩樻湁閲嶅鏁版嵁锛�
+-- 鍥炲埌绗� 2 姝ユ竻鐞嗚琛ㄥ悗锛屽崟鐙墽琛岋細
+--   ALTER TABLE `pat_med_outhosp_20261012` ADD UNIQUE INDEX uk_serialnum (serialnum);
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 4 姝ワ細鏍¢獙锛堟瘡寮犺〃閮藉簲璇� has_unique_index = 1锛�
+-- ----------------------------------------------------------------------------
+SELECT t.TABLE_NAME,
+       (SELECT COUNT(*)
+          FROM information_schema.STATISTICS s
+         WHERE s.TABLE_SCHEMA = t.TABLE_SCHEMA
+           AND s.TABLE_NAME = t.TABLE_NAME
+           AND s.COLUMN_NAME = 'serialnum'
+           AND s.NON_UNIQUE = 0) AS has_unique_index
+FROM information_schema.TABLES t
+WHERE t.TABLE_SCHEMA = DATABASE()
+  AND (t.TABLE_NAME = 'pat_med_outhosp' OR t.TABLE_NAME REGEXP '^pat_med_outhosp_[0-9]{4,8}$')
+ORDER BY t.TABLE_NAME;
diff --git a/sql/patinhosp_select_list_index_optimize.sql b/sql/patinhosp_select_list_index_optimize.sql
new file mode 100644
index 0000000..e9713d6
--- /dev/null
+++ b/sql/patinhosp_select_list_index_optimize.sql
@@ -0,0 +1,202 @@
+-- ============================================================================
+-- POST /smartor/patinhosp/selectPatMedInhospList 鎱㈡煡璇㈣瘖鏂� + 绱㈠紩鑴氭湰
+--
+-- 鐜板満鍏ュ弬锛堝湪闄㈣鍥撅級锛�
+--   {"bedSort":1,"pageNum":1,"pageSize":20,
+--    "deptcodeList":["40003378"],"hospitaldistrictcodeList":["40003380"],"cry":0}
+--
+-- 璋冪敤閾撅紙宸查�愯鏍稿锛夛細
+--   InhospVisitDataController#selectPatMedInhosplis
+--     -> InhospVisitFacade#selectPatMedInhospList
+--     -> DefaultInhospVisitDataService#selectPatMedInhospList
+--     -> PatMedInhospMapper.xml <select id="selectPatMedInhospList">
+--
+-- 鈿狅笍 娉ㄦ剰锛氳縼绉诲悗杩欐潯閾俱�愪笉鍐嶇粡杩囥�憇martor 鐨� PatMedInhospServiceImpl#selectPatMedInhospList锛�
+--    鍥犳閭i噷闈㈢殑 cry 褰掍竴鍖栵紙cry=0 -> inhospstate='0'锛夊湪杩欐潯鎺ュ彛涓娿�愬凡缁忎笉鐢熸晥浜嗐�戙��
+--    杩欎竴鐐瑰悓鏃舵槸"鎱�"鐨勬牴鍥犱箣涓�锛岃涓嬮潰銆愮 4 鑺傘�戙��
+--
+-- 鎵ц椤哄簭锛氱 1 姝ョ湅鐜扮姸 鈫� 绗� 2 姝ワ紙浜岄�変竴锛夆啋 绗� 3 姝� EXPLAIN 楠岃瘉銆�
+-- ADD INDEX 璧� online DDL锛堜笉闃诲璇诲啓锛夛紝浣嗗ぇ琛ㄤ粛浼氬悆 IO锛屽缓璁笟鍔′綆宄版墽琛屻��
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 1 鑺傦細杩欐潯鍏ュ弬瀹為檯鎵ц鐨勪袱鏉� SQL锛堢敱 MyBatis 鍔ㄦ�佹爣绛惧睍寮� + PageHelper 鏀瑰啓锛�
+-- ----------------------------------------------------------------------------
+--
+-- 鈶� 鏁版嵁鏌ヨ锛�<select id="selectPatMedInhospList">锛坈ry=0 璧� endtime is null 鍒嗘敮锛�
+--    bedSort 浼犲瓧绗︿覆 "1" 涓嶅尮閰� XML 閲岀殑 "asc"/"desc"锛屾晠钀藉埌 <otherwise> 榛樿鎺掑簭锛�
+--
+--    SELECT a.age, a.telcode, a.sex, b.inhospid, b.nurse_id, ...锛堝叡 60+ 鍒楋級..., a.idcardno
+--      FROM pat_med_inhosp b
+--      JOIN pat_archive a ON a.id = b.patid
+--     WHERE 1=1
+--       AND a.del_flag = 0                 -- 鈫� 鏁板瓧甯搁噺姣� char 鍒楋紝瑙佺 4 鑺� F1
+--       AND b.del_flag = 0                 -- 鈫� 鍚屼笂锛屼笖瀹冩鏄� idx_inhosp_optimize 鐨勯鍒�
+--       AND a.idcardno IS NOT NULL
+--       AND b.endtime IS NULL              -- 鈫� 鍦ㄩ櫌鍒ゅ畾锛堢瓑浠锋潯浠讹紝鏃犳硶鐢ㄧ幇鏈夌储寮曪級
+--       AND b.hospitaldistrictcode IN ('40003380')
+--       AND b.deptcode IN ('40003378')
+--       AND b.orgid = '<鐧诲綍鐢ㄦ埛 orgid>'     -- 鐢� @AddOrgId 娉ㄥ叆
+--      [AND b.campusid = '<鐧诲綍鐢ㄦ埛 campusid>']  -- 闄㈠尯鏉冮檺鏈斁寮�鏃剁敱 @AddOrgId 娉ㄥ叆
+--     GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex   -- 鈫� 瑙佺 4 鑺� F3
+--     ORDER BY b.starttime DESC, b.bed_no ASC
+--     LIMIT 0, 20
+--
+-- 鈶� 鎬绘暟鏌ヨ锛歅ageHelper 鑷姩鐢熸垚銆傚洜涓烘湁 GROUP BY锛宨sSimpleCount() 涓� false锛�
+--    CountSqlParser 浼氥�愭妸鏁存潯鏌ヨ鍖呬竴灞傘�戣�屼笉鏄敼鍐欐垚 count(0)锛堝凡鏍稿 pagehelper 5.3.x
+--    瀛楄妭鐮佸父閲� "select count(" + ") from ( " + ") tmp_count"锛夛細
+--
+--    SELECT count(0) FROM ( <鈶� 鍘绘帀 ORDER BY 鍚庣殑瀹屾暣 60 鍒楄鍙�> ) tmp_count
+--
+--    => 姣忔缈婚〉 = 鍚屼竴鏉¢噸閲忕骇鏌ヨ璺戜袱閬嶃�傝繖鏄�"鎱�"鐨勭浜屼釜鏍瑰洜锛岃绗� 4 鑺� F2銆�
+--
+-- 鈶� 鍙﹀涓�鏉★細fillTagname 涓嶅湪杩欐潯閾句笂锛堥偅鏄� smartor 渚� ServiceImpl 鐨勯�昏緫锛夛紝鍙帓闄ゃ��
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 1 姝ワ細鍏堢湅鐜扮姸 鈥斺�� 鐜版湁绱㈠紩銆佹參鏃ュ織銆佷互鍙婅繖鏉� SQL 鐨勭湡瀹炴墽琛岃鍒�
+-- ----------------------------------------------------------------------------
+
+-- 1.1 pat_med_inhosp / pat_archive 鐜版湁绱㈠紩
+--     閲嶇偣鐪� idx_inhosp_optimize 鐨勭湡瀹炲垪椤哄簭锛堜唬鐮佹敞閲婇噷鍐欑殑鏄� (del_flag, orgid, inhospstate)锛�
+SELECT TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX, COLUMN_NAME, CARDINALITY, NON_UNIQUE
+FROM information_schema.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('pat_med_inhosp', 'pat_archive')
+ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
+
+-- 1.2 鍏虫帀鐨勬潯浠跺埌搴曟槸涓嶆槸绱㈠紩鍒椼�佸垪绫诲瀷瀵逛笉瀵癸紙del_flag / inhospstate 鏄� char 杩樻槸 int锛�
+--     鐩存帴鍐冲畾涓嬮潰 F1 / F4 瑕佷笉瑕佹敼锛�
+SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('pat_med_inhosp', 'pat_archive')
+  AND COLUMN_NAME IN ('inhospid', 'patid', 'del_flag', 'orgid', 'campusid',
+                      'inhospstate', 'endtime', 'starttime', 'bed_no',
+                      'deptcode', 'hospitaldistrictcode');
+
+-- 1.3 琛ㄤ綋閲� + 鍦ㄩ櫌鍗犳瘮锛堝垽鏂�"鍏ㄨ〃鎵弿"鍒板簳璐典笉璐碉級
+SELECT TABLE_NAME, TABLE_ROWS, ROUND(DATA_LENGTH / 1024 / 1024, 1) AS data_mb,
+       ROUND(INDEX_LENGTH / 1024 / 1024, 1) AS index_mb
+FROM information_schema.TABLES
+WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('pat_med_inhosp', 'pat_archive');
+
+SELECT COUNT(*) AS total,
+       SUM(endtime IS NULL) AS in_hosp_by_endtime,
+       SUM(inhospstate = '0') AS in_hosp_by_state,
+       -- 涓ょ"鍦ㄩ櫌"瀹氫箟涓嶄竴鑷寸殑琛屾暟锛�>0 灏辫鏄庛�愪笉鑳姐�戦殢鎵嬫妸 inhospstate='0' 褰撲綔
+       -- endtime IS NULL 鐨勬浛浠f潯浠讹紝F2 鍙兘璧�"鍔犵储寮�"閭f潯璺�
+       SUM(CASE WHEN endtime IS NULL AND IFNULL(inhospstate, '') <> '0' THEN 1 ELSE 0 END) AS in_hosp_def_conflict
+FROM pat_med_inhosp
+WHERE del_flag = '0';
+
+-- 1.4 鐩存帴 EXPLAIN 杩欐潯璇彞锛堟妸 orgid 鎹㈡垚鐜板満鍊硷級
+EXPLAIN
+SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime, b.endtime
+FROM pat_med_inhosp b
+         JOIN pat_archive a ON a.id = b.patid
+WHERE a.del_flag = 0
+  AND b.del_flag = 0
+  AND a.idcardno IS NOT NULL
+  AND b.endtime IS NULL
+  AND b.hospitaldistrictcode IN ('40003380')
+  AND b.deptcode IN ('40003378')
+  AND b.orgid = '<鎹㈡垚鐜板満 orgid>'
+GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex
+ORDER BY b.starttime DESC, b.bed_no ASC
+LIMIT 0, 20;
+--
+-- 棰勬湡锛堟敼涔嬪墠锛夛細b 琛� type=ref/range 鎴� ALL锛宬ey 鍙湁 idx_inhosp_optimize 鐨�
+--   (del_flag, orgid) 鍓嶇紑鑳界敤鍒帮紙鎴栧畬鍏ㄧ敤涓嶄笂锛夛紱
+--   rows 绾︾瓑浜�"璇ユ満鏋勫叏閮ㄥ巻鍙蹭綇闄㈣褰曟暟"锛孍xtra 閲屽嚭鐜� Using where; Using temporary; Using filesort銆�
+-- 鏀逛箣鍚庤鐐癸細b 琛� rows 搴旈檷鍒�"璇ユ満鏋勫湪闄汉鏁�"閲忕骇锛堟暟鍗冿級锛屼笖 key 鍛戒腑涓嬮潰鐨勬柊绱㈠紩 / 鐜版湁绱㈠紩鍏ㄥ墠缂�銆�
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 2 鑺傦細涓ょ淇硶 鈥斺�� 銆愭湰娆¢噰鐢ㄤ慨娉� A銆戯紝淇硶 B 鐣欎綔澶囬��
+-- ----------------------------------------------------------------------------
+
+-- 淇硶 A锛堟湰娆¢噰鐢紝闆惰涔夐闄╋級锛氱粰"鍦ㄩ櫌"琛ヤ竴涓兘瀹氫綅鐨勭储寮曘��
+--   鐜版湁 idx_inhosp_optimize 鐨勭涓変釜绛夊�煎垪鏄� inhospstate锛屼絾鏈帴鍙d笉浼犺繖涓潯浠讹紝
+--   鍙兘鐢ㄤ笂 (del_flag, orgid) 鍓嶇紑 = 璇ユ満鏋勫叏閮ㄥ巻鍙蹭綇闄㈣褰曪紝绛変簬娌¤蛋绱㈠紩銆�
+--   鍓嶆彁锛欶1 鐨� del_flag = '0' 宸叉敼锛堝惁鍒欓鍒楃敤涓嶄笂锛岃繖鏉$储寮曚篃鐧藉缓锛夈��
+ALTER TABLE pat_med_inhosp
+    ADD INDEX idx_pmi_del_org_end (del_flag, orgid, endtime);
+
+--   鍙�夊姞寮猴細鎶婁袱涓� IN 鏉′欢涔熸斁杩涚储寮曪紝鍛戒腑琛屼笉鐢ㄥ洖琛ㄥ氨鑳藉垽鎺夛紙绱㈠紩鏇村锛屽啓鏀惧ぇ鏇存槑鏄撅級
+-- ALTER TABLE pat_med_inhosp
+--     ADD INDEX idx_pmi_del_org_end_dept (del_flag, orgid, endtime, deptcode, hospitaldistrictcode);
+
+--   鍑洪櫌 / 杞 / 棰勫叆闄� 涓変釜瑙嗗浘锛坈ry=1/2/3锛宱rder by b.endtime desc锛夌敤杩欐潯锛�
+--   绛夊�煎垪 (del_flag, orgid, inhospstate) 鍏ㄥ懡涓紝涓� endtime 鍙互椤哄甫閬垮厤 filesort 鐨勬帓搴忛敭
+ALTER TABLE pat_med_inhosp
+    ADD INDEX idx_pmi_del_org_state_end (del_flag, orgid, inhospstate, endtime);
+
+
+-- 淇硶 B锛堟湰娆′笉閲囩敤锛岀暀浣滃閫夛級锛氫笉鍔犵储寮曪紝cry=0 鏃惰ˉ inhospstate='0'锛岃鐜版湁
+--   idx_inhosp_optimize 鐨� (del_flag, orgid, inhospstate) 鍓嶇紑鍏ㄩ儴绛夊�煎懡涓� 鈥斺��
+--   鍏跺疄杩欐墠鏄�愯縼绉诲墠鐨勮涓恒�戯細smartor 鐨� PatMedInhospServiceImpl#selectPatMedInhospList
+--   鍦� cry=0 鏃朵細 setInhospstate("0")锛岃縼鍒� ruoyi-inhospvisit 鍚庤繖鏉¢摼鐩存帴璋� Mapper锛�
+--   杩欐褰掍竴鍖栦涪浜嗐��
+--   鈿狅笍 涔嬫墍浠ユ病閫夊畠锛氬畠浼氳"endtime 涓虹┖浣� inhospstate<>'0'"鐨勮闈欓粯娑堝け锛�
+--   鏄惁瀹夊叏鍙栧喅浜庢暟鎹紝寰楀厛鐪嬬 1.3 鑺傜殑 in_hosp_def_conflict銆�
+--   鑻ュ皢鏉ョ‘璁� = 0锛岃繖涓�鏉℃瘮寤虹储寮曟洿鐪侊紙瑙� PatMedInhospMapper.xml 鐨�
+--   <if test="cry != null and cry == 0 "> 鍒嗘敮锛夈��
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 3 鑺傦細楠岃瘉锛堢 2 姝ュ仛瀹屽悗閲嶈窇绗� 1.4 鑺傦級
+-- ----------------------------------------------------------------------------
+-- 鈶� b 琛� type = ref锛宬ey = idx_pmi_del_org_end锛堟垨 idx_inhosp_optimize锛夛紝rows 鏁板崈绾э紱
+-- 鈶� Using temporary; Using filesort 浠嶄細鏈夛紙GROUP BY + 搴婁綅鎺掑簭瀵艰嚧锛岃 F3锛夛紝
+--    浣嗗洜涓哄弬涓庢帓搴忕殑琛屾暟宸茬粡浠�"鍏ㄦ満鏋勫巻鍙�"闄嶅埌"鏈儴闂ㄥ湪闄�"锛屽彲浠ユ帴鍙楋紱
+-- 鈶� 鎺ュ彛鑰楁椂锛歝ount + data 涓ゆ潯閮芥寜杩欎釜璁″垝璧帮紝鏁翠綋搴旈檷鍒板嚑鍗佹绉掔骇銆�
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愬洖婊氥��
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE pat_med_inhosp DROP INDEX idx_pmi_del_org_end;
+-- ALTER TABLE pat_med_inhosp DROP INDEX idx_pmi_del_org_state_end;
+
+
+-- ============================================================================
+-- 绗� 4 鑺傦細浠g爜渚ч『甯﹀彂鐜扮殑闂锛堟寜褰卞搷鎺掑簭锛�
+--   鉁� 宸叉敼锛欶1 / F2 / F4      鈴� 鏈敼锛堢瓑纭锛夛細F3 / F5 / F6
+--
+-- F1  鉁� 宸叉敼  b.del_flag = 0 / a.del_flag = 0锛氭暟瀛楀父閲忔瘮 char 鍒楋紝MySQL 浼氭妸銆愬垪銆戣浆
+--     DOUBLE锛岃鏉′欢鍙兘杩囨护銆佷笉鑳藉畾浣嶃�俰dx_inhosp_optimize 鐨勯鍒楀氨鏄� del_flag锛�
+--     绛変簬棣栧垪鐧界粰銆傚凡鏀规垚 = '0'銆傛湰浠撳簱宸叉湁鍚岀被缁撹锛岃
+--     sql/sltdMydTotalByDimension_index_20260924.sql 绗� 117-134 琛岋細"浠g爜渚у繀椤诲悓姝ヤ慨姝�
+--     del_flag 鐨勫啓娉曪紝鍚﹀垯绱㈠紩鍙兘鐢ㄤ笂涓�鍗�"銆�
+--     锛堝垪鏄� int 鏃跺啓 '0' 涔熷畨鍏細甯搁噺渚ц浆鎹紝绱㈠紩鐓ф牱鍙敤銆傦級
+--
+-- F2  鉁� 宸叉敼  PageHelper 鐨� count锛氭湁 GROUP BY 鏃朵笉鑳界畝鍖栵紝鍙兘鍖呬竴灞� tmp_count锛�
+--     绛変簬姣忔缈婚〉鎶婅繖鏉� 60 鍒楁煡璇㈠啀璺戜竴閬嶃�傚凡鍦�
+--     ruoyi-inhospvisit/.../PatMedInhospMapper.xml 琛� selectPatMedInhospList_COUNT
+--     锛坧agehelper 5.3.x 鐨� PageInterceptor 鏀寔 countSuffix="_COUNT" 鐨勬墜鍐� count锛�
+--     宸叉牳瀵瑰瓧鑺傜爜甯搁噺锛歡enCountMsId / getExistedMappedStatement / executeManualCount锛夛紝
+--     骞舵妸 FROM/WHERE 鎶芥垚 selectPatMedInhospListFromWhere 鐗囨缁欎袱鏉¤鍙ュ叡鐢紝
+--     淇濊瘉 count 涓庡垪琛ㄦ案杩滄槸鍚屼竴濂楁潯浠躲��
+--
+-- F3  鈴� 鏈敼  GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex 鎭掔瓑銆佷笉鍘婚噸锛�
+--     a.id 鏄� pat_archive 涓婚敭銆乥.patid 鍙叧鑱斿埌涓�琛岋紝姣忎釜 join 缁撴灉琛岃嚜鎴愬垎缁勩��
+--     瀹冨彧鎹㈡潵 Using temporary + Using filesort銆傚垹瀹冧箣鍓嶈鍏堢‘璁� pat_archive.id 鍞竴锛�
+--     纭鍚庡垹鎺夛紝F2 鐨� count 杩樹細鑷姩鍙樻垚绠�鍗曠殑 count(0)銆�
+--
+-- F4  鉁� 宸叉敼  cry=1/2/3 鍒嗘敮鍘熸潵鏄� b.inhospstate=1 / =2 / =3锛堟暟瀛楀父閲� vs char 鍒楋級锛屽悓 F1锛�
+--     鍑洪櫌 / 杞 / 棰勫叆闄� 涓変釜瑙嗗浘鐨勭储寮曚篃鐢ㄤ笉涓婏紝宸叉敼鎴� '1' / '2' / '3'銆�
+--
+-- F5  鈴� 鏈敼  bedSort 鍦ㄨ繖鏉¢摼涓婃病鏈夊綊涓�鍖栥�傚墠绔紶 bedSort:1锛堟暟瀛楋級锛孞ackson 钀藉埌 String
+--     鏄� "1"锛岃�� XML 鍙 "asc"/"desc"锛屾墍浠ャ�愭寜搴婁綅鎺掑簭瀹為檯娌$敓鏁堛�戯紝钀藉洖榛樿
+--     order by starttime desc, bed_no asc銆傚綊涓�鍖栧嚱鏁� normalizeBedSort 鐩墠鍙湪
+--     smartor 鐨� ServiceImpl 閲岋紝鑰岃繖鏉¢摼宸茬粡涓嶈蛋瀹冧簡銆�
+--
+-- F6  鈴� 鏈敼  date_format(b.endtime,'%y%m%d') >= date_format(?, '%y%m%d') 杩欑被鍐欐硶
+--     锛堝嚭闄�/鍏ラ櫌鏃堕棿鑼冨洿杩囨护锛屾湰鍏ュ弬涓嶆秹鍙婏級瀵瑰垪鐢ㄤ簡鍑芥暟锛岀储寮曞繀澶辨晥銆傜瓑浠锋敼娉曪細
+--       >= date_format(?, '%y%m%d')  ->  b.endtime >= DATE(?)
+--       <= date_format(?, '%y%m%d')  ->  b.endtime <  DATE(?) + INTERVAL 1 DAY
+--
+-- 鍥炲綊妫�鏌ワ細python sql\_probe\verify_patinhosp_list_count.py锛�17 椤癸紝鏀瑰畬璇疯窇涓�娆★級
+-- ============================================================================
diff --git a/sql/patinhosp_select_list_slow_diagnose.sql b/sql/patinhosp_select_list_slow_diagnose.sql
new file mode 100644
index 0000000..b2bd3e4
--- /dev/null
+++ b/sql/patinhosp_select_list_slow_diagnose.sql
@@ -0,0 +1,222 @@
+-- ============================================================================
+-- /smartor/patinhosp/selectPatMedInhospList 鎱� 鈥斺�� 涓�椤佃瘖鏂紙鎶婅緭鍑鸿创鍥炴潵鍗冲彲瀹氫綅锛�
+--
+-- 鐜板満鍏ュ弬锛歿"bedSort":1,"pageNum":1,"pageSize":20,
+--           "deptcodeList":["40003378"],"hospitaldistrictcodeList":["40003380"],"cry":0}
+--
+-- 浠g爜渚у凡缁忓仛瀹岀殑涓変欢浜嬶紙涓嶇敤鍐嶆煡锛夛細
+--   鈶� del_flag / inhospstate 宸叉敼鎴愬瓧绗︿覆甯搁噺 鈫� 绱㈠紩棣栧垪鑳界敤涓婁簡
+--   鈶� 鍒嗛〉 count 宸叉敼鎴愭墜鍐� _COUNT锛坧agehelper 瀹炴祴瑙f瀽鍒� 5.3.2锛岃鏈哄埗鐢熸晥锛夛紝
+--      涓嶅啀鎶� 60 鍒楁煡璇㈡暣涓寘涓�灞傞噸璺�
+--   鈶� 銆愬湪闄㈠彛寰勩�慶ry=0 鐜板湪鍚屾椂甯� endtime is null 鍜� inhospstate = '0'
+--      鈥斺�� 杩欐槸杩佸嚭鍓� PatMedInhospServiceImpl 鐨勮涓猴紝涔熸槸璁╃储寮曠涓夊垪
+--      (del_flag, orgid, inhospstate) 鐪熸绛夊�煎懡涓殑鍓嶆彁
+-- 濡傛灉銆愯繕鏄參銆戯紝鍓╀笅鐨勬椂闂村繀鐒跺湪杩欎袱澶勪箣涓�锛�
+--   (鐢�) 鍦ㄩ櫌鍙e緞閫夐敊浜嗗垪 鈥斺�� endtime IS NULL 鍛戒腑鐨勮鏁拌繙澶т簬鐪熷疄鍦ㄩ櫌浜烘暟
+--        锛圚IS 瀵煎叆鐨勫巻鍙叉暟鎹� endtime 甯稿勾涓虹┖锛岃繖涓�鏉℃渶瀹规槗琚拷鐣ワ級
+--   (涔�) 绱㈠紩娌″缓 / 寤轰簡浣嗙敤涓嶄笂锛堢被鍨嬫垨瀛楃闆嗕笉涓�鑷达紝join 閿闅愬紡杞崲锛�
+--
+-- 璺戞硶锛氭暣娈佃创杩� mysql 瀹㈡埛绔�傛瘡涓� SELECT 鐨勭粨鏋滈噷瀹㈡埛绔細鎵撳嵃
+--       "1 row in set (0.0xx sec)"锛岄偅涓鏁板氨鏄垜瑕佺殑銆�
+-- 闇�瑕佹浛鎹㈢殑鍗犱綅绗︼細<ORGID>锛�= 鐧诲綍鐢ㄦ埛鐨� orgid锛夈��<DEPT>銆�<DISTRICT>銆�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 0) 鐗堟湰锛圗XPLAIN ANALYZE 闇�瑕� 8.0.17+锛�5.7 灏辫蛋绗� 4 鑺傜殑鏅�� EXPLAIN锛�
+-- ----------------------------------------------------------------------------
+SELECT VERSION() AS mysql_version, @@sql_mode AS sql_mode;
+
+
+-- ----------------------------------------------------------------------------
+-- 1) 绱㈠紩鐜扮姸 + 鍏抽敭鍒楃被鍨�/瀛楃闆嗭紙鍐冲畾"绱㈠紩鑳戒笉鑳借鐢ㄤ笂"锛�
+-- ----------------------------------------------------------------------------
+SELECT TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX, COLUMN_NAME, CARDINALITY, NON_UNIQUE
+FROM information_schema.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('pat_med_inhosp', 'pat_archive')
+ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
+
+-- 鈿狅笍 閲嶇偣鐪嬩袱琛岋細
+--    b.patid  涓� a.id  鐨� COLUMN_TYPE / COLLATION_NAME 鏄惁銆愬畬鍏ㄤ竴鑷淬��
+--    涓嶄竴鑷� = join 閿闅愬紡杞崲 = pat_archive 鐨勪富閿储寮曠敤涓嶄笂锛堣绗� 5 鑺傦級
+SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLLATION_NAME, IS_NULLABLE
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND ( (TABLE_NAME = 'pat_med_inhosp'
+         AND COLUMN_NAME IN ('inhospid','patid','del_flag','orgid','campusid',
+                             'inhospstate','endtime','starttime','bed_no',
+                             'deptcode','hospitaldistrictcode'))
+     OR (TABLE_NAME = 'pat_archive'
+         AND COLUMN_NAME IN ('id','del_flag','idcardno','age','age_unit','telcode','sex')) )
+ORDER BY TABLE_NAME, COLUMN_NAME;
+
+SELECT TABLE_NAME, TABLE_ROWS, ROUND(DATA_LENGTH/1024/1024) AS data_mb,
+       ROUND(INDEX_LENGTH/1024/1024) AS index_mb
+FROM information_schema.TABLES
+WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('pat_med_inhosp', 'pat_archive');
+
+
+-- ----------------------------------------------------------------------------
+-- 2) 鈽呮渶鍏抽敭锛氬湪闄㈠埌搴曟湁澶氬皯琛岋紙涓ょ鍙e緞瀵规瘮锛�
+--    濡傛灉 in_by_endtime 杩滃ぇ浜� in_by_state锛岃鏄� endtime IS NULL 涓嶆槸"鍦ㄩ櫌"锛�
+--    閭e啀鎬庝箞鍔犵储寮曚篃娌℃晳 鈥斺�� 蹇呴』鎹㈡垚 inhospstate 鍙e緞锛堜唬鐮佷竴琛岋級銆�
+-- ----------------------------------------------------------------------------
+SELECT
+    COUNT(*)                                                              AS total_rows,
+    SUM(del_flag = '0')                                                   AS alive_rows,
+    SUM(del_flag = '0' AND endtime IS NULL)                               AS in_by_endtime,
+    SUM(del_flag = '0' AND inhospstate = '0')                             AS in_by_state,
+    SUM(del_flag = '0' AND endtime IS NULL AND IFNULL(inhospstate,'') <> '0') AS conflict_endtime_null_but_not_state0,
+    SUM(del_flag = '0' AND inhospstate = '0' AND endtime IS NOT NULL)     AS conflict_state0_but_has_endtime
+FROM pat_med_inhosp;
+
+-- 鎹㈡垚"璇ユ満鏋�"鍐嶇湅涓�閬嶏紙鍙e緞鍒嗗竷鍙兘鍥犳満鏋勮�屽紓锛�
+SELECT
+    COUNT(*)                                                    AS org_alive_rows,
+    SUM(endtime IS NULL)                                        AS org_in_by_endtime,
+    SUM(inhospstate = '0')                                      AS org_in_by_state,
+    SUM(endtime IS NULL AND IFNULL(inhospstate,'') <> '0')      AS org_conflict
+FROM pat_med_inhosp
+WHERE del_flag = '0' AND orgid = '<ORGID>';
+
+-- 鍐嶇湅"璇ユ満鏋� + 璇ラ櫌鍖� + 璇ョ瀹�"锛堝氨鏄繖娆″叆鍙傜殑杩囨护缁勫悎锛�
+SELECT
+    COUNT(*)                                                    AS scope_alive_rows,
+    SUM(endtime IS NULL)                                        AS scope_in_by_endtime,
+    SUM(inhospstate = '0')                                      AS scope_in_by_state
+FROM pat_med_inhosp
+WHERE del_flag = '0' AND orgid = '<ORGID>'
+  AND hospitaldistrictcode = '<DISTRICT>' AND deptcode = '<DEPT>';
+
+
+-- ----------------------------------------------------------------------------
+-- 3) 鍒嗘璁℃椂锛堜竴鏉′竴鏉¤窇锛岀湅绉掓暟钀藉湪鍝竴姝ワ級
+-- ----------------------------------------------------------------------------
+
+-- 3a 鍙壂 pat_med_inhosp锛屼笉 join銆佷笉 group by锛氳繖鏄�"鍙栨暟"鐨勪笅闄愩�愭柊鍙e緞銆�
+SELECT COUNT(*) AS c
+FROM pat_med_inhosp b
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0';
+
+-- 3g 鈽呭鐓э細鍚屼竴鏉★紝浣嗗幓鎺� inhospstate锛�= 鏀归�犲墠鐨勫彛寰勶級
+--    3a 涓� 3g 鐨勭鏁板樊 = "琛ヤ笂 inhospstate 鍒板簳鏁戝洖鏉ュ灏�"銆�
+--    濡傛灉 3g 杩樻槸鍑犵鑰� 3a 鏄绉掔骇锛岃鏄庣梾鍥犲氨鏄畠锛屽埌姝や负姝紱
+SELECT COUNT(*) AS c
+FROM pat_med_inhosp b
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL;
+
+-- 3b 鍔犱笂 join pat_archive锛堝垽 a.del_flag / a.idcardno锛夛細join 璐典笉璐�
+SELECT COUNT(*) AS c
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL;
+
+-- 3c 鏀归�犮�愬墠銆戠殑 count锛�60 鍒� + GROUP BY 鏁翠釜鍖呬竴灞傦級鈥斺�� 杩欏氨鏄浼樺寲鎺夌殑閭f潯
+SELECT COUNT(0) AS c FROM (
+  SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime
+  FROM pat_med_inhosp b
+  JOIN pat_archive a ON a.id = b.patid
+  WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+    AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+    AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL
+  GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex
+) tmp_count;
+
+-- 3d 鏁版嵁鏌ヨ銆愬幓鎺� GROUP BY 鍜� ORDER BY銆戯細绾彇 20 琛岃澶氫箙
+SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL
+LIMIT 20;
+
+-- 3e 鏁版嵁鏌ヨ銆愬姞 GROUP BY锛屼笉鍔� ORDER BY銆戯細group by 鐨勪唬浠�
+SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL
+GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex
+LIMIT 20;
+
+-- 3f 鐜扮姸鍏ㄨ矊锛�= 鎺ュ彛鐪熸鎵ц鐨勯偅鏉★級锛氬啀鍔� ORDER BY
+SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL
+GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex
+ORDER BY b.starttime DESC, b.bed_no ASC
+LIMIT 20;
+
+-- 璇绘硶锛�
+--   3g 鎱€��3a 蹇�      -> 鐥呭洜灏辨槸"鍦ㄩ櫌鍙e緞"锛屾湰娆¤ˉ inhospstate='0' 宸茶В鍐筹紝鏀跺伐
+--   3a 鎱�             -> 鍙栨暟灏辫蛋閿欒矾浜嗭紙绱㈠紩缂哄け / 绫诲瀷瀛楃闆嗕笉涓�鑷达級锛岀湅绗� 1銆�2銆�5 鑺�
+--   3a 蹇��3b 鎱�      -> join 鏈夐棶棰橈紙patid/id 绫诲瀷鎴栧瓧绗﹂泦涓嶄竴鑷达紝鐪嬬 5 鑺傦級
+--   3b 蹇��3e 鎱�      -> GROUP BY 鐨勪唬浠凤紱鍙互纭"GROUP BY 鏄┖鎿嶄綔"鍚庡垹鎺�
+--   3e 蹇��3f 鎱�      -> ORDER BY 鐨� filesort 浠d环锛涘彲鑰冭檻璁╃储寮曢『搴忚鐩栨帓搴�
+--   3c 鏄庢樉鎱簬 3b    -> 璇存槑杩欐鐨勬墜鍐� count 鏀归�犵‘瀹炵渷鎺変簡澶уご
+
+
+-- ----------------------------------------------------------------------------
+-- 4) 鎵ц璁″垝锛圡ySQL 5.7 鐢ㄦ櫘閫� EXPLAIN锛�8.0.17+ 鐩存帴鐢� EXPLAIN ANALYZE 鐪嬬湡瀹炶�楁椂锛�
+-- ----------------------------------------------------------------------------
+EXPLAIN
+SELECT a.age, a.telcode, a.sex, b.inhospid, b.patid, b.deptcode, b.bed_no, b.starttime
+FROM pat_med_inhosp b
+JOIN pat_archive a ON a.id = b.patid
+WHERE b.del_flag = '0' AND b.orgid = '<ORGID>'
+  AND b.hospitaldistrictcode = '<DISTRICT>' AND b.deptcode = '<DEPT>'
+  AND b.endtime IS NULL AND b.inhospstate = '0' AND a.del_flag = '0' AND a.idcardno IS NOT NULL
+GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex
+ORDER BY b.starttime DESC, b.bed_no ASC
+LIMIT 20;
+
+-- 8.0.17+ 鎵嶆湁锛氱洿鎺ョ粰鍑烘瘡涓畻瀛愮殑瀹為檯琛屾暟/鑰楁椂锛屾瘮 EXPLAIN 鏈夌敤寰楀
+-- EXPLAIN ANALYZE
+-- SELECT ... (鍚屼笂闈㈣繖鏉�)
+
+-- 鐪� EXPLAIN 鏃跺彧鐩� 4 鍒楋細
+--   table  : 绗竴琛屾槸涓嶆槸 b锛堝鏋滅涓�琛屾槸 a锛岃鏄庝紭鍖栧櫒鍙嶇潃椹卞姩锛屾渶鍧忔儏鍐碉級
+--   type   : ALL / index = 鍏ㄦ壂锛堥棶棰橈級锛況ef / range = 璧扮储寮曪紙姝e父锛�
+--   key    : 鍛戒腑鐨勭储寮曞悕锛汵ULL = 娌$敤绱㈠紩
+--   rows   : 浼扮畻鎵弿琛屾暟锛堝嚑涓囦互涓婂氨鏄叏鏈烘瀯鍘嗗彶锛岃鏄庡彛寰�/绱㈠紩浠嶄笉瀵癸級
+
+
+-- ----------------------------------------------------------------------------
+-- 5) join 閿竴鑷存�э紙绗� 1 鑺傜湅涓嶆槑鐧藉氨璺戣繖鏉★紝鐩存帴缁欏嚭"浼氫笉浼氶殣寮忚浆鎹�"鐨勭粨璁猴級
+-- ----------------------------------------------------------------------------
+SELECT
+    b_col.COLUMN_TYPE   AS b_patid_type,
+    b_col.COLLATION_NAME AS b_patid_collation,
+    a_col.COLUMN_TYPE   AS a_id_type,
+    a_col.COLLATION_NAME AS a_id_collation,
+    CASE
+        WHEN a_col.COLUMN_TYPE = b_col.COLUMN_TYPE
+         AND IFNULL(a_col.COLLATION_NAME,'') = IFNULL(b_col.COLLATION_NAME,'')
+        THEN '鉁� 涓�鑷达紝join 鍙互鐢� a.id 涓婚敭'
+        ELSE '鉂� 涓嶄竴鑷� -> join 閿闅愬紡杞崲锛宲at_archive 鍙兘琚弽澶嶅叏鎵�'
+    END AS verdict
+FROM (SELECT COLUMN_TYPE, COLLATION_NAME FROM information_schema.COLUMNS
+      WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pat_med_inhosp' AND COLUMN_NAME = 'patid') b_col
+JOIN (SELECT COLUMN_TYPE, COLLATION_NAME FROM information_schema.COLUMNS
+      WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pat_archive' AND COLUMN_NAME = 'id') a_col;
+
+
+-- ============================================================================
+-- 瑕佽创鍥炴潵鐨勪笢瑗匡紙濡傛灉琛ヤ簡 inhospstate 涔嬪悗杩樻槸鎱紝鎸夎繖涓『搴忥紝鏈�鐪佷簨鐨勪笁椤瑰氨澶燂級锛�
+--   鈶� 绗� 3 鑺� 3a 鍜� 3g 鐨勭鏁帮紙杩欎袱涓竴瀵规瘮灏辩煡閬撶梾鍥犳槸涓嶆槸"鍦ㄩ櫌鍙e緞"锛�
+--   鈶� 绗� 2 鑺傜涓�缁勭殑鍥涗釜鏁板瓧锛坱otal_rows / in_by_endtime / in_by_state / conflict...锛�
+--   鈶� 绗� 4 鑺� EXPLAIN 鐨� table / type / key / rows 鍥涘垪
+--   鈶� 闇�瑕佹椂鍐嶈ˉ绗� 1 鑺傜储寮曟竻鍗曚笌绗� 5 鑺傜殑 join 閿竴鑷存�х粨璁�
+-- ============================================================================
diff --git a/sql/perf_sf_statistics_details_20261102.sql b/sql/perf_sf_statistics_details_20261102.sql
new file mode 100644
index 0000000..ccbcdfe
--- /dev/null
+++ b/sql/perf_sf_statistics_details_20261102.sql
@@ -0,0 +1,105 @@
+-- ============================================================================
+-- /smartor/serviceSubtask/getSfStatisticsCountDetails 鎱㈡煡璇紭鍖栵紙鍗楀崕闄勪竴 nhfy锛�
+--                                                          2026-11-02
+--
+-- 銆愮幇璞°�戞弧鎰忓害缁熻椤电偣鈥滄煡鐪嬭鎯呪�濊绛夊崄鍑犵鍒颁簩鍗佸嚑绉掋��
+--   璇锋眰锛歿 "configKey":"joyCount", "leavehospitaldistrictcodes":["40003514"],
+--           "serviceType":[6], "pageNum":1, "pageSize":20 }
+--
+-- 銆愯繖鏉℃帴鍙e疄闄呭彂浜� 5 鏉� SQL銆�
+--   ServiceSubtaskServiceImpl#getSfStatisticsScriptDetails 鍦� type 涓虹┖鏃朵細璺戜袱瓒燂細
+--     type=1(璇煶)  鈫� getSfStatisticsScriptDetails + getSfStatisticsScriptItemDetails
+--     type=2(闂嵎)  鈫� getSfStatisticsScriptDetails + getSfStatisticsScriptItemDetails
+--   controller 涓婅繕鏈� PageUtils.startPageByPost(...)锛孭ageHelper 浼氬绗竴鏉″啀琛ヤ竴娆� COUNT銆�
+--   姣忎竴鏉¢兘鍦� service_subtask_detail锛�38 涓囪锛変笂鍋氥�屽瓙浠诲姟 JOIN 棰樼洰鏄庣粏 GROUP BY銆嶃��
+--
+-- 銆愭牴鍥狅細璋撹瘝鎶婂垪鍖呭湪鍑芥暟閲岋紝绱㈠紩鍏ㄥ簾銆�
+--   涓轰簡銆屽嚭闄㈢梾鍖轰负绌哄洖閫�鍒板湪闄㈢梾鍖恒�嶏紝鏉′欢鍐欐垚浜�
+--       AND IFNULL(ss.leavehospitaldistrictcode, ss.hospitaldistrictcode) IN ('40003514')
+--   鍒楄 IFNULL 鍖呬綇 鈫� 浼樺寲鍣ㄧ敤涓嶄簡浠讳綍绱㈠紩锛屽彧鑳� orgid='20001001' 鐨� 27864 鏉″瓙浠诲姟鍏ㄦ壂锛�
+--   姣忔潯鍐嶅幓 detail 琛ㄦ寜 sub_id 鎹� 11 琛岋紙鈮�30 涓囪闅忔満璇伙級銆�
+--   EXPLAIN 瀹炴祴锛歴s 璧� idx_service_subtask_orgid_visit_time锛宺ows=27864銆�
+--
+-- 銆愭敼娉� 1锛氳皳璇嶅睍寮�鎴愮瓑浠风殑 OR锛岃绱㈠紩鍙敤銆�
+--       AND (ss.leavehospitaldistrictcode IN ('40003514')
+--            OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN ('40003514')))
+--   璇箟涓� IFNULL 瀹屽叏绛変环锛�4 涓梾鍖洪�愪竴姣斿鏄庣粏琛屾暟锛�8873/95/4307/8550 鍏ㄩ儴涓�鑷达級銆�
+--   鍙仛杩欎竴姝ワ紙涓嶅姞绱㈠紩锛夛細5.1s 鈫� 1.9s锛屾墽琛岃鍒掑彉鎴� ref_or_null锛宺ows 27864 鈫� 3644銆�
+--
+-- 銆愭敼娉� 2锛氳ˉ涓や釜绱㈠紩锛屾妸鑼冨洿鍐嶆敹绐勩��
+--   鏄庣粏椤靛浐瀹氭寜 (鐥呭尯, service_type, type) 杩囨护锛屽師鏉ユ病鏈変换浣曠储寮曡兘瑕嗙洊杩欎釜缁勫悎
+--   锛坰ervice_subtask 涓婂彧鏈夊崟鍒� index锛屾垨 visit_time 鎵撳ご鐨勫鍚堢储寮曪級銆�
+--
+--   绂婚櫌鐥呭尯锛堝惈绌哄�煎洖閫�锛夆啋 idx_ss_district_pair
+--   鍦ㄩ櫌鐥呭尯             鈫� idx_ss_hosp_dist_svc_type
+--
+-- 銆愬疄娴嬶紙192.168.99.192 / smartor_nhfy锛屽悓涓�鏉′欢涓嬬殑鍗曟潯 SQL锛夈��
+--   绂婚櫌鐥呭尯 40003514锛�5120ms 鈫� 1593ms(鍐�) / 728ms(鐑�)
+--   鍦ㄩ櫌鐥呭尯 40003514锛�4750ms 鈫� 1854ms
+--   鏄庣粏閫夐」缁熻      锛�6183ms 鈫� 629~1104ms
+--   涓�娆¤皟鐢� 5 鏉� SQL 鍚堣锛氣増23s 鈫� 鈮�2s
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愪竴銆慏DL锛堟瘡涓幆澧冮兘瑕佸崟鐙墽琛岋紱MySQL 8 鏀寔 Online DDL锛屼笉浼氶攣琛級
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE service_subtask
+--     ADD INDEX idx_ss_district_pair
+--         (leavehospitaldistrictcode, hospitaldistrictcode, service_type, type, del_flag),
+--     ADD INDEX idx_ss_hosp_dist_svc_type
+--         (hospitaldistrictcode, service_type, type, del_flag);
+
+-- 鍗曠嫭鎵ц鍐欐硶锛堝凡鍦� 192.168.99.192 鎵ц杩囷紝涓ゆ潯鍚� 5~8 绉掞級锛�
+-- CREATE INDEX idx_ss_district_pair      ON service_subtask (leavehospitaldistrictcode, hospitaldistrictcode, service_type, type, del_flag);
+-- CREATE INDEX idx_ss_hosp_dist_svc_type ON service_subtask (hospitaldistrictcode, service_type, type, del_flag);
+
+-- 鍥炴粴锛�
+-- DROP INDEX idx_ss_district_pair      ON service_subtask;
+-- DROP INDEX idx_ss_hosp_dist_svc_type ON service_subtask;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愪簩銆戦獙璇佹墽琛岃鍒掞紙鎵ц DDL 鍚庡簲鐪嬪埌 key = idx_ss_district_pair / idx_ss_hosp_dist_svc_type锛�
+-- ----------------------------------------------------------------------------
+-- EXPLAIN
+-- SELECT ssd.scriptid, COUNT(*) AS all_quantity
+-- FROM service_subtask_detail ssd
+-- INNER JOIN service_subtask ss ON ssd.sub_id = ss.id
+-- WHERE ss.del_flag = 0 AND ssd.del_flag = 0
+--   AND ss.orgid = '20001001' AND ss.campusid = '30001002'
+--   AND (ss.leavehospitaldistrictcode IN ('40003514')
+--        OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN ('40003514')))
+--   AND ss.service_type IN (6) AND ss.type = '2'
+--   AND ssd.categoryid IN (62,1000000012,5,1000000015,465)
+-- GROUP BY ssd.scriptid;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愪笁銆戠瓑浠锋�ц嚜妫�锛氭崲鍐欐硶鍓嶅悗姣忎釜鐥呭尯鐨勬槑缁嗚鏁板繀椤讳竴妯′竴鏍�
+-- ----------------------------------------------------------------------------
+-- SELECT w.code,
+--        (SELECT COUNT(*) FROM service_subtask ss JOIN service_subtask_detail ssd ON ssd.sub_id = ss.id
+--         WHERE ss.del_flag=0 AND ssd.del_flag=0
+--           AND ss.orgid='20001001' AND ss.campusid='30001002'
+--           AND ss.service_type IN (6) AND ss.type='2'
+--           AND IFNULL(ss.leavehospitaldistrictcode, ss.hospitaldistrictcode) IN (w.code))     AS ifnull_rows,
+--        (SELECT COUNT(*) FROM service_subtask ss JOIN service_subtask_detail ssd ON ssd.sub_id = ss.id
+--         WHERE ss.del_flag=0 AND ssd.del_flag=0
+--           AND ss.orgid='20001001' AND ss.campusid='30001002'
+--           AND ss.service_type IN (6) AND ss.type='2'
+--           AND (ss.leavehospitaldistrictcode IN (w.code)
+--                OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN (w.code)))) AS or_rows
+-- FROM (SELECT '40003514' AS code UNION ALL SELECT '40003309'
+--       UNION ALL SELECT '40011024' UNION ALL SELECT '40003317') w;
+-- 瀹炴祴锛�8873/8873銆�95/95銆�4307/4307銆�8550/8550 鈥斺�� 瀹屽叏涓�鑷淬��
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愬洓銆戣繕娌¤В鍐崇殑涓ょ偣锛堥渶瑕佷笟鍔�/鍓嶇閰嶅悎锛屾湰娆℃湭鍔級
+-- ----------------------------------------------------------------------------
+-- 1) type 涓虹┖鏃跺浐瀹氳窇涓よ稛锛堣闊� + 闂嵎锛夈�傚崡鍗庢弧鎰忓害鍙彲鑳芥槸闂嵎(type=2)锛�
+--    璇煶閭d竴瓒熸亽涓� 0 琛屻�傜幇鍦ㄦ湁绱㈠紩鍚庡畠鍙 ~120ms锛屽彲浠ユ帴鍙楋紱
+--    鑻ヨ褰诲簳鐪佹帀锛岃鍓嶇鏄庣‘浼� type锛屾垨鍚庣鎸� serviceType 鎺ㄦ柇銆�
+-- 2) PageHelper 鐨� COUNT 浼氬鍚屼竴鏉¢噸鏌ヨ鍐嶈窇涓�閬嶃�傝繖涓粨鏋滈泦鍙湁 19 琛岋紝
+--    鍏跺疄涓嶉渶瑕佸垎椤点�傝鐪佸氨寰楀幓鎺� startPageByPost锛屾帴鍙h繑鍥炵粨鏋勪細鍙橈紝鍏堜笉鍔ㄣ��
diff --git a/sql/rename_service_subtask_dims_20261106.sql b/sql/rename_service_subtask_dims_20261106.sql
new file mode 100644
index 0000000..56560d9
--- /dev/null
+++ b/sql/rename_service_subtask_dims_20261106.sql
@@ -0,0 +1,105 @@
+-- ============================================================================
+-- service_subtask 瀛楁鏀瑰悕锛堝嚭闄㈢淮搴� 鈫� leavel*锛屽鐢� sendlimit* 绌哄垪 鈫� 鍦ㄩ櫌鐥呭尯 / 鍦ㄩ櫌绉戝锛�
+-- 鐢熸垚鏃ユ湡锛�2026-11-06
+-- 閫傜敤锛歁ySQL 8.0锛堟湰浠撳簱 SQL 鐢ㄥ埌 JSON_TABLE锛�5.7 瑙佹枃鏈�屽吋瀹瑰啓娉曘�嶏級
+--
+-- 鏀瑰悕鏄犲皠锛�
+--   deptcode        鈫� leaveldeptcode      锛堝師鏈夎涔� = 鍑洪櫌绉戝锛�
+--   deptname        鈫� leaveldeptname
+--   sendlimitabegin 鈫� hospitaldistrictcode锛堝師銆屼笂鍗堝紑濮嬪彂閫佹椂闂撮檺鍒躲�嶏紝4 鍒楀潎鏈涓氬姟璇诲啓锛�
+--   sendlimitaend   鈫� hospitaldistrictname锛堝鐢ㄤ负銆屽湪闄㈢梾鍖恒�嶏紝鍚� pat_med_inhosp.hospitaldistrictcode锛�
+--   sendlimitpbegin 鈫� deptcode            锛堝鐢ㄤ负銆屽湪闄㈢瀹ゃ�嶏級
+--   sendlimitpend   鈫� deptname
+--   sendlimitnbegin / sendlimitnend       鈫� 淇濈暀涓嶅姩
+--
+-- 鈿狅笍 椤哄簭涓嶈兘棰犲�掞細鍏堟妸 deptcode/deptname 鑵惧嚭鏉ワ紝鍐嶆妸 sendlimit* 鏀规垚杩欎袱涓悕瀛椼��
+-- 鈿狅笍 RENAME COLUMN 鍘熷湴淇濈暀鏁版嵁锛屾棫鏁版嵁鐨勫嚭闄㈢瀹や細鑷姩璺熷埌 leaveldeptcode/leaveldeptname銆�
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 0) 鍏堢湅鐜扮姸锛堟妸缁撴灉璐村嚭鏉ワ紝鏍稿闀垮害/绫诲瀷銆佺‘璁� sendlimit* 鏄惁瀛樺湪锛�
+-- ----------------------------------------------------------------------------
+SHOW FULL COLUMNS FROM service_subtask LIKE '%dept%';
+SHOW FULL COLUMNS FROM service_subtask LIKE 'sendlimit%';
+SHOW FULL COLUMNS FROM pat_med_inhosp LIKE '%leaveldept%';
+
+-- ----------------------------------------------------------------------------
+-- 0.5) 澶囦唤锛堝彲閫変絾寮虹儓寤鸿锛�
+-- ----------------------------------------------------------------------------
+-- CREATE TABLE bak_service_subtask_rename_20261106 LIKE service_subtask;
+-- INSERT INTO bak_service_subtask_rename_20261106 SELECT * FROM service_subtask;
+
+-- ----------------------------------------------------------------------------
+-- 1) 鍑洪櫌缁村害鏀瑰悕锛堣吘鍑� deptcode / deptname 涓や釜鍚嶅瓧锛�
+-- ----------------------------------------------------------------------------
+ALTER TABLE service_subtask
+  RENAME COLUMN deptcode TO leaveldeptcode,
+  RENAME COLUMN deptname TO leaveldeptname;
+
+-- ----------------------------------------------------------------------------
+-- 2) 4 涓┖闂插垪鏀规垚鏂拌涔�
+-- ----------------------------------------------------------------------------
+ALTER TABLE service_subtask
+  RENAME COLUMN sendlimitabegin  TO hospitaldistrictcode,
+  RENAME COLUMN sendlimitaend   TO hospitaldistrictname,
+  RENAME COLUMN sendlimitpbegin TO deptcode,
+  RENAME COLUMN sendlimitpend   TO deptname;
+
+-- ----------------------------------------------------------------------------
+-- 3) 闀垮害/绫诲瀷鏍″噯锛堝繀椤伙級
+--    RENAME COLUMN 浼氭部鐢� sendlimit* 鍘熸潵鐨勭被鍨嬶紙閫氬父鏄� VARCHAR(10) 鐢氳嚦 TIME锛夛紝
+--    瑁呭湪闄㈢瀹�/鍦ㄩ櫌鐥呭尯缂栫爜涓庡悕绉颁細涓嶅銆備笅闈㈡寜鎺ㄨ崘闀垮害鏀惧ぇ锛屼笉浼氱缉灏忓凡鏈夊垪銆�
+--    鑻ヤ綘搴撻噷 deptcode/deptname 鍘熸潵鏄洿闀跨殑 VARCHAR(255)锛岃鎶� 64/128 璋冨ぇ鑰屼笉鏄皟灏忋��
+-- ----------------------------------------------------------------------------
+ALTER TABLE service_subtask
+  MODIFY COLUMN hospitaldistrictcode VARCHAR(64)  NULL COMMENT '鍦ㄩ櫌鐥呭尯缂栫爜锛堝師 sendlimitabegin锛�',
+  MODIFY COLUMN hospitaldistrictname VARCHAR(128) NULL COMMENT '鍦ㄩ櫌鐥呭尯鍚嶇О锛堝師 sendlimitaend锛�',
+  MODIFY COLUMN deptcode             VARCHAR(64)  NULL COMMENT '鍦ㄩ櫌绉戝缂栫爜锛堝師 sendlimitpbegin锛�',
+  MODIFY COLUMN deptname             VARCHAR(128) NULL COMMENT '鍦ㄩ櫌绉戝鍚嶇О锛堝師 sendlimitpend锛�';
+
+-- ----------------------------------------------------------------------------
+-- 3.5) 濡傛灉绗� 3 姝ヤ箣鍓嶅凡缁忔墽琛岃繃锛堝垪娉ㄩ噴鍐欐垚浜嗐�岄櫌鍖恒�嶏級锛屽彧淇敞閲娿�佷笉鍔ㄦ暟鎹細
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE service_subtask
+--   MODIFY COLUMN hospitaldistrictcode VARCHAR(64)  NULL COMMENT '鍦ㄩ櫌鐥呭尯缂栫爜锛堝師 sendlimitabegin锛�',
+--   MODIFY COLUMN hospitaldistrictname VARCHAR(128) NULL COMMENT '鍦ㄩ櫌鐥呭尯鍚嶇О锛堝師 sendlimitaend锛�';
+
+-- ----------------------------------------------------------------------------
+-- 4) 娓呮帀 sendlimit* 鍙兘娈嬬暀鐨勬椂闂翠覆锛堝 '08:00:00'锛�
+--    鍏� SELECT 纭杩欎簺鍒楁湰鏉ュ氨鏃犳湁鏁堟暟鎹紝鍐嶆墽琛� UPDATE銆�
+-- ----------------------------------------------------------------------------
+-- SELECT COUNT(*) AS total,
+--        SUM(hospitaldistrictcode IS NOT NULL AND hospitaldistrictcode <> '') AS hd_code,
+--        SUM(hospitaldistrictname IS NOT NULL AND hospitaldistrictname <> '') AS hd_name,
+--        SUM(deptcode IS NOT NULL AND deptcode <> '') AS dept_code,
+--        SUM(deptname IS NOT NULL AND deptname <> '') AS dept_name
+--   FROM service_subtask;
+-- UPDATE service_subtask
+--    SET hospitaldistrictcode = NULL, hospitaldistrictname = NULL,
+--        deptcode = NULL, deptname = NULL;
+
+-- ----------------------------------------------------------------------------
+-- 5) 鏍稿
+-- ----------------------------------------------------------------------------
+SHOW FULL COLUMNS FROM service_subtask LIKE '%dept%';
+SHOW FULL COLUMNS FROM service_subtask LIKE 'hospitaldistrict%';
+
+-- ============================================================================
+-- 澶囬�� A锛歴endlimit* 鍒楀湪搴撻噷涓嶅瓨鍦紙绗� 2 姝ユ姤 1054锛夋椂锛屾敼鎴愭柊澧�
+-- ============================================================================
+-- ALTER TABLE service_subtask
+--   ADD COLUMN hospitaldistrictcode VARCHAR(64)  NULL COMMENT '闄㈠尯/鐥呭尯缂栫爜',
+--   ADD COLUMN hospitaldistrictname VARCHAR(128) NULL COMMENT '闄㈠尯/鐥呭尯鍚嶇О',
+--   ADD COLUMN deptcode             VARCHAR(64)  NULL COMMENT '绉戝缂栫爜锛堝叆闄�/鍦ㄩ櫌缁村害锛�',
+--   ADD COLUMN deptname             VARCHAR(128) NULL COMMENT '绉戝鍚嶇О锛堝叆闄�/鍦ㄩ櫌缁村害锛�';
+
+-- ============================================================================
+-- 澶囬�� B锛歁ySQL 5.7锛堜笉鏀寔 RENAME COLUMN锛夆啋 鐢� CHANGE锛屽畾涔夎涓庡師鍒椾竴鑷�
+-- ============================================================================
+-- ALTER TABLE service_subtask
+--   CHANGE COLUMN deptcode        leaveldeptcode       <鍘� deptcode 绫诲瀷> NULL COMMENT '鍑洪櫌绉戝缂栫爜',
+--   CHANGE COLUMN deptname        leaveldeptname       <鍘� deptname 绫诲瀷> NULL COMMENT '鍑洪櫌绉戝鍚嶇О',
+--   CHANGE COLUMN sendlimitabegin hospitaldistrictcode VARCHAR(64)  NULL COMMENT '闄㈠尯/鐥呭尯缂栫爜',
+--   CHANGE COLUMN sendlimitaend   hospitaldistrictname VARCHAR(128) NULL COMMENT '闄㈠尯/鐥呭尯鍚嶇О',
+--   CHANGE COLUMN sendlimitpbegin deptcode             VARCHAR(64)  NULL COMMENT '绉戝缂栫爜',
+--   CHANGE COLUMN sendlimitpend   deptname             VARCHAR(128) NULL COMMENT '绉戝鍚嶇О';
diff --git a/sql/service_out_path_radix_shortcode_20261106.sql b/sql/service_out_path_radix_shortcode_20261106.sql
new file mode 100644
index 0000000..c051ea9
--- /dev/null
+++ b/sql/service_out_path_radix_shortcode_20261106.sql
@@ -0,0 +1,31 @@
+-- =============================================================================
+-- 澶栭摼鐭爜鏀归�狅紙2026-11-06锛�
+--   鍘熺煭鐮侊細String.format("%03X", id)   鈥斺�� 3~4 浣嶅崄鍏繘鍒讹紝绛変簬鎶婅嚜澧炰富閿啓杩涢摼鎺ワ紝鍙亶鍘�
+--   鏂扮煭鐮侊細ShortCode.encode(id)        鈥斺�� 鍥哄畾 6 浣� base62锛屽甫瀵嗛挜 Feistel 鍙屽皠锛屼笉鍙灇涓�
+--
+-- 鈿狅笍 鎵ц椤哄簭锛�**鍏堟墽琛屾湰鑴氭湰绗� 2 姝ワ紝鍐嶅彂甯冩柊鐗堟湰鐨� jar**銆�
+--    鍚﹀垯鍐� 6 浣嶇煭鐮佹椂锛�
+--      * MySQL 涓ユ牸妯″紡锛�5.7+ 榛樿锛夆啋 UPDATE 鎶� "Data too long for column 'radix'"锛岀煭淇″彂涓嶅嚭鍘伙紱
+--      * 闈炰弗鏍兼ā寮� 鈫� 闈欓粯鎴柇鎴� 4 浣嶏紝radix 鍒楀彉鑴忔暟鎹�
+--        锛堢嚎涓婅繕鑳介潬 getInfoByParam 鍙嶈В涓婚敭鍏滃簳锛屼絾涓嶅簲渚濊禆杩欎釜鍏滃簳锛夈��
+--
+-- 鏈剼鏈彲閲嶅鎵ц銆�
+-- =============================================================================
+
+-- 1) 鍏堢湅褰撳墠鍒楀畾涔夛紙璁板綍鍘熷鍊硷紝渚夸簬鍥炴粴锛�
+SHOW COLUMNS FROM service_out_path LIKE 'radix';
+
+-- 2) 鍒楀涓嶈冻 6 浣嶆椂鎵ц锛涘凡 >= 16 浣嶅彲鏁村彞璺宠繃
+ALTER TABLE service_out_path
+    MODIFY COLUMN radix VARCHAR(16) NULL
+    COMMENT '澶栭摼鐭爜锛氭柊鏁版嵁涓� 6 浣� base62锛屽巻鍙叉暟鎹负 3~5 浣嶅崄鍏繘鍒讹紱getInfoByParam 涓ょ閮借';
+
+-- 3) 鎵ц鍚庢牳瀵�
+SHOW COLUMNS FROM service_out_path LIKE 'radix';
+
+-- 4) 瑙傚療瀛橀噺鍒嗗竷锛堜笂绾垮悗鏂颁骇鐢熺殑鐭爜搴斿叏閮ㄦ槸 6 浣嶏級
+-- SELECT CHAR_LENGTH(radix) AS len, COUNT(*) AS cnt
+-- FROM service_out_path
+-- WHERE radix IS NOT NULL AND radix <> ''
+-- GROUP BY CHAR_LENGTH(radix)
+-- ORDER BY len;
diff --git a/sql/service_subtask_index_opt.sql b/sql/service_subtask_index_opt.sql
new file mode 100644
index 0000000..c175747
--- /dev/null
+++ b/sql/service_subtask_index_opt.sql
@@ -0,0 +1,146 @@
+-- =====================================================================
+-- service_subtask 绱㈠紩浼樺寲鑴氭湰
+-- 鐩爣鎺ュ彛锛歅OST /smartor/serviceSubtask/patItem锛堝強鍏辩敤鍚屼竴濂� SQL 鐨� /patItemCount銆�/patItemExport锛�
+--
+-- 娑夊強鐨勪袱鏉� SQL锛堥兘鍦� ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml锛夛細
+--   1) id = selectServiceSubtaskList   鈥斺�� 鍒楄〃锛岀害 100 鍒� + order by + limit offset
+--   2) id = countByCondition           鈥斺�� 鍚屼竴濂� where 鐨� SUM 鑱氬悎锛圧edis 鏈懡涓椂鎵ц锛�
+--
+-- 鍏煎鎬э細MySQL 5.7 / 8.0 鍧囧彲鎵ц銆�
+--   * 5.7 涓嶆敮鎸侀檷搴忕储寮曪紝浣� ASC 绱㈠紩鍙鍙嶅悜鎵弿锛宱rder by ... desc 鍚屾牱鑳界敤锛屾棤闇�棰濆澶勭悊锛�
+--   * 5.7 娌℃湁 EXPLAIN ANALYZE锛岄獙璇佺敤鏂囨湯鐨� EXPLAIN + Handler 鐘舵�佸彉閲忋��
+-- =====================================================================
+
+-- ---------------------------------------------------------------------
+-- 0. 鎵ц鍓嶅厛鐪嬬幇鐘讹紙閬垮厤閲嶅寤虹储寮� / 纭鏁版嵁閲忎笌鍒楃被鍨嬶級
+-- ---------------------------------------------------------------------
+SHOW INDEX FROM service_subtask;
+
+SELECT COUNT(*) AS total_rows FROM service_subtask;
+
+SELECT COLUMN_NAME, COLUMN_TYPE
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'service_subtask'
+  AND COLUMN_NAME IN ('orgid', 'campusid', 'del_flag', 'endtime',
+                      'visit_time', 'sendstate', 'taskid', 'create_time',
+                      'patid', 'inhospid', 'schedule_id', 'loop_count');
+
+-- ---------------------------------------------------------------------
+-- 1. 蹇呭姞锛氬垪琛ㄤ富鏌ヨ / 鑱氬悎鐨勫叕鍏卞墠缂� + 鎺掑簭
+--
+--    where 鍥哄畾鏄� del_flag = 0 AND orgid = ? AND campusid = ?锛圕ontroller 寮哄埗娉ㄥ叆锛�
+--    order by 榛樿鏄� endtime asc/desc
+--    鈫� 鍛戒腑鍚� order by 涓嶅啀 filesort锛屼笖 limit 鍙互鎻愬墠鎴柇锛�
+--      鍚屾椂璁� countByCondition 浠庛�屽叏琛ㄦ壂鎻忋�嶉檷涓恒�屼竴涓満鏋�+闄㈠尯鐨勮寖鍥存壂鎻忋�嶃��
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_org_cam_del_endtime (orgid, campusid, del_flag, endtime),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 2. 蹇呭姞锛氭寜闅忚鏃堕棿鎺掑簭/绛涢�夛紙sort=2/3/7/8锛屼互鍙� startSendDateTime/endSendDateTime 鍖洪棿锛�
+--    娉細杩欎袱涓尯闂存潯浠跺凡鐢� date_format(...) 鏀瑰啓涓哄彲璧扮储寮曠殑鑼冨洿姣旇緝銆�
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_org_cam_del_vtime (orgid, campusid, del_flag, visit_time),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 3. 蹇呭姞锛氱姸鎬侀〉绛撅紙sendstateView 鈫� sendstate IN (1,2,3,5,7) / (6) / (4)锛�
+--    鐢ㄦ埛鏈�甯哥偣鐨勫氨鏄�屽緟闅忚 / 宸插畬鎴� / 鏃犻渶闅忚銆嶄笁涓� tab銆�
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_org_cam_del_state_end (orgid, campusid, del_flag, sendstate, endtime),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 4. 寤鸿锛氫换鍔$淮搴︿笅閽伙紙taskid 鏄繖寮犺〃鏈�楂橀鐨勭瓑鍊兼潯浠讹級
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_org_cam_del_task (orgid, campusid, del_flag, taskid),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 5. 寤鸿锛歝reate_time 鍖洪棿
+--    渚� selectServiceSubtaskListByCreateTime / selectServiceSubtaskListAgain 浣跨敤銆�
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_org_cam_del_ctime (orgid, campusid, del_flag, create_time),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 6. 寤鸿锛氭偅鑰� / 浣忛櫌璁板綍鍙嶆煡锛堟偅鑰呯銆佸啀娆¢殢璁裤�佽浆绉戦摼璺級
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_patid (patid),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_inhospid (inhospid),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 7. 寤鸿锛氫换鍔$粍婊氬姩璋冨害锛坈ountActiveByScheduleIdAndLoop锛岃窇寰楅潪甯稿嫟锛�
+-- ---------------------------------------------------------------------
+ALTER TABLE service_subtask
+    ADD INDEX idx_ss_sched_loop (schedule_id, loop_count),
+    ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 8. 鍙�夛細璁� countByCondition 鍙樻垚瑕嗙洊绱㈠紩锛堢储寮曞唴瀹屾垚鑱氬悎锛屼笉鍥炶〃锛�
+--    鍙湁褰� Redis 鍛戒腑鐜囦綆銆佺粺璁℃帴鍙d粛鐒舵參鏃舵墠鍔犮��
+--    浠d环锛歴ervice_subtask 鍐欏叆棰戠箒锛屽涓�涓绱㈠紩浼氬姞澶у啓鍏ュ紑閿�銆�
+-- ---------------------------------------------------------------------
+-- ALTER TABLE service_subtask
+--     ADD INDEX idx_ss_org_cam_del_state_excep (orgid, campusid, del_flag, sendstate, excep),
+--     ALGORITHM = INPLACE, LOCK = NONE;
+
+-- ---------------------------------------------------------------------
+-- 9. 鏀跺熬锛氭洿鏂扮粺璁′俊鎭紝璁╀紭鍖栧櫒绔嬪埢鐢ㄤ笂鏂扮储寮�
+-- ---------------------------------------------------------------------
+ANALYZE TABLE service_subtask;
+
+-- =====================================================================
+-- 楠岃瘉锛圡ySQL 5.7 鍙敤锛�
+-- =====================================================================
+
+-- 9.1 鍒楄〃涓绘煡璇細鏈熸湜 key = idx_ss_org_cam_del_endtime锛孍xtra 閲屻�愭病鏈夈�慤sing filesort
+EXPLAIN
+SELECT id, endtime
+FROM service_subtask
+WHERE del_flag = 0
+  AND orgid = '杩欓噷鎹㈡垚鐪熷疄 orgid'
+  AND campusid = '杩欓噷鎹㈡垚鐪熷疄 campusid'
+ORDER BY endtime DESC
+LIMIT 20 OFFSET 0;
+
+-- 9.2 鐘舵�侀〉绛撅細鏈熸湜 key = idx_ss_org_cam_del_state_end
+EXPLAIN
+SELECT id, endtime
+FROM service_subtask
+WHERE del_flag = 0
+  AND orgid = '杩欓噷鎹㈡垚鐪熷疄 orgid'
+  AND campusid = '杩欓噷鎹㈡垚鐪熷疄 campusid'
+  AND sendstate IN (1, 2, 3, 5, 7)
+ORDER BY endtime DESC
+LIMIT 20 OFFSET 0;
+
+-- 9.3 瀹為檯鎵弿閲忓姣旓紙鎵ц鍓嶅悗鍚勮窇涓�娆★紝鐪� Handler_read_next 鏄惁澶у箙涓嬮檷锛�
+FLUSH STATUS;
+SELECT COUNT(1) FROM service_subtask
+WHERE del_flag = 0 AND orgid = '杩欓噷鎹㈡垚鐪熷疄 orgid' AND campusid = '杩欓噷鎹㈡垚鐪熷疄 campusid';
+SHOW SESSION STATUS LIKE 'Handler_read%';
+
+-- =====================================================================
+-- 鍥炴粴
+-- =====================================================================
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_endtime;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_vtime;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_state_end;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_task;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_ctime;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_patid;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_inhospid;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_sched_loop;
+-- ALTER TABLE service_subtask DROP INDEX idx_ss_org_cam_del_state_excep;
diff --git a/sql/sltdMydTotalByDimension_index_20260924.sql b/sql/sltdMydTotalByDimension_index_20260924.sql
new file mode 100644
index 0000000..3db4741
--- /dev/null
+++ b/sql/sltdMydTotalByDimension_index_20260924.sql
@@ -0,0 +1,139 @@
+-- ============================================================================
+-- smartor_sltd 鏁版嵁搴� 婊℃剰搴︾淮搴︾粺璁℃帴鍙f�ц兘浼樺寲 鈥斺�� 绱㈠紩鑴氭湰
+-- 鐢熸垚鏃ユ湡: 20260924
+-- 鐩爣鎺ュ彛: POST /smartor/serviceSubtaskDetail/sltdMydTotalByDimension
+--           (dimensiontType=1 鈫� ServiceSubtaskMapper.sltdMydTotalByDimension
+--            dimensiontType=2 鈫� ServiceSubtaskMapper.sltdMydTotalByYQ锛屽悓鏍峰彈鐩�)
+-- 鐩爣 SQL: smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml:3050
+--
+-- 銆愰棶棰樺畾浣嶃�戯紙绾夸笂搴撳疄娴嬶細MySQL 5.7.34锛宻ervice_subtask_detail 102,249 琛� /
+--  service_task 153 琛岋紝涓ゅ紶琛ㄩ櫎涓婚敭澶栨病鏈変换浣曚簩绾х储寮曪級
+--
+--  EXPLAIN 缁撴灉鏄剧ず 4 涓闂矾寰勫叏閮ㄦ槸 type=ALL 鍏ㄨ〃鎵弿 + Block Nested Loop锛�
+--    id=2 DERIVED  service_subtask_detail  ALL  rows=101778   -- period 鏃堕棿娈靛瓙鏌ヨ
+--    id=3 DERIVED  service_subtask_detail  ALL  rows=101778   -- dimension 缁村害瀛愭煡璇�
+--    id=1 PRIMARY  t (service_task)        ALL  rows=153
+--    id=1 PRIMARY  d (service_subtask_detail) ALL rows=101778 -- Using join buffer
+--
+--  鍗筹細涓绘煡璇㈤噷 d.taskid = t.taskid 娌℃湁绱㈠紩锛�102,778 琛岀殑鏄庣粏琛ㄨ褰撴垚 BNL 鍐呰〃
+--  鍙嶅鍏ㄨ〃鎵弿锛岃繖鏄帴鍙f參鐨勬牴鏈師鍥狅紱涓や釜娲剧敓琛ㄤ篃鍚勮嚜鍏ㄨ〃鎵弿涓�娆°��
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 銆愭墽琛屽墠妫�鏌ャ�戠‘璁ゅ綋鍓嶇‘瀹炴病鏈夎繖浜涚储寮曪紙姝e父搴斿彧鐪嬪埌 PRIMARY锛�
+-- ----------------------------------------------------------------------------
+-- SHOW INDEX FROM service_subtask_detail;
+-- SHOW INDEX FROM service_task;
+-- SELECT COUNT(*) FROM service_subtask_detail;   -- 绾� 10 涓囪锛屽姞绱㈠紩绾﹂渶 10~60 绉�
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愭楠� 1銆憇ervice_subtask_detail 澧炲姞 3 涓储寮�
+--
+--  1) idx_ssd_taskid_flag_dim_ct (taskid, del_flag, dimension, create_time)
+--     鐢ㄩ�旓細涓绘煡璇㈢殑 JOIN 鏉′欢 d.taskid = t.taskid
+--           + d.del_flag = '0' + d.dimension = dim.dimension锛堢瓑鍊硷級
+--           + d.create_time 鍖洪棿锛堣寖鍥达級銆�
+--     鏁堟灉锛氱敱銆屽叏琛ㄦ壂鎻� 10 涓囪銆嶅彉涓恒�屾寜 taskid 绮剧‘瀹氫綅绾� 700 琛屻�嶃��
+--
+--  2) idx_ssd_ct_flag (create_time, del_flag)
+--     鐢ㄩ�旓細period 鏃堕棿娈靛瓙鏌ヨ
+--           WHERE del_flag='0' AND create_time >= ? AND create_time < ?
+--     鏁堟灉锛歝reate_time 璧拌寖鍥存壂鎻忥紱del_flag 铏藉湪绱㈠紩绗簩浣嶄絾浠嶅彲鍋�
+--           Index Condition Pushdown 杩囨护锛屼笉蹇呭洖琛紝鐪佹帀 10 涓囪鍥炶〃銆�
+--     锛堟敞鎰忥細del_flag 蹇呴』鏀剧浜屼綅锛屾妸 create_time 鏀剧涓�浣嶆墠鑳界敤涓婅寖鍥存壂鎻忥級
+--
+--  3) idx_ssd_flag_dim (del_flag, dimension)
+--     鐢ㄩ�旓細dim 缁村害瀛愭煡璇�
+--           SELECT DISTINCT dimension FROM service_subtask_detail
+--           WHERE del_flag='0' AND dimension IS NOT NULL
+--     鏁堟灉锛氱储寮曡鐩栬瀛愭煡璇紝鍙蛋鏉炬暎绱㈠紩鎵弿锛圲sing index for group-by锛夛紝
+--           dimension 鍙湁 16 涓笉鍚屽�硷紝鍩烘湰鐬棿杩斿洖銆�
+--
+--  MySQL 5.7 鐨� ALTER TABLE 鍔犱簩绾х储寮曟敮鎸� ONLINE DDL锛堜笉閿佽〃銆佷笉闃诲璇诲啓锛夛紝
+--  涓嬮潰鏄惧紡澹版槑 ALGORITHM=INPLACE, LOCK=NONE锛涗笁鏉$储寮曟斁鍦ㄥ悓涓�鏉� ALTER 閲岋紝
+--  鍙渶鎵弿涓�娆¤〃锛屾瘮鍒嗗紑鎵ц蹇�傝嫢涓�旀姤閿欎笉鏀寔锛屽幓鎺夎繖涓や釜閫夐」閲嶈瘯鍗冲彲銆�
+-- ----------------------------------------------------------------------------
+ALTER TABLE service_subtask_detail
+    ADD INDEX idx_ssd_taskid_flag_dim_ct (taskid, del_flag, dimension, create_time),
+    ADD INDEX idx_ssd_ct_flag (create_time, del_flag),
+    ADD INDEX idx_ssd_flag_dim (del_flag, dimension),
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愭楠� 2銆憇ervice_task 澧炲姞 1 涓储寮�
+--
+--  4) idx_st_type_flag (service_type, del_flag)
+--     鐢ㄩ�旓細LEFT JOIN service_task t ON t.service_type IN (6,14) AND t.del_flag='0'
+--     鏁堟灉锛歴ervice_task 鍙湁 153 琛岋紝鏀剁泭鏈夐檺锛�153 琛� 鈫� 46 琛岋級锛�
+--           浣嗚兘璁╄琛ㄤ篃璧扮储寮曘�侀伩鍏嶄綔涓� BNL 澶栬〃鍏ㄦ壂锛屽睘浜庨『甯︿紭鍖栥��
+-- ----------------------------------------------------------------------------
+ALTER TABLE service_task
+    ADD INDEX idx_st_type_flag (service_type, del_flag),
+    ALGORITHM = INPLACE,
+    LOCK = NONE;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愭楠� 3銆戞洿鏂扮粺璁′俊鎭紙鍔犲畬绱㈠紩鍚庢墽琛屼竴娆★紝璁╀紭鍖栧櫒閫夊绱㈠紩锛�
+-- ----------------------------------------------------------------------------
+ANALYZE TABLE service_subtask_detail;
+ANALYZE TABLE service_task;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愰獙璇併�戞墽琛屼笅闈袱鏉� EXPLAIN锛屽叧閿湅锛�
+--   * 涓嶅啀鍑虹幇 type=ALL 鍏ㄨ〃鎵弿锛堥櫎娲剧敓琛ㄥ锛�
+--   * d 琛屽嚭鐜� type=ref / key=idx_ssd_taskid_flag_dim_ct
+--   * service_task 琛� key=idx_st_type_flag
+-- ----------------------------------------------------------------------------
+-- EXPLAIN
+-- SELECT p.period, dim.dimension, IFNULL(ROUND(SUM(d.score), 2), 0) AS totalScore
+-- FROM (SELECT DISTINCT DATE_FORMAT(d.create_time, '%Y-%m') AS period
+--       FROM service_subtask_detail d
+--       WHERE d.del_flag = '0' AND d.create_time >= '2025-01-01' AND d.create_time < '2026-12-31') p
+-- CROSS JOIN (SELECT DISTINCT dimension FROM service_subtask_detail
+--             WHERE del_flag = '0' AND dimension IS NOT NULL) dim
+-- LEFT JOIN service_task t ON t.service_type IN (6, 14) AND t.del_flag = '0'
+-- LEFT JOIN service_subtask_detail d
+--        ON d.taskid = t.taskid AND d.del_flag = '0' AND d.dimension = dim.dimension
+--       AND DATE_FORMAT(d.create_time, '%Y-%m') = p.period
+--       AND d.create_time >= '2025-01-01' AND d.create_time < '2026-12-31'
+-- GROUP BY p.period, dim.dimension ORDER BY p.period, dim.dimension;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆愬洖婊氥�戝闇�鎾ら攢锛屾墽琛屼互涓嬭鍙�
+-- ----------------------------------------------------------------------------
+-- ALTER TABLE service_subtask_detail DROP INDEX idx_ssd_taskid_flag_dim_ct;
+-- ALTER TABLE service_subtask_detail DROP INDEX idx_ssd_ct_flag;
+-- ALTER TABLE service_subtask_detail DROP INDEX idx_ssd_flag_dim;
+-- ALTER TABLE service_task DROP INDEX idx_st_type_flag;
+
+
+-- ============================================================================
+-- 銆愰噸瑕併�戜唬鐮佷晶蹇呴』鍚屾淇 del_flag 鐨勫啓娉曪紝鍚﹀垯绱㈠紩鍙兘鐢ㄤ笂涓�鍗�
+--
+-- ServiceSubtaskMapper.xml 涓啓鐨勬槸锛�  d.del_flag = 0
+-- 浣� del_flag 鐨勫垪绫诲瀷鏄� char(10)锛堝彇鍊� '0' / '1'锛夈��
+-- MySQL 鍦ㄣ�屽瓧绗︿覆鍒� = 鏁板瓧甯搁噺銆嶆椂浼氭寜 DOUBLE 闅愬紡杞崲姣旇緝锛�
+-- 瀵艰嚧璇ユ潯浠舵棤娉曚綔涓虹储寮曠殑绛夊�兼潯浠朵娇鐢紙鍙兘杩囨护锛屼笉鑳藉畾浣嶏級銆�
+-- 涓婇潰 3 涓储寮曢噷 del_flag 閮芥槸绛夊�煎垪锛屾敼鎴愪笅闈㈣繖鏍锋墠绠楃湡姝g敓鏁堬細
+--
+--   d.del_flag  = 0   鈫�   d.del_flag  = '0'
+--   del_flag    = 0   鈫�   del_flag    = '0'
+--   t.del_flag  = 0   鈫�   t.del_flag  = '0'
+--
+-- 閫傜敤鑼冨洿锛堝悓涓�鏂囦欢鍐呭悓鏍烽棶棰樼殑鏌ヨ锛屽缓璁竴璧锋敼锛夛細
+--   * sltdMydTotalByDimension   (3050 琛岄檮杩�)
+--   * sltdMydTotalByYQ          (3097 琛岄檮杩�)
+--   * mydTrend                  (3030 琛岄檮杩�)
+-- 璇箟褰卞搷锛�'0' 涓� 0 鐨勫尮閰嶇粨鏋滃湪鏈簱涓畬鍏ㄤ竴鑷达紙del_flag 瀹炴祴鍙湁 '0'銆�'1'
+-- 涓ょ鍙栧�硷紝鏃� NULL銆佹棤绌轰覆锛夛紝鏀规垚瀛楃涓叉瘮杈冧笉浼氭敼鍙樹笟鍔$粨鏋溿��
+--
+-- 鍙︼細鏈帴鍙d袱鏉� SQL 鐨� LEFT JOIN service_task t 鍚庨潰娌℃湁璺熶换浣曞叧鑱旀潯浠�
+-- 锛圤N 閲屽彧鏈� t 鑷繁鐨勮繃婊ゆ潯浠讹級锛岀瓑浠蜂簬鍏堝 service_task 鍋氫竴娆¤繃婊ゅ啀浜ゅ弶
+-- 杩炴帴锛屾湰韬啓娉曚笉瑙勮寖锛涙湰娆″彧鍔犵储寮曘�佷笉鍔� SQL锛岄伩鍏嶅奖鍝嶈繑鍥炵粨鏋勩��
+-- ============================================================================
diff --git a/sql/sync_svy_lib_default_value_to_task_20261106.sql b/sql/sync_svy_lib_default_value_to_task_20261106.sql
new file mode 100644
index 0000000..e5e727d
--- /dev/null
+++ b/sql/sync_svy_lib_default_value_to_task_20261106.sql
@@ -0,0 +1,282 @@
+-- ============================================================================
+-- 鎶娿�岄棶鍗峰簱妯℃澘銆嶉鐩殑閫夐」榛樿鍊硷紙svy_lib_template_targetoption.default_value锛�
+-- 鍚屾鍒般�岄棶鍗蜂换鍔℃ā鏉裤�嶉鐩�夐」锛坰vy_task_template_targetoption.default_value锛�
+--
+-- 琛ㄥ悕璇存槑锛堥棶棰橀�夐」鐨勯粯璁ゅ�煎叾瀹炰笉鍦� script 琛ㄩ噷锛岃�屽湪 option 琛ㄩ噷锛夛細
+--   搴�   棰樼洰 svy_lib_template_script  鈹�鈹� id 鈫� scriptid 鈹�鈹� 搴�   閫夐」 svy_lib_template_targetoption
+--   浠诲姟 棰樼洰 svy_task_template_script 鈹�鈹� id 鈫� scriptid 鈹�鈹� 浠诲姟 閫夐」 svy_task_template_targetoption
+--   default_value 璇箟锛�1=鍚︼紙榛樿鍊硷級锛�2=鏄紙榛樿閫夐」锛夛紝NULL=鏈缃�
+--
+-- 浠诲姟妯℃澘 鈫� 搴撴ā鏉� 鐨勬槧灏勯摼锛堝疄娴� smartor_nhfy锛夛細
+--   svy_task_template_script.templateid
+--     = svy_task_template.id
+--     鈫� svy_task_template.templateid = svy_lib_template.svyid
+--     鈫� svy_lib_template_script.svyid锛岄闈� script_content 鐩稿悓鍗冲悓涓�閬撻
+--     鈫� svy_lib_template_targetoption.scriptid = svy_lib_template_script.id
+--        涓� optioncontent 鐩稿悓鍗冲悓涓�涓�夐」
+--
+-- 瀹炴祴瑕嗙洊锛�2026-11-06锛宻martor_nhfy锛夛細
+--   浠诲姟妯℃澘 710 涓紝鑳芥槧灏勫埌搴撴ā鏉跨殑 663 涓紙鍙﹀ 47 涓ā鏉� / 879 涓�夐」娌℃湁搴撴潵婧愶紝
+--   鏈剼鏈笉浼氬姩瀹冧滑锛岄渶瑕佷汉宸ュ鐞嗭級锛�
+--   浠诲姟棰樼洰 6409 閬擄紝鎸夐闈㈣兘瀵逛笂搴撻鐩� 6353 閬擄紙99.1%锛夛紱
+--   浠诲姟閫夐」 16405 涓紝鑳藉涓婂簱閫夐」 16369 涓紙99.8%锛夈��
+--
+-- 涓変釜鏂规锛屾寜闇�瑕佸彧璺戝叾涓竴涓細
+--   鏂规A锛堟帹鑽愶級锛氬彧鎶� lib 閲屾爣浜嗛粯璁�(=2)鐨勯�夐」鎺ㄥ埌 task锛屼笉鍔� task 宸叉湁鐨勫叾瀹冨��
+--                  鈫� 瀹炴祴褰卞搷 34 琛�
+--   鏂规B锛堝畬鍏ㄥ榻愶級锛歭ib=2 鈫� 2锛宭ib=1/NULL 鈫� 1锛堜笉鍐� NULL锛�
+--                  鈫� 瀹炴祴褰卞搷 86 琛岋紙棰濆 52 琛屾槸鎶� task 閲屾湁銆乴ib 閲屾病鏈夌殑榛樿鍘绘帀锛�
+--   鏂规C锛堜弗鏍奸暅鍍忥級锛氳繛 NULL 涓�璧风収鎶�
+--                  鈫� 瀹炴祴褰卞搷 10867 琛岋紝鍏朵腑 10782 琛屼細琚疆鎴� NULL锛岄�氬父涓嶅缓璁�
+--
+-- 鎵ц鍓嶈鍏堣窇绗� 0 姝ュ浠姐�佺 1 姝ラ妫�銆�
+-- ============================================================================
+
+
+-- ---------------------------------------------------------------------------
+-- 0. 澶囦唤锛堝彧澶囦唤浼氳鏀瑰姩鐨勯偅鍑犲垪锛屾暣琛ㄥお澶ф病蹇呰锛�
+-- ---------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS bak_svy_task_targetoption_dv_20261106 AS
+SELECT id,
+       taskid,
+       templateID,
+       scriptid,
+       optioncontent,
+       default_value
+FROM svy_task_template_targetoption
+WHERE del_flag = '0';
+
+-- 琛屾暟搴斾笌涓嬮潰涓�鑷达紙瀹炴祴 17403 琛岋級
+SELECT COUNT(*) AS bak_rows FROM bak_svy_task_targetoption_dv_20261106;
+
+-- 鍙樻洿鍓嶅垎甯冿紙瀹炴祴锛�1=16397锛�2=1005锛�4=1锛�
+SELECT default_value, COUNT(*) AS cnt
+FROM svy_task_template_targetoption
+WHERE del_flag = '0'
+GROUP BY default_value
+ORDER BY cnt DESC;
+
+
+-- ---------------------------------------------------------------------------
+-- 1. 棰勬锛氱湅鐪� lib 鐨勯粯璁ゅ�煎悓姝ュ埌 task 浼氭敼澶氬皯琛屻�佹敼鎴愪粈涔�
+-- ---------------------------------------------------------------------------
+-- 1.1 姹囨�伙紙鎸夋柟妗圓/B/C 鍒嗗埆棰勪及锛�
+SELECT '鏂规A 鍙帹 lib=2' AS plan,
+       SUM(ld.dv = 2 AND COALESCE(o.default_value, 0) <> 2) AS will_change
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         JOIN (
+    SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+    FROM svy_lib_template_script l
+             JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+    WHERE l.del_flag = '0'
+    GROUP BY l.svyid, l.script_content, lo.optioncontent
+) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+WHERE o.del_flag = '0'
+UNION ALL
+SELECT '鏂规B 1/2 瀹屽叏瀵归綈',
+       SUM(COALESCE(o.default_value, 1) <> (CASE WHEN ld.dv = 2 THEN 2 ELSE 1 END))
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         JOIN (
+    SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+    FROM svy_lib_template_script l
+             JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+    WHERE l.del_flag = '0'
+    GROUP BY l.svyid, l.script_content, lo.optioncontent
+) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+WHERE o.del_flag = '0'
+UNION ALL
+SELECT '鏂规C 涓ユ牸闀滃儚(鍚玁ULL)',
+       SUM(COALESCE(o.default_value, -1) <> COALESCE(ld.dv, -1))
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         JOIN (
+    SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+    FROM svy_lib_template_script l
+             JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+    WHERE l.del_flag = '0'
+    GROUP BY l.svyid, l.script_content, lo.optioncontent
+) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+WHERE o.del_flag = '0';
+
+-- 1.2 閫愯宸紓娓呭崟锛堟敼鍔ㄥ墠鍏堢湅涓�鐪硷紝纭娌℃湁涓嶈鏀圭殑锛�
+SELECT o.id AS task_option_id,
+       o.templateid AS task_template,
+       tt.svyname,
+       LEFT(s.script_content, 30) AS question,
+       o.optioncontent,
+       o.default_value AS task_now,
+       ld.dv AS lib_value
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         JOIN (
+    SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+    FROM svy_lib_template_script l
+             JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+    WHERE l.del_flag = '0'
+    GROUP BY l.svyid, l.script_content, lo.optioncontent
+) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+WHERE o.del_flag = '0'
+  AND COALESCE(o.default_value, 1) <> (CASE WHEN ld.dv = 2 THEN 2 ELSE 1 END)
+ORDER BY o.templateid, s.id, o.id;
+
+-- 1.3 椤哄甫鐪嬬湅鍝簺 task 閫夐」鍦ㄥ簱閲屾壘涓嶅埌锛堥闈㈣鏀硅繃/鏂板姞閫夐」锛夛紝杩欎簺涓嶄細琚悓姝�
+SELECT COUNT(*) AS unmapped_option_rows
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         LEFT JOIN svy_lib_template_script l
+                   ON l.svyid = lt.svyid AND l.script_content = s.script_content AND l.del_flag = '0'
+         LEFT JOIN svy_lib_template_targetoption lo
+                   ON lo.scriptid = l.id AND lo.del_flag = '0' AND lo.optioncontent = o.optioncontent
+WHERE o.del_flag = '0'
+  AND lo.id IS NULL;
+
+
+-- ---------------------------------------------------------------------------
+-- 2. 鏂规A锛堟帹鑽愶級锛氭妸搴撻噷鐨勯粯璁ら�夐」(=2)鍚屾鍒颁换鍔℃ā鏉块�夐」
+--    瀹炴祴褰卞搷 34 琛岋紱涓嶅姩 task 閲屽凡鏈夌殑 1 / NULL锛岄伩鍏嶈鍒犱换鍔′晶鍗曠嫭閰嶈繃鐨勯粯璁ら」
+--    锛圡ySQL 澶氳〃 UPDATE 涓嶈兘甯� ORDER BY / LIMIT锛屼笅闈㈢殑鏉′欢宸茬粡鑳藉畾浣嶅埌琛岋級
+-- ---------------------------------------------------------------------------
+UPDATE svy_task_template_targetoption o
+    JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+    JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+    JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+    JOIN (
+        SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+        FROM svy_lib_template_script l
+                 JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+        WHERE l.del_flag = '0'
+        GROUP BY l.svyid, l.script_content, lo.optioncontent
+    ) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+SET o.default_value = 2
+WHERE o.del_flag = '0'
+  AND ld.dv = 2
+  AND COALESCE(o.default_value, 0) <> 2;
+
+
+-- ---------------------------------------------------------------------------
+-- 3. 鏂规B锛氬拰搴撳畬鍏ㄥ榻愶紙lib=2 鈫� 2锛宭ib=1/NULL 鈫� 1锛夛紝瀹炴祴褰卞搷 86 琛�
+--    娉ㄦ剰锛氫細鎶� task 閲屻�屾湁榛樿銆佷絾搴撻噷娌℃爣榛樿銆嶇殑 52 琛屾敼鎴� 1
+-- ---------------------------------------------------------------------------
+-- UPDATE svy_task_template_targetoption o
+--     JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+--     JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+--     JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+--     JOIN (
+--         SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+--         FROM svy_lib_template_script l
+--                  JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+--         WHERE l.del_flag = '0'
+--         GROUP BY l.svyid, l.script_content, lo.optioncontent
+--     ) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+-- SET o.default_value = CASE WHEN ld.dv = 2 THEN 2 ELSE 1 END
+-- WHERE o.del_flag = '0'
+--   AND COALESCE(o.default_value, 1) <> (CASE WHEN ld.dv = 2 THEN 2 ELSE 1 END);
+
+
+-- ---------------------------------------------------------------------------
+-- 4. 鏂规C锛氫弗鏍奸暅鍍忓簱閲岀殑鍊硷紙杩� NULL 涓�璧风収鎶勶級锛屽疄娴嬪奖鍝� 10867 琛岋紝
+--    鍏朵腑 10782 琛屼細琚疆鎴� NULL锛堝簱閲岃繖浜涢�夐」鏈韩娌¤榛樿鍊硷級銆備竴鑸笉寤鸿銆�
+-- ---------------------------------------------------------------------------
+-- UPDATE svy_task_template_targetoption o
+--     JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+--     JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+--     JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+--     JOIN (
+--         SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+--         FROM svy_lib_template_script l
+--                  JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+--         WHERE l.del_flag = '0'
+--         GROUP BY l.svyid, l.script_content, lo.optioncontent
+--     ) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+-- SET o.default_value = ld.dv
+-- WHERE o.del_flag = '0'
+--   AND COALESCE(o.default_value, -1) <> COALESCE(ld.dv, -1);
+
+
+-- ---------------------------------------------------------------------------
+-- 5. 鏀剁獎鑼冨洿绀轰緥锛堝彧鎯冲姩鏌愬嚑涓换鍔℃ā鏉挎椂锛屽湪 WHERE 閲屽姞鏉′欢鍗冲彲锛�
+--    浠诲姟妯℃澘 id 鏉ヨ嚜 svy_task_template.id锛�= svy_task_template_script.templateid锛�
+-- ---------------------------------------------------------------------------
+-- 5.1 鍙悓姝ヤ换鍔℃ā鏉� 514锛堝叏闄㈢婊℃剰搴︼紱瀹炴祴宸蹭竴鑷达紝鏀� 0 琛岋級
+-- UPDATE svy_task_template_targetoption o
+--     JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+--     JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+--     JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+--     JOIN (
+--         SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+--         FROM svy_lib_template_script l
+--                  JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+--         WHERE l.del_flag = '0'
+--         GROUP BY l.svyid, l.script_content, lo.optioncontent
+--     ) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+-- SET o.default_value = 2
+-- WHERE o.del_flag = '0'
+--   AND ld.dv = 2
+--   AND COALESCE(o.default_value, 0) <> 2
+--   AND s.templateid IN (514);
+
+-- 5.2 鍙悓姝ユ煇涓満鏋勪笅鐨勪换鍔℃ā鏉匡紙orgid 鍦ㄤ袱涓� option 琛ㄤ笂閮芥湁锛�
+--   AND o.orgid = ' xxx '
+
+
+-- ---------------------------------------------------------------------------
+-- 6. 鏍¢獙
+-- ---------------------------------------------------------------------------
+-- 6.1 鏀瑰姩鍚庡垎甯冿紙鏂规A 涔嬪悗搴斾负锛�1=16363锛�2=1039锛�4=1锛�
+SELECT default_value, COUNT(*) AS cnt
+FROM svy_task_template_targetoption
+WHERE del_flag = '0'
+GROUP BY default_value
+ORDER BY cnt DESC;
+
+-- 6.2 浠嶄笌搴撲笉涓�鑷寸殑琛屾暟锛堟柟妗圓 涔嬪悗搴斾负 10833锛屽樊鐨勯兘鏄� lib 渚ф湭璁剧疆/涓�1 鐨勮锛�
+SELECT COUNT(*) AS still_diff
+FROM svy_task_template_targetoption o
+         JOIN svy_task_template_script s ON s.id = o.scriptid AND s.del_flag = '0'
+         JOIN svy_task_template tt ON tt.id = s.templateid AND tt.del_flag = '0'
+         JOIN svy_lib_template lt ON lt.svyid = tt.templateid AND lt.del_flag = '0'
+         JOIN (
+    SELECT l.svyid, l.script_content, lo.optioncontent, MAX(lo.default_value) AS dv
+    FROM svy_lib_template_script l
+             JOIN svy_lib_template_targetoption lo ON lo.scriptid = l.id AND lo.del_flag = '0'
+    WHERE l.del_flag = '0'
+    GROUP BY l.svyid, l.script_content, lo.optioncontent
+) ld ON ld.svyid = lt.svyid AND ld.script_content = s.script_content AND ld.optioncontent = o.optioncontent
+WHERE o.del_flag = '0'
+  AND COALESCE(o.default_value, 0) <> COALESCE(ld.dv, 0);
+
+-- 6.3 姣忛銆岄粯璁ら�夐」鐨勪釜鏁般�嶅垎甯冿細姝e父搴旀渶澶� 1 涓��
+--     瀹炴祴璺戝畬鏂规A 鍚庯細0 涓�=5624 棰橈紝1 涓�=1017 棰橈紝2 涓�=8 棰橈紝3 涓�=2 棰�
+--     锛堝簱閲屾湰韬氨鏈� 1 閬撻鎸備簡 2 涓粯璁ら」锛涘甫 2/3 涓粯璁ら」鐨勯鐩睘浜庡悓姝ュ墠灏卞瓨鍦ㄧ殑闂锛�
+SELECT c AS default_options_per_question, COUNT(*) AS questions
+FROM (SELECT s.id, SUM(o.default_value = 2) c
+      FROM svy_task_template_script s
+               JOIN svy_task_template_targetoption o ON o.scriptid = s.id AND o.del_flag = '0'
+      WHERE s.del_flag = '0'
+      GROUP BY s.id) x
+GROUP BY c
+ORDER BY c;
+
+
+-- ---------------------------------------------------------------------------
+-- 7. 鍥炴粴锛堝彧鎶婅鏀硅繃鐨勯偅鍑犲垪鍐欏洖澶囦唤鍊硷級
+-- ---------------------------------------------------------------------------
+-- UPDATE svy_task_template_targetoption o
+--     JOIN bak_svy_task_targetoption_dv_20261106 b ON b.id = o.id
+-- SET o.default_value = b.default_value
+-- WHERE o.del_flag = '0';
+--
+-- 纭娌¢棶棰樺悗鍐嶅垹澶囦唤琛細
+-- DROP TABLE bak_svy_task_targetoption_dv_20261106;
diff --git a/sql/tracedeallist_index_optimize.sql b/sql/tracedeallist_index_optimize.sql
new file mode 100644
index 0000000..f4fbcdf
--- /dev/null
+++ b/sql/tracedeallist_index_optimize.sql
@@ -0,0 +1,68 @@
+-- ============================================================================
+-- /smartor/trace/tracedeallist锛堝紓甯搁棶棰樺鐞嗘儏鍐垫煡璇級鎬ц兘浼樺寲閰嶅绱㈠紩
+--
+-- 鏀归�犲悗杩欐潯鎺ュ彛鍥哄畾鎵ц 5 鏉¤仛鍚� SQL锛岃繃婊ゆ潯浠堕兘鏄細
+--   service_subtask_detail_trace:  orgid + template_type + del_flag锛�+ 鍒嗙粍/鎺掑簭 questiontext锛�
+--   service_subtask_detail:        scriptid
+-- 绾夸笂濡傛灉杩欎袱寮犺〃娌℃湁瀵瑰簲绱㈠紩锛岃仛鍚堜粛鐒舵槸鍏ㄨ〃鎵弿銆�
+--
+-- 鎵ц椤哄簭锛氬厛璺戠 1 姝ョ湅鐜扮姸鍜屽瓧娈电被鍨嬶紝鍐嶆寜绗� 2 姝ュ姞缂哄け鐨勭储寮曘��
+-- ADD INDEX 璧� online DDL锛堜笉闃诲璇诲啓锛夛紝浣嗗ぇ琛ㄤ粛浼氬悆 IO锛屽缓璁笟鍔′綆宄版墽琛屻��
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 1 姝ワ細鐪嬬幇鏈夌储寮� + questiontext 鐨勫瓧娈电被鍨嬶紙鍐冲畾鑳戒笉鑳芥妸 questiontext 鏀捐繘绱㈠紩锛�
+-- ----------------------------------------------------------------------------
+SELECT INDEX_NAME, SEQ_IN_INDEX, COLUMN_NAME, NON_UNIQUE
+FROM information_schema.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('service_subtask_detail_trace', 'service_subtask_detail')
+ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
+
+SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, CHARACTER_MAXIMUM_LENGTH
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('service_subtask_detail_trace', 'service_subtask_detail')
+  AND COLUMN_NAME IN ('orgid', 'campusid', 'template_type', 'del_flag', 'scriptid', 'questiontext', 'handle_time', 'todeptcode');
+
+SELECT TABLE_NAME, TABLE_ROWS, ROUND(DATA_LENGTH / 1024 / 1024, 1) AS data_mb
+FROM information_schema.TABLES
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME IN ('service_subtask_detail_trace', 'service_subtask_detail');
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 2 姝ワ細鍔犵储寮曪紙宸插瓨鍦ㄧ殑浼氭姤 Duplicate key name锛岃烦杩囧嵆鍙級
+-- ----------------------------------------------------------------------------
+
+-- 鈶� trace 琛ㄧ殑涓昏繃婊ゆ潯浠讹細orgid + template_type + del_flag
+--    锛堟湰鎺ュ彛鍏ュ弬鍙湁 templateType锛宱rgid 鐢� @AddOrgId 娉ㄥ叆锛�
+ALTER TABLE service_subtask_detail_trace
+    ADD INDEX idx_trace_deal_query (orgid, template_type, del_flag);
+
+-- 鈶� 鏄庣粏琛ㄧ殑銆屾湁鏁堝~鍐欐暟銆嶆寜 scriptid 缁熻锛堟敼閫犲墠鏄�愪釜 scriptid 鏌ワ紝鏀归�犲悗鏄竴鏉� group by锛�
+ALTER TABLE service_subtask_detail
+    ADD INDEX idx_detail_scriptid (scriptid);
+
+-- 鈶� 鍙�夛細濡傛灉绗� 1 姝ユ煡鍒� questiontext 鏄� VARCHAR(255) 鍙婁互涓嬶紙utf8mb4 涓嶈秴杩� 255锛夛紝
+--    鍙互鍐嶅姞瑕嗙洊鍒嗙粍/鎺掑簭鐨勭储寮曪紝鏁堟灉鏇村ソ锛�
+-- ALTER TABLE service_subtask_detail_trace
+--     ADD INDEX idx_trace_deal_group (orgid, template_type, del_flag, questiontext);
+
+-- 鈶� 鍙�夛細鏈�鏂板鐞嗕汉閭f潯 SQL 鐢ㄥ埌 (questiontext, handle_time)
+-- ALTER TABLE service_subtask_detail_trace
+--     ADD INDEX idx_trace_deal_handle (orgid, template_type, del_flag, questiontext, handle_time);
+
+
+-- ----------------------------------------------------------------------------
+-- 绗� 3 姝ワ細楠岃瘉绱㈠紩鏄惁鐢熸晥锛堟妸涓嬮潰 SQL 鎷垮幓 EXPLAIN锛宬ey 鍒楀簲璇ュ懡涓垰寤虹殑绱㈠紩锛�
+-- ----------------------------------------------------------------------------
+-- EXPLAIN SELECT questiontext, min(scriptid), count(*)
+--           FROM service_subtask_detail_trace
+--          WHERE del_flag = 0 AND questiontext IS NOT NULL
+--            AND orgid = '20001001' AND template_type = 2
+--          GROUP BY questiontext ORDER BY questiontext LIMIT 10 OFFSET 0;
+--
+-- EXPLAIN SELECT scriptid, count(*) FROM service_subtask_detail
+--          WHERE scriptid IN (1, 2, 3) GROUP BY scriptid;
diff --git a/sql/v_sf_statistics_ward.sql b/sql/v_sf_statistics_ward.sql
new file mode 100644
index 0000000..0a5de9c
--- /dev/null
+++ b/sql/v_sf_statistics_ward.sql
@@ -0,0 +1,603 @@
+-- =============================================================================
+-- /smartor/serviceSubtask/getSfStatistics 鐨� SQL 鐗堬紙鐥呭尯缁村害 路 鍏ㄩ儴鐥呭尯 路 鍑洪櫌闅忚 serviceType=2锛�
+-- =============================================================================
+-- 瀵瑰簲浠g爜锛�
+--   ServiceSubtaskController#getSfStatistics
+--     鈫� ServiceSubtaskServiceImpl#getSfStatistics            锛堝垎缁� + 閫愭潯绱姞锛�
+--     鈫� ServiceSubtaskMapper.getSfStatistics / getSfStatisticsGroupKey
+--     鈫� ServiceSubtaskMapper.selectTimelyRateBatch           锛堝強鏃剁巼 rate锛�
+-- 鏁版嵁婧愶細service_subtask锛堟湰鎺ュ彛鍙煡杩欎竴寮犺〃锛�
+--
+-- 鍏ュ弬锛氬彧鏈� hospitalStartTime锛堝嚭闄㈡椂闂翠笅闄愶級銆�
+--   鍒嗙粍锛歴tatisticaltype=1锛堢梾鍖猴級锛屼笖涓嶄紶 leavehospitaldistrictcodes 鈫� 鍏ㄩ儴鐥呭尯銆�
+--   鏈嶅姟绫诲瀷锛歴erviceType = 2锛堝嚭闄㈤殢璁匡級銆�
+--   璇存槑锛氭帴鍙� Mapper 閲屽嚭闄㈡椂闂存潯浠舵槸銆宧ospitalStartTime 涓� hospitalEndTime 閮戒紶鎵嶇敓鏁堛�嶏紝
+--        鍙紶 hospitalStartTime 鏃舵帴鍙e叾瀹炪�愬畬鍏ㄤ笉杩囨护鍑洪櫌鏃堕棿銆戙�備笅闈㈡寜浣犺鐨勮涔夊疄鐜帮細
+--        鍑洪櫌鏃堕棿 >= hospitalStartTime锛堜笂闄愬彲閫夛級銆�
+--
+-- 宸插湪 MySQL 5.7.34锛坰martor_sltd锛夊疄璺戦獙璇侊細
+--   hospitalStartTime = '2026-10-01' 鈫� 45 涓梾鍖� / 3088 鏉″嚭闄㈣褰曪紝
+--   鎶芥煡鐥呭尯 40003052锛�287 鏉°�佹棤闇�闅忚 4銆佸簲闅忚 283銆侀娆¢殢璁挎垚鍔� 250銆侀殢璁跨巼 88.34%锛屼笌鏄庣粏閫愭潯鏍稿涓�鑷淬��
+-- =============================================================================
+
+
+-- -----------------------------------------------------------------------------
+-- PART 0. 鍙傛暟锛堝彧鏈夌涓�涓槸蹇呭~锛�
+-- -----------------------------------------------------------------------------
+SET @hospitalStartTime = '2026-10-01';   -- 蹇呭~锛氬嚭闄㈡椂闂翠笅闄愶紙褰撳ぉ 0 鐐硅捣锛�
+SET @hospitalEndTime   = NULL;           -- 鍙�夛細鍑洪櫌鏃堕棿涓婇檺锛孨ULL = 涓嶉檺
+SET @followUpCountStyle = '1';           -- 绯荤粺閰嶇疆 followUpCountStyle锛涙湰搴撴湭閰嶇疆璇ュ弬鏁帮紝鎺ュ彛鎸� '1' 澶勭悊
+SET @orgid    = NULL;                    -- 鍙�夛細鏈烘瀯锛汵ULL = 涓嶉檺锛堟帴鍙i噷鐢辩櫥褰曚俊鎭敞鍏ワ級
+SET @campusid = NULL;                    -- 鍙�夛細闄㈠尯锛汵ULL = 涓嶉檺
+
+
+-- -----------------------------------------------------------------------------
+-- PART 1. 涓绘煡璇細涓�琛� = 涓�涓嚭闄㈢梾鍖猴紝瑕嗙洊鍏ㄩ儴鐥呭尯
+--   路 鍐呭眰 r   锛氫竴琛� = 涓�鏉¢殢璁垮瓙浠诲姟锛屾妸銆岀粺璁″彛寰勩�嶇炕璇戞垚 0/1 鏍囪
+--   路 涓棿 t   锛氭寜鐥呭尯鎶婃爣璁扮疮鍔�
+--   路 鏈�澶栧眰   锛氭妸绱姞鍊肩畻鎴愭帴鍙h繑鍥炵殑姣旂巼瀛楃涓�
+--   鎯虫敼缁熻缁村害锛氭妸 GROUP BY r.ward_code 鎹㈡垚 r.dept_code锛堢瀹わ級鎴� r.dr_code锛堝尰鐢燂級鍗冲彲銆�
+--   鎯宠鎬昏琛岋細鎶娿�孏ROUP BY r.ward_code銆嶆敼鎴愩�孏ROUP BY r.ward_code WITH ROLLUP銆嶏紝
+--               鏈�鍚庝竴琛� ward_code 涓� NULL 鐨勫氨鏄叏閮ㄧ梾鍖哄悎璁°��
+-- -----------------------------------------------------------------------------
+SELECT
+  t.leavehospitaldistrictcode,
+  t.leavehospitaldistrictname,
+  t.deptcode,
+  t.deptname,
+  t.drcode,
+  t.drname,
+  t.dischargeCount,            -- 鍑洪櫌浜烘
+  t.nonFollowUp,               -- 鏃犻渶闅忚浜烘
+  t.filterCount,               -- 杩囨护鎮h�呮暟閲�
+  t.followUpNeeded,            -- 搴旈殢璁夸汉娆�
+  t.needFollowUp,              -- 棣栨搴旈殢璁�
+  t.nonFollowUpFirst,          -- 棣栨鏃犻渶闅忚
+  t.pendingFollowUp,           -- 棣栨寰呴殢璁匡紙鏈帴鍙f璺緞鎭掍负 0锛岃 PART 5锛�
+  t.followUpSuccess,           -- 棣栨闅忚鎴愬姛
+  t.followUpFail,              -- 棣栨闅忚澶辫触锛堝惈浜哄伐瓒呮椂锛�
+  t.manual,                    -- 棣栨浜哄伐闅忚
+  t.voice,                     -- 棣栨璇煶闅忚
+  t.sms,                       -- 棣栨鐭俊闅忚
+  t.weChat,                    -- 棣栨寰俊闅忚
+  t.manualSuccess,             -- 棣栨浜哄伐闅忚鎴愬姛
+  t.voiceSuccess,              -- 棣栨璇煶闅忚鎴愬姛
+  t.smsSuccess,                -- 棣栨鐭俊闅忚鎴愬姛
+  t.weChatSuccess,             -- 棣栨寰俊闅忚鎴愬姛
+  -- 棣栨闅忚鐜� =锛堥娆¢殢璁挎垚鍔� + 棣栨闅忚澶辫触锛�/ 棣栨搴旈殢璁�
+  IF(t.needFollowUp = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.followUpSuccess + t.followUpFail) / t.needFollowUp, 2), '%')) AS followUpRate,
+  t.abnormal,                  -- 缁撴灉寮傚父锛堥娆★級
+  t.needFollowUpAgain,         -- 浜屾搴旈殢璁�
+  t.nonFollowUpAgain,          -- 浜屾鏃犻渶闅忚
+  t.pendingFollowUpAgain,      -- 浜屾寰呴殢璁�
+  t.followUpSuccessAgain,      -- 浜屾闅忚鎴愬姛
+  t.followUpFailAgain,         -- 浜屾闅忚澶辫触
+  t.manualAgain,
+  t.voiceAgain,
+  t.smsAgain,
+  t.weChatAgain,
+  t.manualAgainSuccess,
+  t.voiceAgainSuccess,
+  t.smsAgainSuccess,
+  t.weChatAgainSuccess,
+  -- 浜屾闅忚鐜�
+  IF(t.needFollowUpAgain = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.followUpSuccessAgain + t.followUpFailAgain) / t.needFollowUpAgain, 2), '%')) AS followUpRateAgain,
+  t.abnormalAgain,             -- 缁撴灉寮傚父锛堝啀娆★級
+  t.taskSituation1,            -- 闅忚鎯呭喌锛氭甯歌闊�
+  t.taskSituation2,            -- 闅忚鎯呭喌锛氭偅鑰呮嫆鎺�/鎷掕
+  t.taskSituation3,            -- 闅忚鎯呭喌锛氶潰璁�/鎺ヨ瘖
+  t.taskSituation4,            -- 闅忚鎯呭喌锛氬井淇¢殢璁�
+  t.taskSituation5,            -- 闅忚鎯呭喌锛氶殢璁跨數璇濅笉姝g‘
+  t.taskSituation6            -- 闅忚鎯呭喌锛氬叾浠栵紙task_situation = 7锛�
+FROM (
+  SELECT
+    r.ward_code                                                             AS leavehospitaldistrictcode,
+    MAX(r.ward_name)                                                        AS leavehospitaldistrictname,
+    MAX(r.dept_code)                                                        AS deptcode,
+    MAX(r.dept_name)                                                        AS deptname,
+    MAX(r.dr_code)                                                          AS drcode,
+    MAX(r.dr_name)                                                          AS drname,
+    COUNT(*)                                                                AS dischargeCount,
+    SUM(r.f_no)                                                             AS nonFollowUp,
+    SUM(r.f_filter)                                                         AS filterCount,
+    SUM(r.f_need)                                                           AS followUpNeeded,
+    SUM(IF(r.f_first = 1 AND r.f_need = 1, 1, 0))                           AS needFollowUp,
+    -- followUpCountStyle='1' 鏃舵帴鍙f妸銆岄娆℃棤闇�闅忚銆嶅姞浜嗕袱娆★紙浠g爜 L2195-2197 涓� L2211-2213锛夛紝杩欓噷 *2 澶嶅埢
+    SUM(IF(r.f_first = 1 AND r.f_no = 1, 1, 0)) * IF(@followUpCountStyle = '1', 2, 1) AS nonFollowUpFirst,
+    0                                                                       AS pendingFollowUp,
+    SUM(IF(r.f_first = 1 AND r.f_succ_first = 1, 1, 0))                     AS followUpSuccess,
+    SUM(IF(r.f_first = 1 AND r.f_fail_first = 1, 1, 0))                     AS followUpFail,
+    SUM(IF(r.f_first = 1 AND r.ch_hit = 1 AND r.cp = '1', 1, 0))            AS manual,
+    SUM(IF(r.f_first = 1 AND r.ch_hit = 1 AND r.cp = '3', 1, 0))            AS voice,
+    SUM(IF(r.f_first = 1 AND r.ch_hit = 1 AND r.cp = '4', 1, 0))            AS sms,
+    SUM(IF(r.f_first = 1 AND r.ch_hit = 1 AND r.cp = '5', 1, 0))            AS weChat,
+    SUM(IF(r.f_first = 1 AND r.sendstate = 6 AND r.cp = '1', 1, 0))         AS manualSuccess,
+    SUM(IF(r.f_first = 1 AND r.sendstate = 6 AND r.cp = '3', 1, 0))         AS voiceSuccess,
+    SUM(IF(r.f_first = 1 AND r.sendstate = 6 AND r.cp = '4', 1, 0))         AS smsSuccess,
+    SUM(IF(r.f_first = 1 AND r.sendstate = 6 AND r.cp = '5', 1, 0))         AS weChatSuccess,
+    SUM(IF(r.f_first = 1 AND r.f_abnormal = 1, 1, 0))                       AS abnormal,
+    SUM(IF(r.f_again = 1 AND r.f_need = 1, 1, 0))                           AS needFollowUpAgain,
+    SUM(IF(r.f_again = 1 AND r.f_no = 1, 1, 0))                             AS nonFollowUpAgain,
+    SUM(IF(r.f_again = 1 AND r.sendstate = 2, 1, 0))                        AS pendingFollowUpAgain,
+    SUM(IF(r.f_again = 1 AND r.f_succ_again = 1, 1, 0))                     AS followUpSuccessAgain,
+    SUM(IF(r.f_again = 1 AND r.f_fail_again = 1, 1, 0))                     AS followUpFailAgain,
+    SUM(IF(r.f_again = 1 AND r.ch_hit = 1 AND r.cp = '1', 1, 0))            AS manualAgain,
+    SUM(IF(r.f_again = 1 AND r.ch_hit = 1 AND r.cp = '3', 1, 0))            AS voiceAgain,
+    SUM(IF(r.f_again = 1 AND r.ch_hit = 1 AND r.cp = '4', 1, 0))            AS smsAgain,
+    SUM(IF(r.f_again = 1 AND r.ch_hit = 1 AND r.cp = '5', 1, 0))            AS weChatAgain,
+    SUM(IF(r.f_again = 1 AND r.sendstate = 6 AND r.cp = '1', 1, 0))         AS manualAgainSuccess,
+    SUM(IF(r.f_again = 1 AND r.sendstate = 6 AND r.cp = '3', 1, 0))         AS voiceAgainSuccess,
+    SUM(IF(r.f_again = 1 AND r.sendstate = 6 AND r.cp = '4', 1, 0))         AS smsAgainSuccess,
+    SUM(IF(r.f_again = 1 AND r.sendstate = 6 AND r.cp = '5', 1, 0))         AS weChatAgainSuccess,
+    SUM(IF(r.f_again = 1 AND r.f_abnormal = 1, 1, 0))                       AS abnormalAgain,
+    SUM(IF(r.task_situation = 1, 1, 0))                                     AS taskSituation1,
+    SUM(IF(r.task_situation = 2, 1, 0))                                     AS taskSituation2,
+    SUM(IF(r.task_situation = 3, 1, 0))                                     AS taskSituation3,
+    SUM(IF(r.task_situation = 4, 1, 0))                                     AS taskSituation4,
+    SUM(IF(r.task_situation = 5, 1, 0))                                     AS taskSituation5,
+    SUM(IF(r.task_situation = 7, 1, 0))                                     AS taskSituation6
+  FROM (
+    SELECT
+      ss.leavehospitaldistrictcode                            AS ward_code,
+      ss.leavehospitaldistrictname                            AS ward_name,
+      ss.leaveldeptcode                                       AS dept_code,
+      ss.leaveldeptname                                       AS dept_name,
+      ss.drcode                                               AS dr_code,
+      ss.drname                                               AS dr_name,
+      ss.sendstate                                            AS sendstate,
+      ss.current_preachform                                   AS cp,
+      ss.task_situation                                       AS task_situation,
+      IF(ss.sendstate = 4, 1, 0)                              AS f_no,
+      IF(ss.sendstate = 4 AND ss.task_situation = 6, 1, 0)    AS f_filter,
+      IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0) AS f_need,
+      IF(ss.visit_count = 1, 1, 0)                            AS f_first,
+      IF(ss.visit_count > 1, 1, 0)                            AS f_again,
+      -- 棣栨闅忚鎴愬姛锛氱粺璁℃柟寮� 1/3 鍙畻宸插畬鎴�(6)锛涘叾瀹冩柟寮忕畻涓婁笉鎵ц/宸插彂閫�(3,4,6)
+      IF(@followUpCountStyle IN ('1', '3'),
+         IF(ss.sendstate = 6, 1, 0),
+         IF(ss.sendstate IN (3, 4, 6), 1, 0))                 AS f_succ_first,
+      -- 鍐嶆闅忚鎴愬姛锛氱粺璁℃柟寮� 1/3 鍙畻宸插畬鎴�(6)锛涘叾瀹冩柟寮忕畻涓婂緟闅忚澶辫触鍓嶇殑 1 绛�(1,3,4,6)
+      IF(@followUpCountStyle IN ('1', '3'),
+         IF(ss.sendstate = 6, 1, 0),
+         IF(ss.sendstate IN (1, 3, 4, 6), 1, 0))              AS f_succ_again,
+      IF(ss.sendstate IN (5, 7), 1, 0)                        AS f_fail_first,
+      IF(ss.sendstate = 5, 1, 0)                              AS f_fail_again,
+      IF(ss.excep = '1', 1, 0)                                AS f_abnormal,
+      -- 闅忚鏂瑰紡鍛戒腑鏉′欢锛氭柟寮� 1 鎺掗櫎銆屾棤闇�闅忚銆嶏紱鏂瑰紡 3 鍙畻宸插畬鎴愶紱鍏跺畠鏂瑰紡涓嶈闄�
+      IF(@followUpCountStyle = '1',
+         IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0),
+         IF(@followUpCountStyle = '3',
+            IF(ss.sendstate = 6, 1, 0),
+            IF(ss.sendstate IS NOT NULL, 1, 0)))              AS ch_hit
+    FROM service_subtask ss
+    WHERE ss.del_flag = 0
+      AND ss.service_type = '2'                              -- serviceType = 2 鍑洪櫌闅忚
+      -- 鎺ュ彛閲� groupKeyList 浼氬甫鍏ㄩ噺鐥呭尯鐮侊紝绛変环浜庛�屽嚭闄㈢梾鍖轰负 NULL 鐨勮琚涪鎺夈�嶏紱
+      -- 鑻ユ兂鎶婄┖鐥呭尯涔熺粺璁¤繘鏉ワ紝娉ㄩ噴鎺変笅涓�琛屻��
+      AND ss.leavehospitaldistrictcode IS NOT NULL
+      AND ss.endtime >= DATE(@hospitalStartTime)
+      AND (@hospitalEndTime IS NULL OR ss.endtime < DATE_ADD(DATE(@hospitalEndTime), INTERVAL 1 DAY))
+      AND (@orgid    IS NULL OR ss.orgid    = @orgid)
+      AND (@campusid IS NULL OR ss.campusid = @campusid)
+  ) r
+  GROUP BY r.ward_code
+) t
+ORDER BY t.dischargeCount DESC;
+
+
+-- -----------------------------------------------------------------------------
+-- PART 1B. 鍙銆岄娆¢殢璁裤�嶇殑鏁版嵁锛堢瓑浠蜂簬鎺ュ彛鍏ュ弬 visitCount = 1 鈫� getStatisticFirst锛�
+--   路 鍙粺璁� visit_count = 1 鐨勮褰曪細浜屾闅忚璁板綍涓嶈繘鍏ヤ换浣曚竴鍒�
+--   路 鍒楋細鍑洪櫌浜烘 / 搴旈殢璁挎媶瑙� / 闅忚鎴愬姛鎷嗚В / 鍚勬垚鍔熺巼 / 鍙婃椂鐜� / 鍑洪櫌鏃堕棿鑼冨洿
+--   路 鍙e緞涓� getStatisticFirst 瀵归綈锛歱endingFollowUp 鏄� sendstate = 2 鐨勭湡瀹炴暟閲�
+--
+--   鈽� 瀵硅处锛氭帴鍙h繖鍑犲垪鏈韩涓嶇瓑浜庛�屽簲闅忚銆嶏紝宸鏄袱涓湡瀹炲瓨鍦ㄧ殑鍙e緞缂洪」锛屼笉鏄暟鎹敊锛�
+--      棣栨搴旈殢璁� = 寰呭彂閫�(1) + 寰呴殢璁�(2) + 宸插彂閫佹湭瀹屾垚(3) + 鍏跺畠鐘舵�� + 闅忚鎴愬姛(6) + 闅忚澶辫触(5,7)
+--      棣栨闅忚鎴愬姛 = 浜哄伐鎴愬姛 + 璇煶鎴愬姛 + 鐭俊鎴愬姛 + 寰俊鎴愬姛 + 鏃犳柟寮忔垚鍔�(sendstate=6 浣� current_preachform 涓虹┖)
+--     鎺ュ彛鍙粺璁� 2 / 6 / 5+7锛屾墍浠ャ�屽緟闅忚 + 鎴愬姛 + 澶辫触銆嶅皯浜庡簲闅忚锛�
+--     娓犻亾鎴愬姛鎸� current_preachform 鍒嗭紝娌℃湁鏂瑰紡鐨勬垚鍔熻褰曚笉钀戒换浣曟笭閬撱��
+--     涓嬮潰鎶� notSent / sentNotDone / otherStatus / noChannelSuccess 鏄惧紡鍒楀嚭鏉ワ紝骞剁粰鍑� diffNeed / diffSucc
+--     涓や釜鑷鍒楋紙姝e父鎭掍负 0锛夈��
+--
+--   鈽� 鍑洪櫌鏃堕棿锛氫富鏌ヨ缁� endTimeMin/endTimeMax锛屽強鏃剁巼鍙e緞缁� timelyEndMin/timelyEndMax銆�
+--     鈿� 鍙婃椂鐜囧瓙鏌ヨ閲岀殑鍑洪櫌鏃堕棿鏉′欢褰撳墠鏄敞閲婃帀鐨勶紙鎸変綘鐨勭増鏈級锛屾墍浠ュ畠缁熻鐨勬槸璇ョ梾鍖恒�屽叏閮ㄥ巻鍙层�嶏紝
+--       鍒嗘瘝 timelyBase 浼氳繙澶т簬搴旈殢璁匡紙瀹炴祴鏌愮梾鍖� 643 鏉″簲闅忚 vs 2342 鏉″強鏃剁巼鍒嗘瘝锛夛紝
+--       timelyRate 涓庡叾瀹冨垪涓嶅啀鍚屽尯闂淬�佷笉鍙洿鎺ユ瘮杈冦�傝鎭㈠鍚屽尯闂村氨鎶婇偅涓よ鏀惧紑銆�
+--
+--   涓绘煡璇㈠凡瀹炶窇鏍¢獙锛�2026-09-04 ~ 2026-11-03锛宱rgid=20001001锛�45 涓梾鍖猴級锛�7378 鏉� / 鏃犻渶闅忚 428 /
+--   搴旈殢璁� 6950 = 寰呭彂閫� 116 + 寰呴殢璁� 337 + 宸插彂閫佹湭瀹屾垚 941 + 鎴愬姛 4188 + 澶辫触 1368锛�
+--   鎴愬姛 4188 = 浜哄伐 2974 + 鐭俊 1197 + 鏃犳柟寮� 17锛堟湰搴� current_preachform 鍙湁 1 鍜� 4锛岃闊�/寰俊涓� 0锛夈��
+-- -----------------------------------------------------------------------------
+SELECT
+  t.leavehospitaldistrictname,   -- 鍑洪櫌鐥呭尯
+  t.endTimeMin,                  -- 璇ョ梾鍖哄懡涓殑鏈�鏃╁嚭闄㈡椂闂�
+  t.endTimeMax,                  -- 璇ョ梾鍖哄懡涓殑鏈�鏅氬嚭闄㈡椂闂�
+  t.deptname,                    -- 鍑洪櫌绉戝
+  t.dischargeCount,              -- 鍑洪櫌浜烘锛堥娆¢殢璁胯褰曟暟锛�
+  t.nonFollowUp,                 -- 鏃犻渶闅忚浜烘
+  t.followUpNeeded,              -- 搴旈殢璁夸汉娆�
+  t.needFollowUp,                -- 棣栨搴旈殢璁�
+  t.notSent,                     -- 寰呭彂閫侊紙sendstate = 1锛�
+  t.pendingFollowUp,             -- 棣栨寰呴殢璁匡紙sendstate = 2锛�
+  t.sentNotDone,                 -- 宸插彂閫佹湭瀹屾垚锛坰endstate = 3锛�
+  t.otherStatus,                 -- 鍏跺畠鐘舵�佸厹搴曪紙姝e父涓� 0锛�
+  t.followUpSuccess,             -- 棣栨闅忚鎴愬姛锛坰endstate = 6锛�
+  t.followUpFail,                -- 棣栨闅忚澶辫触锛坰endstate = 5,7锛屽惈浜哄伐瓒呮椂锛�
+  -- 鍚勯殢璁挎柟寮忔垚鍔熸暟锛堟兂鍚屾椂鐪嬫�绘暟灏辨斁寮�涓嬮潰 4 琛岋紝鎴愬姛鐜囧垎姣嶅氨鏄繖 4 涓級
+  -- t.manual,  t.voice,  t.sms,  t.weChat,
+  t.manualSuccess,               -- 棣栨浜哄伐闅忚鎴愬姛
+  t.voiceSuccess,                -- 棣栨璇煶闅忚鎴愬姛
+  t.smsSuccess,                  -- 棣栨鐭俊闅忚鎴愬姛
+  t.weChatSuccess,               -- 棣栨寰俊闅忚鎴愬姛
+  t.noChannelSuccess,            -- 鎴愬姛浣嗘病鏈夐殢璁挎柟寮忥紙current_preachform 涓虹┖鎴栦笉灞炰簬 1/3/4/5锛�
+  -- 闅忚鐜� =锛堟垚鍔� + 澶辫触锛�/ 搴旈殢璁匡紙鎺ュ彛 followUpRate 鐨勫彛寰勶級
+  IF(t.needFollowUp = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.followUpSuccess + t.followUpFail) / t.needFollowUp, 2), '%')) AS followUpRate,
+  -- 闅忚鎴愬姛鐜� = 鎴愬姛 / 搴旈殢璁匡紙鍙畻鎴愬姛锛屼笉鍚け璐ワ級
+  IF(t.needFollowUp = 0, '0.00%',
+     CONCAT(ROUND(100 * t.followUpSuccess / t.needFollowUp, 2), '%')) AS followUpSuccessRate,
+  -- 鍚勬柟寮忔垚鍔熺巼 = 璇ユ柟寮忔垚鍔� / 璇ユ柟寮忓懡涓紙sendstate<>4 涓� current_preachform 涓鸿鏂瑰紡锛�
+  IF(t.manual = 0, '0.00%', CONCAT(ROUND(100 * t.manualSuccess / t.manual, 2), '%')) AS manualSuccessRate,
+  IF(t.voice  = 0, '0.00%', CONCAT(ROUND(100 * t.voiceSuccess  / t.voice,  2), '%')) AS voiceSuccessRate,
+  IF(t.sms    = 0, '0.00%', CONCAT(ROUND(100 * t.smsSuccess    / t.sms,    2), '%')) AS smsSuccessRate,
+  IF(t.weChat = 0, '0.00%', CONCAT(ROUND(100 * t.weChatSuccess / t.weChat, 2), '%')) AS weChatSuccessRate,
+  -- 娓犻亾鍚堣鎴愬姛鐜� = 鍥涚鏂瑰紡鎴愬姛涔嬪拰 / 鍥涚鏂瑰紡鍛戒腑涔嬪拰
+  IF(t.manual + t.voice + t.sms + t.weChat = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.manualSuccess + t.voiceSuccess + t.smsSuccess + t.weChatSuccess)
+                  / (t.manual + t.voice + t.sms + t.weChat), 2), '%')) AS channelSuccessRate,
+  -- 鍙婃椂鐜囷細鍙e緞涓庢帴鍙� selectTimelyRateBatch 鐩稿悓锛堢嫭绔嬬殑闅忚鏃堕棿绐楀彛 + 鎺掗櫎銆屾棤闇�闅忚銆嶏級锛�
+  -- 鍙婃椂 = finishtime 涓嶄负绌� 涓� DATEDIFF(finishtime, endtime) <= 鍙婃椂澶╂暟 + 琛ュ伩澶╂暟銆�
+  -- 鍙婃椂澶╂暟闃堝�艰涓嬮潰 rt 瀛愭煡璇㈤噷鐨� 7锛屾寜闇�淇敼锛堟帴鍙d笉浼� rateDay 鏃惰繑鍥� 0锛夈��
+  IFNULL(rt.timely_base, 0) AS timelyBase,   -- 鍙婃椂鐜囧垎姣嶏紙鍙e緞涓庛�屽簲闅忚銆嶄笉鍚岋級
+  IF(IFNULL(rt.timely_base, 0) = 0, '0.00%',
+     CONCAT(ROUND(100 * rt.timely_cnt / rt.timely_base, 2), '%')) AS timelyRate,
+  rt.timelyEndMin,               -- 鍙婃椂鐜囧彛寰勫懡涓殑鏈�鏃╁嚭闄㈡椂闂�
+  rt.timelyEndMax,               -- 鍙婃椂鐜囧彛寰勫懡涓殑鏈�鏅氬嚭闄㈡椂闂�
+  -- 鑷锛氫袱涓樊棰濓紝姝e父鎭掍负 0
+  t.needFollowUp - (t.notSent + t.pendingFollowUp + t.sentNotDone + t.otherStatus
+                    + t.followUpSuccess + t.followUpFail) AS diffNeed,
+  t.followUpSuccess - (t.manualSuccess + t.voiceSuccess + t.smsSuccess + t.weChatSuccess
+                       + t.noChannelSuccess) AS diffSucc
+  -- 鍙﹀鍑犲垪闇�瑕佹椂鏀惧紑锛�
+  -- , t.abnormal
+  -- , t.taskSituation1, t.taskSituation2, t.taskSituation3, t.taskSituation4, t.taskSituation5, t.taskSituation6
+FROM (
+  SELECT
+    r.ward_code                                    AS leavehospitaldistrictcode,
+    MAX(r.ward_name)                               AS leavehospitaldistrictname,
+    MAX(r.dept_name)                               AS deptname,
+    MIN(r.end_time)                                AS endTimeMin,
+    MAX(r.end_time)                                AS endTimeMax,
+    COUNT(*)                                       AS dischargeCount,
+    SUM(r.f_no)                                    AS nonFollowUp,
+    SUM(r.f_need)                                  AS followUpNeeded,
+    SUM(r.f_need)                                  AS needFollowUp,
+    SUM(IF(r.sendstate = 1, 1, 0))                 AS notSent,
+    SUM(IF(r.sendstate = 2, 1, 0))                 AS pendingFollowUp,
+    SUM(IF(r.sendstate = 3, 1, 0))                 AS sentNotDone,
+    SUM(IF(r.sendstate IS NOT NULL AND r.sendstate <> 4
+           AND r.sendstate NOT IN (1, 2, 3, 5, 6, 7), 1, 0)) AS otherStatus,
+    SUM(r.f_succ)                                  AS followUpSuccess,
+    SUM(r.f_fail)                                  AS followUpFail,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '1', 1, 0))     AS manual,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '3', 1, 0))     AS voice,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '4', 1, 0))     AS sms,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '5', 1, 0))     AS weChat,
+    SUM(IF(r.sendstate = 6 AND r.cp = '1', 1, 0))  AS manualSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '3', 1, 0))  AS voiceSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '4', 1, 0))  AS smsSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '5', 1, 0))  AS weChatSuccess,
+    SUM(IF(r.sendstate = 6 AND (r.cp IS NULL OR r.cp NOT IN ('1','3','4','5')), 1, 0)) AS noChannelSuccess
+  FROM (
+    SELECT
+      ss.leavehospitaldistrictcode                            AS ward_code,
+      ss.leavehospitaldistrictname                            AS ward_name,
+      ss.leaveldeptname                                       AS dept_name,
+      ss.endtime                                              AS end_time,
+      ss.sendstate                                            AS sendstate,
+      ss.current_preachform                                   AS cp,
+      IF(ss.sendstate = 4, 1, 0)                              AS f_no,
+      IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0) AS f_need,
+      IF(ss.sendstate = 6, 1, 0)                              AS f_succ,
+      IF(ss.sendstate IN (5, 7), 1, 0)                        AS f_fail,
+      -- 闅忚鏂瑰紡鍛戒腑鏉′欢锛氭柟寮� 1 鎺掗櫎銆屾棤闇�闅忚銆嶏紱鏂瑰紡 3 鍙畻宸插畬鎴愶紱鍏跺畠鏂瑰紡涓嶈闄�
+      IF(@followUpCountStyle = '1',
+         IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0),
+         IF(@followUpCountStyle = '3',
+            IF(ss.sendstate = 6, 1, 0),
+            IF(ss.sendstate IS NOT NULL, 1, 0)))              AS ch_hit
+    FROM service_subtask ss
+    WHERE ss.del_flag = 0
+      AND ss.service_type = '2'
+      AND ss.visit_count = 1                                 -- 鍙棣栨闅忚
+      AND ss.leavehospitaldistrictcode IS NOT NULL
+      AND ss.endtime >= DATE('2026-09-04 00:00:00')
+      AND ss.endtime < DATE_ADD(DATE('2026-11-03 23:59:59'), INTERVAL 1 DAY)
+      AND ss.orgid = '20001001'
+  ) r
+  GROUP BY r.ward_code
+) t
+LEFT JOIN (
+  -- 鍙婃椂鐜囷紙selectTimelyRateBatch 鐨勭瓑浠峰啓娉曪紝鎸夌梾鍖洪鑱氬悎涓�娆″啀鍏宠仈锛岄伩鍏嶄竴瀵瑰鏀惧ぇ鍒嗘瘝锛�
+  SELECT
+    ss.leavehospitaldistrictcode AS ward_code,
+    COUNT(*) AS timely_base,
+    SUM(IF(ss.finishtime IS NOT NULL
+           AND DATEDIFF(ss.finishtime, ss.endtime) <= 7 + IFNULL(cp.compensate_days, 0), 1, 0)) AS timely_cnt,
+    MIN(ss.endtime) AS timelyEndMin,     -- 杩欎竴鍙e緞瀹為檯瑕嗙洊鍒扮殑鍑洪櫌鏃堕棿鑼冨洿
+    MAX(ss.endtime) AS timelyEndMax
+  FROM service_subtask ss
+  LEFT JOIN (
+    -- 琛ュ伩鏃堕棿锛歷archar 涓斿彲鑳芥槸绌轰覆锛屽厛鎸夊瓙浠诲姟鑱氬悎鎴愪竴琛�
+    SELECT subid, SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days
+    FROM service_subtask_preachform
+    WHERE del_flag = 0
+    GROUP BY subid
+  ) cp ON cp.subid = ss.id
+  WHERE ss.del_flag = 0
+    AND ss.service_type = '2'
+    AND ss.visit_count = 1
+    AND ss.leavehospitaldistrictcode IS NOT NULL
+    AND ss.visit_time IS NOT NULL
+    AND ss.sendstate <> 4
+    AND DATE(ss.visit_time) < DATE(NOW())     -- 鎺ュ彛鏈紶 startTime/endTime 鏃剁殑鍥哄畾鏉′欢
+    -- 鍙婃椂鐜囪涓嶈璺熶富鏌ヨ鍚屽尯闂达紵鏀惧紑涓嬮潰涓よ鍗冲彲锛堟斁寮�鍚� timelyBase 鎵嶄細绛変簬搴旈殢璁匡級
+    -- AND ss.endtime >= DATE('2026-09-04 00:00:00')
+    -- AND ss.endtime < DATE_ADD(DATE('2026-11-03 23:59:59'), INTERVAL 1 DAY)
+    AND ss.orgid = '20001001'
+  GROUP BY ss.leavehospitaldistrictcode
+) rt ON rt.ward_code = t.leavehospitaldistrictcode
+ORDER BY t.dischargeCount DESC;
+
+
+-- -----------------------------------------------------------------------------
+-- PART 1C. 鎯崇湅銆屽嚭闄㈡椂闂淬�嶈繖涓�鍒楋細鎸� 鐥呭尯 + 鍑洪櫌鏃ユ湡(DATE(endtime)) 鍒嗙粍
+--   涓轰粈涔堜笉鑳藉彧鍦� PART 1B 閲� select ss.endtime 鍐� GROUP BY ward_code锛�
+--     路 ONLY_FULL_GROUP_BY 涓嬩細鎶� 1055锛�
+--     路 鎶婂甫绉掔殑 endtime 鍔犺繘 GROUP BY = 涓�鏉¤褰曚竴缁勶紝7378 鏉¤鎷嗘垚 7133 琛岋紝姹囨�绘病鏈夋剰涔夛紱
+--     路 鏇村潙鐨勬槸鍙婃椂鐜囧瓙鏌ヨ浠嶆寜鐥呭尯鑱氬悎锛屾暣鐥呭尯鐨� timelyBase 浼氳閲嶅鎸傚埌姣忎竴琛�
+--       锛堝疄娴� timelyBase 鍚堣浼氬彉鎴� 9,649,708锛夈�傝繖閲� rt 涔熸寜銆岀梾鍖� + 鍑洪櫌鏃ユ湡銆嶈仛鍚堬紝
+--       鎵�浠ユ瘡琛岀殑鍙婃椂鐜囧拰璇ヨ鏁版嵁鏄悓涓�涓矑搴︺��
+--   瀹炴祴锛�1637 琛� / dischargeCount 鍚堣 7378 / timelyBase 鍚堣 6950 / diffNeed銆乨iffSucc 鍏� 0銆�
+-- -----------------------------------------------------------------------------
+SELECT
+  t.end_date                     AS 鍑洪櫌鏃ユ湡,      -- 鍑洪櫌鏃堕棿锛堟寜澶╋級
+  t.leavehospitaldistrictname    AS 鍑洪櫌鐥呭尯,
+  t.deptname                     AS 鍑洪櫌绉戝,
+  t.dischargeCount, t.nonFollowUp, t.followUpNeeded, t.needFollowUp,
+  t.notSent, t.pendingFollowUp, t.sentNotDone, t.otherStatus,
+  t.followUpSuccess, t.followUpFail,
+  t.manualSuccess, t.voiceSuccess, t.smsSuccess, t.weChatSuccess, t.noChannelSuccess,
+  IF(t.needFollowUp = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.followUpSuccess + t.followUpFail) / t.needFollowUp, 2), '%')) AS followUpRate,
+  IF(t.needFollowUp = 0, '0.00%',
+     CONCAT(ROUND(100 * t.followUpSuccess / t.needFollowUp, 2), '%')) AS followUpSuccessRate,
+  IF(t.manual = 0, '0.00%', CONCAT(ROUND(100 * t.manualSuccess / t.manual, 2), '%')) AS manualSuccessRate,
+  IF(t.voice  = 0, '0.00%', CONCAT(ROUND(100 * t.voiceSuccess  / t.voice,  2), '%')) AS voiceSuccessRate,
+  IF(t.sms    = 0, '0.00%', CONCAT(ROUND(100 * t.smsSuccess    / t.sms,    2), '%')) AS smsSuccessRate,
+  IF(t.weChat = 0, '0.00%', CONCAT(ROUND(100 * t.weChatSuccess / t.weChat, 2), '%')) AS weChatSuccessRate,
+  IF(t.manual + t.voice + t.sms + t.weChat = 0, '0.00%',
+     CONCAT(ROUND(100 * (t.manualSuccess + t.voiceSuccess + t.smsSuccess + t.weChatSuccess)
+                  / (t.manual + t.voice + t.sms + t.weChat), 2), '%')) AS channelSuccessRate,
+  IFNULL(rt.timely_base, 0) AS timelyBase,
+  IF(IFNULL(rt.timely_base, 0) = 0, '0.00%',
+     CONCAT(ROUND(100 * rt.timely_cnt / rt.timely_base, 2), '%')) AS timelyRate,
+  t.needFollowUp - (t.notSent + t.pendingFollowUp + t.sentNotDone + t.otherStatus
+                    + t.followUpSuccess + t.followUpFail) AS diffNeed,
+  t.followUpSuccess - (t.manualSuccess + t.voiceSuccess + t.smsSuccess + t.weChatSuccess
+                       + t.noChannelSuccess) AS diffSucc
+FROM (
+  SELECT
+    r.ward_code                                    AS leavehospitaldistrictcode,
+    r.end_date                                     AS end_date,
+    MAX(r.ward_name)                               AS leavehospitaldistrictname,
+    MAX(r.dept_name)                               AS deptname,
+    COUNT(*)                                       AS dischargeCount,
+    SUM(r.f_no)                                    AS nonFollowUp,
+    SUM(r.f_need)                                  AS followUpNeeded,
+    SUM(r.f_need)                                  AS needFollowUp,
+    SUM(IF(r.sendstate = 1, 1, 0))                 AS notSent,
+    SUM(IF(r.sendstate = 2, 1, 0))                 AS pendingFollowUp,
+    SUM(IF(r.sendstate = 3, 1, 0))                 AS sentNotDone,
+    SUM(IF(r.sendstate IS NOT NULL AND r.sendstate <> 4
+           AND r.sendstate NOT IN (1, 2, 3, 5, 6, 7), 1, 0)) AS otherStatus,
+    SUM(r.f_succ)                                  AS followUpSuccess,
+    SUM(r.f_fail)                                  AS followUpFail,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '1', 1, 0))     AS manual,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '3', 1, 0))     AS voice,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '4', 1, 0))     AS sms,
+    SUM(IF(r.ch_hit = 1 AND r.cp = '5', 1, 0))     AS weChat,
+    SUM(IF(r.sendstate = 6 AND r.cp = '1', 1, 0))  AS manualSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '3', 1, 0))  AS voiceSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '4', 1, 0))  AS smsSuccess,
+    SUM(IF(r.sendstate = 6 AND r.cp = '5', 1, 0))  AS weChatSuccess,
+    SUM(IF(r.sendstate = 6 AND (r.cp IS NULL OR r.cp NOT IN ('1','3','4','5')), 1, 0)) AS noChannelSuccess
+  FROM (
+    SELECT
+      ss.leavehospitaldistrictcode              AS ward_code,
+      DATE(ss.endtime)                          AS end_date,
+      ss.leavehospitaldistrictname              AS ward_name,
+      ss.leaveldeptname                         AS dept_name,
+      ss.sendstate                              AS sendstate,
+      ss.current_preachform                     AS cp,
+      IF(ss.sendstate = 4, 1, 0)                AS f_no,
+      IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0) AS f_need,
+      IF(ss.sendstate = 6, 1, 0)                AS f_succ,
+      IF(ss.sendstate IN (5, 7), 1, 0)          AS f_fail,
+      IF(@followUpCountStyle = '1',
+         IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0),
+         IF(@followUpCountStyle = '3',
+            IF(ss.sendstate = 6, 1, 0),
+            IF(ss.sendstate IS NOT NULL, 1, 0))) AS ch_hit
+    FROM service_subtask ss
+    WHERE ss.del_flag = 0
+      AND ss.service_type = '2'
+      AND ss.visit_count = 1
+      AND ss.leavehospitaldistrictcode IS NOT NULL
+      AND ss.endtime >= DATE('2026-09-04 00:00:00')
+      AND ss.endtime < DATE_ADD(DATE('2026-11-03 23:59:59'), INTERVAL 1 DAY)
+      AND ss.orgid = '20001001'
+  ) r
+  GROUP BY r.ward_code, r.end_date
+) t
+LEFT JOIN (
+  -- 鍙婃椂鐜囷細鍚屾牱鎸夈�岀梾鍖� + 鍑洪櫌鏃ユ湡銆嶈仛鍚堬紝鎵嶈兘鍜屽乏杈规瘡涓�琛屽涓�
+  SELECT
+    ss.leavehospitaldistrictcode AS ward_code,
+    DATE(ss.endtime)             AS end_date,
+    COUNT(*)                     AS timely_base,
+    SUM(IF(ss.finishtime IS NOT NULL
+           AND DATEDIFF(ss.finishtime, ss.endtime) <= 7 + IFNULL(cp.compensate_days, 0), 1, 0)) AS timely_cnt
+  FROM service_subtask ss
+  LEFT JOIN (
+    SELECT subid, SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days
+    FROM service_subtask_preachform
+    WHERE del_flag = 0
+    GROUP BY subid
+  ) cp ON cp.subid = ss.id
+  WHERE ss.del_flag = 0
+    AND ss.service_type = '2'
+    AND ss.visit_count = 1
+    AND ss.leavehospitaldistrictcode IS NOT NULL
+    AND ss.visit_time IS NOT NULL
+    AND ss.sendstate <> 4
+    AND DATE(ss.visit_time) < DATE(NOW())
+    AND ss.orgid = '20001001'
+  GROUP BY ss.leavehospitaldistrictcode, DATE(ss.endtime)
+) rt ON rt.ward_code = t.leavehospitaldistrictcode AND rt.end_date = t.end_date
+ORDER BY t.leavehospitaldistrictname, t.end_date;
+
+
+-- -----------------------------------------------------------------------------
+-- PART 1D. 鏄庣粏鐗堬細涓�琛� = 涓�鏉¢娆¢殢璁胯褰曪紝鐩存帴甯﹀嚭闄㈡椂闂达紙瑕佹牳瀵瑰埌浜�/鍒板ぉ灏辫窇杩欎釜锛�
+-- -----------------------------------------------------------------------------
+SELECT
+  ss.endtime                                              AS 鍑洪櫌鏃堕棿,
+  ss.leavehospitaldistrictname                            AS 鍑洪櫌鐥呭尯,
+  ss.leaveldeptname                                       AS 鍑洪櫌绉戝,
+  ss.sendname                                             AS 鎮h��,
+  ss.sendstate                                            AS 鐘舵�佺爜,
+  CASE ss.sendstate
+    WHEN 1 THEN '寰呭彂閫�' WHEN 2 THEN '寰呴殢璁�' WHEN 3 THEN '宸插彂閫佹湭瀹屾垚'
+    WHEN 4 THEN '鏃犻渶闅忚' WHEN 5 THEN '闅忚澶辫触' WHEN 6 THEN '闅忚鎴愬姛'
+    WHEN 7 THEN '澶辫触/浜哄伐瓒呮椂' ELSE '鍏跺畠'
+  END                                                     AS 闅忚鐘舵��,
+  ss.current_preachform                                   AS 闅忚鏂瑰紡,
+  ss.visit_count                                          AS 闅忚娆℃暟,
+  ss.visit_time                                           AS 闅忚鏃堕棿,
+  ss.finishtime                                           AS 瀹屾垚鏃堕棿,
+  IF(ss.sendstate = 4 OR ss.visit_time IS NULL, '-',
+     IF(ss.finishtime IS NOT NULL AND DATEDIFF(ss.finishtime, ss.endtime) <= 7, '鍙婃椂', '涓嶅強鏃�')) AS 鏄惁鍙婃椂
+FROM service_subtask ss
+WHERE ss.del_flag = 0
+  AND ss.service_type = '2'
+  AND ss.visit_count = 1
+  AND ss.leavehospitaldistrictcode IS NOT NULL
+  AND ss.endtime >= DATE('2026-09-04 00:00:00')
+  AND ss.endtime < DATE_ADD(DATE('2026-11-03 23:59:59'), INTERVAL 1 DAY)
+  AND ss.orgid = '20001001'
+ORDER BY ss.leavehospitaldistrictname, ss.endtime;
+
+
+-- -----------------------------------------------------------------------------
+-- PART 2. 鍙婃椂鐜� rate锛堟帴鍙e彧鍦ㄨ姹傞噷浼犱簡 rateDay 鏃舵墠鏈夊�硷紝涓嶄紶杩斿洖 0.0锛�
+--   鍙e緞涓庢帴鍙d笉鍚岋細杩欎竴鍧楃敤鐨勬槸銆岄殢璁挎椂闂�(visit_time)銆嶇獥鍙o紝鍒嗘瘝鏄� visit_time 涓嶄负绌轰笖
+--   涓嶆槸銆屾棤闇�闅忚銆嶇殑璁板綍鏁帮紱鍑洪櫌鏃堕棿鍙綔涓洪檮鍔犳潯浠躲��
+--   rate = 鍙婃椂鏁� / 鍒嗘瘝锛屽強鏃� = finishtime 涓嶄负绌� 涓� DATEDIFF(finishtime, endtime) <= rateDay + 琛ュ伩澶╂暟
+-- -----------------------------------------------------------------------------
+SET @rateDay = 7;   -- 鍑犲ぉ鍙婃椂鐜囷紱涓嶆兂鐪嬪氨鏁存涓嶈窇
+
+SELECT
+  ss.leavehospitaldistrictcode                                                        AS leavehospitaldistrictcode,
+  COUNT(*)                                                                            AS base,   -- 鍒嗘瘝
+  SUM(IF(ss.finishtime IS NOT NULL
+         AND DATEDIFF(ss.finishtime, ss.endtime) <= @rateDay + IFNULL(cp.compensate_days, 0), 1, 0)) AS timely, -- 鍙婃椂鏁�
+  ROUND(SUM(IF(ss.finishtime IS NOT NULL
+               AND DATEDIFF(ss.finishtime, ss.endtime) <= @rateDay + IFNULL(cp.compensate_days, 0), 1, 0))
+        / COUNT(*), 4)                                                                AS rate
+FROM service_subtask ss
+LEFT JOIN (   -- 琛ュ伩鏃堕棿锛氬厛鎸夊瓙浠诲姟鑱氭垚涓�琛屽啀鍏宠仈锛岄伩鍏嶄竴瀵瑰鎶婂垎姣嶆斁澶�
+  SELECT subid, SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days
+  FROM service_subtask_preachform
+  WHERE del_flag = 0
+  GROUP BY subid
+) cp ON cp.subid = ss.id
+WHERE ss.del_flag = 0
+  AND ss.service_type = '2'
+  AND ss.visit_time IS NOT NULL
+  AND ss.sendstate <> 4
+  AND DATE(ss.visit_time) < DATE(NOW())        -- 鎺ュ彛鏈紶 startTime/endTime 鏃剁殑鍥哄畾鏉′欢
+  AND ss.endtime >= DATE(@hospitalStartTime)   -- 绛変环浜庢帴鍙g殑 date_format(endtime,'%y%m%d') >= date_format(...)
+  AND (@orgid    IS NULL OR ss.orgid    = @orgid)
+  AND (@campusid IS NULL OR ss.campusid = @campusid)
+GROUP BY ss.leavehospitaldistrictcode
+ORDER BY base DESC;
+
+
+-- -----------------------------------------------------------------------------
+-- PART 3. 鎯冲浐瀹氭垚銆岃鍥俱�嶇殑璇濈敤杩欎釜锛圡ySQL 鐨勮鍥句笉鏀寔浼犲叆鍙傛暟锛�
+--         鎵�浠ヨ鍥炬寜銆屼竴鏉″瓙浠诲姟涓�琛屻�嶈惤鏄庣粏 + 鍑洪櫌鏃ユ湡锛屽弬鏁拌繃婊ゆ斁鍦ㄦ煡璇㈠灞傦級
+--   娉ㄦ剰锛氳鍥鹃噷鎶� followUpCountStyle 鍥哄畾鎴� '1'锛堟湰搴撴湭閰嶇疆璇ュ弬鏁帮紝鎺ュ彛瀹為檯灏辫蛋 '1'锛夈��
+--         鑻ユ煇鏈烘瀯閰嶇殑鏄� '3' 鎴栧叾瀹冨�硷紝鏀硅鍥鹃噷鐨� f_succ_first / f_succ_again / ch_hit 涓夊銆�
+-- -----------------------------------------------------------------------------
+CREATE OR REPLACE VIEW v_sf_statistic_flag AS
+SELECT
+  ss.id,
+  DATE(ss.endtime)                                        AS stat_date,     -- 鍑洪櫌鏃ユ湡锛坔ospitalStartTime 杩囨护鐢級
+  ss.leavehospitaldistrictcode                            AS ward_code,
+  ss.leavehospitaldistrictname                            AS ward_name,
+  ss.leaveldeptcode                                       AS dept_code,
+  ss.leaveldeptname                                       AS dept_name,
+  ss.drcode                                               AS dr_code,
+  ss.drname                                               AS dr_name,
+  ss.endtime                                              AS end_time,
+  ss.visit_time,
+  ss.finishtime,
+  ss.sendstate,
+  ss.visit_count,
+  ss.current_preachform                                   AS cp,
+  ss.task_situation,
+  IF(ss.sendstate = 4, 1, 0)                              AS f_no,
+  IF(ss.sendstate = 4 AND ss.task_situation = 6, 1, 0)    AS f_filter,
+  IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0) AS f_need,
+  IF(ss.visit_count = 1, 1, 0)                            AS f_first,
+  IF(ss.visit_count > 1, 1, 0)                            AS f_again,
+  IF(ss.sendstate = 6, 1, 0)                              AS f_succ_first,   -- style '1'/'3'
+  IF(ss.sendstate = 6, 1, 0)                              AS f_succ_again,   -- style '1'/'3'
+  IF(ss.sendstate IN (5, 7), 1, 0)                        AS f_fail_first,
+  IF(ss.sendstate = 5, 1, 0)                              AS f_fail_again,
+  IF(ss.excep = '1', 1, 0)                                AS f_abnormal,
+  IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0) AS ch_hit         -- style '1'
+FROM service_subtask ss
+WHERE ss.del_flag = 0
+  AND ss.service_type = '2';
+
+-- 寤哄ソ瑙嗗浘鍚庯紝鎶� PART 1 閲屽唴灞� "FROM ( ... ) r" 鏁存鎹㈡垚涓嬮潰杩欎竴琛屽嵆鍙紙鍏朵綑涓嶅姩锛夛細
+--   FROM v_sf_statistic_flag r
+--   WHERE r.stat_date >= DATE(@hospitalStartTime)
+--     AND (@hospitalEndTime IS NULL OR r.end_time < DATE_ADD(DATE(@hospitalEndTime), INTERVAL 1 DAY))
+--     AND (@orgid IS NULL OR 1 = 1)   -- 瑙嗗浘涓湭甯� orgid/campusid锛岄渶瑕佺殑璇濇妸瀹冧滑涔熷姞杩涜鍥�
+-- 鍚屾椂鎶婁腑闂村眰 nonFollowUpFirst 鐨� "* IF(@followUpCountStyle = '1', 2, 1)" 鏀规垚 "* 2"锛堣鍥鹃噷宸叉槸 style '1'锛夈��
+
+
+-- -----------------------------------------------------------------------------
+-- PART 4. 鍙e緞璇存槑 / 涓庢帴鍙g殑宸紓
+-- -----------------------------------------------------------------------------
+-- 1) 鎺ュ彛杩斿洖閲屾亽涓� 0銆佹湰娆℃湭杈撳嚭鐨勫瓧娈碉紙浠g爜杩欐潯璺緞娌¤祴鍊硷級锛�
+--    serviceCount銆乥zxCount銆亂sfCount銆亂fsCount銆乨fsCount銆乫ssbCount銆亂wcCount銆�
+--    dxfscs銆乨xsfwccs銆乨hfscs銆乨hsfwccs銆亂czs銆乭fycs銆乫inishRate銆乯oyCount銆乯oyAllCount銆乯oyTotal銆�
+--    pendingFollowUp锛堥娆″緟闅忚锛夊悓鐞嗭細getStatistic 鐨勨�滀笉鍒嗘鏁扳�濆垎鏀噷娌℃湁绱姞锛屾亽涓� 0銆�
+-- 2) nonFollowUpFirst 鍦� followUpCountStyle='1' 鏃舵帴鍙d細閲嶅绱姞涓�娆★紙涓や釜 if 閮藉懡涓� sendstate=4锛夛紝
+--    SQL 鐢� *2 澶嶅埢銆傝嫢鎸夆�滀竴鏉¤褰曠畻涓�娆♀�濆簲涓� 1 鍊嶏紝鎶� IF(@followUpCountStyle='1',2,1) 鏀规垚 1銆�
+-- 3) 姣旂巼鏍煎紡锛氭帴鍙g敤 DecimalFormat("##.##%")锛堝洓鑸嶅叚鍏ャ�佹湯灏� 0 鐪佺暐锛屽 85.5%锛夛紝
+--    SQL 鐢� ROUND(...,2)锛堝洓鑸嶄簲鍏ャ�佸浐瀹氫袱浣嶏紝濡� 85.50%锛夛紱鍒嗘瘝涓� 0 鏃舵帴鍙g粰 "0.00%"銆�
+-- 4) deptcode/deptname/drcode/drname锛氭帴鍙e彇銆屽垎缁勫唴绗竴鏉¤褰曘�嶇殑鍊硷紙HashMap 椤哄簭锛屾棤涓氬姟鍚箟锛夛紝
+--    SQL 鐢� MAX() 浠f浛锛涙寜鐥呭尯缁熻鏃惰繖鍥涘垪鍙綔鍙傝�冦��
+-- 5) 闅忚鎯呭喌 taskSituation1~6锛歵ask_situation = 1~5 鍒嗗埆瀵瑰簲 1~5锛屽叾浠�(=7) 瀵瑰簲 6銆�
+--    鏈簱 service_subtask.task_situation 鍏ㄤ负 NULL锛屾墍浠ヨ繖鍑犲垪鐩墠蹇呯劧閮芥槸 0銆�
+-- 6) 鍙湅棣栨/鍐嶆锛氭帴鍙d紶 visitCount=1 鍙湅棣栨銆�>1 鍙湅鍐嶆锛涙湰 SQL 涓ょ被鍚屾椂缁欙紝鍧囦负 0 璇存槑璇ョ獥鍙f病鏈夊搴旀暟鎹��
+-- 7) 鎹㈢淮搴︼細GROUP BY r.ward_code锛堢梾鍖猴紝鏈� SQL锛夆啋 r.dept_code锛堢瀹わ級/ r.dr_code锛堝尰鐢燂級銆�
+--    缁熻鏂瑰紡銆佸強鏃剁巼澶╂暟閮介�氳繃 PART 0 鐨勫彉閲忔帶鍒讹紝涓嶉渶瑕佹敼缁撴瀯銆�
+-- =============================================================================
diff --git "a/sql/\344\273\273\345\212\241\345\274\200\345\205\263_sys_config.sql" "b/sql/\344\273\273\345\212\241\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..821fc4e
--- /dev/null
+++ "b/sql/\344\273\273\345\212\241\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,40 @@
+-- ----------------------------
+-- 浠诲姟妯″潡寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 閿悕锛歵ask.enabled
+-- 閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--       false = 鍏抽棴
+--
+-- 鍏抽棴鍚庣殑琛屼负锛�
+--   1) 鏈ā鍧� 59 涓换鍔$鐐癸紙/smartor/servicetask/** 11 涓� +
+--      /smartor/serviceSubtask/** 48 涓級浼氳 TaskAvailabilityInterceptor 鎷︿笅锛�
+--      杩斿洖鏄庣‘涓氬姟閿欒銆屼换鍔″姛鑳芥湭鍚敤锛堝弬鏁伴厤缃� task.enabled=false锛夛紝璇ユ帴鍙d笉鍙敤銆嶏紝
+--      鑰屼笉鏄� 404锛�
+--   2) 浠诲姟/瀛愪换鍔℃暟鎹湰韬笉鍙楀奖鍝嶏紝鍏跺畠妯″潡浠嶅彲閫氳繃 ruoyi-task 鐨� api 鍙栨暟锛�
+--   3) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紙杩涚▼鍐呭紑鍏崇紦瀛� TTL锛夛紝涓嶉渶瑕侀噸鍚��
+--
+-- 娉ㄦ剰锛氭湰椤圭洰鐢ㄧ殑 MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+--       鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛岋紝鑴氭湰鍙噸澶嶆墽琛屻��
+-- ----------------------------
+
+SET @task_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+SET @ddl = IF(@task_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''浠诲姟妯″潡寮�鍏�'', ''task.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''浠诲姟/瀛愪换鍔℃ā鍧楁�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''task.enabled'')');
+
+PREPARE task_stmt FROM @ddl;
+EXECUTE task_stmt;
+DEALLOCATE PREPARE task_stmt;
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config WHERE config_key = 'task.enabled';
diff --git "a/sql/\344\277\256\345\244\215_nhfy_\346\273\241\346\204\217\345\272\246\346\230\216\347\273\206\350\242\253\351\200\273\350\276\221\345\210\240\351\231\244_20261021.sql" "b/sql/\344\277\256\345\244\215_nhfy_\346\273\241\346\204\217\345\272\246\346\230\216\347\273\206\350\242\253\351\200\273\350\276\221\345\210\240\351\231\244_20261021.sql"
new file mode 100644
index 0000000..fe70841
--- /dev/null
+++ "b/sql/\344\277\256\345\244\215_nhfy_\346\273\241\346\204\217\345\272\246\346\230\216\347\273\206\350\242\253\351\200\273\350\276\221\345\210\240\351\231\244_20261021.sql"
@@ -0,0 +1,128 @@
+-- ============================================================================
+-- 鍗楀崕闄勪竴锛坣hfy锛夛細婊℃剰搴﹀鍑恒�岄棶棰樿鎯呭崰姣斻�嶆瘮銆屾偅鑰呴殢璁夸俊鎭〃鍗曘�嶅皯 10 浜猴紙370 vs 380锛�
+--                                                        2026-10-21 鎺掓煡
+--
+-- 銆愮幇璞°�戝鍑� patItemExport锛坰heet1=鎮h�呴殢璁夸俊鎭〃鍗� 380 琛岋紝sheet2=闂璇︽儏鍗犳瘮锛�
+--         sheet2 閲� 19 閬撻鐨勨�滄暟閲忓悎璁♀�濋兘鍙湁 370锛屾瘮 sheet1 灏� 10銆�
+--
+-- 銆愭牴鍥狅紙宸插湪搴撲笂鏍稿疄锛夈��
+--   鏈壒 380 涓瓙浠诲姟閲岋紝鏈� 10 涓瓙浠诲姟鐨�**鍏ㄩ儴浣滅瓟鏄庣粏琚�昏緫鍒犻櫎**锛坰ervice_subtask_detail.del_flag='1'锛夛紝
+--   鑰� sheet2 鐨� SQL锛圫atisfactionMapper.xml#statMydQuestionOptionForExport锛夊甫 d.del_flag=0锛�
+--   鎵�浠ヨ繖 10 浜哄湪鍗犳瘮閲屽畬鍏ㄦ秷澶憋紱sheet1 鍙煡 service_subtask銆佷笉鐪嬫槑缁嗭紝鎵�浠ヤ粬浠粛鍦ㄨ〃鍗曢噷銆�
+--
+--   鏍稿疄鏁版嵁锛�2026-10-21 鏌� 192.168.99.192/smartor_nhfy锛夛細
+--     路 澶嶇幇瀵煎嚭鏉′欢 = orgid 20001001 / campusid 30001002 / service_type 6 / sendstate 6 /
+--       visit_count 1 / (deptcode='40003511' OR leavehospitaldistrictcode='40003514') 鈫� 鎭板ソ 380 琛�
+--     路 杩� 380 琛岄噷锛屾湁鏈夋晥鏄庣粏(del_flag=0)鐨勫彧鏈� 370 琛� 鈫� 19 閬撻姣忛閮藉皯鍚屾牱鐨� 10 浜�
+--     路 10 涓棶棰樺瓙浠诲姟鍏ㄩ儴鍦� taskid=196銆屽叏闄㈡弧鎰忓害銆嶏紝瀹屾垚鏃堕棿閮藉湪 2026-09-08锛宒eptcode=40003511
+--     路 姣忎釜瀛愪换鍔¤鍐欏叆浜� 2~6 浠戒竴妯′竴鏍风殑绛斿嵎锛�19 棰� 脳 N 浠斤級锛�**鍏ㄩ儴 del_flag=1**锛�
+--       涓� update_time == create_time锛堝啓鍏ュ悗鍚屼竴绉掑唴灏辫鍒狅級锛屼緥濡� 鏉ㄥ啗(53783) 6 浠界瓟妗堥�愰瀹屽叏鐩稿悓
+--     路 鍏ㄩ櫌鍚岀被鍨嬪紓甯革細service_type=6 閲屸�滄槑缁嗗叏琚垹鍏夆�濈殑瀛愪换鍔″叡 22 涓紙8鏈�3涓��9鏈�19涓級锛�
+--       鍙︽湁 60 涓槸鈥滈儴鍒嗚鍒犫�濄�傛墍浠ヨ繖涓嶆槸涓�娆℃�ф墜婊戯紝鑰屾槸鏌愭潯鈥滈噸濉�/瑕嗙洊鈥濋摼璺弽澶嶅彂鐢熴��
+--
+-- 銆愪负浠�涔堚�滈噸濉�濅細鍙樻垚澶氫唤鍓湰銆�
+--   ServiceSubtaskDetailMapper.xml#isExistServiceSubtaskDetail 鍙煡 del_flag=0锛�
+--   鏄庣粏涓�鏃﹁閫昏緫鍒犻櫎灏辨煡涓嶅埌 鈫� 涓嬩竴娆′繚瀛樿蛋 insert锛屼簬鏄瘡閲嶅~涓�娆″氨澶氫竴浠藉壇鏈��
+--
+-- 銆愯鏄庛�戝綋鍓嶄粨搴撻噷鍞竴浼氭妸 service_subtask_detail.del_flag 缃� '1' 鐨勪唬鐮佹槸
+--   ServiceSubtaskServiceImpl#setFailSubTaskDefalutVal锛堢害 3535~3543 琛岋細淇濆瓨榛樿鍊煎け璐ユ椂鈥滃垹闄よ鏂板detail閲岀殑鏁版嵁鈥濓級锛�
+--   浣嗗畠鍙鐞� sendstate=5銆佷笖鍙拡瀵� sys_config 閲� hosp.default.dept(40003025,40003460) /
+--   hosp.default.ward(40003026,40003461) 閰嶇疆鐨勭瀹ょ梾鍖猴紝涓嶅惈 40003511銆佷篃涓嶆槸 sendstate=6銆�
+--   鈫� 绾夸笂鍖�/鍏朵粬鍏ュ彛杩樻湁涓�澶勨�滈噸濉嵆鍏堝垹鏃ф槑缁嗏�濈殑閫昏緫锛岄渶瑕佺户缁畾浣嶏紙瑙佹枃鏈�愬緟鍔炪�戯級銆�
+--
+-- 銆愭湰鑴氭湰銆戠粰鍑轰袱绉嶆妸 380 / 370 琛ユ垚涓�鑷寸殑鍔炴硶锛岄粯璁ら兘娉ㄩ噴鎺夛紝纭鍚庡啀鎵ц銆�
+-- ============================================================================
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�0銆戝奖鍝嶆竻鍗曪紙10 涓瓙浠诲姟锛宒eptcode=40003511锛宼askid=196锛�2026-09-08 瀹屾垚锛�
+-- ----------------------------------------------------------------------------
+SELECT s.id AS subid, s.patid, s.sendname, s.phone, s.finishtime,
+       (SELECT COUNT(*) FROM service_subtask_detail d WHERE d.sub_id = s.id) AS detail_rows,
+       (SELECT COUNT(*) FROM service_subtask_detail d WHERE d.sub_id = s.id AND d.del_flag = 0) AS live_rows
+FROM service_subtask s
+WHERE s.id IN (44957, 45094, 45095, 45099, 45102, 45108, 45109, 45110, 45111, 45114)
+ORDER BY s.finishtime;
+-- 棰勬湡锛�10 琛岋紝detail_rows 38~114锛宭ive_rows 鍏ㄤ负 0
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆戝浠斤紙鎵ц浠讳綍淇敼鍓嶅厛璺戯級
+-- ----------------------------------------------------------------------------
+-- CREATE TABLE bak_ssd_20261021_nhfy AS
+-- SELECT * FROM service_subtask_detail
+-- WHERE sub_id IN (44957, 45094, 45095, 45099, 45102, 45108, 45109, 45110, 45111, 45114);
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆戞柟妗圓锛堟帹鑽愶級锛氭瘡閬撻鍙仮澶嶁�滄渶鏂颁竴浠解�濆壇鏈紝鍏朵綑鍓湰缁х画淇濈暀 del_flag=1
+--      褰卞搷琛屾暟锛�190锛�= 19 棰� 脳 10 浜猴級锛屽凡 dry-run 鏍稿疄
+--      鈿狅笍 鍓嶆彁锛氳繖浜涚瓟妗堢‘瀹炴槸鎮h�呯殑鐪熷疄浣滅瓟锛堝凡鏍稿锛氭瘡浠藉壇鏈瓟妗堝畬鍏ㄤ竴鑷达紝涓嶆槸鑴忔暟鎹級
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask_detail d
+--     JOIN (SELECT sub_id, scriptid, MAX(id) AS keep_id
+--           FROM service_subtask_detail
+--           WHERE sub_id IN (44957, 45094, 45095, 45099, 45102, 45108, 45109, 45110, 45111, 45114)
+--           GROUP BY sub_id, scriptid) x
+--     ON x.keep_id = d.id
+-- SET d.del_flag = '0', d.update_time = NOW();
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�2b銆戞柟妗圔锛堝鏋滆繖鍑犱唤闂嵎鍏跺疄涓嶈绠椻�滃凡瀹屾垚鈥濓級锛氭妸瀛愪换鍔℃敼鎴愨�滄棤闇�闅忚/涓嶆墽琛屸�濓紝
+--      杩欐牱瀹冧滑涓嶄細鍐嶈繘鈥滃凡瀹屾垚鈥濆彛寰勶紝琛ㄥ崟鍜屽崰姣旈兘浼氭槸 370銆�
+-- ----------------------------------------------------------------------------
+-- UPDATE service_subtask SET sendstate = 4, update_time = NOW()
+-- WHERE id IN (44957, 45094, 45095, 45099, 45102, 45108, 45109, 45110, 45111, 45114);
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戞牎楠岋紙鎵ц鏂规A鍚庡簲杈撳嚭 380 / 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');
+
+-- 閫愰鍐嶇‘璁や竴娆★紙19 琛岋紝counted_patients 搴斿叏閮� = 380锛�
+SELECT d.questiontext, COUNT(DISTINCT s.id) AS counted_patients
+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
+ORDER BY counted_patients DESC, d.questiontext;
+
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戝洖婊氾紙鏂规A鎵ц鍚庢墠闇�瑕侊級
+-- ----------------------------------------------------------------------------
+-- 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;
+-- DROP TABLE bak_ssd_20261021_nhfy;
+
+
+-- ============================================================================
+-- 銆愬緟鍔烇細鏍瑰洜娌荤悊锛堜唬鐮佷晶锛夈��
+-- 1) 瀹氫綅绾夸笂鈥滈噸濉�/瑕嗙洊鈥濇妸鏃ф槑缁嗙疆 del_flag=1 鐨勯偅娈典唬鐮侊細
+--    褰撳墠浠撳簱鍙湁 setFailSubTaskDefalutVal 浼氳繖涔堝仛锛堜笖鍙鐩� hosp.default.dept/ward 鐨勭瀹わ級锛�
+--    40003511 涓嶅湪閰嶇疆閲� 鈫� 璇存槑绾夸笂鍖呯増鏈笉鍚岋紝鎴栬繕鏈夊彟涓�澶勫垹闄ゅ叆鍙c��
+--    寤鸿锛氬湪 service_subtask_detail 鐨� update/delete 鍏ュ彛鍔犳棩蹇楋紙sub_id + 鎿嶄綔浜� + 鏃堕棿锛夛紝
+--          鎴栧绾夸笂 jar 鐩存帴鍙嶆煡 updateServiceSubtaskDetail 鐨勮皟鐢ㄧ偣銆�
+-- 2) 鏀规垚鈥滃厛鍐欐垚鍔熴�佸啀鍒犳棫鈥濓紝涓嶈鈥滃厛鍒犲悗鍐欌�濓細
+--    鐜板湪 isExistServiceSubtaskDetail 鍙煡 del_flag=0锛屽垹闄ゅ悗蹇呯劧鍐� insert锛�
+--    鎵�浠ヤ竴娆″紓甯镐腑鏂氨浼氱暀涓嬧�滃叏鍒犳棤鏂扳�濈殑绌虹瓟鍗凤紙鏈棶棰橈級銆�
+--    寤鸿缁� (sub_id, scriptid) 鍔犲敮涓�绾︽潫鎴栨敼鎴愮墿鐞嗚鐩栨洿鏂般��
+-- 3) 瀵煎嚭渚у厹搴曪紙鍙e緞鍙嚜瑙i噴锛夛細
+--    鈥滈棶棰樿鎯呭崰姣斺�漇heet 澧炲姞涓�琛屻�屾湭浣滅瓟銆嶏紱鎴栧湪銆屾偅鑰呴殢璁夸俊鎭〃鍗曘�嶅姞涓�鍒椼�屾槸鍚﹀凡浣滅瓟銆嶏紝
+--    杩欐牱 380 vs 370 褰撳満灏辫兘瀵逛笂锛屼笉鐢ㄥ啀缈诲簱銆�
+-- ============================================================================
diff --git "a/sql/\345\207\272\345\205\245\351\231\242\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql" "b/sql/\345\207\272\345\205\245\351\231\242\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..15a9c23
--- /dev/null
+++ "b/sql/\345\207\272\345\205\245\351\231\242\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,114 @@
+-- ----------------------------
+-- 鍑哄叆闄㈤殢璁挎ā鍧� + 瀹f暀妯″潡 寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 鏈剼鏈竴娆″缓涓や釜閿紝閮藉彲閲嶅鎵ц锛堝箓绛夛級锛�
+--
+--   閿悕锛歩nhospvisit.enabled
+--   閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--         false = 鍏抽棴
+--
+--   閿悕锛歱ublicity.enabled
+--   閿�硷細true  = 鍚敤锛堥粯璁わ級
+--         false = 鍏抽棴锛堝叆闄㈠鏁欎笌鑽搧瀹f暀閮戒笉鍐嶆墽琛岋級
+--
+-- 鍏抽棴 inhospvisit 鍚庣殑琛屼负锛�
+--   1) 銆怘TTP 闈€�憑@code /smartor/patinhosp} 鍓嶇紑涓嬬殑绔偣**鍏ㄩ儴**琚�
+--      InhospVisitAvailabilityInterceptor 鎷︿笅锛岃繑鍥炴槑纭笟鍔¢敊璇�
+--      銆屽嚭鍏ラ櫌闅忚鍔熻兘鏈惎鐢紙鍙傛暟閰嶇疆 inhospvisit.enabled=false锛夛紝璇ユ帴鍙d笉鍙敤銆嶈�屼笉鏄� 404銆�
+--      鍙楃鐨勬槸**鍓嶇紑閫氶厤** /smartor/patinhosp/**锛堜笉鍐嶉�愪釜鏋氫妇璺緞锛夛紝
+--      褰撳墠瀹炴祴瑕嗙洊 15 涓鐐癸紙3 闅忚瑙﹀彂 + 9 鍩虹鏌ヨ/CRUD + 3 澶嶅悎绔偣锛夈��
+--      鉁� **浠ュ悗鍐嶅線鏈ā鍧楀姞鎺ュ彛锛岃嚜鍔ㄥ彈绠★紝涓嶉渶瑕佹敼杩欎釜閰嶇疆銆佷篃涓嶇敤鏀� WebConfig**
+--         鈥斺�� 鍙鏂版帶鍒跺櫒浠嶆寕鍦� /smartor/patinhosp 鍓嶇紑涓嬨��
+--      鈿狅笍 鍙e緞鍙樻洿鍙诧細鍘熻璁″彧鎷� 2 涓殢璁胯Е鍙戠鐐癸紝鍩虹鏌ヨ鍒绘剰涓嶆嫤
+--      锛堢悊鐢憋細"鍏抽殢璁夸笉璇ヨ鍑哄叆闄㈣褰曟煡涓嶅埌"锛夈�傜敤鎴峰疄鏈哄彂鐜�
+--      POST /smartor/patinhosp/selectPatMedInhospList 鍦ㄥ紑鍏冲叧闂悗浠嶈兘鏌ュ埌锛�
+--      鍐冲畾鏀逛负"鍏冲氨鏁翠釜妯″潡鐨� HTTP 闈笉鍙敤"銆�
+--      瑕嗙洊鎬х敱 sql/_probe/verify_inhospvisit_switch.py 浠庢帶鍒跺櫒婧愮爜**瀹炴祴**鏍稿
+--      锛堟柊鎺у埗鍣ㄨ嫢鎸傞敊鍓嶇紑浼氳瀹� FAIL 鍑烘潵锛夈��
+--   2) 鈿狅笍 **鍙嫤 HTTP锛屼笉鍔ㄨ法妯″潡鏁版嵁濂戠害**锛欼nhospVisitDataService锛圚IS 閲囬泦銆佹。妗堟眹鑱氥��
+--      缁熻绛夋ā鍧楀唴閮�/璺ㄦā鍧楄闂級**鐓у父鍙敤**銆傜悊鐢憋細閭f槸鏁版嵁鍚屾閾捐矾锛�
+--      鍏虫帀闅忚涓嶈璁� HIS 鍐欎笉杩涘嚭鍏ラ櫌璁板綍锛堟暟鎹柇娴佹瘮"椤甸潰鐪嬩笉鍒�"涓ラ噸寰楀锛夈��
+--      鎵�浠�"鏁翠釜妯″潡涓嶅彲鐢�"鐨勫噯纭惈涔夋槸銆岃妯″潡鐨� HTTP 闈笉鍙敤銆嶃��
+--   3) 鈿狅笍 **瀹氭椂浠诲姟涔熷彈姝ゅ紑鍏虫帶鍒�**锛�2025 淇锛屼笌鍘熷厛鐨�"宸叉媿鏉匡細涓嶅彈鎺�"鐩稿弽 鈥斺�� 瑙佷笅锛夈��
+--      RyTask 鐨� 5 涓叆鍙e凡鍏ㄩ儴鎺ュ紑鍏筹細dealOutHospInfo / dealOutHospInfoBySchedule /
+--      dealTaskGroupOutHosp / rollTaskGroupCycle 璧伴棬闈紝dealSubtaskDeadline 璧板叆鍙e畧鍗��
+--      鍏抽棴鍚庢ā鍧楀疄鐜版墦 WARN銆屾ā鍧楁湭鍚敤鈥﹁烦杩囥�嶅苟杩斿洖 0锛屽綋澶╀笉鍐嶇敓鎴愰殢璁裤��
+--
+--      鈿狅笍鈿狅笍 杩欐潯**鎺ㄧ炕浜嗗師璁捐**锛屽繀椤荤煡閬撻闄╁彉浜嗭細
+--        鍘熻璁$殑鐞嗙敱鏄�"鍏虫帀瀹氭椂浠诲姟 = 褰撳ぉ鍏ㄩ櫌闅忚鍋滄憜锛岃�屽紑鍏虫槸鐑鐨勶紝
+--        涓�娆¤鎿嶄綔娌℃湁浠讳綍鍙嶉娓犻亾"銆傜幇鍦ㄥ畠纭疄浼氬仠鎺夊畾鏃朵换鍔★紝鎵�浠ワ細
+--          路 璇搷浣滀唬浠� = 褰撳ぉ鍏ㄩ櫌闅忚涓嶇敓鎴愶紙涓庡師璁捐鎷呭績鐨勪竴鑷达級锛�
+--          路 浣嗗弽棣堟笭閬�**鍙樺ソ浜�** 鈥斺�� 鍏抽棴鏃舵棩蹇楅噷浼氭槑纭墦鍑�
+--            銆屻�愬嚭鍏ラ櫌闅忚銆戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� inhospvisit.enabled=false锛夛紝鈥� 璺宠繃銆嶏紝
+--            鑰屼笉鏄儚鍘熸潵閭f牱"鍏充簡寮�鍏冲嵈姣棤鏁堟灉銆佷篃娌′换浣曟彁绀�"锛�
+--          路 寮�鍏冲湪銆岀郴缁熺鐞� 鈫� 鍙傛暟璁剧疆銆嶉噷鍙鍙敼锛屾瘮鍘汇�屽畾鏃朵换鍔°�嶉噷鎵� sys_job 鏇寸洿瑙傘��
+--        瑕佹殏鍋滃畾鏃朵换鍔′粛鐒跺彲浠ュ幓銆岀郴缁熺鐞� 鈫� 瀹氭椂浠诲姟銆嶆殏鍋� sys_job锛堜袱鏉¤矾閮芥湁鏁堬級锛�
+--          ryTask.dealOutHospInfo / ryTask.dealOutHospInfoBySchedule / ryTask.dealTaskGroupOutHosp
+--        **鏈紑鍏宠鐩栫殑瀹氭椂浠诲姟鍏ュ彛宸插叏瑕嗙洊**锛�5 涓級锛�
+--          dealOutHospInfo / dealOutHospInfoBySchedule / dealTaskGroupOutHosp /
+--          rollTaskGroupCycle / dealSubtaskDeadline
+--        鍏朵腑 rollTaskGroupCycle 璧伴棬闈紙瀹屾垚浜嗘ā鍧楀寲鏂规閲屼竴鐩存病鍋氱殑"绗� 10 姝�"鍒囨崲锛夛紝
+--        dealSubtaskDeadline 鍥犳ā鍧椾晶鏃犲畬鏁村叆鍙h�岄噰鐢�"鍏ュ彛鑷甫瀹堝崼"銆�
+--        鍙︼細鎵嬫湳闅忚锛坉ealOperationInfo锛変笌闂ㄨ瘖闅忚锛堥棬璇婄敓鎴愶級鍚勮嚜鍙�
+--        othervisit.enabled / outpatientvisit.enabled 绠¤緰锛屼笉鍙楁湰寮�鍏崇锛堣繖鏄埢鎰忕殑锛夈��
+--   4) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紙杩涚▼鍐呭紑鍏崇紦瀛� TTL锛夛紝涓嶉渶瑕侀噸鍚��
+--
+-- 鍏抽棴 publicity 鍚庣殑琛屼负锛�
+--   1) 銆愮敓鎴愪晶銆戝叆闄㈠鏁欙紙sys_config: in.helibrary.switch = "2" 鏃舵墽琛岋級涓庤嵂鍝佸鏁�
+--      锛堜粎 sltd 绔欑偣锛夐兘涓嶅啀鐢熸垚 鈥斺�� 鍑哄叆闄㈤殢璁夸富娴佺▼鍥炶皟 PublicityApi锛�
+--      鐢� PublicityFacade 鍒ゆ湰寮�鍏冲悗璺宠繃锛�
+--   2) 銆愬彂閫佷晶銆戝凡鐢熸垚鐨勫鏁欏瓙浠诲姟锛坰ubtask.type = "3"锛屽惈"閫氱煡"锛�**涔熶笉鍐嶅彂鍑�** 鈥斺��
+--      RyTask#sfHandlle 涓� RedisMqReceiver#tsakHandle 閮藉湪娲惧彂鍓嶅垽鏈紑鍏筹紝
+--      鍏抽棴鏃惰烦杩囨墍鏈夐�氶亾锛堢數璇�/鐭俊/鍏紬鍙�/浜哄伐锛夊苟鎵� WARN锛�
+--        銆屻�愬鏁欍�戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� publicity.enabled=false锛夛紝璺宠繃瀹f暀鍙戦�併�俿ubtaskId=..., patid=...銆�
+--      鈿狅笍 2025 淇鍓�**鍙�**绠′綇浜嗙敓鎴愪晶锛氬叧鎺夊紑鍏冲悗宸茬敓鎴愮殑瀹f暀鐓ф牱鍙戝嚭鍘汇��
+--      鈿狅笍 璺宠繃鏃跺埢鎰�**涓嶆帹杩� subtask 鐘舵�併�佷篃涓嶈澶辫触** 鈥斺�� 鍏抽棴鏄�"鏆傛椂涓嶅彂"锛�
+--         涓嶆槸"杩欎釜鎮h�呬笉闇�瑕佸鏁�"锛涙爣鎴愬け璐ヤ細璁╄繖鏉″鏁欏湪寮�鍏虫仮澶嶅悗姘歌繙涓㈠け銆�
+--         寮�鍏虫墦寮�鍚庯紝涓嬩竴娆� longTaskSend / compensateTask 浼氱収甯告妸瀹冩崬鍑烘潵鍙戝嚭銆�
+--   3) 鍑哄叆闄㈤殢璁夸富娴佺▼涓嶅彈褰卞搷锛堝鏁欏け璐ョ粷涓嶆嫋鍨殢璁匡級锛屽叾瀹冪被鍨嬬殑闅忚锛坱ype 1/2/4锛変篃涓嶅彈褰卞搷锛�
+--   4) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紝涓嶉渶瑕侀噸鍚��
+--
+-- 娉ㄦ剰锛氭湰椤圭洰鐢ㄧ殑 MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+--       鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛屻��
+-- ----------------------------
+
+SET @sys_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+-- ---------------------------------------------------------------
+-- 1) inhospvisit.enabled
+-- ---------------------------------------------------------------
+SET @ddl = IF(@sys_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''鍑哄叆闄㈤殢璁挎ā鍧楀紑鍏�'', ''inhospvisit.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''鍑哄叆闄㈤殢璁挎�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue銆傛敞鎰忥細2025淇鍚庢湰寮�鍏充篃浣滅敤浜庡畾鏃朵换鍔★紙dealOutHospInfo绛�3涓叆鍙o級锛屽叧闂�=褰撳ぉ涓嶅啀鐢熸垚闅忚''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''inhospvisit.enabled'')');
+
+PREPARE inhospvisit_stmt FROM @ddl;
+EXECUTE inhospvisit_stmt;
+DEALLOCATE PREPARE inhospvisit_stmt;
+
+-- ---------------------------------------------------------------
+-- 2) publicity.enabled
+-- ---------------------------------------------------------------
+SET @ddl = IF(@sys_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''瀹f暀妯″潡寮�鍏�'', ''publicity.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''瀹f暀锛堝叆闄㈠鏁�/鑽搧瀹f暀锛夋�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue銆傚悓鏃剁鐢熸垚渚т笌鍙戦�佷晶锛坱ype=3瀹f暀/閫氱煡锛�''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''publicity.enabled'')');
+
+PREPARE publicity_stmt FROM @ddl;
+EXECUTE publicity_stmt;
+DEALLOCATE PREPARE publicity_stmt;
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config
+--  WHERE config_key IN ('inhospvisit.enabled', 'publicity.enabled');
diff --git "a/sql/\345\234\250\351\231\242\344\277\241\346\201\257\345\210\267\346\226\260_sys_job.sql" "b/sql/\345\234\250\351\231\242\344\277\241\346\201\257\345\210\267\346\226\260_sys_job.sql"
new file mode 100644
index 0000000..fdfaae0
--- /dev/null
+++ "b/sql/\345\234\250\351\231\242\344\277\241\346\201\257\345\210\267\346\226\260_sys_job.sql"
@@ -0,0 +1,59 @@
+-- ============================================================================
+-- 鍦ㄩ櫌鎮h��"绉戝 / 鐥呭尯 / 搴婁綅"姣忔棩鍒锋柊 鈥斺�� 瀹氭椂浠诲姟鐧昏锛堝彲閲嶅鎵ц锛�
+--
+-- 鑳屾櫙锛氬湪闄㈡偅鑰呬細杞銆佽浆鐥呭尯銆佹崲搴婏紝鑰� pat_med_inhosp 鐨勪綅缃瓧娈靛彧鍦�"鍏ラ櫌閲囬泦"鏃�
+--       鍐欒繃涓�娆★紝涔嬪悗涓嶄細鑷繁鏇存柊锛岃浆绉�/鎹㈠簥鎮h�呬細涓�鐩存樉绀烘棫绉戝/鏃х梾鍖�/鏃у簥浣嶃��
+--       鏈换鍔℃瘡澶╂寜鎮h�呮煡涓�閬� HIS 閲岃鎮h��"褰撳墠鐨勫湪闄俊鎭�"
+--       锛坉tcQueryHealthcareRecordList 鈥斺�� 涓庡叆闄㈤噰闆嗗悓涓�涓帴鍙o紝鎸� healthcareRecordNo 鍗曟煡銆�
+--        statusList=["FH0109.24"] 鍙彇鍦ㄩ櫌璁板綍锛夛紝涓庡簱鍐呮瘮瀵瑰悗鍙啓鍙樺寲鐨勫瓧娈点��
+--       宸蹭笉鍦ㄩ櫌锛堟帴鍙h繑鍥炵┖锛夌殑鎮h�呭彧璺宠繃璁℃暟锛氫綅缃繚鎸佷笉鍔紝inhospstate 浠嶇敱鍑洪櫌閲囬泦璐熻矗銆�
+--
+-- 瀹炵幇锛歳uoyi-datacollection 鐨� InhospDeptRefreshServiceImpl
+--       鍏ュ彛锛歳uoyi-quartz 鐨� com.ruoyi.quartz.task.RyTask#refreshInhospDeptInfo()
+--       鍙e緞锛氫粎 spring.profiles.active=nhfy锛堝崡鍗庨檮涓�锛夋墽琛岋紱鍏朵粬绔欑偣鐩存帴璺宠繃
+--
+-- 鍙傛暟閫夋嫨鐞嗙敱锛�
+--   cron_expression = '0 30 3 * * ?'  姣忓ぉ 03:30
+--       鈥斺�� 閬垮紑 01:00 鐨勫叆闄㈤噰闆嗭紙dealHisData锛変笌 02:00 鐨勫嚭闄㈠鐞嗭紙dealOutHospInfo锛夛紝
+--          鍚﹀垯浼氫笌鏈换鍔℃姠"鍚屼竴鎵规偅鑰呯殑褰撳墠鐘舵��"锛岃鍒板崐鏂板崐鏃х殑鏁版嵁銆�
+--   concurrent      = '1'             绂佹骞跺彂锛堜竴杞害 10 鍒嗛挓锛氬疄娴嬪崟娆� 137~460ms 脳 绾� 3000 浜猴紱
+--                                     鍙犲姞鎵ц娌℃湁鎰忎箟锛屽疄鐜伴噷鍙︽湁 Redis 杩愯閿佸厹搴曟墜宸ヨЕ鍙戯級
+--   misfire_policy  = '1'             绔嬪嵆鎵ц锛氭湇鍔″湪 03:30 鍋滄満銆佷箣鍚庢墠鎭㈠鏃惰ˉ璺戜竴娆°��
+--                                     鏈换鍔″箓绛夛紙鍙啓鍙樺寲鐨勫瓧娈碉級锛岃ˉ璺戞棤瀹筹紱
+--                                     鑻ユ兂"閿欒繃灏辩畻浜�"锛屾敼鎴� '3' 鍗冲彲銆�
+--   status          = '0'             姝e父锛堢櫥璁板悗鍗冲惎鐢級銆傝鍋滅敤鏀规垚 '1'锛�
+--                                     鎴栫洿鎺ュ湪銆岀郴缁熺鐞� 鈫� 瀹氭椂浠诲姟銆嶉噷鏆傚仠銆�
+--
+-- 娉ㄦ剰锛氭湰浠诲姟鍙楁暟鎹噰闆嗘ā鍧楀紑鍏崇杈栵紙sys_config: datacollection.enabled锛夆�斺��
+--       妯″潡鍏抽棴鏃堕棬闈㈡姏 DataCollectionModuleDisabledException锛孯yTask 鍙墦涓�鏉� WARN 骞惰烦杩囨湰杞��
+--       瑙� sql/鏁版嵁閲囬泦寮�鍏砡sys_config.sql銆�
+-- ============================================================================
+
+insert into sys_job (job_name, job_group, invoke_target, cron_expression,
+                     misfire_policy, concurrent, status, create_by, create_time, remark)
+select '鍦ㄩ櫌鎮h�呯瀹ょ梾鍖哄簥浣嶅埛鏂帮紙鍗楀崕闄勪竴锛屾瘡澶╋級',
+       'DEFAULT',
+       'ryTask.refreshInhospDeptInfo()',
+       '0 30 3 * * ?',
+       '1',
+       '1',
+       '0',
+       'admin',
+       sysdate(),
+       '姣忓ぉ 03:30 鎸夋偅鑰呭埛鏂� pat_med_inhosp 鐨勭瀹�/鐥呭尯/搴婁綅锛堟暟鎹噰闆嗘ā鍧楋級'
+from dual
+where not exists (
+    select 1 from sys_job where invoke_target = 'ryTask.refreshInhospDeptInfo()'
+);
+
+-- ---------------------------------------------------------------------------
+-- 鐧昏鍚庤嚜妫�锛氬簲鎭板ソ涓�琛岋紝status='0'锛堟甯革級銆乧oncurrent='1'锛堢姝㈠苟鍙戯級
+-- ---------------------------------------------------------------------------
+-- select job_id, job_name, invoke_target, cron_expression, misfire_policy, concurrent, status
+-- from sys_job where invoke_target = 'ryTask.refreshInhospDeptInfo()';
+
+-- 鍙兂鍏堣瀵熴�佷笉鍚敤鏃讹細鐧昏鎴愭殏鍋滅姸鎬侊紝楠岃瘉杩囧啀鍚敤
+-- update sys_job set status = '0' where invoke_target = 'ryTask.refreshInhospDeptInfo()';
+
+-- 鍥炴粴锛堟挙閿�鏈换鍔$櫥璁帮級
+-- delete from sys_job where invoke_target = 'ryTask.refreshInhospDeptInfo()';
diff --git "a/sql/\346\212\223\347\216\260\345\234\272_\350\260\201\346\212\212\346\230\216\347\273\206\347\275\256\344\270\272\345\210\240\351\231\244_20261021.sql" "b/sql/\346\212\223\347\216\260\345\234\272_\350\260\201\346\212\212\346\230\216\347\273\206\347\275\256\344\270\272\345\210\240\351\231\244_20261021.sql"
new file mode 100644
index 0000000..77ddc4c
--- /dev/null
+++ "b/sql/\346\212\223\347\216\260\345\234\272_\350\260\201\346\212\212\346\230\216\347\273\206\347\275\256\344\270\272\345\210\240\351\231\244_20261021.sql"
@@ -0,0 +1,173 @@
+-- ============================================================================
+-- 鎶撶幇琛岋細鍒板簳鏄皝鎶� service_subtask_detail.del_flag 浠� 0 鏀规垚 1
+--                                 鍗楀崕闄勪竴锛坣hfy锛�2026-10-21
+--
+-- 銆愮粨璁哄厛璇淬��
+--   鍏ㄤ粨搴撹兘鍐� service_subtask_detail.del_flag 鐨勫彧鏈� 3 澶勶紝鍏朵腑鍙湁 1 澶勮兘鈥滀竴娆℃竻绌烘暣浠界瓟鍗封�濓紝
+--   鑰屼笖鍙湁瀹冧笉浼氭敼 update_time锛�
+--
+--   A. ServiceSubtaskServiceImpl#setFailSubTaskDefalutVal锛�3533~3544 琛岋級
+--        鐩存帴璋� mapper 寰幆缃� del_flag=1锛�**涓嶆敼 update_time**锛涘彧鏈夊畠鑳芥妸鏁村嵎涓�娆℃竻绌恒��
+--        quartz 鍏ュ彛 = ryTask.setFailSubTaskDefalutVal()锛岃 sys_config: hosp.default.fail.day
+--        锛坣hfy 璇ュ弬鏁�=5锛屽瓨鍦級锛屼絾 sys_job 閲屽綋鍓嶆病鏈夎繖鏉′换鍔°��
+--   B. POST /smartor/serviceSubtaskDetail/edit銆�/batchEdit锛圕ontroller 118~142 琛岋級
+--        -> ServiceSubtaskDetailServiceImpl.updateServiceSubtaskDetail锛�180~183 琛岋級
+--        -> 浼氭妸瀹㈡埛绔紶鐨� delFlag 鍘熸牱鍐欒繘 SQL锛屼笖寮哄埗 updateTime = NOW()銆�
+--   C. POST /smartor/serviceSubtaskDetail/editByCondition锛圕ontroller 144~148 琛岋紝**娌℃湁 @Log**锛�
+--        -> updateSSDByCondition锛屽悓鏍峰鎴风鍙帶 delFlag锛屽悓鏍峰己鍒� updateTime = NOW()锛�
+--        WHERE 鏄� patid + scriptid + sub_id锛堜竴娆″彧鑳芥竻涓�閬撻锛夈��
+--
+-- 銆愮幇鍦烘寚绾癸紙2026-09-08 閭� 10 涓汉锛屽叡 735 琛岃鍒犳槑缁嗭級銆�
+--   路 姣忚 update_time 涓� create_time **閫愮鐩哥瓑**锛�45094 鐨� 6 浠藉壇鏈法浜� 15:41:18~15:41:25锛�
+--     鍒犻櫎鍚庝粛鐒舵槸鐩哥瓑锛夆啋 璇存槑鍒犻櫎鏃舵病鏈夐噸鏂板啓 update_time銆�
+--   路 璧� B / C 涓�瀹氫細鎶� update_time 鏀规垚鍒犻櫎閭d竴鍒� 鈫� 涓庣幇鍦轰笉绗︼紝鍙熀鏈帓闄ゃ��
+--   路 鍞竴绗﹀悎"鐩存帴鏀规垚 1銆佷笉鍔� update_time"鐨勫氨鏄� A 閭g鈥滆鍑烘潵鈫抯etDelFlag鈫抲pdate鈥濈殑鍐欐硶銆�
+--   路 浣� A 鐨勪袱涓墠鎻愶紙sendstate=5銆佺瀹ゅ湪 hosp.default.dept/ward锛夊湪 nhfy 褰撳墠閰嶇疆涓嬮兘涓嶆弧瓒筹紝
+--     涓� sys_job 閲屾病鏈夎繖涓换鍔°��2026-09-08 涔熸病鏈変换浣曗�滄墜鍔ㄦ墽琛屼换鍔♀�濈殑鎿嶄綔鏃ュ織
+--     鈫� 绾夸笂璺戠殑鍖呬笌褰撳墠浠撳簱浠g爜涓嶄竴鑷达紝鎴栬繖娈碘�滃厛鎻掑悗鍒犫�濈殑閫昏緫鎸傚湪鍒殑鍏ュ彛涓娿��
+--
+-- 銆愭湰鑴氭湰銆戜袱鏉℃姄鐜拌鐨勮矾瀛愶細鈶� MySQL general_log 鎶� SQL 鍘熸枃锛堟渶鍑嗭紝10 鍒嗛挓绐楀彛锛夛紱
+--          鈶� 瀹¤瑙﹀彂鍣紙鍙暱鏈熸寕鐫�锛屽彧璁板綍 del_flag 鍙樺寲锛夈��
+--          閮芥槸鏌�/璁板綍锛屼笉鏀逛笟鍔℃暟鎹紱general_log 鐢ㄥ紑鍏虫帶鍒讹紝璁板緱鍏炽��
+-- ============================================================================
+
+
+-- ============================================================================
+-- 鏂规鈶狅紙鎺ㄨ崘銆佹渶蹇級锛歡eneral_log 鎶撳埌 SQL 鍘熸枃 鈥斺�� 璇彞褰㈢姸鐩存帴鏆撮湶鏄摢鏉′唬鐮佽矾寰�
+--   路 鍙湪澶嶇幇绐楀彛锛堜緥濡傛湁浜洪噸濉棶鍗� / 瀹氭椂浠诲姟璺戞壒鐨勬椂娈碉級鎵撳紑 5~10 鍒嗛挓
+--   路 闇�瑕� root 鎴� SUPER 鏉冮檺锛坣hfy 搴旂敤璐﹀彿灏辨槸 root锛�
+--   路 褰卞搷寰堝皬锛屼絾鐢熶骇鐜璇锋寫浣庡嘲銆佹姄瀹岀珛鍒诲叧
+-- ============================================================================
+
+-- 1) 鎵撳紑锛堣褰曞埌 mysql.general_log 琛紝涓嶅啓鏂囦欢锛岄伩鍏嶇鐩樻潈闄愰棶棰橈級
+--    鈿狅笍 杩欎笁鍙ヨ**鎵嬪伐閫愭潯鎵ц**锛屼笉瑕佹暣娈佃窇锛氭暣娈佃窇浼�"寮�浜嗙珛鍒诲叧"锛屼粈涔堥兘鎶撲笉鍒�
+-- SET GLOBAL log_output = 'TABLE';
+-- SET GLOBAL general_log = 'ON';
+-- TRUNCATE TABLE mysql.general_log;
+
+-- 2) 鈥斺�� 鍦ㄨ繖閲屽鐜帮細璁╂煇涓偅鑰呴噸鏂板~涓�娆¢棶鍗� / 绛変竴杞畾鏃朵换鍔� 鈥斺�旓紙寮�鐫�绛� 5~10 鍒嗛挓锛�
+
+-- 3) 鎶撳彇鎵�鏈夆�滄妸鏄庣粏缃负鍒犻櫎鈥濈殑 UPDATE 鍘熸枃
+SELECT event_time, user_host, thread_id, argument
+FROM mysql.general_log
+WHERE command_type = 'Query'
+  AND argument LIKE 'update service_subtask_detail%'
+  AND argument LIKE '%del_flag%'
+ORDER BY event_time DESC
+LIMIT 200;
+
+-- 4) 椤轰究鐪嬭繖娈垫椂闂撮噷鍝簺浼氳瘽/鎺ュ彛鍦ㄥ啓鏄庣粏锛坕nsert / update 閮藉垪鍑烘潵锛�
+SELECT event_time, LEFT(argument, 160) AS sql_head, COUNT(*) AS times
+FROM mysql.general_log
+WHERE command_type = 'Query'
+  AND argument LIKE '%service_subtask_detail%'
+GROUP BY LEFT(argument, 160)
+ORDER BY times DESC
+LIMIT 30;
+
+-- 5) 鍏抽棴锛堝姟蹇呮墜宸ユ墽琛岋級
+-- SET GLOBAL general_log = 'OFF';
+
+-- 銆愭�庝箞璇荤粨鏋溿�戠湅 WHERE 鐨勫舰鐘跺嵆鍙畾浣嶄唬鐮侊細
+--   路 where id = ?                                     -> /smartor/serviceSubtaskDetail/edit 鎴� /batchEdit
+--   路 where patid = ? and scriptid = ? and sub_id = ?  -> /smartor/serviceSubtaskDetail/editByCondition
+--   路 涓�鏉′竴鏉� by id 鐨勫惊鐜紙鍚屼竴绉掑唴鍗佸嚑鏉★紝涓� update_time 娌″彉锛� -> 鍚庡彴 job锛坰etFailSubTaskDefalutVal 閭d竴绫伙級
+--   路 娌℃湁 update_time 璧嬪��                             -> 鐩存帴璋� mapper 鐨勫啓娉曪紙涓嶆槸 Controller -> Service 閾捐矾锛�
+
+
+-- ============================================================================
+-- 鏂规鈶★細瀹¤瑙﹀彂鍣紙鍙暱鏈熸寕鐫�锛屽彧鍦� del_flag 鐪熸鍙樺寲鏃惰涓�琛岋級
+--   涓嶄緷璧� general_log 寮�鍏筹紱璁板綍姣鏃堕棿 + 鏄惁椤哄甫鏀逛簡 update_time锛�
+--   鍓嶈�呯敤鏉ュ拰搴旂敤鐨� access log / 涓氬姟鏃ュ織瀵归綈锛屽悗鑰呯敤鏉ュ垽瀹氳蛋鐨勬槸涓嶆槸 Service 閾捐矾銆�
+-- ============================================================================
+
+-- 鈿狅笍 浠ヤ笅 DDL 榛樿娉ㄩ噴鎺夛紱纭瑕侀暱鏈熸寕瀹¤鍐嶅彇娑堟敞閲婂悗鎵ц锛圢avicat / DBeaver 鍙洿鎺ユ暣娈垫墽琛岋級
+-- CREATE TABLE IF NOT EXISTS audit_detail_delflag (
+--     audit_id    BIGINT AUTO_INCREMENT PRIMARY KEY,
+--     detail_id   BIGINT      NULL COMMENT '琚敼鐨勬槑缁� id',
+--     sub_id      BIGINT      NULL COMMENT '瀛愪换鍔� id',
+--     scriptid    BIGINT      NULL COMMENT '棰樼洰 id',
+--     old_flag    VARCHAR(10) NULL,
+--     new_flag    VARCHAR(10) NULL,
+--     created_at  DATETIME(3) NULL COMMENT '鍘熻鐨� create_time',
+--     updated_at  DATETIME(3) NULL COMMENT '鍘熻鐨� update_time',
+--     new_upd_at  DATETIME(3) NULL COMMENT '鏈琚敼鍚庣殑 update_time',
+--     at          DATETIME(3) NOT NULL COMMENT '瑙﹀彂鍣ㄨЕ鍙戞椂鍒伙紙姣锛�',
+--     db_user     VARCHAR(64) NULL,
+--     conn_id     BIGINT      NULL
+-- ) ENGINE = InnoDB COMMENT = 'service_subtask_detail.del_flag 鍙樻洿瀹¤';
+--
+-- DROP TRIGGER IF EXISTS trg_ssd_delflag_au;
+-- CREATE TRIGGER trg_ssd_delflag_au
+-- AFTER UPDATE ON service_subtask_detail
+-- FOR EACH ROW
+-- BEGIN
+--     IF COALESCE(OLD.del_flag, '') <> COALESCE(NEW.del_flag, '') THEN
+--         INSERT INTO audit_detail_delflag
+--             (detail_id, sub_id, scriptid, old_flag, new_flag, created_at, updated_at, new_upd_at, at, db_user, conn_id)
+--         VALUES
+--             (OLD.id, OLD.sub_id, OLD.scriptid, OLD.del_flag, NEW.del_flag,
+--              OLD.create_time, OLD.update_time, NEW.update_time, NOW(3),
+--              CURRENT_USER(), CONNECTION_ID());
+--     END IF;
+-- END;
+
+-- 浜嬪悗鐪嬬粨璁猴紙寤轰簡 audit_detail_delflag 涔嬪悗鎵嶇敤锛�
+-- SELECT DATE(at) AS day, HOUR(at) AS hr, new_flag, COUNT(*) AS rows_cnt,
+--        COUNT(DISTINCT sub_id) AS subs,
+--        SUM(updated_at IS NULL OR updated_at = new_upd_at) AS upd_untouched,   -- >0 璇存槑璧扮殑涓嶆槸 Service 閾捐矾
+--        SUM(updated_at IS NOT NULL AND updated_at <> new_upd_at) AS upd_changed
+-- FROM audit_detail_delflag
+-- GROUP BY day, hr, new_flag
+-- ORDER BY day DESC, hr DESC;
+
+-- 鏌愪釜瀛愪换鍔$殑瀹屾暣杞ㄨ抗锛堝拰涓氬姟鏃ュ織鐨勬椂闂寸偣瀵归綈锛涘缓浜嗗璁¤〃涔嬪悗鎵嶇敤锛�
+-- SELECT * FROM audit_detail_delflag WHERE sub_id = 45094 ORDER BY at;
+
+
+-- ============================================================================
+-- 浜嬪悗鍒ゆ嵁锛堜笉鎶撳寘涔熻兘鐢級锛氭嬁鍘嗗彶鏁版嵁鍒ゆ柇鏌愭鍒犻櫎璧扮殑鏄摢鏉¢摼璺�
+--   update_time 涓� create_time 鐩哥瓑 -> 涓嶆槸 Controller->Service 閾捐矾锛圔/C 浼氬己鍒跺埛鏂� update_time锛�
+--   update_time 姣� create_time 鏅� -> B 鎴� C
+-- ============================================================================
+SELECT sub_id,
+       COUNT(*) AS rows_cnt,
+       SUM(update_time = create_time) AS upd_untouched,   -- 鐩存帴 mapper锛坖ob 涓�绫伙級
+       SUM(update_time <> create_time) AS upd_changed,     -- Controller -> Service
+       MIN(create_time) AS first_create, MAX(create_time) AS last_create
+FROM service_subtask_detail
+WHERE del_flag <> 0
+GROUP BY sub_id
+ORDER BY rows_cnt DESC
+LIMIT 50;
+
+
+-- ============================================================================
+-- 褰撳墠浠嶆湭淇鐨勶紙鍏ㄥ垹鏃犳椿琛岋級鈥斺�� 鎴戝鏌ユ椂宸叉湁 5 涓鎵嬪伐鎭㈠浜嗭紝鍓╀笅鐨勫氨鏄繖浜�
+-- ============================================================================
+SELECT s.id AS subid, s.patid, s.sendname, s.finishtime,
+       (SELECT COUNT(*) FROM service_subtask_detail d WHERE d.sub_id = s.id AND d.del_flag = 0) AS live_rows,
+       (SELECT COUNT(*) FROM service_subtask_detail d WHERE d.sub_id = s.id) AS all_rows
+FROM service_subtask s
+WHERE s.service_type = 6 AND s.sendstate = 6
+  AND EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = s.id)
+  AND NOT EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = s.id AND d.del_flag = 0)
+ORDER BY s.finishtime;
+
+
+-- ============================================================================
+-- 銆愪唬鐮佷晶淇硶锛堝畾浣嶅埌涔嬪悗涓�璧锋敼锛夈��
+-- 1) 鎶� delFlag 浠庡鎴风鍙帶瀛楁閲屾憳鎺夛細
+--    ServiceSubtaskDetailMapper.xml#updateServiceSubtaskDetail / #updateSSDByCondition
+--    鍒犳帀 <if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if> 杩欎竴琛岋紱
+--    閫昏緫鍒犻櫎鍙厑璁稿悗鍙颁笓鐢ㄦ柟娉曪紙鏄庣‘鐨勬柟娉曞悕 + 鎿嶄綔浜� + 鏃ュ織锛夈��
+-- 2) 鍚庡彴鈥滆ˉ榛樿鍊尖�濅笉瑕佲�滃厛鎻掑悗鍒犫�濓細
+--    setFailSubTaskDefalutVal 閲屽厛鎶婃瘡棰樼殑榛樿鍊肩畻瀹屻�佺‘璁ゅ叏閮芥湁榛樿鍊硷紙flag锛夛紝
+--    鍐嶅喅瀹氭槸鈥滄暣鎵规彃鍏モ�濊繕鏄�滀粈涔堥兘涓嶅仛鈥濓紝閬垮厤鍒犳帀鍒氭彃杩涘幓鐨勬暟鎹��
+-- 3) 鏄庣粏鍘婚噸锛�
+--    isExistServiceSubtaskDetail 鍙湅 del_flag=0 鈫� 姣忔閲嶅缓閮戒細鏂板鍓湰銆�
+--    寤鸿缁� (sub_id, scriptid) 鍔犲敮涓�绱㈠紩 + 鐗╃悊瑕嗙洊鏇存柊锛屽壇鏈氨涓嶄細瓒婄Н瓒婂銆�
+-- 4) 鎻愪氦骞傜瓑锛�
+--    /smartor/subtaskAnswer/saveQuestionAnswer 鏄� @Async 涓旀棤骞傜瓑锛坰aveQuestionCache 鎵嶆湁 @RepeatSubmit锛夛紝
+--    鎮h�呯閲嶅鐐瑰嚮/閲嶈瘯浼氬苟鍙戝啓澶氫唤锛屽缓璁姞 Redis 骞傜瓑閿紙subid+scriptid+绛旀鎽樿锛夈��
+-- ============================================================================
diff --git "a/sql/\346\216\222\346\237\245_\345\257\274\345\207\272\351\227\256\351\242\230\345\215\240\346\257\224\344\272\272\346\225\260\344\270\216\344\273\273\345\212\241\346\225\260\344\270\215\344\270\200\350\207\264_20261029.sql" "b/sql/\346\216\222\346\237\245_\345\257\274\345\207\272\351\227\256\351\242\230\345\215\240\346\257\224\344\272\272\346\225\260\344\270\216\344\273\273\345\212\241\346\225\260\344\270\215\344\270\200\350\207\264_20261029.sql"
new file mode 100644
index 0000000..43c76a5
--- /dev/null
+++ "b/sql/\346\216\222\346\237\245_\345\257\274\345\207\272\351\227\256\351\242\230\345\215\240\346\257\224\344\272\272\346\225\260\344\270\216\344\273\273\345\212\241\346\225\260\344\270\215\344\270\200\350\207\264_20261029.sql"
@@ -0,0 +1,108 @@
+-- ============================================================================
+-- 鎺掓煡锛氶殢璁垮鍑虹殑銆岄棶棰樿鎯呭崰姣斻��(Sheet2) 浜烘暟 姣斻�屾偅鑰呴殢璁夸俊鎭〃鍗曘��(Sheet1) 灏�
+--       渚嬶細Sheet1 475 浜猴紝Sheet2 鐨勯鐩彧鏈� 283 / 172 浜轰綔绛�
+-- 鍙鑴氭湰銆傛敼涓嬮潰 3 涓弬鏁板嵆鍙璺戙��
+-- ----------------------------------------------------------------------------
+-- 銆愮粨璁猴紙2026-10-29 瀹炴祴锛宯hfy锛岄绉戜腑蹇冧竴鐥呭尯 40011020锛屽嚭闄� 2026-07-01~09-30锛夈��
+--   475 鏉′换鍔� 鈮� 475 涓�"鍚屽嵎浣滅瓟鐨勪汉"銆傚畠鐨勬瀯鎴愭槸锛�
+--     路 浠诲姟 67銆岄绉戜腑蹇冧竴鐥呭尯鍑洪櫌闅忚銆嶁啋 妯℃澘 115銆岄绉戜腑蹇冧竴鐥呭尯闅忚闂嵎銆�
+--         鈫� **10 閬撴弧鎰忓害棰�**锛堝尰寰疯瘎浠�/鏈嶅姟鎬佸害/鍖荤枟鏁堟灉鈥︼級锛屼綔绛� 283 浜�
+--     路 浠诲姟 68銆岄绉戜腑蹇冧竴鐥呭尯鍑洪櫌闅忚銆嶁啋 妯℃澘 116銆岃偂楠ㄩ楠ㄦ姌鏈悗闅忚闂嵎銆�
+--         鈫� **8 閬撻绉戦**锛堜激鍙f槸鍚︽湁绾㈣偪/鏄惁娉ㄦ剰楗按鈥︼級锛屼綔绛� 129 浜�
+--     路 浠诲姟 67 閲岃繕鏈� 44 鏉$敤鐨勬槸銆岃偂楠ㄩ楠ㄦ姌鏈悗闅忚闂嵎銆嶁啋 43 浜�
+--         鍘熷洜锛堜笟鍔$‘璁わ級锛氳繖浜涙偅鑰呮湰娆′綇闄㈡槸**浠庡叾瀹冪瀹�/鐥呭尯杞繃鏉�**鐨勶紝闅忚浠诲姟娌跨敤鐨勬槸
+--         **杞鍓嶇瀹�/鐥呭尯**鐨勯偅濂楅棶鍗凤紱浠诲姟 67 鐨勯厤缃湰韬病鍙� 鈥斺��
+--         浣愯瘉锛氳繖 44 鏉$殑鐢熸垚鏃堕棿鏁h惤鍦� 2026-07-02 ~ 2026-10-01 鍚勫ぉ锛屼笉鏄煇澶╃粺涓�鍒囨崲锛�
+--               涓斿畠浠幇鍦ㄧ殑璁板綍绉戝/鐥呭尯閮藉凡缁忔槸楠ㄧ涓績涓�鐥呮埧/涓�鐥呭尯锛堣浆绉戝悗 HIS 鏇存柊杩囷級銆�
+--         鈬� 鎵�浠ュ悓涓�浠诲姟鍚嶄笅浼氬悓鏃跺嚭鐜�"婊℃剰搴﹂"鍜�"楠ㄧ棰�"锛屼笖楠ㄧ棰樺彧鏈� 43 浜轰綔绛斻��
+--     路 鍙︽湁 6 鏉¢浂鏁d换鍔★紙31/148/195/197/11锛夛紝鍚� 1锝�2 浜�
+--   浣滅瓟瑕嗙洊锛�475 鏉¢噷 458 鏉℃湁鏄庣粏锛�17 鏉℃病濉細11 鏉�"鏃犻渶闅忚" + 6 鏉″凡瀹屾垚浣嗘棤鏄庣粏锛夈��
+--
+--   楠ㄧ棰樺悎璁� 172 浜猴紙129 + 43锛夛紱婊℃剰搴﹂鍚堣 283 浜恒��
+--   鎵�浠� Sheet2 姣忛亾棰樼殑浜烘暟鍙兘鏄� 283 鎴� 172锛屾案杩滃噾涓嶅埌 475 鈥斺��
+--   鑰屼笖 Sheet2 鐨勩�屽崰姣斻�嶅垎姣嶆槸**璇ラ浣滅瓟浜烘暟**锛屼笉鏄� 475銆�
+--
+--   涓や釜鍘熷洜锛堥兘涓嶆槸"缁熻绠楅敊"锛夛細
+--     鈶� 鍚屼竴鐥呭尯閰嶄簡涓や釜鍚屽悕闀挎湡浠诲姟锛�67 / 68锛夛紝鎸傜殑鏄袱濂椾笉鍚岄棶鍗� 鈥斺�� 閰嶇疆灞傞潰锛�
+--     鈶� 杞/杞梾鍖烘偅鑰呮部鐢�**杞鍓嶇瀹�/鐥呭尯**鐨勯偅濂楅棶鍗� 鈥斺�� 涓氬姟纭鐨勫彛寰勩��
+--
+-- 銆愮敤娉曘�戞敼鍙傛暟鍚庢暣娈垫墽琛岋紝鎸夈��1銆戔啋銆�5銆戦『搴忕湅銆�
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆慡heet1 琛屾暟锛氭湰娆″鍑鸿寖鍥达紙= 瀵煎嚭 Excel 绗� 1 涓� Sheet 鐨勮鏁帮級
+-- ----------------------------------------------------------------------------
+SELECT '1 琛ㄥ崟琛屾暟' AS step, COUNT(*) AS sheet1_rows
+FROM (
+  SELECT DISTINCT b.inhospid
+  FROM pat_med_inhosp b
+  JOIN pat_archive a ON a.id = b.patid
+  WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+    AND b.inhospstate = '1'
+    AND b.leavehospitaldistrictcode = '40011020'
+    AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+) r
+JOIN service_subtask s ON s.inhospid = r.inhospid AND s.del_flag = 0 AND s.service_type = '2';
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆戣繖鎵逛换鍔$殑鍒嗚韩锛氫换鍔� + 妯℃澘 + 浣滅瓟浜烘暟
+--     涓�鐪肩湅鍑�"鍚屼竴涓换鍔″悕涓嬫贩浜嗗嚑濂楅棶鍗�"
+-- ----------------------------------------------------------------------------
+SELECT '2 浠诲姟涓庢ā鏉垮垎甯�' AS step, s.taskid, MAX(s.task_name) AS 浠诲姟鍚�,
+       s.templatename AS 鎮h�呭疄闄呯敤鐨勯棶鍗�, s.libtemplateid, COUNT(*) AS 浠诲姟鏁�,
+       SUM(CASE WHEN EXISTS (SELECT 1 FROM service_subtask_detail x
+                              WHERE x.sub_id = s.id AND x.del_flag = 0) THEN 1 ELSE 0 END) AS 鏈夋槑缁�
+FROM (
+  SELECT DISTINCT b.inhospid
+  FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+  WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+    AND b.inhospstate = '1'
+    AND b.leavehospitaldistrictcode = '40011020'
+    AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+) r
+JOIN service_subtask s ON s.inhospid = r.inhospid AND s.del_flag = 0 AND s.service_type = '2'
+GROUP BY s.taskid, s.templatename, s.libtemplateid
+ORDER BY 浠诲姟鏁� DESC;
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戦�愰浣滅瓟浜烘暟锛�= Sheet2 閲岃棰樼殑銆屾暟閲忓悎璁°�嶏紝涔熸槸銆屽崰姣斻�嶇殑鍒嗘瘝锛�
+--     涓庡鍑� SQL 瀹屽叏鍚屽彛寰勶細鍚屼竴浜哄悓涓�棰樺彧鍙� MAX(id) 閭f潯
+-- ----------------------------------------------------------------------------
+SELECT '3 閫愰浣滅瓟浜烘暟' AS step, s.taskid, d.questiontext,
+       COUNT(DISTINCT s.id) AS 浣滅瓟浜烘暟,
+       SUM(CASE WHEN TRIM(COALESCE(d.asrtext, '')) = '' THEN 1 ELSE 0 END) AS 绌虹瓟妗堣
+FROM service_subtask s
+JOIN service_subtask_detail d ON d.sub_id = s.id AND d.del_flag = 0
+WHERE s.del_flag = 0 AND s.service_type = '2'
+  AND s.taskid IN (67, 68)
+  AND s.endtime >= '2026-07-01 00:00:00' AND s.endtime < '2026-10-01 00:00:00'
+  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')
+GROUP BY s.taskid, d.questiontext
+ORDER BY s.taskid, 浣滅瓟浜烘暟 DESC;
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戞病浣滅瓟鐨勪汉鏄皝锛圫heet1 鏈夈�丼heet2 閲屽畬鍏ㄦ病鏈夛級
+-- ----------------------------------------------------------------------------
+SELECT '4 娌″~闂嵎鐨勪汉' AS step, s.id AS 瀛愪换鍔D, s.taskid, s.sendname AS 濮撳悕,
+       DATE_FORMAT(s.endtime, '%Y-%m-%d') AS 鍑洪櫌鏃ユ湡, s.sendstate,
+       CASE WHEN s.sendstate = 4 THEN '鏃犻渶闅忚(鏈彂)' ELSE '宸插畬鎴愪絾娌℃湁鏄庣粏' END AS 鍘熷洜
+FROM (
+  SELECT DISTINCT b.inhospid
+  FROM pat_med_inhosp b JOIN pat_archive a ON a.id = b.patid
+  WHERE a.del_flag = '0' AND b.del_flag = '0' AND a.idcardno IS NOT NULL
+    AND b.inhospstate = '1'
+    AND b.leavehospitaldistrictcode = '40011020'
+    AND b.endtime >= '2026-07-01 00:00:00' AND b.endtime < '2026-10-01 00:00:00'
+) r
+JOIN service_subtask s ON s.inhospid = r.inhospid AND s.del_flag = 0 AND s.service_type = '2'
+WHERE NOT EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = s.id AND d.del_flag = 0)
+ORDER BY s.sendstate, s.endtime DESC;
+
+-- ----------------------------------------------------------------------------
+-- 銆�5銆戜袱涓悓鍚嶄换鍔$殑閰嶇疆瀵圭収锛堟牴鍥狅級
+-- ----------------------------------------------------------------------------
+SELECT '5 鍚屽悕浠诲姟鐨勬ā鏉块厤缃�' AS step, t.taskid, t.task_name, t.templateid, t.templatename,
+       t.libtemplateid, t.service_type, t.send_day, t.send_state
+FROM service_task t
+WHERE t.taskid IN (67, 68);
diff --git "a/sql/\346\216\222\346\237\245_\351\227\256\351\242\230\345\215\240\346\257\224\344\270\216\351\232\217\350\256\277\350\241\250\345\215\225\344\272\272\346\225\260\344\270\215\344\270\200\350\207\264.sql" "b/sql/\346\216\222\346\237\245_\351\227\256\351\242\230\345\215\240\346\257\224\344\270\216\351\232\217\350\256\277\350\241\250\345\215\225\344\272\272\346\225\260\344\270\215\344\270\200\350\207\264.sql"
new file mode 100644
index 0000000..63c693a
--- /dev/null
+++ "b/sql/\346\216\222\346\237\245_\351\227\256\351\242\230\345\215\240\346\257\224\344\270\216\351\232\217\350\256\277\350\241\250\345\215\225\344\272\272\346\225\260\344\270\215\344\270\200\350\207\264.sql"
@@ -0,0 +1,168 @@
+-- ============================================================================
+-- 鎺掓煡锛氶殢璁垮鍑虹殑銆岄棶棰樿鎯呭崰姣斻�嶄汉鏁� 姣� 銆屾偅鑰呴殢璁夸俊鎭〃鍗曘�嶈鏁板皯锛堜緥锛�370 vs 380锛�
+--
+-- 銆愬彛寰勪簨瀹烇紙浠g爜鍧愬疄锛夈��
+--   * Sheet1銆屾偅鑰呴殢璁夸俊鎭〃鍗曘��= 鏈瀵煎嚭鐨勫瓙浠诲姟琛岋細ServiceSubtaskController#patItemExport
+--     (ruoyi-task/.../controller/ServiceSubtaskController.java:237) -> patItem() -> selectServiceSubtaskList
+--     => 涓�琛� = 涓�涓� service_subtask锛堜笌 sendstateView / visit_count / 绉戝鐥呭尯绛夌瓫閫夊畬鍏ㄤ竴鑷达級
+--   * Sheet2銆岄棶棰樿鎯呭崰姣斻��= SatisfactionFacade#getQuestionOptionRatioExport(subtaskIds)
+--     -> DefaultSatisfactionApi -> SatisfactionSubtaskServiceImpl#statMydQuestionOptionForExport
+--     -> SatisfactionMapper.xml#statMydQuestionOptionForExport锛堢 206 琛岃捣锛�
+--     璇� SQL 鏄� INNER JOIN service_subtask_detail锛屽苟涓�
+--         AND s.del_flag='0' AND d.del_flag=0
+--         AND d.id = (SELECT MAX(d2.id) ... d2.questiontext <=> d.questiontext ...)   -- 鍚屼竴浜哄悓涓�棰樺彧鍙栨渶鏂颁竴鏉�
+--     鍐嶇敱 ServiceSubtaskServiceImpl#buildMydOptionRows 鎸夈�屼换鍔�+棰樼洰銆嶆眹鎬伙細
+--         璇ラ鈥滄暟閲忓悎璁♀�� = 閫変腑鍚勯�夐」鐨勪汉鏁颁箣鍜� = 璇ラ**鏈変綔绛�**鐨勬偅鑰呮暟锛堟瘮渚嬬殑鍒嗘瘝涔熺敤杩欎釜锛�
+--         鍏朵腑 asrtext 涓虹┖鐨勬偅鑰咃細
+--             - 璇ラ鍙厤浜� 1 涓�夐」鏃讹紝绠楄繘杩欎釜閫夐」锛�
+--             - 璇ラ閰嶄簡 鈮�2 涓�夐」鏃讹紝java 閲岀洿鎺� continue 涓㈡帀锛堟棦涓嶇畻鏁伴噺锛屼篃涓嶈繘鍒嗘瘝锛夆啇 瑙� buildMydOptionRows 绗� 181~185 琛�
+--     => 鍙鏌愭偅鑰呭湪璇ラ涓娾�滄病鏈夋槑缁嗚鈥濇垨鈥滄槑缁嗚绛旀涓虹┖涓旇棰樺閫夐」鈥濓紝浠栧湪 Sheet2 閲屽氨褰诲簳娑堝け锛�
+--        鎵�浠� Sheet2 鐨勪汉鏁板ぉ鐒� 鈮� Sheet1 鐨勮鏁般�傚樊棰濆氨鏄繖绫绘偅鑰呫��
+--
+-- 銆愭湰鑴氭湰鐢ㄩ�斻�戞妸宸鎮h�呬竴涓釜鍒楀嚭鏉ワ紝鍒ゅ畾灞炰簬鍝缂哄け锛屽彧璇汇�佷笉鏀逛换浣曟暟鎹��
+-- 銆愮敤娉曘��
+--   1) 鎶婁笅闈� @鍙橀噺 鏀规垚鍑洪棶棰橀偅娆″鍑虹殑绛涢�夋潯浠讹紙鎴浘閲� payload 鐨勯偅浜涘�硷級锛�
+--   2) 鑻ユ墜涓婂凡鏈� 380 涓瓙浠诲姟 id锛屽彲鐩存帴璺冲埌銆�0-B銆戠敤 id 鍒楄〃鏇夸唬绛涢�夛紱
+--   3) 浠庛��1銆戝線涓嬮『搴忔墽琛岋紝鐪嬫敞閲婇噷鐨勨�滈鏈熲�濄��
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 銆�0-A銆戠瓫閫夋潯浠讹紙鐓ф妱瀵煎嚭璇锋眰 payload锛�
+-- ----------------------------------------------------------------------------
+SET @orgid           := '20001001';   -- 鐧诲綍鐢ㄦ埛 orgid锛堝悗绔己鍒舵敞鍏ワ紝闈為〉闈㈠弬鏁帮級
+SET @campusid        := '30001002';   -- 鐧诲綍鐢ㄦ埛 campusid锛堝悓涓婏級
+SET @serviceType     := 6;            -- payload: serviceType
+SET @sendstateView   := 2;            -- payload: sendstateView锛�1 寰呴殢璁縖1,2,3,5,7] / 2 宸插畬鎴怺6] / 3 鏃犻渶闅忚[4]锛�
+SET @visitCount      := 1;            -- payload: visitcount锛�1=浠呴娆¢殢璁匡紝>1=澶氭锛孨ULL=涓嶉檺锛�
+SET @deptcodes       := '40003511';   -- payload: leavelptcodes[0]锛屽涓敤閫楀彿锛涙棤鍒欑疆 NULL
+SET @districtcodes   := '40003514';   -- payload: leavehospitaldistrictcodes[0]锛屽涓敤閫楀彿锛涙棤鍒欑疆 NULL
+SET @deptOrDistrict  := 2;            -- payload: deptOrDistrict锛堢瀹� OR 鐥呭尯锛�
+
+DROP TEMPORARY TABLE IF EXISTS tmp_export_subtask;
+CREATE TEMPORARY TABLE tmp_export_subtask (id BIGINT NOT NULL PRIMARY KEY);
+
+-- 銆�0-B銆戜簩閫変竴锛欰 鐢ㄧ瓫閫夋潯浠惰繕鍘燂紙榛樿锛夛紝B 鐩存帴鐢ㄥ鍑洪噷閭� 380 涓瓙浠诲姟 id
+INSERT INTO tmp_export_subtask (id)
+SELECT s.id
+FROM service_subtask s
+WHERE s.del_flag = '0'
+  AND s.orgid = @orgid
+  AND s.campusid = @campusid
+  AND s.service_type = @serviceType
+  AND (   (@sendstateView = 2 AND s.sendstate = 6)
+       OR (@sendstateView = 3 AND s.sendstate = 4)
+       OR (@sendstateView = 1 AND s.sendstate IN (1, 2, 3, 5, 7)))
+  AND (@visitCount IS NULL
+       OR (@visitCount = 1 AND s.visit_count = 1)
+       OR (@visitCount > 1 AND s.visit_count > 1))
+  AND (@deptOrDistrict <> 2
+       OR FIND_IN_SET(IFNULL(s.leavehospitaldistrictcode, ''), IFNULL(@districtcodes, '')) > 0
+       OR FIND_IN_SET(IFNULL(s.deptcode, ''), IFNULL(@deptcodes, '')) > 0);
+
+-- B) 宸茬煡 id 鍒楄〃鏃舵敼璺戣繖涓�鍙ワ紙鎶婃敞閲婂幓鎺夈�佷笂闈㈢殑 INSERT 娉ㄩ噴鎺夛級锛岄�楀彿鍒嗛殧锛�
+-- INSERT INTO tmp_export_subtask (id)
+-- SELECT id FROM service_subtask WHERE id IN ( /* 380 涓� id */ );
+
+-- ----------------------------------------------------------------------------
+-- 銆�1銆慡heet1 琛屾暟锛氬簲璇ョ瓑浜庡鍑� Excel 閲屻�屾偅鑰呴殢璁夸俊鎭〃鍗曘�嶇殑琛屾暟锛堜緥 380锛�
+-- ----------------------------------------------------------------------------
+SELECT '1. 琛ㄥ崟琛屾暟(Sheet1)' AS step, COUNT(*) AS cnt FROM tmp_export_subtask;
+
+-- 璁颁笅鎬绘暟锛圡ySQL 涓存椂琛ㄥ湪鍚屼竴璇彞閲屼笉鑳借鎵撳紑涓ゆ锛屽悗闈㈢敤鍙橀噺浠f浛瀛愭煡璇級
+SET @total := (SELECT COUNT(*) FROM tmp_export_subtask);
+
+-- ----------------------------------------------------------------------------
+-- 銆�2銆慡heet2 瀹為檯鑳界粺璁″埌鐨勪汉鏁�
+--     2a = 鑷冲皯鏈� 1 鏉℃湁鏁堟槑缁嗭紙del_flag=0锛夌殑鎮h�呮暟
+--     2b = 鏄庣粏瀛樺湪浣嗗叏閮ㄨ閫昏緫鍒犻櫎鐨勬偅鑰呮暟锛堣繖浜涗汉鍦� Sheet2 閲屽悓鏍风湅涓嶅埌锛�
+--     棰勬湡锛�2a <= 1 鐨� cnt锛屽樊棰� = 瀹屽叏娌″~鎶�/鏄庣粏涓㈠け鐨勪汉
+-- ----------------------------------------------------------------------------
+SELECT '2a. 鏈夋湁鏁堟槑缁嗙殑鎮h�呮暟' AS step, COUNT(DISTINCT d.sub_id) AS cnt
+FROM tmp_export_subtask t
+JOIN service_subtask_detail d ON d.sub_id = t.id AND d.del_flag = 0;
+
+SELECT '2b. 鏄庣粏鍏ㄨ閫昏緫鍒犻櫎鐨勬偅鑰呮暟' AS step, COUNT(*) AS cnt
+FROM tmp_export_subtask t
+WHERE EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = t.id)
+  AND NOT EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = t.id AND d.del_flag = 0);
+
+-- ----------------------------------------------------------------------------
+-- 銆�3銆戝樊棰濇竻鍗曪細鍦� Sheet1 閲屻�佷絾鍦� Sheet2 閲屽畬鍏ㄧ湅涓嶅埌鐨勬偅鑰�
+--     reason 璇存槑锛�
+--       no_detail_row  鈥斺�� service_subtask_detail 閲屼竴鏉¤瀛愪换鍔$殑鏄庣粏閮芥病鏈夛紙娌″~鎶�/涓�旈��鍑�/鏄庣粏鏈惤搴擄級
+--       all_deleted    鈥斺�� 鏈夋槑缁嗕絾鍏ㄨ閫昏緫鍒犻櫎
+-- ----------------------------------------------------------------------------
+SELECT '3. 宸鎮h�呮竻鍗曪紙鍘熷洜1锛氭棤鏄庣粏锛�' AS step;
+SELECT t.id AS subid, s.taskid, s.patid, s.sendname, s.sendstate, s.visit_count,
+       s.visit_time, s.finishtime, s.deptcode, s.leavehospitaldistrictcode,
+       'no_detail_row' AS reason
+FROM tmp_export_subtask t
+JOIN service_subtask s ON s.id = t.id
+WHERE NOT EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = t.id)
+ORDER BY t.id;
+
+SELECT '3. 宸鎮h�呮竻鍗曪紙鍘熷洜2锛氭槑缁嗗叏琚�昏緫鍒犻櫎锛�' AS step;
+SELECT t.id AS subid, s.taskid, s.patid, s.sendname, s.sendstate,
+       (SELECT COUNT(*) FROM service_subtask_detail d WHERE d.sub_id = t.id) AS detail_rows,
+       'all_deleted' AS reason
+FROM tmp_export_subtask t
+JOIN service_subtask s ON s.id = t.id
+WHERE EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = t.id)
+  AND NOT EXISTS (SELECT 1 FROM service_subtask_detail d WHERE d.sub_id = t.id AND d.del_flag = 0)
+ORDER BY t.id;
+
+-- ----------------------------------------------------------------------------
+-- 銆�4銆戦�愰浜烘暟锛氫换浣曚竴涓鐨勩�屾湁浣滅瓟鎮h�呮暟銆嶉兘 <= 琛ㄥ崟琛屾暟锛�
+--     瀵煎嚭閲岀湅鍒扮殑 370 灏辨槸杩欓噷鏌愪竴琛岋紙涔熸槸璇ラ姣斾緥鐨勫垎姣嶏級
+--       patients_with_row  : 鏈夎棰樻槑缁嗙殑浜烘暟
+--       answered           : 绛旀闈炵┖鐨勪汉鏁�  鈮� Sheet2 鐨勨�滄暟閲忓悎璁♀�濅笌鍒嗘瘝
+--       empty_answer       : 鏈夋槑缁嗕絾绛旀涓虹┖鐨勪汉鏁�  鈮� 琚� buildMydOptionRows 涓㈡帀鐨勯偅閮ㄥ垎锛堝閫夐」棰橈級
+--       no_row             : 璇ラ杩炴槑缁嗛兘娌℃湁鐨勪汉鏁�
+--     锛堣繖閲屾病濂� MAX(id) 鍘婚噸锛屽幓閲嶇増瑙併��4b銆戯紱涓よ�呭樊寮�=鍚屼竴浜哄悓涓�棰樻湁澶氭潯鏄庣粏锛�
+-- ----------------------------------------------------------------------------
+SELECT '4. 閫愰浜烘暟' AS step;
+SELECT d.questiontext,
+       COUNT(DISTINCT t.id) AS patients_with_row,
+       COUNT(DISTINCT CASE WHEN TRIM(COALESCE(d.asrtext, '')) <> '' THEN t.id END) AS answered,
+       COUNT(DISTINCT CASE WHEN TRIM(COALESCE(d.asrtext, '')) =  '' THEN t.id END) AS empty_answer,
+       @total - COUNT(DISTINCT t.id) AS no_row
+FROM tmp_export_subtask t
+JOIN service_subtask_detail d ON d.sub_id = t.id AND d.del_flag = 0
+GROUP BY d.questiontext
+ORDER BY patients_with_row DESC, d.questiontext;
+
+-- 銆�4b銆戜笌 SQL 瀹屽叏鍚屽彛寰勶紙鍚屼竴浜哄悓涓�棰樺彧鐣� MAX(id) 閭f潯锛夌殑閫愰浜烘暟
+SELECT '4b. 閫愰浜烘暟(鍘婚噸鍙e緞,涓庡鍑轰竴鑷�)' AS step;
+SELECT d.questiontext,
+       COUNT(DISTINCT t.id) AS patients_counted_in_export,
+       COUNT(DISTINCT CASE WHEN TRIM(COALESCE(d.asrtext, '')) = '' THEN t.id END) AS empty_answer_will_be_dropped
+FROM tmp_export_subtask t
+JOIN service_subtask_detail d
+  ON d.sub_id = t.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')
+GROUP BY d.questiontext
+ORDER BY patients_counted_in_export DESC, d.questiontext;
+
+-- ----------------------------------------------------------------------------
+-- 銆�5銆戝悓涓�鎮h�呭悓涓�棰樺鏉℃槑缁嗭紙閲嶇瓟/閲嶅鎻愪氦锛夛細瀵煎嚭鍙彇鏈�鏂颁竴鏉�
+-- ----------------------------------------------------------------------------
+SELECT '5. 鍚屼竴浜哄悓涓�棰樺鏉℃槑缁嗙殑鎮h�呮暟' AS step, COUNT(*) AS cnt
+FROM (SELECT d.sub_id, d.questiontext
+      FROM tmp_export_subtask t
+      JOIN service_subtask_detail d ON d.sub_id = t.id AND d.del_flag = 0
+      GROUP BY d.sub_id, d.questiontext
+      HAVING COUNT(*) > 1) x;
+
+-- ----------------------------------------------------------------------------
+-- 銆�6銆戠粨璁烘�庝箞璇�
+--   * 鑻ャ��1銆�= 380 涓斻��2a銆�= 370锛氬樊棰� 10 浜� = 銆�3銆戦噷鍒楀嚭鏉ョ殑鎮h�咃紝
+--     浠栦滑瑕佷箞娌″~鎶ワ紙no_detail_row锛夛紝瑕佷箞鏄庣粏琚垹锛坅ll_deleted锛�
+--     鈥斺�� 杩欐槸銆屽崰姣斿彧缁熻浣滅瓟鎮h�呫�嶇殑鍙e緞閫犳垚鐨勶紝涓嶆槸 SQL 婕忎簡绛涢�夋潯浠躲��
+--   * 鑻ャ��1銆�= 380 浣嗐��4銆戠殑 answered 鏈夊琛岄兘灏忎簬 380锛堟瘮濡� 378/375/370鈥︼級锛�
+--     璇存槑姣忎釜棰樼洰鐨勫垎姣嶆湰鏉ュ氨涓嶅悓锛堝悇鏈夊悇鐨勬湭浣滅瓟锛夛紝Sheet2 閲屾病鏈夆�滄湭浣滅瓟鈥濊繖涓�琛岋紝
+--     鎵�浠ュ悎璁℃案杩滃噾涓嶅埌 380銆�
+-- ----------------------------------------------------------------------------
diff --git "a/sql/\346\225\260\346\215\256\351\207\207\351\233\206\345\274\200\345\205\263_sys_config.sql" "b/sql/\346\225\260\346\215\256\351\207\207\351\233\206\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..aa23e00
--- /dev/null
+++ "b/sql/\346\225\260\346\215\256\351\207\207\351\233\206\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,47 @@
+-- ----------------------------
+-- 鏁版嵁閲囬泦妯″潡寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 閿悕锛歞atacollection.enabled
+-- 閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--       false = 鍋滈噰
+--
+-- 鍏抽棴鍚庣殑琛屼负锛�
+--   1) 瀹氭椂浠诲姟鍏ュ彛 ryTask.dealHisData('...') 浠嶅彲琚� quartz 璋冨埌锛堝叆鍙� Bean 涓嶄細娑堝け锛夛紝
+--      浣嗛棬闈� DataCollectionFacade#dealHisData 浼氭姏
+--      DataCollectionModuleDisabledException锛汻yTask 鎹曡幏鍚庡彧鎵撲竴鏉� WARN
+--      銆屾暟鎹噰闆嗘ā鍧楁湭鍚敤鈥︹�︼紙鏈疆瀹氭椂閲囬泦璺宠繃锛夈�嶏紝
+--      鍗筹細**姣忎竴杞兘鏄庣‘璺宠繃锛屽苟鍦ㄦ棩蹇楅噷鐣欎笅鐥曡抗**锛屼笉鏄潤榛樹粈涔堥兘涓嶅仛锛�
+--   2) 闂ㄩ潰 DataCollectionFacade#isEnabled() 浠嶅彲璋冪敤锛屼緵璋冪敤鏂归鍒ゅ紑鍏崇姸鎬侊紱
+--   3) 鍏跺畠鍏ュ彛锛圚TTP 鎵嬪姩瑙﹀彂閲囬泦鐨勬帶鍒跺櫒锛変笉鍙楁湰寮�鍏冲奖鍝� 鈥斺�� 瀹冧滑璧扮殑鏄�
+--      smartor / ruoyi-quartz 閲屽悇鑷殑 Service锛屾湰寮�鍏冲彧绠�"瀹氭椂閲囬泦缂栨帓"杩欎竴鏉¢摼璺紱
+--   4) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紙杩涚▼鍐呭紑鍏崇紦瀛� TTL锛夛紝涓嶉渶瑕侀噸鍚��
+--
+-- 鈿狅笍 娉ㄦ剰锛氬仠閲囦笉浼氬垹闄や换浣曟暟鎹紝涔熶笉浼氬洖濉�"鍋滈噰鏈熼棿婕忔帀鐨勬椂闂存" 鈥斺��
+--          閲嶆柊鎵撳紑鍚庢寜褰撳墠鏃堕棿绐楀彛缁х画閲囷紙nhfy/sltd 绔欑偣鍙敤甯︽棩鏈熷叆鍙傜殑鎵嬪伐瑙﹀彂鍋氬洖婧級銆�
+-- 鈿狅笍 鍙傛暟琛岀己澶辨椂鎸� true锛坒ail-open锛夛細缁濅笉鍥犱负搴撻噷灏戜竴琛岄厤缃氨闈欓潤鍋滈噰銆�
+--
+-- 鏈」鐩敤鐨� MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+-- 鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛岋紝鑴氭湰鍙噸澶嶆墽琛屻��
+-- ----------------------------
+
+SET @datacollection_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+SET @ddl = IF(@datacollection_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''鏁版嵁閲囬泦妯″潡寮�鍏�'', ''datacollection.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''鏁版嵁閲囬泦妯″潡锛圚IS 閲囬泦瀹氭椂缂栨帓锛夋�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍋滈噰锛涢粯璁rue''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''datacollection.enabled'')');
+
+PREPARE datacollection_stmt FROM @ddl;
+EXECUTE datacollection_stmt;
+DEALLOCATE PREPARE datacollection_stmt;
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config WHERE config_key = 'datacollection.enabled';
diff --git "a/sql/\346\250\241\346\235\277\345\274\200\345\205\263_sys_config.sql" "b/sql/\346\250\241\346\235\277\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..976bb09
--- /dev/null
+++ "b/sql/\346\250\241\346\235\277\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,65 @@
+-- ----------------------------
+-- 妯℃澘妯″潡寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 閿悕锛歵emplate.enabled
+-- 閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--       false = 鍏抽棴
+--
+-- 璇诲彇鏂瑰紡锛歍emplateSwitch#isEnabled()
+--   sys_config 鐑 + 10 绉掕繘绋嬪唴缂撳瓨锛宖ail-open锛堣涓嶅埌 / 璇诲簱寮傚父閮芥寜 true 澶勭悊锛夈��
+--
+-- 鍏抽棴鍚庣殑琛屼负锛�
+--   1) 鏈ā鍧� 66 涓ā鏉跨鐞嗙鐐逛細琚� TemplateAvailabilityInterceptor 鎷︿笅锛�
+--      杩斿洖鏄庣‘涓氬姟閿欒銆屾ā鏉垮姛鑳芥湭鍚敤锛堝弬鏁伴厤缃� template.enabled=false锛夛紝璇ユ帴鍙d笉鍙敤銆嶏紝
+--      鑰屼笉鏄� 404锛堝墠绔兘鍖哄垎"妯″潡琚叧闂�"鍜�"鍦板潃鍐欓敊浜�"锛夛紱
+--   2) 璺ㄦā鍧楄皟鐢ㄤ篃浼氳鎷掞細鍏跺畠妯″潡缁� TemplateFacade 鍙栨ā鏉挎椂锛�
+--      6 涓暟鎹柟娉曠粺涓�鎶� TemplateModuleDisabledException锛堟彁绀鸿涓庝笂闈竴鑷达級銆�
+--      璋冪敤鏂瑰悇鑷喅瀹氶檷绾ф柟寮忥紝宸插湪 4 涓皟鐢ㄧ偣閫愪釜鏄庣‘锛�
+--        RyTask / RedisMqReceiver  -> 濡傚疄璁般�屽彂閫佸け璐ャ�嶅苟鍗囩骇涓嬩竴閫氶亾锛堜笉鎺╃洊锛�
+--        ServiceTaskServiceImpl     -> 杩斿洖绌哄垪琛紝鎮h�呭鏁欓〉闈㈢収甯稿彲寮�鍙彁浜�
+--        ChatWebSocketHandler       -> 鎶涘紓甯革紙璇煶闂嵎鏈氨妯℃澘椹卞姩锛岀户缁蛋鍙細 NPE锛�
+--      鈿狅笍 涔熷氨鏄锛�**鍏抽棴妯℃澘浼氳繛甯﹀仠鎺夊鏁欑煭淇$殑鍐呭鐢熸垚**锛岃繖鏄埢鎰忕殑 鈥斺��
+--      鍙栦笉鍒版ā鏉垮唴瀹瑰氨鏄病鍐呭鍙彂锛屼笉璇ヨ鎴�"鍙戦�佹垚鍔�"銆�
+--   3) 鈿狅笍 鍙楃鐨勬槸"绠℃ā鏉挎暟鎹�"鐨勭鐐癸紝鍏� 66 涓墠缂�锛屽寘鍚埢鎰忕暀鍦� smartor 鐨�
+--      3 涓ā鏉跨鐞嗘帶鍒跺櫒锛圫vyLibTemplateController / SvyTaskController /
+--      SvyTaskTemplateController锛夈�傚畬鏁存竻鍗曡 TemplateWebConfig#guardedPathPatterns()
+--      鎴� sql/_probe/verify_template_switch.py 鐨勮緭鍑恒��
+--   4) 鈿狅笍 **涓嶅彈绠�**锛欼vrTaskVisitResultController / IvrTasksmsController /
+--      IvrTaskcallrecordController 鈥斺�� 瀹冧滑鏄�"浠诲姟鎵ц璁板綍"锛堣繍琛屾椂瀹炰緥锛夛紝
+--      宸叉寜鑱岃矗绉诲嚭妯℃澘妯″潡锛涘叧鎺�"妯℃澘"涓嶈璁�"浠诲姟鎵ц璁板綍鏌ヨ"鍋滄憜銆�
+--      鏈嶅姟瀛愪换鍔� / 妗f / 鏈嶅姟浠诲姟 / 闂嵎浠诲姟瀹炰緥 / 鏂规娴佺▼绛夐潪妯℃澘绔偣鍚屾牱涓嶅彈绠°��
+--   5) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紝涓嶉渶瑕侀噸鍚��
+--
+-- 娉ㄦ剰 1锛氭湰椤圭洰鐢ㄧ殑 MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+--         鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛岋紝鑴氭湰鍙噸澶嶆墽琛屻��
+-- 娉ㄦ剰 2锛歋ysConfigServiceImpl#selectConfigByKey 閲�**鍐� Redis 鐨勯偅琛屾槸娉ㄩ噴鎺夌殑**
+--         锛堝彧璇� Redis 缂撳瓨銆佽涓嶅埌灏辨煡搴擄級銆傛墍浠ヨ嫢鍘嗗彶涓婃湁浜烘墜鍔ㄥ線 Redis 鍐欒繃杩欎釜閿紝
+--         鏀瑰簱涓嶄竴瀹氱珛鍒荤湅寰楄銆傜ǔ濡ュ仛娉曪細璧般�岀郴缁熺鐞� 鈫� 鍙傛暟璁剧疆銆嶉〉闈㈡敼锛堜細娓呯紦瀛橈級锛�
+--         鎴栨墽琛� UPDATE 鍚庡垹鎺� Redis 閲岀殑 sys_config:template.enabled銆�
+-- ----------------------------
+
+SET @sys_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+SET @ddl = IF(@sys_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''妯℃澘妯″潡寮�鍏�'', ''template.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''妯℃澘妯″潡鎬诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue銆傚叧闂悗66涓ā鏉跨鐞嗙鐐逛笌TemplateFacade璺ㄦā鍧楄皟鐢ㄤ竴骞惰鎷�''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''template.enabled'')');
+
+PREPARE template_stmt FROM @ddl;
+EXECUTE template_stmt;
+DEALLOCATE PREPARE template_stmt;
+
+-- 鏃ュ父寮�鍏虫搷浣滐紙浜岄�変竴锛屾敼瀹屾渶澶� 10 绉掔敓鏁堬級锛�
+--   鍏抽棴锛歎PDATE sys_config SET config_value = 'false', update_time = SYSDATE() WHERE config_key = 'template.enabled';
+--   寮�鍚細UPDATE sys_config SET config_value = 'true',  update_time = SYSDATE() WHERE config_key = 'template.enabled';
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config WHERE config_key = 'template.enabled';
diff --git "a/sql/\346\273\241\346\204\217\345\272\246\345\274\200\345\205\263_sys_config.sql" "b/sql/\346\273\241\346\204\217\345\272\246\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..99cf564
--- /dev/null
+++ "b/sql/\346\273\241\346\204\217\345\272\246\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,39 @@
+-- ----------------------------
+-- 婊℃剰搴︽ā鍧楀紑鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 閿悕锛歴atisfaction.enabled
+-- 閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--       false = 鍏抽棴
+--
+-- 鍏抽棴鍚庣殑琛屼负锛�
+--   1) 鏈ā鍧� 17 涓弧鎰忓害绔偣浼氳 SatisfactionAvailabilityInterceptor 鎷︿笅锛�
+--      杩斿洖鏄庣‘涓氬姟閿欒銆屾弧鎰忓害鍔熻兘鏈惎鐢紙鍙傛暟閰嶇疆 satisfaction.enabled=false锛夛紝璇ユ帴鍙d笉鍙敤銆嶏紝
+--      鑰屼笉鏄� 404锛�
+--   2) 闅忚瀵煎嚭 / 闅忚缁熻 / 鐧诲綍閾捐矾閫氳繃 SatisfactionFacade 鍙栨暟鏃堕檷绾т负绌哄��/鍏ㄩ浂锛屼笉鍙楀奖鍝嶏紱
+--   3) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紙杩涚▼鍐呭紑鍏崇紦瀛� TTL锛夛紝涓嶉渶瑕侀噸鍚��
+--
+-- 娉ㄦ剰锛氭湰椤圭洰鐢ㄧ殑 MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+--       鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛岋紝鑴氭湰鍙噸澶嶆墽琛屻��
+-- ----------------------------
+
+SET @satisfaction_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+SET @ddl = IF(@satisfaction_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''婊℃剰搴︽ā鍧楀紑鍏�'', ''satisfaction.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''婊℃剰搴︽ā鍧楁�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''satisfaction.enabled'')');
+
+PREPARE satisfaction_stmt FROM @ddl;
+EXECUTE satisfaction_stmt;
+DEALLOCATE PREPARE satisfaction_stmt;
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config WHERE config_key = 'satisfaction.enabled';
diff --git "a/sql/\347\224\265\350\257\235\345\274\200\345\205\263_sys_config.sql" "b/sql/\347\224\265\350\257\235\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..cc7eeb2
--- /dev/null
+++ "b/sql/\347\224\265\350\257\235\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,56 @@
+-- ----------------------------
+-- 鐢佃瘽妯″潡寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 閿悕锛歱hone.enabled
+-- 閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--       false = 鍏抽棴
+--
+-- 鍏抽棴鍚庣殑琛屼负锛�
+--   1) 鏈ā鍧� 8 涓數璇濈鐐逛細琚� PhoneAvailabilityInterceptor 鎷︿笅锛�
+--      杩斿洖鏄庣‘涓氬姟閿欒銆岀數璇濆姛鑳芥湭鍚敤锛堝弬鏁伴厤缃� phone.enabled=false锛夛紝璇ユ帴鍙d笉鍙敤銆嶏紝
+--      鑰屼笉鏄� 404锛�
+--        /smartor/serviceSubtask/phoneCallBack            涓婃捣锛氳闊宠瘑鍒粨鏋滃洖璋�
+--        /smartor/serviceSubtask/phoneCallBackYQ          闆ㄧ划锛欰SR/闈欓粯/鎾斁浜嬩欢鍥炶皟
+--        /smartor/serviceSubtask/taskPull                 闆ㄧ划锛氫换鍔℃媺鍙�
+--        /smartor/serviceSubtask/saveQuestionAnswerPhone   鐢佃瘽锛氭偅鑰呴棶棰樼粨鏋滆褰�
+--        /smartor/serviceSubtask/recordAcceptshanghai      涓婃捣锛氶�氳瘽璁板綍鍥炶皟
+--        /smartor/serviceSubtask/recordAccept              闆ㄧ划锛氶�氳瘽璁板綍鍥炶皟
+--        /smartor/shphone/getFirstQues                    涓夋眹锛氬彇棣栭
+--        /smartor/shphone/processResust                   涓夋眹锛欰SR 缁撴灉澶勭悊
+--   2) 杩� 6 鏉℃寕鍦� /smartor/serviceSubtask/** 涓嬬殑鐢佃瘽绔偣锛屽凡浠庛�屼换鍔℃ā鍧楀紑鍏炽��
+--      锛坱ask.enabled锛夌殑鎷︽埅鑼冨洿閲屾帓闄わ紙瑙� TaskWebConfig#excludedPhonePaths锛夛紝
+--      鍗冲叧浠诲姟涓嶄細杩炲甫鍏虫帀鐢佃瘽锛涘弽涔嬩害鐒讹紱
+--   3) 妯″潡闂ㄩ潰 PhoneFacade锛堝叾瀹冩ā鍧楄皟鐢佃瘽鑳藉姏鐨勫叆鍙o級浠嶅彲娉ㄥ叆锛�
+--      浣嗗悇鏂规硶闄嶇骇涓虹┖鍊�/绌哄垪琛ㄥ苟鎵� WARN锛屼笉鎶涘紓甯革紱
+--   4) 鐢佃瘽浼氳瘽鐘舵�侊紙Redis 閲岀殑 uuid / 瀛愪换鍔�-鎵嬫満鍙� 閿級涓嶅彈寮�鍏冲奖鍝嶏紝
+--      閲嶆柊鎵撳紑鍚庝粛鍦ㄦ湁鏁堟湡鍐咃紙鏈�闀� 120 鍒嗛挓锛夛紱
+--   5) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紙杩涚▼鍐呭紑鍏崇紦瀛� TTL锛夛紝涓嶉渶瑕侀噸鍚��
+--
+-- 鈿狅笍 娉ㄦ剰锛氬叧闂數璇濆姛鑳藉彧褰卞搷"鍥炶皟绔偣涓庨棬闈㈣皟鐢�"锛屼笉浼氬垹闄や换浣曟暟鎹紝
+--          涔熶笉浼氬仠姝㈠閮ㄥ钩鍙板凡缁忓彂璧风殑澶栧懠锛堝畠浠殑鍥炶皟浼氳鏄庣‘鎷掔粷锛夈��
+--
+-- 鏈」鐩敤鐨� MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+-- 鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛岋紝鑴氭湰鍙噸澶嶆墽琛屻��
+-- ----------------------------
+
+SET @phone_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+SET @ddl = IF(@phone_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''鐢佃瘽妯″潡寮�鍏�'', ''phone.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''鐢佃瘽妯″潡锛堜笂娴�/闆ㄧ划/涓夋眹澶栧懠鍥炶皟锛夋�诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''phone.enabled'')');
+
+PREPARE phone_stmt FROM @ddl;
+EXECUTE phone_stmt;
+DEALLOCATE PREPARE phone_stmt;
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config WHERE config_key = 'phone.enabled';
diff --git "a/sql/\351\227\250\346\200\245\350\257\212\344\270\216\346\211\213\346\234\257\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql" "b/sql/\351\227\250\346\200\245\350\257\212\344\270\216\346\211\213\346\234\257\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql"
new file mode 100644
index 0000000..e1c9cd4
--- /dev/null
+++ "b/sql/\351\227\250\346\200\245\350\257\212\344\270\216\346\211\213\346\234\257\351\232\217\350\256\277\345\274\200\345\205\263_sys_config.sql"
@@ -0,0 +1,91 @@
+-- ----------------------------
+-- 闂ㄦ�ヨ瘖闅忚妯″潡 + 鎵嬫湳闅忚妯″潡 寮�鍏筹紙sys_config 鍙傛暟閰嶇疆琛級
+-- ----------------------------
+-- 鏈剼鏈竴娆″缓涓や釜閿紝閮藉彲閲嶅鎵ц锛堝箓绛夛級锛�
+--
+--   閿悕锛歰utpatientvisit.enabled     闂ㄦ�ヨ瘖闅忚鎬诲紑鍏�
+--   閿悕锛歰thervisit.enabled          鎵嬫湳闅忚鎬诲紑鍏�
+--   閿�硷細true  = 鍚敤锛堥粯璁わ紝绛変环浜庝笉閰嶇疆杩欎竴琛岋級
+--         false = 鍏抽棴
+--
+-- 璇诲彇鏂瑰紡锛歄uthospVisitSwitch#isEnabled() / OtherVisitSwitch#isEnabled()
+--   sys_config 鐑 + 10 绉掕繘绋嬪唴缂撳瓨锛宖ail-open锛堣涓嶅埌 / 璇诲簱寮傚父閮芥寜 true 澶勭悊锛夈��
+--
+-- 鈿狅笍 杩欎袱涓ā鍧椾笌鍑哄叆闄�/瀹f暀**鏈変竴涓叧閿粨鏋勫樊寮�**锛�
+--   瀹冧滑鐨勬帶鍒跺櫒閲�**鍏ㄦ槸璁板綍 CRUD**锛坙ist / export / getInfo / add / edit / remove锛夛紝
+--   **娌℃湁浠讳綍"鐢熸垚闅忚"鐨� HTTP 瑙﹀彂绔偣** 鈥斺�� 瑙﹀彂鍣ㄥ叏鍦ㄥ畾鏃朵换鍔′笌 service 璋冪敤閲屻��
+--   鎵�浠ュ畠浠�**娌℃湁** XxxAvailabilityInterceptor / XxxWebConfig锛�
+--   寮�鍏崇殑浣滅敤鐐瑰湪**闂ㄩ潰鐨勭紪鎺掓柟娉�**涓婏紝涓嶅湪 HTTP 灞傘��
+--   杩欐槸鍒绘剰鐨勶細涓庡嚭鍏ラ櫌妯″潡"鍒ゆ柇鏍囧噯鏄繖涓鐐逛細涓嶄細鐢熸垚闅忚锛岃�屼笉鏄畠鍦ㄤ笉鍦ㄦ湰妯″潡閲�"
+--   瀹屽叏涓�鑷� 鈥斺�� 鏃㈢劧涓�涓細鐢熸垚闅忚鐨� HTTP 绔偣閮芥病鏈夛紝灏变笉璇ヤ负浜嗚褰㈢姸鏁撮綈鑰岀‖閫犳嫤鎴櫒銆�
+--
+-- 鍏抽棴 outpatientvisit 鍚庣殑琛屼负锛�
+--   1) OuthospVisitFacade#dealOutpatientInfo()锛堥棬璇婇殢璁夸富鎵弿锛氭壂鏈鐞嗛棬璇婅褰� 鈫�
+--      鍖归厤闀挎湡浠诲姟 鈫� 鍐欏瓙浠诲姟锛夎繑鍥� 0 骞舵墦 WARN锛�**涓嶅啀鐢熸垚鏂扮殑闂ㄨ瘖闅忚**锛�
+--   2) 鈿狅笍 瀹氭椂浠诲姟鍏ュ彛**鏀硅蛋璇ラ棬闈�**鎵嶄細鍙楃 鈥斺�� 2025 淇鍓嶏紝RyTask#dealOutHospInfo
+--      璋冪殑鏄� IPatMedOuthospService锛堢粡 OuthospDataFacade锛屾棤瀹堝崼锛夛紝
+--      寮�鍏虫槸**澶辨晥**鐨勩�備慨澶嶅悗涓庢墜鏈殢璁� RyTask#dealOperationInfo 璧� otherVisitFacade 鍚屽舰銆�
+--   3) 闂ㄨ瘖璁板綍鏌ヨ/CRUD锛�/smartor/patouthosp/**銆�/smartor/provisional/**锛�**涓嶅彈褰卞搷**锛�
+--   4) 闂ㄨ瘖鍒嗚〃缁存姢涓庡瓨鍌ㄨ繃绋嬮噸寤猴紙OuthospVisitFacade#createOuthospQuarterTable锛�
+--      **涓嶅彈鏈紑鍏崇害鏉�** 鈥斺�� 瀹冨缓鐨勬槸鐗╃悊鍒嗚〃锛屽睘鏁版嵁鍩虹璁炬柦锛�
+--      瀹冭嚜宸辩殑寮�鍏虫槸 sys_config: outhosp.split.mode锛堟病閰嶅氨鏁村潡涓嶆墽琛岋級銆�
+--      鑻ユ妸瀹冧篃濂椾笂闅忚寮�鍏筹紝鍏抽棴闅忚浼氳鏂板懆鏈熷垎琛ㄤ笉寤� 鈫� 闂ㄨ瘖璁板綍鍐欎笉杩涜〃銆�
+--   5) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紝涓嶉渶瑕侀噸鍚��
+--
+-- 鍏抽棴 othervisit 鍚庣殑琛屼负锛�
+--   1) OtherVisitFacade#dealOperationInfo()锛堟墜鏈殢璁夸富鎵弿锛夎繑鍥� 0 骞舵墦 WARN锛�
+--   2) 鎵嬫湳璁板綍 / 鎵嬫湳鏄庣粏 / 鎵嬫湳鍩虹瀛楀吀鐨勬煡璇笌 CRUD
+--      锛�/smartor/operation/**銆�/smartor/item/**銆�/smartor/baseopera/**锛�**涓嶅彈褰卞搷**锛�
+--   3) 鏀瑰畬绔嬪嵆鐢熸晥锛屾渶澶� 10 绉掞紝涓嶉渶瑕侀噸鍚��
+--
+-- 鈿狅笍 涓よ�呴兘**涓嶄綔鐢ㄤ簬**宸茬敓鎴愮殑瀛愪换鍔★細鍏抽棴寮�鍏虫槸"褰撳ぉ涓嶅啀鐢熸垚鏂扮殑闅忚"锛�
+--    宸插瓨鍦ㄧ殑瀛愪换鍔$殑鍒版湡/鍥炴敹鐢� ruoyi-inhospvisit 鐨勫畾鏃朵换鍔″鐞嗐��
+--
+-- 娉ㄦ剰锛氭湰椤圭洰鐢ㄧ殑 MySQL 鐗堟湰鍙兘涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛�
+--       鍥犳杩欓噷鐢� information_schema 鍒ゆ柇鍚庡啀鍔ㄦ�佹墽琛屻��
+-- ----------------------------
+
+SET @sys_config_exists = (
+    SELECT COUNT(1) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 'sys_config'
+      AND COLUMN_NAME = 'config_key'
+);
+
+-- ---------------------------------------------------------------
+-- 1) outpatientvisit.enabled
+-- ---------------------------------------------------------------
+SET @ddl = IF(@sys_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''闂ㄦ�ヨ瘖闅忚妯″潡寮�鍏�'', ''outpatientvisit.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''闂ㄦ�ヨ瘖闅忚鎬诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue銆傚彧浣滅敤浜庨棬璇婇殢璁跨紪鎺掞紝闂ㄨ瘖璁板綍CRUD涓庡垎琛ㄧ淮鎶や笉鍙楀奖鍝�''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''outpatientvisit.enabled'')');
+
+PREPARE outpatientvisit_stmt FROM @ddl;
+EXECUTE outpatientvisit_stmt;
+DEALLOCATE PREPARE outpatientvisit_stmt;
+
+-- ---------------------------------------------------------------
+-- 2) othervisit.enabled
+-- ---------------------------------------------------------------
+SET @ddl = IF(@sys_config_exists = 0,
+    'SELECT ''sys_config 琛ㄤ笉瀛樺湪锛岃鍏堟墽琛屽缓琛ㄨ剼鏈�'' AS warning',
+    'INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
+     SELECT ''鎵嬫湳闅忚妯″潡寮�鍏�'', ''othervisit.enabled'', ''true'', ''Y'', ''admin'', SYSDATE(),
+            ''鎵嬫湳闅忚鎬诲紑鍏筹紙杩愯鏃惰鍙栵紝鏀瑰畬鏈�澶�10绉掔敓鏁堬級锛歵rue鍚敤锛宖alse鍏抽棴锛涢粯璁rue銆傚彧浣滅敤浜庢墜鏈殢璁跨紪鎺掞紝鎵嬫湳璁板綍/鏄庣粏/鍩虹瀛楀吀CRUD涓嶅彈褰卞搷''
+     FROM DUAL
+     WHERE NOT EXISTS (SELECT 1 FROM sys_config WHERE config_key = ''othervisit.enabled'')');
+
+PREPARE othervisit_stmt FROM @ddl;
+EXECUTE othervisit_stmt;
+DEALLOCATE PREPARE othervisit_stmt;
+
+-- 鏃ュ父寮�鍏虫搷浣滐紙浜岄�変竴锛屾敼瀹屾渶澶� 10 绉掔敓鏁堬級锛�
+--   鍏抽棴闂ㄨ瘖闅忚锛歎PDATE sys_config SET config_value = 'false', update_time = SYSDATE() WHERE config_key = 'outpatientvisit.enabled';
+--   鍏抽棴鎵嬫湳闅忚锛歎PDATE sys_config SET config_value = 'false', update_time = SYSDATE() WHERE config_key = 'othervisit.enabled';
+
+-- 鏌ヨ褰撳墠鍊�
+-- SELECT config_id, config_name, config_key, config_value, remark FROM sys_config
+--  WHERE config_key IN ('outpatientvisit.enabled', 'othervisit.enabled');

--
Gitblit v1.9.3