吉安感知网项目-后端
linwei
2026-04-02 3feb3b25657a04f8e213f80d52b12483ec9f06fb
opt: sql改造其他模块改造10
1 files modified
84 ■■■■ changed files
drone-service/drone-fw/src/main/java/org/sxkj/fw/device/mapper/FwDeviceMapper.xml 84 ●●●● patch | view | raw | blame | history
drone-service/drone-fw/src/main/java/org/sxkj/fw/device/mapper/FwDeviceMapper.xml
@@ -188,48 +188,51 @@
            and track_status = 1
            <if test="query.isAreaSelect != null and query.isAreaSelect == 1">
                and (
                    <choose>
                        <when test="query.areaId != null">
                            exists (
                                select 1
                                from ja_fw_area_divide ad
                                where ad.is_deleted = 0
                                  and ad.id = #{query.areaId}
                                  and ad.device_ids is not null
                                  and ad.device_ids != ''
                                  and ja_fw_device.id = ANY(string_to_array(ad.device_ids, ',')::bigint[])
                            )
                            or not exists (
                                select 1
                                from ja_fw_area_divide ad
                                where ad.is_deleted = 0
                                  and ad.device_ids is not null
                                  and ad.device_ids != ''
                                  and ja_fw_device.id = ANY(string_to_array(ad.device_ids, ',')::bigint[])
                                  and ad.id != #{query.areaId}
                            )
                        </when>
                        <otherwise>
                            not exists (
                                select 1
                                from ja_fw_area_divide ad
                                where ad.is_deleted = 0
                                  and ad.device_ids is not null
                                  and ad.device_ids != ''
                                  and ja_fw_device.id = ANY(string_to_array(ad.device_ids, ',')::bigint[])
                            )
                        </otherwise>
                    </choose>
                <choose>
                    <when test="query.areaId != null">
                        exists (
                        select 1
                        from ja_fw_area_divide ad
                        where ad.is_deleted = 0
                        /* 修改点1:参数对齐 */
                        and ad.id::text = #{query.areaId}::text
                        and ad.device_ids is not null
                        and ad.device_ids != ''
                        /* 修改点2:使用 text 匹配文本数组,去掉不稳定的 ::bigint[] */
                        and ja_fw_device.id::text = ANY(string_to_array(replace(ad.device_ids, ' ', ''), ','))
                        )
                        or not exists (
                        select 1
                        from ja_fw_area_divide ad
                        where ad.is_deleted = 0
                        and ad.device_ids is not null
                        and ad.device_ids != ''
                        and ja_fw_device.id::text = ANY(string_to_array(replace(ad.device_ids, ' ', ''), ','))
                        and ad.id::text != #{query.areaId}::text
                        )
                    </when>
                    <otherwise>
                        not exists (
                        select 1
                        from ja_fw_area_divide ad
                        where ad.is_deleted = 0
                        and ad.device_ids is not null
                        and ad.device_ids != ''
                        and ja_fw_device.id::text = ANY(string_to_array(replace(ad.device_ids, ' ', ''), ','))
                        )
                    </otherwise>
                </choose>
                )
            </if>
            <if test="query.status != null">
                and status = #{query.status}
            </if>
            <if test="query.isTrack != null and query.isTrack == 1">
                and (SELECT COUNT(*) FROM ja_fw_device_track tmp WHERE ja_fw_device.id = tmp.device_id::VARCHAR) > 0
                /* 修改点3:解决 Position 575 报错,双向转 text */
                and (SELECT COUNT(*) FROM ja_fw_device_track tmp WHERE ja_fw_device.id::text = tmp.device_id::text) > 0
            </if>
            <if test="query.isTrack != null and query.isTrack == 2">
                and (SELECT COUNT(*) FROM ja_fw_device_track tmp WHERE ja_fw_device.id = tmp.device_id::VARCHAR) = 0
                and (SELECT COUNT(*) FROM ja_fw_device_track tmp WHERE ja_fw_device.id::text = tmp.device_id::text) = 0
            </if>
            and longitude is not null
            and longitude != ''
@@ -237,12 +240,13 @@
            and latitude != ''
            <if test="query.polygons != null and query.polygons.size > 0">
                and (
                    <foreach collection="query.polygons" item="polygon" separator=" OR ">
                        ST_Contains(
                            ST_SRID(ST_GeomFromText(#{polygon}), 4326),
                            ST_GeomFromText(CONCAT('POINT(', latitude, ' ', longitude, ')'), 4326)
                        )
                    </foreach>
                <foreach collection="query.polygons" item="polygon" separator=" OR ">
                    ST_Contains(
                    ST_SRID(ST_GeomFromText(#{polygon}), 4326),
                    /* 注意:Kingbase/PostGIS 坐标顺序通常是 (经度, 纬度) 即 (longitude, latitude) */
                    ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')'), 4326)
                    )
                </foreach>
                )
            </if>
        </where>