From c4dc6a5d66524d08b768046d9d2d5974bf96f45c Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期三, 11 十一月 2026 14:06:23 +0800
Subject: [PATCH] Merge branch 'smartor_ls_261103' into smartor_ls_merge

---
 ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml |  142 ++++++++++++++++++++++++++++++----------------
 1 files changed, 92 insertions(+), 50 deletions(-)

diff --git a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
index 98680e2..5a56e4d 100644
--- a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
+++ b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
@@ -270,50 +270,61 @@
     </sql>
 
     <!-- 瓒呮椂瀹屾垚銆佸欢鏈熷畬鎴愰�昏緫 瀹屾垚鏃剁姸鎬�(finish_state)璁$畻锛氫粎褰撴湰娆℃洿鏂版妸 sendstate 缃负 6锛堥殢璁垮畬鎴愶級鏃朵娇鐢ㄣ��
-         鍩哄噯鎴鏃堕棿 base = endtime + send_day(缂虹渷1) + (危 service_subtask_preachform.compensate_time + 1) 澶╋紝
-         涓� RyTask/RedisMqReceiver 鐨� isSubtaskDeadline 鍙e緞淇濇寔涓�鑷达紱
+         鍩哄噯鎴鏃堕棿 base锛�
+           闈炰换鍔$粍(appltype != 5)锛歟ndtime + send_day(缂虹渷1) + (危 service_subtask_preachform.compensate_time + 1) 澶╋紱
+           浠诲姟缁�(appltype = 5)锛氭寜 schedule_benchmark 瑙f瀽鍩哄噯鏃堕棿
+                                   (1-鍏ラ櫌 2-鍑洪櫌 3-灏辫瘖 4-鍏ョ粍 0/鍏跺畠-鑷畾涔夋椂闂�)
+                                   + day_offset + (危 compensate_time + 1) 澶╋紙涓嶅彔鍔� send_day锛夛紱
+         涓� RyTask/RedisMqReceiver 鐨� isSubtaskDeadline銆乻electTimelyRateBatch 鍙e緞淇濇寔涓�鑷达紱
          delay = COALESCE(service_task.delay_finish_days, 0)锛�
          finish_time = COALESCE(鍏ュ弬 finishtime, 搴撲腑 finishtime, NOW())锛�
            finish_time <= base                                    -> 1 姝e父瀹屾垚
            delay > 0 涓� finish_time <= base + delay               -> 2 寤舵湡瀹屾垚
            鍏朵綑锛堝惈 delay 涓� 0 鎴� NULL銆佹垨宸茶秴鍑哄欢鏈熺獥鍙o級          -> 3 瓒呮椂瀹屾垚
          finishtime 涓虹┖鏃剁敤 NOW() 鍏滃簳锛屼繚璇佸畬鎴愭椂涓�瀹氬啓鍏ョ姸鎬侊紱
-         浠呭綋 endtime 涓虹┖瀵艰嚧鏃犳硶璁$畻鏃舵墠淇濇寔鍘熷�间笉瑕嗙洊銆� -->
-    <sql id="finishStateExpr">
+         base 涓虹┖锛坋ndtime / schedule / day_offset 缂哄け锛夋椂淇濇寔鍘熷�间笉瑕嗙洊銆� -->
+    <sql id="finishDeadlineExpr">
+        DATE_ADD(
         CASE
-        WHEN service_subtask.endtime IS NULL THEN finish_state
+            WHEN COALESCE(st.appltype, '') = '5' THEN
+                DATE_ADD(
+                CASE sts.schedule_benchmark
+                    WHEN 1 THEN service_subtask.starttime
+                    WHEN 2 THEN service_subtask.endtime
+                    WHEN 3 THEN service_subtask.admindate
+                    WHEN 4 THEN service_subtask.create_time
+                    ELSE sts.schedule_benchmark_custom_time
+                END,
+                INTERVAL std.day_offset DAY)
+            ELSE
+                DATE_ADD(service_subtask.endtime, INTERVAL COALESCE(st.send_day, 1) DAY)
+        END,
+        INTERVAL (COALESCE((SELECT SUM(CAST(COALESCE(NULLIF(TRIM(pf.compensate_time), ''), '0') AS SIGNED))
+        FROM service_subtask_preachform pf
+        WHERE pf.subid = service_subtask.id AND pf.del_flag = 0), 0) + 1) DAY)
+    </sql>
+
+    <sql id="finishStateExpr">
+        COALESCE((
+        SELECT
+        CASE
+        WHEN <include refid="finishDeadlineExpr"/> IS NULL THEN NULL
         WHEN COALESCE(#{finishtime,jdbcType=TIMESTAMP}, service_subtask.finishtime, NOW())
-        &lt;= DATE_ADD(
-        DATE_ADD(
-        service_subtask.endtime,
-        INTERVAL COALESCE((SELECT st.send_day FROM service_task st
-        WHERE st.taskid = service_subtask.taskid AND st.del_flag = '0' LIMIT 1), 1) DAY
-        ),
-        INTERVAL (COALESCE((SELECT SUM(CAST(COALESCE(NULLIF(TRIM(pf.compensate_time), ''), '0') AS SIGNED))
-        FROM service_subtask_preachform pf
-        WHERE pf.subid = service_subtask.id AND pf.del_flag = 0), 0) + 1) DAY
-        )
+        &lt;= <include refid="finishDeadlineExpr"/>
         THEN 1
-        WHEN COALESCE((SELECT st.delay_finish_days FROM service_task st
-        WHERE st.taskid = service_subtask.taskid AND st.del_flag = '0' LIMIT 1), 0) &gt; 0
+        WHEN COALESCE(st.delay_finish_days, 0) &gt; 0
         AND COALESCE(#{finishtime,jdbcType=TIMESTAMP}, service_subtask.finishtime, NOW())
-        &lt;= DATE_ADD(
-        DATE_ADD(
-        DATE_ADD(
-        service_subtask.endtime,
-        INTERVAL COALESCE((SELECT st.send_day FROM service_task st
-        WHERE st.taskid = service_subtask.taskid AND st.del_flag = '0' LIMIT 1), 1) DAY
-        ),
-        INTERVAL (COALESCE((SELECT SUM(CAST(COALESCE(NULLIF(TRIM(pf.compensate_time), ''), '0') AS SIGNED))
-        FROM service_subtask_preachform pf
-        WHERE pf.subid = service_subtask.id AND pf.del_flag = 0), 0) + 1) DAY
-        ),
-        INTERVAL COALESCE((SELECT st.delay_finish_days FROM service_task st
-        WHERE st.taskid = service_subtask.taskid AND st.del_flag = '0' LIMIT 1), 0) DAY
-        )
+        &lt;= DATE_ADD(<include refid="finishDeadlineExpr"/>,
+        INTERVAL COALESCE(st.delay_finish_days, 0) DAY)
         THEN 2
         ELSE 3
         END
+        FROM (SELECT 1) dummy
+        LEFT JOIN service_task st ON st.taskid = service_subtask.taskid
+        LEFT JOIN service_task_schedule sts ON sts.id = service_subtask.schedule_id
+        LEFT JOIN service_task_schedule_detail std ON std.id = service_subtask.schedule_detail_id
+        LIMIT 1
+        ), finish_state)
     </sql>
 
     <!-- 褰撳墠鎵ц鏂瑰紡锛氶娆¢殢璁� current_preachform 涓虹┖鏃讹紝鍙� preachform 鐨勭涓�涓墽琛屾柟寮忓厹搴� -->
@@ -999,26 +1010,57 @@
         </if>
         SUM(CASE WHEN ss.finishtime IS NOT NULL AND DATE(ss.visit_time) &lt;= DATE(ss.finishtime) THEN 1 ELSE 0 END) /
         COUNT(*) AS finishRate,
-        <if test="rateDay != null">
-            SUM(CASE WHEN ss.finishtime IS NOT NULL
-            AND DATEDIFF(ss.finishtime, ss.endtime) &lt;= #{rateDay} + COALESCE(cp.compensate_days, 0)
-            THEN 1 ELSE 0 END) / COUNT(*) AS rate
-        </if>
-        <if test="rateDay == null">
-            NULL AS rate
-        </if>
+        <!-- 鍙婃椂鐜囧熀鍑嗭細
+             1) 闈炰换鍔$粍(appltype != 5)锛歟ndtime + send_day(缂虹渷1) + 危琛ュ伩澶╂暟 + 1 澶╋紱
+             2) 浠诲姟缁�(appltype = 5)锛氭寜 schedule_benchmark 瑙f瀽鍩哄噯鏃堕棿
+                (1-鍏ラ櫌鏃堕棿 2-鍑洪櫌鏃堕棿 3-灏辫瘖鏃堕棿 4-鍏ョ粍鏃堕棿 0/鍏跺畠-鑷畾涔夋椂闂�)
+                + day_offset + 危琛ュ伩澶╂暟 + 1 澶╋紙涓嶅啀鍙犲姞 send_day锛夛紱
+             瀹屾垚鏃堕棿 finishtime <= 鍩哄噯鏃堕棿璁′负鍙婃椂锛屽垎姣嶄粛涓哄簲闅忚鏁般��
+             琛ュ伩澶╂暟鍙彇 service_subtask_preachform.compensate_time 鐨勬眹鎬诲�间竴娆★紝
+             閬垮厤涓庤ˉ鍋挎槑缁嗙浉鍔犻�犳垚閲嶅琛ュ伩鎴栦竴瀵瑰鏀惧ぇ鍒嗘瘝銆� -->
+        SUM(CASE
+            WHEN ss.finishtime IS NOT NULL
+             AND COALESCE(st.appltype, '') != '5'
+             AND ss.endtime IS NOT NULL
+             AND ss.finishtime &lt;= DATE_ADD(
+                   DATE_ADD(ss.endtime, INTERVAL COALESCE(st.send_day, 1) DAY),
+                   INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY)
+            THEN 1
+            WHEN ss.finishtime IS NOT NULL
+             AND st.appltype = '5'
+             AND std.day_offset IS NOT NULL
+             AND ss.finishtime &lt;= DATE_ADD(
+                   DATE_ADD(
+                       CASE sts.schedule_benchmark
+                         WHEN 1 THEN ss.starttime
+                         WHEN 2 THEN ss.endtime
+                         WHEN 3 THEN ss.admindate
+                         WHEN 4 THEN ss.create_time
+                         ELSE sts.schedule_benchmark_custom_time
+                       END, INTERVAL std.day_offset DAY),
+                   INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY)
+            THEN 1
+            ELSE 0
+        END) / COUNT(*) AS rate
         FROM service_subtask ss
-        <if test="rateDay != null">
-            <!-- 琛ュ伩鏃堕棿锛氬厛鎸夊瓙浠诲姟鑱氬悎鎴愪竴琛屽啀鍏宠仈锛岄伩鍏嶄竴瀵瑰鏀惧ぇ COUNT(*) 鍒嗘瘝銆�
-                 compensate_time 鏄� varchar 涓斿彲鑳藉瓨鎴愮┖涓诧紝闇�鍏堢疆绌哄啀杞暟瀛� -->
-            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
-        </if>
+        <!-- 杩欓噷鎸� taskid / 鍘嗗彶 schedule 蹇収鍏宠仈锛屼笉鎸� del_flag 杩囨护锛�
+             浠诲姟鎴栬鍒掕缂栬緫鍚庢棫 schedule/detail 浼氱疆涓� del_flag=1锛�
+             浣嗗巻鍙� subtask 浠嶅紩鐢ㄦ棫 ID锛岃繃婊や細涓㈠け鍘嗗彶鍙婃椂鐜囧熀鍑嗐�� -->
+        LEFT JOIN service_task st
+               ON st.taskid = ss.taskid
+        LEFT JOIN service_task_schedule sts
+               ON sts.id = ss.schedule_id
+        LEFT JOIN service_task_schedule_detail std
+               ON std.id = ss.schedule_detail_id
+        <!-- 琛ュ伩鏃堕棿锛氬厛鎸夊瓙浠诲姟鑱氬悎鎴愪竴琛屽啀鍏宠仈锛岄伩鍏嶄竴瀵瑰鏀惧ぇ COUNT(*) 鍒嗘瘝銆�
+             compensate_time 鏄� varchar 涓斿彲鑳藉瓨鎴愮┖涓诧紝闇�鍏堢疆绌哄啀杞暟瀛� -->
+        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.visit_time IS NOT NULL
         AND ss.sendstate != 4

--
Gitblit v1.9.3