提交Merge branch 'subtask' of http://116.62.18.175:6699/r/~yxh/smartor-web into subtask
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================================= |
| | | -- ç
åºåºé¢é访ç»è®¡ · åå¨è¿ç¨ï¼æ¨èï¼çæ£æè°ç¨ä¼ åï¼ |
| | | -- ============================================================================= |
| | | -- MySQL è§å¾ä¸è½å¸¦åæ°ï¼è§å¾å®ä¹éè¿ @åé é½ä¸è®¸ç¨ï¼ï¼è¦ãä¼ åãå°±ç¨åå¨è¿ç¨ã |
| | | -- |
| | | -- è°ç¨ï¼ |
| | | -- CALL p_ward_followup_stats('2026-10-04', '2026-11-03', '1', 7); |
| | | -- CALL p_ward_followup_stats('2026-10-04', '2026-11-03', NULL, NULL); -- å£å¾/忶天æ°ç¨é»è®¤å¼ |
| | | -- ï¼MySQL åå¨è¿ç¨æ²¡æãå¯éåæ°ãï¼åä¸ªåæ°é½å¿
é¡»åï¼ä¸éè¦çä¼ NULLï¼ |
| | | -- |
| | | -- åæ°ï¼ |
| | | -- p_start_time åºé¢æ¶é´èµ·ï¼å«ï¼ï¼'yyyy-MM-dd' æ 'yyyy-MM-dd HH:mm:ss' |
| | | -- p_end_time åºé¢æ¶é´æ¢ï¼å«å½å¤© 23:59:59ï¼ï¼ä¼ 'yyyy-MM-dd' å³å¯ |
| | | -- p_count_style é访æ¹å¼å½ä¸å£å¾ï¼1=åºé访ï¼é»è®¤ï¼ 3=ä»
æå å
¶å®=å
¨é¨ |
| | | -- p_timely_days 忶天æ°åºæ°ï¼é»è®¤ 7ï¼è¡¥å¿å¤©æ°å¦å ï¼ |
| | | -- ============================================================================= |
| | | |
| | | DROP PROCEDURE IF EXISTS p_ward_followup_stats; |
| | | |
| | | DELIMITER $$ |
| | | CREATE PROCEDURE p_ward_followup_stats( |
| | | IN p_start_time DATETIME, |
| | | IN p_end_time DATETIME, |
| | | IN p_count_style VARCHAR(2), |
| | | IN p_timely_days INT |
| | | ) |
| | | BEGIN |
| | | DECLARE v_start DATETIME; |
| | | DECLARE v_end DATETIME; |
| | | DECLARE v_style VARCHAR(2); |
| | | DECLARE v_timely_days INT; |
| | | |
| | | -- èµ·æ¢æ¶é´å¿
ä¼ ï¼æ¢æ¶é´æãå
å«å½å¤©ãå¤ç |
| | | IF p_start_time IS NULL OR p_end_time IS NULL THEN |
| | | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'p_start_time / p_end_time ä¸è½ä¸ºç©º'; |
| | | END IF; |
| | | |
| | | SET v_start = DATE(p_start_time); |
| | | SET v_end = DATE_ADD(DATE(p_end_time), INTERVAL 1 DAY); |
| | | SET v_style = IFNULL(p_count_style, '1'); |
| | | SET v_timely_days = IFNULL(p_timely_days, 7); |
| | | |
| | | SELECT |
| | | t.leavehospitaldistrictname, -- åºé¢ç
åº |
| | | t.deptname, -- åºé¢ç§å®¤ |
| | | t.dischargeCount, -- åºé¢äººæ¬¡ï¼é¦æ¬¡éè®¿è®°å½æ°ï¼ |
| | | t.nonFollowUp, -- æ éé访人次 |
| | | t.followUpNeeded, -- åºé访人次 |
| | | t.needFollowUp, -- 馿¬¡åºé访ï¼= åºéè®¿äººæ¬¡ï¼ |
| | | t.pendingFollowUp, -- 馿¬¡å¾
é访 |
| | | t.followUpSuccess, -- 馿¬¡é访æå |
| | | t.followUpFail, -- 馿¬¡é访失败ï¼å«äººå·¥è¶
æ¶ï¼ |
| | | t.manualSuccess, -- 馿¬¡äººå·¥é访æå |
| | | t.voiceSuccess, -- 馿¬¡è¯é³é访æå |
| | | t.smsSuccess, -- 馿¬¡çä¿¡é访æå |
| | | t.weChatSuccess, -- 馿¬¡å¾®ä¿¡é访æå |
| | | -- é访æåç = æå / åºé访ï¼åªç®æåï¼ä¸å«å¤±è´¥ï¼ |
| | | IF(t.needFollowUp = 0, '0.00%', |
| | | CONCAT(ROUND(100 * t.followUpSuccess / t.needFollowUp, 2), '%')) AS followUpSuccessRate, |
| | | -- æ¸ éå计æåç = åç§æ¹å¼æåä¹å / åç§æ¹å¼å½ä¸ä¹å |
| | | 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, |
| | | -- åæ¶çï¼åæ¶ = finishtime ä¸ä¸ºç©º ä¸ DATEDIFF(finishtime, endtime) <= åæ¶å¤©æ° + è¡¥å¿å¤©æ° |
| | | IF(IFNULL(rt.timely_base, 0) = 0, '0.00%', |
| | | CONCAT(ROUND(100 * rt.timely_cnt / rt.timely_base, 2), '%')) AS timelyRate |
| | | FROM ( |
| | | SELECT |
| | | r.ward_code AS ward_code, |
| | | 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 = 2, 1, 0)) AS pendingFollowUp, |
| | | 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 |
| | | FROM ( |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | 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, |
| | | -- é访æ¹å¼å½ä¸æ¡ä»¶ï¼æ¹å¼ 1 æé¤ãæ éé访ãï¼æ¹å¼ 3 åªç®å·²å®æï¼å
¶å®æ¹å¼ä¸è®¾é |
| | | IF(v_style = '1', |
| | | IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0), |
| | | IF(v_style = '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(v_start) |
| | | AND ss.endtime < DATE_ADD(DATE(v_end), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | ) r |
| | | GROUP BY r.ward_code |
| | | ) t |
| | | LEFT JOIN ( |
| | | -- åæ¶çï¼æç
åºé¢èå䏿¬¡åå
³èï¼é¿å
ä¸å¯¹å¤æ¾å¤§åæ¯ |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | COUNT(*) AS timely_base, |
| | | SUM(IF(ss.finishtime IS NOT NULL |
| | | AND DATEDIFF(ss.finishtime, ss.endtime) <= v_timely_days + IFNULL(cp.compensate_days, 0), |
| | | 1, 0)) AS timely_cnt |
| | | FROM service_subtask ss |
| | | LEFT JOIN ( |
| | | -- è¡¥å¿æ¶é´ï¼varchar ä¸å¯è½æ¯ç©ºä¸²ï¼å
æåä»»å¡èåæä¸è¡ |
| | | 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 æ¶çåºå®æ¡ä»¶ |
| | | AND ss.endtime >= DATE(v_start) |
| | | AND ss.endtime < DATE_ADD(DATE(v_end), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | GROUP BY ss.leavehospitaldistrictcode |
| | | ) rt ON rt.ward_code = t.ward_code |
| | | ORDER BY t.dischargeCount DESC; |
| | | END$$ |
| | | DELIMITER ; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================================= |
| | | -- ç
åºåºé¢é访ç»è®¡ · å¯ä¼ åè§å¾ |
| | | -- ============================================================================= |
| | | -- 为ä»ä¹æ¯ãåæ°è¡¨ + è§å¾ãè䏿¯ @åéï¼ |
| | | -- MySQL è§å¾å®ä¹éç¦æ¢å¼ç¨ @ç¨æ·åé / ç³»ç»åé / åå¨è¿ç¨åæ°ï¼ |
| | | -- å¦ååå»ºæ¶æ¥ ERROR 1351 (HY000): View's SELECT contains a variable or parameterã |
| | | -- 宿¹åæï¼ãThe SELECT statement cannot refer to system variables or |
| | | -- user-defined variables.ã |
| | | -- https://dev.mysql.com/doc/refman/8.0/en/create-view.html |
| | | -- |
| | | -- æä»¥ç¨åè¡åæ°è¡¨ report_param æ¿è½½åæ°ï¼ |
| | | -- 1) REPLACE INTO report_param ... æ¹ç¬¬ 1 è¡ï¼èµ·æ¢æ¶é´ / å£å¾ / 忶天æ°ï¼ |
| | | -- 2) SELECT * FROM v_ward_followup_stats; |
| | | -- |
| | | -- å¹¶åæéï¼åæ°è¡¨æ¯å
±äº«ç¶æï¼ä¸¤ä¸ªä¼è¯åæ¶æ¹ä¼äºç¸ä¸²ãå¤ç¨æ·å¹¶å请æ¹ç¨ |
| | | -- åç®å½ç p_ward_followup_stats.sqlï¼åå¨è¿ç¨ï¼çæ£æè°ç¨ä¼ åï¼ã |
| | | -- ============================================================================= |
| | | |
| | | -- --------------------------------------------------------------------------- |
| | | -- 1. åæ°è¡¨ï¼æ°¸è¿åªæ id = 1 è¿ä¸è¡ï¼ |
| | | -- --------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS report_param ( |
| | | id TINYINT NOT NULL COMMENT 'åºå®ä¸º 1', |
| | | start_time DATETIME NOT NULL COMMENT 'åºé¢æ¶é´èµ·ï¼å«ï¼ï¼ä¼ yyyy-MM-dd æ yyyy-MM-dd HH:mm:ss åå¯', |
| | | end_time DATETIME NOT NULL COMMENT 'åºé¢æ¶é´æ¢ï¼å«å½å¤© 23:59:59ï¼ï¼ä¼ yyyy-MM-dd å³å¯', |
| | | count_style VARCHAR(2) NOT NULL DEFAULT '1' COMMENT 'é访æ¹å¼å½ä¸å£å¾ï¼1=åºé访 3=ä»
æå å
¶å®=å
¨é¨', |
| | | timely_days INT NOT NULL DEFAULT 7 COMMENT 'åæ¶çç天æ°åºæ°ï¼è¡¥å¿å¤©æ°å¦å ï¼', |
| | | PRIMARY KEY (id) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'æ¥è¡¨åæ°ï¼åè¡ï¼id æä¸º 1ï¼'; |
| | | |
| | | -- --------------------------------------------------------------------------- |
| | | -- 2. è§å¾ |
| | | -- --------------------------------------------------------------------------- |
| | | CREATE OR REPLACE VIEW v_ward_followup_stats AS |
| | | SELECT |
| | | t.leavehospitaldistrictname, -- åºé¢ç
åº |
| | | t.deptname, -- åºé¢ç§å®¤ |
| | | t.dischargeCount, -- åºé¢äººæ¬¡ï¼é¦æ¬¡éè®¿è®°å½æ°ï¼ |
| | | t.nonFollowUp, -- æ éé访人次 |
| | | t.followUpNeeded, -- åºé访人次 |
| | | t.needFollowUp, -- 馿¬¡åºé访ï¼= åºéè®¿äººæ¬¡ï¼ |
| | | t.pendingFollowUp, -- 馿¬¡å¾
é访 |
| | | t.followUpSuccess, -- 馿¬¡é访æå |
| | | t.followUpFail, -- 馿¬¡é访失败ï¼å«äººå·¥è¶
æ¶ï¼ |
| | | t.manualSuccess, -- 馿¬¡äººå·¥é访æå |
| | | t.voiceSuccess, -- 馿¬¡è¯é³é访æå |
| | | t.smsSuccess, -- 馿¬¡çä¿¡é访æå |
| | | t.weChatSuccess, -- 馿¬¡å¾®ä¿¡é访æå |
| | | -- é访æåç = æå / åºé访ï¼åªç®æåï¼ä¸å«å¤±è´¥ï¼ |
| | | IF(t.needFollowUp = 0, '0.00%', |
| | | CONCAT(ROUND(100 * t.followUpSuccess / t.needFollowUp, 2), '%')) AS followUpSuccessRate, |
| | | -- æ¸ éå计æåç = åç§æ¹å¼æåä¹å / åç§æ¹å¼å½ä¸ä¹å |
| | | 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, |
| | | -- åæ¶çï¼åæ¶ = finishtime ä¸ä¸ºç©º ä¸ DATEDIFF(finishtime, endtime) <= åæ¶å¤©æ° + è¡¥å¿å¤©æ° |
| | | IF(IFNULL(rt.timely_base, 0) = 0, '0.00%', |
| | | CONCAT(ROUND(100 * rt.timely_cnt / rt.timely_base, 2), '%')) AS timelyRate |
| | | FROM ( |
| | | SELECT |
| | | r.ward_code AS ward_code, |
| | | 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 = 2, 1, 0)) AS pendingFollowUp, |
| | | 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 |
| | | FROM ( |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | 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, |
| | | -- é访æ¹å¼å½ä¸æ¡ä»¶ï¼æ¹å¼ 1 æé¤ãæ éé访ãï¼æ¹å¼ 3 åªç®å·²å®æï¼å
¶å®æ¹å¼ä¸è®¾é |
| | | IF(p.count_style = '1', |
| | | IF(ss.sendstate IS NOT NULL AND ss.sendstate <> 4, 1, 0), |
| | | IF(p.count_style = '3', |
| | | IF(ss.sendstate = 6, 1, 0), |
| | | IF(ss.sendstate IS NOT NULL, 1, 0))) AS ch_hit |
| | | FROM service_subtask ss |
| | | JOIN report_param p ON p.id = 1 |
| | | WHERE ss.del_flag = 0 |
| | | AND ss.service_type = '2' |
| | | AND ss.visit_count = 1 -- åªè¦é¦æ¬¡é访 |
| | | AND ss.leavehospitaldistrictcode IS NOT NULL |
| | | -- >>> å¯ä¼ åçæ¶é´èå´ï¼å·¦éå³å¼ï¼end_time ä¼ æ¥æå³å¯å«å½å¤©å
¨å¤© <<< |
| | | AND ss.endtime >= DATE(p.start_time) |
| | | AND ss.endtime < DATE_ADD(DATE(p.end_time), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | ) r |
| | | GROUP BY r.ward_code |
| | | ) t |
| | | LEFT JOIN ( |
| | | -- åæ¶çï¼æç
åºé¢èå䏿¬¡åå
³èï¼é¿å
ä¸å¯¹å¤æ¾å¤§åæ¯ |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | COUNT(*) AS timely_base, |
| | | SUM(IF(ss.finishtime IS NOT NULL |
| | | AND DATEDIFF(ss.finishtime, ss.endtime) <= p.timely_days + IFNULL(cp.compensate_days, 0), |
| | | 1, 0)) AS timely_cnt |
| | | FROM service_subtask ss |
| | | JOIN report_param p ON p.id = 1 |
| | | LEFT JOIN ( |
| | | -- è¡¥å¿æ¶é´ï¼varchar ä¸å¯è½æ¯ç©ºä¸²ï¼å
æåä»»å¡èåæä¸è¡ |
| | | 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 æ¶çåºå®æ¡ä»¶ |
| | | AND ss.endtime >= DATE(p.start_time) |
| | | AND ss.endtime < DATE_ADD(DATE(p.end_time), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | GROUP BY ss.leavehospitaldistrictcode |
| | | ) rt ON rt.ward_code = t.ward_code |
| | | ORDER BY t.dischargeCount DESC; |
| | | |
| | | -- --------------------------------------------------------------------------- |
| | | -- 3. ç¨æ³ |
| | | -- --------------------------------------------------------------------------- |
| | | -- æ¹åæ°ï¼åªæ¹è¿ä¸è¡ï¼ä¸¤ä¸ªæ¥æå°±æ¯åæ¥ç endtime èµ·æ¢ï¼ |
| | | REPLACE INTO report_param (id, start_time, end_time, count_style, timely_days) |
| | | VALUES (1, '2026-10-04', '2026-11-03', '1', 7); |
| | | |
| | | -- æ¥æ° |
| | | SELECT * |
| | | FROM v_ward_followup_stats |
| | | -- WHERE leavehospitaldistrictname LIKE '%骨ç§%' -- è§å¾å¤ç
§æ ·è½åå æ¡ä»¶ |
| | | ; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================================= |
| | | -- ç
åºåºé¢é访ç»è®¡ · 纯æ¥è¯¢çï¼ä¼è¯åéä¼ åï¼éå Navicat/DataGrip 临æ¶åæ°ï¼ |
| | | -- ============================================================================= |
| | | -- @start_time / @end_time å°±æ¯åæ¥åæ»ç endtime èµ·æ¢ï¼æ¹è¿ä¸¤è¡å³å¯ã |
| | | -- 注æï¼è¿ä¸æ¯è§å¾ï¼åéå±äºå½åè¿æ¥ï¼æ¢è¿æ¥è¦éæ° SETã |
| | | -- ============================================================================= |
| | | |
| | | SET @start_time = '2026-10-04'; -- åºé¢æ¶é´èµ·ï¼å«ï¼ |
| | | SET @end_time = '2026-11-03'; -- åºé¢æ¶é´æ¢ï¼å«å½å¤©ï¼ |
| | | SET @followUpCountStyle = '1'; -- 1=åºé访 3=ä»
æå å
¶å®=å
¨é¨ |
| | | SET @timelyDays = 7; -- 忶天æ°åºæ° |
| | | |
| | | SELECT |
| | | t.leavehospitaldistrictname, -- åºé¢ç
åº |
| | | t.deptname, -- åºé¢ç§å®¤ |
| | | t.dischargeCount, -- åºé¢äººæ¬¡ï¼é¦æ¬¡éè®¿è®°å½æ°ï¼ |
| | | t.nonFollowUp, -- æ éé访人次 |
| | | t.followUpNeeded, -- åºé访人次 |
| | | t.needFollowUp, -- 馿¬¡åºé访ï¼= åºéè®¿äººæ¬¡ï¼ |
| | | t.pendingFollowUp, -- 馿¬¡å¾
é访 |
| | | t.followUpSuccess, -- 馿¬¡é访æå |
| | | t.followUpFail, -- 馿¬¡é访失败ï¼å«äººå·¥è¶
æ¶ï¼ |
| | | t.manualSuccess, -- 馿¬¡äººå·¥é访æå |
| | | t.voiceSuccess, -- 馿¬¡è¯é³é访æå |
| | | t.smsSuccess, -- 馿¬¡çä¿¡é访æå |
| | | t.weChatSuccess, -- 馿¬¡å¾®ä¿¡é访æå |
| | | -- é访æåç = æå / åºé访ï¼åªç®æåï¼ä¸å«å¤±è´¥ï¼ |
| | | IF(t.needFollowUp = 0, '0.00%', |
| | | CONCAT(ROUND(100 * t.followUpSuccess / t.needFollowUp, 2), '%')) AS followUpSuccessRate, |
| | | -- æ¸ éå计æåç = åç§æ¹å¼æåä¹å / åç§æ¹å¼å½ä¸ä¹å |
| | | 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, |
| | | -- åæ¶çï¼åæ¶ = finishtime ä¸ä¸ºç©º ä¸ DATEDIFF(finishtime, endtime) <= åæ¶å¤©æ° + è¡¥å¿å¤©æ° |
| | | IF(IFNULL(rt.timely_base, 0) = 0, '0.00%', |
| | | CONCAT(ROUND(100 * rt.timely_cnt / rt.timely_base, 2), '%')) AS timelyRate |
| | | FROM ( |
| | | SELECT |
| | | r.ward_code AS ward_code, |
| | | 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 = 2, 1, 0)) AS pendingFollowUp, |
| | | 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 |
| | | FROM ( |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | 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, |
| | | -- é访æ¹å¼å½ä¸æ¡ä»¶ï¼æ¹å¼ 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(@start_time) |
| | | AND ss.endtime < DATE_ADD(DATE(@end_time), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | ) r |
| | | GROUP BY r.ward_code |
| | | ) t |
| | | LEFT JOIN ( |
| | | -- åæ¶çï¼æç
åºé¢èå䏿¬¡åå
³èï¼é¿å
ä¸å¯¹å¤æ¾å¤§åæ¯ |
| | | SELECT |
| | | ss.leavehospitaldistrictcode AS ward_code, |
| | | COUNT(*) AS timely_base, |
| | | SUM(IF(ss.finishtime IS NOT NULL |
| | | AND DATEDIFF(ss.finishtime, ss.endtime) <= @timelyDays + IFNULL(cp.compensate_days, 0), |
| | | 1, 0)) AS timely_cnt |
| | | FROM service_subtask ss |
| | | LEFT JOIN ( |
| | | -- è¡¥å¿æ¶é´ï¼varchar ä¸å¯è½æ¯ç©ºä¸²ï¼å
æåä»»å¡èåæä¸è¡ |
| | | 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 æ¶çåºå®æ¡ä»¶ |
| | | AND ss.endtime >= DATE(@start_time) |
| | | AND ss.endtime < DATE_ADD(DATE(@end_time), INTERVAL 1 DAY) |
| | | AND ss.orgid = '20001001' |
| | | GROUP BY ss.leavehospitaldistrictcode |
| | | ) rt ON rt.ward_code = t.ward_code |
| | | ORDER BY t.dischargeCount DESC; |
| | |
| | | * å端å£å¾ï¼service_subtask ä¸ |
| | | * service_type = '2' åºé¢é访 / '3' é¨è¯é访ï¼åå¼è®¡æ°ï¼ |
| | | * current_preachform = '1'ï¼äººå·¥ï¼ |
| | | * å¾
éè®¿ç¶æï¼sendstate in 1,2,3,5,7ï¼ |
| | | * å¾
éè®¿ç¶æï¼sendstate in 1,2,3,7ï¼åé失败 5 ä¸è®¡å
¥ï¼ |
| | | * åºé¢æ¶é´ endtime æ©äºçäºä»å¤© - 7 天 |
| | | * åªç»è®¡æè¿ 4 个åºé¢æä»½ï¼å«å½æï¼ |
| | | * |
| | |
| | | }, |
| | | /** |
| | | * å³ä¸è§ãå¾
å¤çé访任å¡ãå¡çç¹å»æ°åè·³è½¬è¿æ¥ï¼ |
| | | * æåºé¢å¹´æ + å¾
é访ï¼sendstate 1/2/3/5/7ï¼+ åºé¢æ»¡ 7 天 è¿æ»¤ï¼å£å¾ä¸å¡çä¸è´ |
| | | * æåºé¢å¹´æ + å¾
é访ï¼sendstate 1/2/3/7ï¼+ åºé¢æ»¡ 7 天 è¿æ»¤ï¼å£å¾ä¸å¡çä¸è´ |
| | | * @returns {boolean} æ¯å¦å·²æå¡çæ¡ä»¶åèµ·æ¥è¯¢ |
| | | */ |
| | | applyPendingTaskQuery() { |
| | |
| | | const serviceType = Number(query.serviceType) === 3 ? 3 : 2; |
| | | this.errtype = undefined; |
| | | const start = month + "-01"; |
| | | let end = this.pendingTaskMonthEnd(month); |
| | | // æå 7 天å
ï¼"ä»å¤©-7天" 伿©äºæåï¼å
åºææåï¼é¿å
æ¥æåºé´åæ |
| | | if (end < start) { |
| | | end = start; |
| | | } |
| | | // å¡çç»è®¡çæ¯ãåºé¢æ»¡ 7 天ãçä»»å¡ï¼æªæ¢æ¥ = min(该ææåä¸å¤©, ä»å¤©-7 天) |
| | | const end = this.pendingTaskMonthEnd(month); |
| | | this.dateRange = [start, end]; |
| | | this.topqueryParams.serviceType = serviceType; |
| | | this.topqueryParams.sendstateView = 1; |
| | |
| | | // å¡çç»è®¡çæ¯å
¨é¨å¾
é访任å¡ï¼ä¸åºåé¦è½®/å¤è¯ï¼ï¼å表è¿é忥æ¾å¼ |
| | | this.topqueryParams.visitCount = null; |
| | | this.topqueryParams.pageNum = 1; |
| | | // å½æè¿æ²¡å°ç¬¬ 8 天æ¶ï¼è¯¥æä¸å¯è½æãåºé¢æ»¡ 7 天ãçä»»å¡ï¼å¡çæ¾ç¤º 0ï¼ï¼åè¡¨ç´æ¥ç»ç©ºã |
| | | // æ¥ææ¡ä»æ¾ç¤ºè¯¥æçèªç¶åºé´ï¼é¿å
åºç°ãèµ·æ¢åæãçç鿡件ã |
| | | if (end < start) { |
| | | this.dateRange = [start, this.pendingTaskMonthLastDay(month)]; |
| | | this.userList = []; |
| | | this.total = 0; |
| | | this.loading = false; |
| | | this.$message.info("è¯¥æææ åºé¢æ»¡ 7 天çå¾
é访任å¡"); |
| | | return true; |
| | | } |
| | | this.handleQuery(1); |
| | | return true; |
| | | }, |
| | | /** |
| | | * å¡çå£å¾çæä»½ç»ææ¥ï¼ |
| | | * 彿åªç»è®¡åºé¢æ»¡ 7 天çï¼æä»¥åãä»å¤© - 7 天ãï¼å岿份å彿æåä¸å¤© |
| | | * 该ææåä¸å¤©ï¼yyyy-MM-ddï¼ï¼åªç¨äºãå½æè¿æ²¡ææ»¡ 7 天任å¡ãæ¶å±ç¤ºæ£å¸¸æä»½åºé´ |
| | | */ |
| | | pendingTaskMonthLastDay(month) { |
| | | const parts = String(month).split("-"); |
| | | const date = new Date(Number(parts[0]), Number(parts[1]), 0); |
| | | const mm = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const dd = String(date.getDate()).padStart(2, "0"); |
| | | return date.getFullYear() + "-" + mm + "-" + dd; |
| | | }, |
| | | /** |
| | | * å¡çå£å¾çæä»½ç»ææ¥ï¼å¡çåªç»è®¡ãåºé¢æ»¡ 7 天仿ªé访ãçä»»å¡ï¼ |
| | | * æä»¥æªæ¢æ¥æ°¸è¿æ¯ min(该ææåä¸å¤©, ä»å¤©-7 天)ï¼ |
| | | * åå²æä»½åæ ·è¦æãä»å¤©-7 å¤©ãæªæï¼å¦åææ«å 天åºé¢çæ£è
ä¼è¢«ç®è¿æ¥ï¼å¡ç 49ãå表 77ï¼ã |
| | | */ |
| | | pendingTaskMonthEnd(month) { |
| | | const parts = String(month).split("-"); |
| | | const year = Number(parts[0]); |
| | | const mon = Number(parts[1]); |
| | | const now = new Date(); |
| | | let date; |
| | | if (year === now.getFullYear() && mon === now.getMonth() + 1) { |
| | | date = new Date(year, mon - 1, now.getDate() - 7); |
| | | } else { |
| | | date = new Date(year, mon, 0); |
| | | } |
| | | // åºé¢æ»¡ 7 天ï¼åºé¢æ¥æ <= ä»å¤©-7ï¼ä¸å端 endtime < ä»å¤©-6 00:00 çä»·ï¼ |
| | | const cutoff = new Date( |
| | | now.getFullYear(), |
| | | now.getMonth(), |
| | | now.getDate() - 7 |
| | | ); |
| | | const monthEnd = new Date(year, mon, 0); |
| | | const date = cutoff < monthEnd ? cutoff : monthEnd; |
| | | const mm = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const dd = String(date.getDate()).padStart(2, "0"); |
| | | return date.getFullYear() + "-" + mm + "-" + dd; |
| | |
| | | }, |
| | | /** |
| | | * å³ä¸è§ãå¾
å¤çé访任å¡ãå¡çç¹å»æ°åè·³è½¬è¿æ¥ï¼ |
| | | * æåºé¢å¹´æ + å¾
é访ï¼sendstate 1/2/3/5/7ï¼+ åºé¢æ»¡ 7 天 è¿æ»¤ï¼å£å¾ä¸å¡çä¸è´ |
| | | * æåºé¢å¹´æ + å¾
é访ï¼sendstate 1/2/3/7ï¼+ åºé¢æ»¡ 7 天 è¿æ»¤ï¼å£å¾ä¸å¡çä¸è´ |
| | | * @returns {boolean} æ¯å¦å·²æå¡çæ¡ä»¶åèµ·æ¥è¯¢ |
| | | */ |
| | | applyPendingTaskQuery() { |
| | |
| | | const serviceType = Number(query.serviceType) === 3 ? 3 : 2; |
| | | this.errtype = undefined; |
| | | const start = month + "-01"; |
| | | let end = this.pendingTaskMonthEnd(month); |
| | | // æå 7 天å
ï¼"ä»å¤©-7天" 伿©äºæåï¼å
åºææåï¼é¿å
æ¥æåºé´åæ |
| | | if (end < start) { |
| | | end = start; |
| | | } |
| | | // å¡çç»è®¡çæ¯ãåºé¢æ»¡ 7 天ãçä»»å¡ï¼æªæ¢æ¥ = min(该ææåä¸å¤©, ä»å¤©-7 天) |
| | | const end = this.pendingTaskMonthEnd(month); |
| | | this.dateRange = [start, end]; |
| | | this.topqueryParams.serviceType = serviceType; |
| | | this.topqueryParams.sendstateView = 1; |
| | |
| | | // å¡çç»è®¡çæ¯å
¨é¨å¾
é访任å¡ï¼ä¸åºåé¦è½®/å¤è¯ï¼ï¼å表è¿é忥æ¾å¼ |
| | | this.topqueryParams.visitCount = null; |
| | | this.topqueryParams.pageNum = 1; |
| | | // å½æè¿æ²¡å°ç¬¬ 8 天æ¶ï¼è¯¥æä¸å¯è½æãåºé¢æ»¡ 7 天ãçä»»å¡ï¼å¡çæ¾ç¤º 0ï¼ï¼åè¡¨ç´æ¥ç»ç©ºã |
| | | // æ¥ææ¡ä»æ¾ç¤ºè¯¥æçèªç¶åºé´ï¼é¿å
åºç°ãèµ·æ¢åæãçç鿡件ã |
| | | if (end < start) { |
| | | this.dateRange = [start, this.pendingTaskMonthLastDay(month)]; |
| | | this.userList = []; |
| | | this.total = 0; |
| | | this.loading = false; |
| | | this.$message.info("è¯¥æææ åºé¢æ»¡ 7 天çå¾
é访任å¡"); |
| | | return true; |
| | | } |
| | | this.handleQuery(1); |
| | | return true; |
| | | }, |
| | | /** |
| | | * å¡çå£å¾çæä»½ç»ææ¥ï¼ |
| | | * 彿åªç»è®¡åºé¢æ»¡ 7 天çï¼æä»¥åãä»å¤© - 7 天ãï¼å岿份å彿æåä¸å¤© |
| | | * 该ææåä¸å¤©ï¼yyyy-MM-ddï¼ï¼åªç¨äºãå½æè¿æ²¡ææ»¡ 7 天任å¡ãæ¶å±ç¤ºæ£å¸¸æä»½åºé´ |
| | | */ |
| | | pendingTaskMonthLastDay(month) { |
| | | const parts = String(month).split("-"); |
| | | const date = new Date(Number(parts[0]), Number(parts[1]), 0); |
| | | const mm = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const dd = String(date.getDate()).padStart(2, "0"); |
| | | return date.getFullYear() + "-" + mm + "-" + dd; |
| | | }, |
| | | /** |
| | | * å¡çå£å¾çæä»½ç»ææ¥ï¼å¡çåªç»è®¡ãåºé¢æ»¡ 7 天仿ªé访ãçä»»å¡ï¼ |
| | | * æä»¥æªæ¢æ¥æ°¸è¿æ¯ min(该ææåä¸å¤©, ä»å¤©-7 天)ï¼ |
| | | * åå²æä»½åæ ·è¦æãä»å¤©-7 å¤©ãæªæï¼å¦åææ«å 天åºé¢çæ£è
ä¼è¢«ç®è¿æ¥ï¼å¡ç 49ãå表 77ï¼ã |
| | | */ |
| | | pendingTaskMonthEnd(month) { |
| | | const parts = String(month).split("-"); |
| | | const year = Number(parts[0]); |
| | | const mon = Number(parts[1]); |
| | | const now = new Date(); |
| | | let date; |
| | | if (year === now.getFullYear() && mon === now.getMonth() + 1) { |
| | | date = new Date(year, mon - 1, now.getDate() - 7); |
| | | } else { |
| | | date = new Date(year, mon, 0); |
| | | } |
| | | // åºé¢æ»¡ 7 天ï¼åºé¢æ¥æ <= ä»å¤©-7ï¼ä¸å端 endtime < ä»å¤©-6 00:00 çä»·ï¼ |
| | | const cutoff = new Date( |
| | | now.getFullYear(), |
| | | now.getMonth(), |
| | | now.getDate() - 7 |
| | | ); |
| | | const monthEnd = new Date(year, mon, 0); |
| | | const date = cutoff < monthEnd ? cutoff : monthEnd; |
| | | const mm = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const dd = String(date.getDate()).padStart(2, "0"); |
| | | return date.getFullYear() + "-" + mm + "-" + dd; |