From 126c2efc23cb8a02e4ff4d300050a590b8a0f1fa Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期五, 25 十月 2024 10:33:25 +0800
Subject: [PATCH] 取水口管理功能中去除顯示在線情況,優化SQL語句。

---
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml |   59 ++++++++++++++++++-----------------------------------------
 1 files changed, 18 insertions(+), 41 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
index 9bce76d..f7bf939 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
@@ -231,14 +231,9 @@
         LEFT JOIN ba_district town ON ge.townId = town.id
         LEFT JOIN ba_district village ON ge.villageId = village.id
         LEFT JOIN pr_controller cont ON ge.id = cont.intakeId
-        left JOIN JSON_TABLE(
-        <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
-        #{onLineMap},
-        '$[*]' COLUMNS(
-        rtuAddr VARCHAR(20) PATH '$.rtuAddr',
-        isOnLine BOOLEAN PATH '$.isOnLine'
-        )
-        ) rtus ON cont.rtuAddr = rtus.rtuAddr
+        <if test = "bindNumber != null and bindNumber > 0">
+            JOIN (SELECT intakeId, COUNT(*) num FROM pr_intake_controller WHERE operateType = 1 group by intakeId) AS bindNumTb on bindNumTb.intakeId= ge.id
+        </if>
         <where>
             ge.deleted = 0
             AND divi.deleted = 0
@@ -255,10 +250,10 @@
                 AND blo.id = #{blockId}
             </if>
 
-            <if test="isBinded == 0">
+            <if test="isBinded != null and isBinded == 0">
                 AND ge.id NOT IN (SELECT intakeId FROM pr_controller where deleted = 0)
             </if>
-            <if test="isBinded == 1">
+            <if test="isBinded != null and isBinded == 1">
                 AND ge.id IN (SELECT intakeId FROM pr_controller where deleted = 0)
             </if>
             <if test="isBinded == null">
@@ -269,21 +264,20 @@
             <if test = "rtuAddr != null and rtuAddr !=''">
                 AND cont.rtuAddr like CONCAT('%',#{rtuAddr},'%')
             </if>
-            <if test="isOnLine != null and isOnLine !='' ">
-                AND rtus.isOnLine = #{isOnLine}
-            </if>
             <if test="protocol != null and protocol !='' ">
                 AND cont.protocol = #{protocol}
             </if>
             <if test = "bindNumber != null and bindNumber > 0">
-                AND (SELECT COUNT(*) FROM pr_intake_controller WHERE intakeId = ge.id AND operateType = 1) = ${bindNumber}
+                AND bindNumTb.num = #{bindNumber}
             </if>
         </where>
     </select>
 
     <!--鏍规嵁鎸囧畾鏉′欢鑾峰彇鍙栨按鍙h褰�-->
     <select id="getIntakes" resultType="com.dy.pipIrrGlobal.voPr.VoIntake">
-        SELECT CAST(ge.id AS char)                                 AS intakeId,
+        WITH intakeIds AS(SELECT intakeId FROM pr_controller where deleted = 0)
+
+        SELECT CAST(ge.id AS char)                          AS intakeId,
         ge.`name`                                           AS intakeName,
         CAST(divi.id AS char)                               AS divideId,
         divi.`name`                                         AS divideName,
@@ -293,18 +287,14 @@
         cont.rtuAddr                                        AS rtuAddr,
         cont.protocol                                       AS protocol,
         cont.findDt                                         AS findDt,
-        rtus.isOnLine                                       AS isOnLine,
-        (SELECT COUNT(*) FROM pr_intake_controller WHERE intakeId = ge.id AND operateType = 1) AS bindNumber,
+        bindNumTb.num                                       AS bindNumber,
         ge.lng,
         ge.lat,
         ge.remarks,
         ge.operator,
         ge.operateDt                                        As operateDt,
-        (CASE
-        WHEN ge.id NOT IN (SELECT intakeId FROM pr_controller where deleted = 0) THEN '鏈粦瀹�'
-        WHEN ge.id IN (SELECT intakeId FROM pr_controller where deleted = 0) THEN '宸茬粦瀹�'
-        END)                                            AS isBind,
-        CONCAT(country.`name`, town.`name`, village.`name`) AS address
+        IF(ge.id IN (SELECT intakeId FROM intakeIds),'宸茬粦瀹�','鏈粦瀹�')    AS isBind,
+        CONCAT(country.`name`, town.`name`, village.`name`)              AS address
         FROM pr_intake ge
         INNER JOIN pr_divide divi ON ge.divideId = divi.id
         INNER JOIN ba_block blo ON divi.blockId = blo.id
@@ -312,14 +302,7 @@
         LEFT JOIN ba_district town ON ge.townId = town.id
         LEFT JOIN ba_district village ON ge.villageId = village.id
         LEFT JOIN pr_controller cont ON ge.id = cont.intakeId
-        left JOIN JSON_TABLE(
-        <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
-        #{onLineMap},
-        '$[*]' COLUMNS(
-        rtuAddr VARCHAR(20) PATH '$.rtuAddr',
-        isOnLine BOOLEAN PATH '$.isOnLine'
-        )
-        ) rtus ON cont.rtuAddr = rtus.rtuAddr
+        JOIN (SELECT intakeId, COUNT(*) num FROM pr_intake_controller WHERE operateType = 1 group by intakeId) AS bindNumTb on bindNumTb.intakeId= ge.id
         <where>
             ge.deleted = 0
             AND divi.deleted = 0
@@ -327,19 +310,16 @@
             <if test="intakeName != null and intakeName != ''">
                 AND ge.name LIKE CONCAT('%', #{intakeName}, '%')
             </if>
-
             <if test="divideId != null and divideId != ''">
                 AND divi.id = #{divideId}
             </if>
-
             <if test="blockId != null and blockId != ''">
                 AND blo.id = #{blockId}
             </if>
-
-            <if test="isBinded == 0">
+            <if test="isBinded != null and isBinded == 0">
                 AND ge.id NOT IN (SELECT intakeId FROM pr_controller where deleted = 0)
             </if>
-            <if test="isBinded == 1">
+            <if test="isBinded != null and isBinded == 1">
                 AND ge.id IN (SELECT intakeId FROM pr_controller where deleted = 0)
             </if>
             <if test="isBinded == null">
@@ -347,17 +327,14 @@
             <if test="address != null and address != ''">
                 AND CONCAT(country.`name`, town.`name`, village.`name`) LIKE CONCAT('%', #{address}, '%')
             </if>
-            <if test = "rtuAddr != null and rtuAddr !=''">
+            <if test="rtuAddr != null and rtuAddr !=''">
                 AND cont.rtuAddr like CONCAT('%',#{rtuAddr},'%')
-            </if>
-            <if test="isOnLine != null and isOnLine !='' ">
-                AND rtus.isOnLine = #{isOnLine}
             </if>
             <if test="protocol != null and protocol !='' ">
                 AND cont.protocol = #{protocol}
             </if>
-            <if test = "bindNumber != null and bindNumber > 0">
-                AND (SELECT COUNT(*) FROM pr_intake_controller WHERE intakeId = ge.id AND operateType = 1) = ${bindNumber}
+            <if test="bindNumber != null and bindNumber > 0">
+                AND bindNumTb.num = #{bindNumber}
             </if>
         </where>
         ORDER BY ge.operateDt DESC

--
Gitblit v1.8.0