Просмотр исходного кода

pms 空日报生成查询逻辑优化

zhangcl 2 недель назад
Родитель
Сommit
5cbb177015

+ 38 - 26
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -1308,36 +1308,48 @@
 
     <select id="selectDevStatusBatch" parameterType="java.util.List"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO">
+        WITH dept_with_sg AS (
+            SELECT DISTINCT dept_id
+            FROM rq_iot_device
+            WHERE deleted = 0
+            AND dept_id IN
+            <foreach collection="teams" item="item" open="(" separator="," close=")">
+                #{item.id}
+            </foreach>
+            AND asset_class IN (159, 160, 122, 106, 157, 158, 308, 108, 229)
+            AND device_status = 'sg'
+        )
         SELECT dept_id, device_status
         FROM (
-                 SELECT
-                     dept_id,
-                     device_status,
-                     -- 定义设备优先级,和你原有CASE顺序完全一致
-                     ROW_NUMBER() OVER (
-            PARTITION BY dept_id
+            SELECT
+            d.dept_id,
+            d.device_status,
+            ROW_NUMBER() OVER (
+            PARTITION BY d.dept_id
             ORDER BY
-                CASE asset_class
-                    WHEN 159 THEN 1 WHEN 160 THEN 1
-                    WHEN 122 THEN 2
-                    WHEN 157 THEN 3 WHEN 158 THEN 3
-                    WHEN 106 THEN 4
-                    WHEN 308 THEN 5
-                    WHEN 108 THEN 6
-                    WHEN 229 THEN 7
-                END ASC
-        ) AS rn
-                 FROM rq_iot_device
-                 WHERE
-                     deleted = 0
-                   AND dept_id IN
-                    <foreach collection="teams" item="item" open="(" separator="," close=")">
-                        #{item.id}
-                    </foreach>
-                   AND asset_class IN (159, 160, 122, 106, 157, 158, 308, 108, 229)
-                   AND device_status != 'sg'
-             ) t
+            CASE d.asset_class
+            WHEN 159 THEN 1 WHEN 160 THEN 1
+            WHEN 122 THEN 2
+            WHEN 157 THEN 3 WHEN 158 THEN 3
+            WHEN 106 THEN 4
+            WHEN 308 THEN 5
+            WHEN 108 THEN 6
+            WHEN 229 THEN 7
+            END ASC
+            ) AS rn
+            FROM rq_iot_device d
+            LEFT JOIN dept_with_sg e ON d.dept_id = e.dept_id
+            WHERE d.deleted = 0
+            AND dept_id IN
+            <foreach collection="teams" item="item" open="(" separator="," close=")">
+                #{item.id}
+            </foreach>
+            AND d.asset_class IN (159, 160, 122, 106, 157, 158, 308, 108, 229)
+            AND d.device_status != 'sg'
+            AND e.dept_id IS NULL
+        ) t
         WHERE t.rn = 1;
+
     </select>
 
     <select id="isReport" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"