2025-11-10 16:25:04 +08:00
|
|
|
<?xml version="1.0" encoding="UTF-8" ?>
|
|
|
|
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
|
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
|
|
|
<mapper namespace="com.cdzy.operations.mapper.EbikeRegionMapper">
|
|
|
|
|
|
|
|
|
|
<!-- 查询车辆是否在指定运营区内 -->
|
|
|
|
|
<select id="checkBikeInRegion" resultType="boolean">
|
|
|
|
|
SELECT
|
|
|
|
|
ST_Contains(
|
|
|
|
|
r.region_polygon::geometry,
|
2026-01-07 10:14:27 +08:00
|
|
|
ST_SetSRID(ST_MakePoint(ST_X(b.location), ST_Y(b.location)), 4326)
|
2025-11-10 16:25:04 +08:00
|
|
|
) as in_region
|
|
|
|
|
FROM
|
|
|
|
|
ebike_bike_info b
|
|
|
|
|
INNER JOIN
|
|
|
|
|
ebike_region r ON b.region_id = r.region_id
|
|
|
|
|
WHERE
|
|
|
|
|
b.bike_code = #{bikeCode}
|
|
|
|
|
</select>
|
|
|
|
|
|
2025-12-08 09:56:44 +08:00
|
|
|
<select id="findAllRegionsOrderByDistance" resultType="com.cdzy.operations.model.entity.EbikeRegion">
|
|
|
|
|
SELECT
|
|
|
|
|
ebike_region.*,
|
2025-12-25 16:57:00 +08:00
|
|
|
ST_Distance ( region_polygon::geometry, ST_SetSRID ( ST_MakePoint ( #{lng}, #{lat}), 4326 ) :: geography ) AS distance_meters,
|
|
|
|
|
ST_Contains ( ST_SetSRID(region_polygon::geometry, 4326), ST_SetSRID ( ST_MakePoint ( #{lng}, #{lat}), 4326 ) ) AS is_within_region
|
|
|
|
|
FROM
|
|
|
|
|
ebike_region
|
|
|
|
|
WHERE
|
|
|
|
|
is_deleted IS NOT TRUE
|
2025-12-08 09:56:44 +08:00
|
|
|
ORDER BY
|
|
|
|
|
is_within_region DESC,
|
|
|
|
|
distance_meters
|
|
|
|
|
</select>
|
|
|
|
|
|
2026-01-07 09:59:15 +08:00
|
|
|
<resultMap id="FeignEbikeSiteVoMap" type="com.ebike.feign.model.vo.FeignEbikeSiteVo">
|
|
|
|
|
<id property="siteId" column="site_id"/>
|
|
|
|
|
<result property="siteName" column="site_name"/>
|
|
|
|
|
<result property="operatorId" column="site_operator_id"/>
|
|
|
|
|
<result property="regionId" column="site_region_id"/>
|
|
|
|
|
<result property="sitePolygon" column="site_polygon" typeHandler="com.cdzy.operations.handler.PolygonTypeHandler"/>
|
|
|
|
|
<result property="siteType" column="site_type"/>
|
|
|
|
|
<result property="isDeleted" column="site_is_deleted"/>
|
|
|
|
|
</resultMap>
|
|
|
|
|
|
|
|
|
|
<resultMap id="FeignEbikeRegionVoMap" type="com.ebike.feign.model.vo.FeignEbikeRegionVo">
|
|
|
|
|
<id property="regionId" column="region_id"/>
|
|
|
|
|
<result property="operatorId" column="operator_id"/>
|
|
|
|
|
<result property="regionName" column="region_name"/>
|
|
|
|
|
<result property="regionSimpleName" column="region_simple_name"/>
|
|
|
|
|
<result property="regionPolygon" column="region_polygon" typeHandler="com.cdzy.operations.handler.PolygonTypeHandler"/>
|
|
|
|
|
<result property="siteNum" column="site_num"/>
|
|
|
|
|
<result property="status" column="status"/>
|
|
|
|
|
|
|
|
|
|
<collection property="ebikeSiteVos"
|
|
|
|
|
ofType="com.ebike.feign.model.vo.FeignEbikeSiteVo"
|
|
|
|
|
resultMap="FeignEbikeSiteVoMap"/>
|
|
|
|
|
</resultMap>
|
|
|
|
|
|
|
|
|
|
<select id="findCurrentRegion" resultMap="FeignEbikeRegionVoMap">
|
2026-01-08 09:24:47 +08:00
|
|
|
WITH nearest_region_in_radius AS (
|
|
|
|
|
-- 先获取半径范围内的区域
|
|
|
|
|
SELECT
|
|
|
|
|
r.*,
|
|
|
|
|
ST_Distance(
|
|
|
|
|
ST_SetSRID(r.region_polygon::geometry, 4326)::geography,
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{point.x}, #{point.y}), 4326)::geography
|
|
|
|
|
) AS distance_meters,
|
|
|
|
|
ST_Contains(
|
|
|
|
|
ST_SetSRID(r.region_polygon::geometry, 4326),
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{point.x}, #{point.y}), 4326)
|
|
|
|
|
) AS is_within_region
|
|
|
|
|
FROM ebike_region r
|
|
|
|
|
WHERE r.is_deleted IS NOT TRUE
|
|
|
|
|
AND r.status = 1
|
|
|
|
|
AND ST_DWithin(
|
|
|
|
|
ST_SetSRID(r.region_polygon::geometry, 4326)::geography,
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{point.x}, #{point.y}), 4326)::geography,
|
|
|
|
|
#{radius}
|
|
|
|
|
)
|
|
|
|
|
ORDER BY is_within_region DESC, distance_meters
|
|
|
|
|
LIMIT 1
|
|
|
|
|
),
|
|
|
|
|
nearest_region_overall AS (
|
|
|
|
|
-- 如果没有半径范围内的,获取所有区域中最近的
|
2026-01-07 09:59:15 +08:00
|
|
|
SELECT
|
2026-01-08 09:24:47 +08:00
|
|
|
r.*,
|
|
|
|
|
ST_Distance(
|
|
|
|
|
ST_SetSRID(r.region_polygon::geometry, 4326)::geography,
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{point.x}, #{point.y}), 4326)::geography
|
|
|
|
|
) AS distance_meters,
|
|
|
|
|
ST_Contains(
|
|
|
|
|
ST_SetSRID(r.region_polygon::geometry, 4326),
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{point.x}, #{point.y}), 4326)
|
|
|
|
|
) AS is_within_region
|
|
|
|
|
FROM ebike_region r
|
|
|
|
|
WHERE r.is_deleted IS NOT TRUE
|
|
|
|
|
AND r.status = 1
|
|
|
|
|
ORDER BY is_within_region DESC, distance_meters
|
|
|
|
|
LIMIT 1
|
|
|
|
|
),
|
|
|
|
|
final_region AS (
|
|
|
|
|
SELECT * FROM nearest_region_in_radius
|
|
|
|
|
UNION ALL
|
|
|
|
|
SELECT * FROM nearest_region_overall
|
|
|
|
|
WHERE NOT EXISTS (SELECT 1 FROM nearest_region_in_radius)
|
|
|
|
|
LIMIT 1
|
|
|
|
|
)
|
|
|
|
|
SELECT
|
|
|
|
|
fr.region_id,
|
|
|
|
|
fr.operator_id,
|
|
|
|
|
fr.region_name,
|
|
|
|
|
fr.region_simple_name,
|
|
|
|
|
fr.region_polygon,
|
|
|
|
|
fr.site_num,
|
|
|
|
|
fr.status,
|
|
|
|
|
fr.distance_meters,
|
|
|
|
|
fr.is_within_region,
|
2026-01-07 09:59:15 +08:00
|
|
|
s.site_id,
|
|
|
|
|
s.site_name,
|
|
|
|
|
s.operator_id AS site_operator_id,
|
|
|
|
|
s.region_id AS site_region_id,
|
|
|
|
|
s.site_polygon,
|
|
|
|
|
s.site_type,
|
|
|
|
|
s.is_deleted AS site_is_deleted
|
2026-01-08 09:24:47 +08:00
|
|
|
FROM final_region fr
|
|
|
|
|
LEFT JOIN ebike_site s ON fr.region_id = s.region_id
|
2026-01-07 09:59:15 +08:00
|
|
|
AND s.is_deleted IS NOT TRUE
|
|
|
|
|
AND s.site_type = 1
|
2025-12-25 14:14:45 +08:00
|
|
|
</select>
|
2026-01-08 09:24:47 +08:00
|
|
|
|
|
|
|
|
<select id="findCurrentPointRegion" resultType="com.cdzy.operations.model.entity.EbikeRegion">
|
|
|
|
|
SELECT *
|
|
|
|
|
FROM ebike_region
|
|
|
|
|
WHERE is_deleted IS NOT TRUE
|
|
|
|
|
AND ST_Contains(
|
|
|
|
|
ST_SetSRID(region_polygon::geometry, 4326),
|
|
|
|
|
ST_SetSRID(ST_MakePoint(#{x}, #{y}), 4326)
|
|
|
|
|
)
|
|
|
|
|
LIMIT 1
|
|
|
|
|
</select>
|
2025-11-10 16:25:04 +08:00
|
|
|
</mapper>
|