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

---
 ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml |  117 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 81 insertions(+), 36 deletions(-)

diff --git a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
index c28c13e..a6a536b 100644
--- a/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
+++ b/ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
@@ -267,50 +267,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 鐨勭涓�涓墽琛屾柟寮忓厹搴� -->
@@ -373,16 +384,34 @@
     <sql id="filterLeaveDimAnd">
         /* f-v3 */
         <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
-            AND leavehospitaldistrictcode IN
+            AND (
+            leavehospitaldistrictcode IN
             <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                 #{lvWardCodeItem}
             </foreach>
+            <!-- 寤剁画鎶ょ悊浠诲姟锛坰ervice_type='99'锛夊彲浠ュ湪鎮h�呰繕娌″嚭闄㈡椂鐢熸垚锛�
+                 杩欑被璁板綍鍙湁銆屽湪闄㈢淮搴︺�嶏紙hospitaldistrictcode / deptcode锛夛紝鍑洪櫌缁村害鏄� NULL銆�
+                 NULL 涓嶅尮閰嶄换浣� IN锛屼换鍔′細銆屾彁绀虹敓鎴愭垚鍔熴�佸垪琛ㄩ噷鍗存煡涓嶅埌銆嶏紝
+                 鎵�浠ュ嚭闄㈢淮搴︿负绌烘椂鐢ㄥ悓涓�濂楃紪鐮佷綋绯荤殑鍦ㄩ櫌缁村害鍏滃簳銆� -->
+            OR (service_type = '99' AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')
+                AND hospitaldistrictcode IN
+                <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
+                    #{lvWardCodeItem}
+                </foreach>)
+            )
         </if>
         <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
-            AND leaveldeptcode IN
+            AND (
+            leaveldeptcode IN
             <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                 #{lvDeptCodeItem}
             </foreach>
+            OR (service_type = '99' AND (leaveldeptcode IS NULL OR leaveldeptcode = '')
+                AND deptcode IN
+                <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
+                    #{lvDeptCodeItem}
+                </foreach>)
+            )
         </if>
     </sql>
 
@@ -423,20 +452,38 @@
                   or (leaveldeptcodes != null and leaveldeptcodes.size() > 0)">
             AND (
             <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
+                (
                 leavehospitaldistrictcode IN
                 <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                     #{lvWardCodeItem}
                 </foreach>
+                <!-- 寤剁画鎶ょ悊浠诲姟锛坰ervice_type='99'锛夊彲浠ュ湪鎮h�呰繕娌″嚭闄㈡椂鐢熸垚锛�
+                     杩欑被璁板綍鍙湁銆屽湪闄㈢淮搴︺�嶏紙hospitaldistrictcode / deptcode锛夛紝鍑洪櫌缁村害鏄� NULL銆�
+                     NULL 涓嶅尮閰嶄换浣� IN锛屼换鍔′細銆屾彁绀虹敓鎴愭垚鍔熴�佸垪琛ㄩ噷鍗存煡涓嶅埌銆嶏紝
+                     鎵�浠ュ嚭闄㈢淮搴︿负绌烘椂鐢ㄥ悓涓�濂楃紪鐮佷綋绯荤殑鍦ㄩ櫌缁村害鍏滃簳銆� -->
+                OR (service_type = '99' AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')
+                    AND hospitaldistrictcode IN
+                    <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
+                        #{lvWardCodeItem}
+                    </foreach>)
+                )
             </if>
             <if test="(leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0)
                       and (leaveldeptcodes != null and leaveldeptcodes.size() > 0)">
                 OR
             </if>
             <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
+                (
                 leaveldeptcode IN
                 <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                     #{lvDeptCodeItem}
                 </foreach>
+                OR (service_type = '99' AND (leaveldeptcode IS NULL OR leaveldeptcode = '')
+                    AND deptcode IN
+                    <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
+                        #{lvDeptCodeItem}
+                    </foreach>)
+                )
             </if>
             )
         </if>
@@ -944,7 +991,7 @@
              1) 闈炰换鍔$粍(appltype != 5)锛歟ndtime + send_day(缂虹渷1) + 危琛ュ伩澶╂暟 + 1 澶╋紱
              2) 浠诲姟缁�(appltype = 5)锛氭寜 schedule_benchmark 瑙f瀽鍩哄噯鏃堕棿
                 (1-鍏ラ櫌鏃堕棿 2-鍑洪櫌鏃堕棿 3-灏辫瘖鏃堕棿 4-鍏ョ粍鏃堕棿 0/鍏跺畠-鑷畾涔夋椂闂�)
-                + day_offset + send_day(缂虹渷1) + 危琛ュ伩澶╂暟 + 1 澶╋紱
+                + day_offset + 危琛ュ伩澶╂暟 + 1 澶╋紙涓嶅啀鍙犲姞 send_day锛夛紱
              瀹屾垚鏃堕棿 finishtime <= 鍩哄噯鏃堕棿璁′负鍙婃椂锛屽垎姣嶄粛涓哄簲闅忚鏁般��
              琛ュ伩澶╂暟鍙彇 service_subtask_preachform.compensate_time 鐨勬眹鎬诲�间竴娆★紝
              閬垮厤涓庤ˉ鍋挎槑缁嗙浉鍔犻�犳垚閲嶅琛ュ伩鎴栦竴瀵瑰鏀惧ぇ鍒嗘瘝銆� -->
@@ -961,7 +1008,6 @@
              AND std.day_offset IS NOT NULL
              AND ss.finishtime &lt;= DATE_ADD(
                    DATE_ADD(
-                     DATE_ADD(
                        CASE sts.schedule_benchmark
                          WHEN 1 THEN ss.starttime
                          WHEN 2 THEN ss.endtime
@@ -969,7 +1015,6 @@
                          WHEN 4 THEN ss.create_time
                          ELSE sts.schedule_benchmark_custom_time
                        END, INTERVAL std.day_offset DAY),
-                     INTERVAL COALESCE(st.send_day, 1) DAY),
                    INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY)
             THEN 1
             ELSE 0

--
Gitblit v1.9.3