Explorar el Código

pms 瑞恒 生成空日报 SQL 性能优化

zhangcl hace 2 semanas
padre
commit
2823e394f1

+ 29 - 99
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -1308,106 +1308,36 @@
 
     <select id="selectDevStatusBatch" parameterType="java.util.List"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO">
-        SELECT
-        dept_id,
-        device_status
-        FROM (
-        SELECT
-        d.dept_id,
-        -- 原有优先级判断逻辑,不变
-        CASE
-        WHEN EXISTS (
-        SELECT 1
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class IN (159, 160)
-        AND deleted = 0
-        ) THEN (
-        SELECT device_status
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class IN (159, 160)
-        AND deleted = 0
-        AND device_status != 'sg'
-        LIMIT 1
-        )
-        WHEN EXISTS (
-        SELECT 1
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 122
-        AND deleted = 0
-        ) THEN (
-        SELECT device_status
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 122
-        AND deleted = 0
-        AND device_status != 'sg'
-        LIMIT 1
-        )
-        WHEN EXISTS (
-        SELECT 1
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class IN (157, 158)
-        AND deleted = 0
-        ) THEN (
-        SELECT device_status
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class IN (157, 158)
-        AND deleted = 0
-        AND device_status != 'sg'
-        LIMIT 1
-        )
-        WHEN EXISTS (
-        SELECT 1
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 106
-        AND deleted = 0
-        ) THEN (
-        SELECT device_status
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 106
-        AND deleted = 0
-        AND device_status != 'sg'
-        LIMIT 1
-        )
-        WHEN EXISTS (
-        SELECT 1
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 308
-        AND deleted = 0
-        ) THEN (
-        SELECT device_status
-        FROM rq_iot_device
-        WHERE dept_id = d.dept_id
-        AND asset_class = 308
-        AND deleted = 0
-        AND device_status != 'sg'
-        LIMIT 1
-        )
-        ELSE NULL
-        END AS device_status
+        SELECT dept_id, device_status
         FROM (
-        SELECT DISTINCT dept_id
-        FROM rq_iot_device
-        WHERE 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 deleted = 0
-        ) AS d
-        ) AS temp
-        -- 核心过滤:仅保留设备状态非NULL的记录,状态为NULL则不返回整条记录
-        WHERE temp.device_status IS NOT NULL -- 确保每个部门只返回1条记录(若多个设备,取任意1条)
-        -- 可选:如需指定返回某条设备(如最新/最早),可加排序:
-        -- ORDER BY create_time DESC -- 按创建时间倒序(取最新)
+                 SELECT
+                     dept_id,
+                     device_status,
+                     -- 定义设备优先级,和你原有CASE顺序完全一致
+                     ROW_NUMBER() OVER (
+            PARTITION BY 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
+        WHERE t.rn = 1;
     </select>
 
     <select id="isReport" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"