diff --git a/ebike-feign/src/main/java/com/ebike/feign/clients/OperationsFeignClient.java b/ebike-feign/src/main/java/com/ebike/feign/clients/OperationsFeignClient.java index d09bbce..2a9c2be 100644 --- a/ebike-feign/src/main/java/com/ebike/feign/clients/OperationsFeignClient.java +++ b/ebike-feign/src/main/java/com/ebike/feign/clients/OperationsFeignClient.java @@ -11,8 +11,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; /** - * @author: yanglei - * @since: 2025-10-21 11:44 + * @author yanglei + * @since 2025-10-21 11:44 */ @FeignClient(name = "ebike-operations", configuration = {ExampleFeignConfiguration.class, FeignTokenInterceptor.class}) public interface OperationsFeignClient { diff --git a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeInfoController.java b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeInfoController.java index 6954244..5814e7c 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeInfoController.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeInfoController.java @@ -3,15 +3,19 @@ package com.cdzy.operations.controller; import com.cdzy.common.model.request.PageParam; import com.cdzy.common.model.response.JsonResult; import com.cdzy.operations.model.dto.EbikeBikeInfoDto; +import com.cdzy.operations.model.dto.EbikeDto; import com.cdzy.operations.model.vo.EbikeBatchLaunchVo; import com.cdzy.operations.model.vo.EbikeBatchUnLaunchVo; import com.cdzy.operations.model.vo.EbikeBikeBindVo; +import com.cdzy.operations.model.vo.EbikeBikeRadiusVo; import com.cdzy.operations.service.EbikeBikeInfoService; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 车辆基本信息 控制层。 * @@ -84,4 +88,15 @@ public class EbikeBikeInfoController { ebikeBikeInfoService.batchUnLaunch(launchVo); return JsonResult.success(); } + + /** + * 用户半径范围内车辆 + * + * @return 结果 + */ + @PostMapping("/api/userRadiusList") + public JsonResult userRadiusList(@Validated @RequestBody EbikeBikeRadiusVo radiusVo) { + List list = ebikeBikeInfoService.userRadiusList(radiusVo); + return JsonResult.success(list); + } } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/handler/PGpointSerializer.java b/ebike-operations/src/main/java/com/cdzy/operations/handler/PGpointSerializer.java index 449e03c..c04184e 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/handler/PGpointSerializer.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/handler/PGpointSerializer.java @@ -23,7 +23,7 @@ public class PGpointSerializer extends JsonSerializer { gen.writeStartObject(); gen.writeStringField("type","point"); gen.writeNumberField("longitude",point.x); - gen.writeNumberField("latitude",point.x); + gen.writeNumberField("latitude",point.y); // gen.writeArrayFieldStart("coordinates"); // gen.writeNumber(point.x); // gen.writeNumber(point.y); diff --git a/ebike-operations/src/main/java/com/cdzy/operations/mapper/EbikeBikeInfoMapper.java b/ebike-operations/src/main/java/com/cdzy/operations/mapper/EbikeBikeInfoMapper.java index 5b41c9c..3f55746 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/mapper/EbikeBikeInfoMapper.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/mapper/EbikeBikeInfoMapper.java @@ -1,8 +1,10 @@ package com.cdzy.operations.mapper; +import com.cdzy.operations.model.dto.EbikeDto; import com.mybatisflex.core.BaseMapper; import com.cdzy.operations.model.entity.EbikeBikeInfo; import org.apache.ibatis.annotations.Param; +import org.postgresql.geometric.PGpoint; import org.postgresql.geometric.PGpolygon; import java.util.List; @@ -22,4 +24,13 @@ public interface EbikeBikeInfoMapper extends BaseMapper { */ List selectPolygonGeometry(@Param("polygon") PGpolygon polygon); + /** + * 查询半径范围内的车辆(带距离排序) + * @param centerPoint 中心点坐标 + * @param radiusMeters 半径距离(米) + * @return 按距离排序的车辆列表 + */ + List selectRadiusGeometryWithOrder(@Param("centerPoint") PGpoint centerPoint, + @Param("radius") double radiusMeters); + } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeDto.java b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeDto.java new file mode 100644 index 0000000..9ccfc13 --- /dev/null +++ b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeDto.java @@ -0,0 +1,35 @@ +package com.cdzy.operations.model.dto; + +import com.cdzy.operations.handler.PGpointDeserializer; +import com.cdzy.operations.handler.PGpointSerializer; +import com.cdzy.operations.handler.PGpointTypeHandler; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mybatisflex.annotation.Column; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.postgresql.geometric.PGpoint; + +import java.io.Serializable; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EbikeDto implements Serializable { + + /** + * 车辆编号(与车辆二维码编号相同 + */ + private String bikeCode; + + /** + * 定位 + */ + @Column(typeHandler = PGpointTypeHandler.class) + @JsonSerialize(using = PGpointSerializer.class) + @JsonDeserialize(using = PGpointDeserializer.class) + private PGpoint location; + +} diff --git a/ebike-operations/src/main/java/com/cdzy/operations/model/vo/EbikeBikeRadiusVo.java b/ebike-operations/src/main/java/com/cdzy/operations/model/vo/EbikeBikeRadiusVo.java new file mode 100644 index 0000000..59b1d4c --- /dev/null +++ b/ebike-operations/src/main/java/com/cdzy/operations/model/vo/EbikeBikeRadiusVo.java @@ -0,0 +1,51 @@ +package com.cdzy.operations.model.vo; + +import com.cdzy.operations.handler.PGpointDeserializer; +import com.cdzy.operations.handler.PGpointSerializer; +import com.cdzy.operations.handler.PGpointTypeHandler; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mybatisflex.annotation.Column; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.postgresql.geometric.PGpoint; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 实体类。 + * + * @author attiya + * @since 2025-10-21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EbikeBikeRadiusVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户所在坐标 + */ + @Column(typeHandler = PGpointTypeHandler.class) + @JsonSerialize(using = PGpointSerializer.class) + @JsonDeserialize(using = PGpointDeserializer.class) + @NotNull(message = "用户所在坐标不能为空") + private PGpoint point; + + /** + * 用户所在坐标 + */ + @NotNull(message = "半径不能为空") + private Float radius; + + + +} diff --git a/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeInfoService.java b/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeInfoService.java index fa7b5a4..e97dd38 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeInfoService.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeInfoService.java @@ -2,10 +2,12 @@ package com.cdzy.operations.service; import com.cdzy.common.model.request.PageParam; import com.cdzy.operations.model.dto.EbikeBikeInfoDto; +import com.cdzy.operations.model.dto.EbikeDto; import com.cdzy.operations.model.entity.EbikeBikeInfo; import com.cdzy.operations.model.vo.EbikeBatchLaunchVo; import com.cdzy.operations.model.vo.EbikeBatchUnLaunchVo; import com.cdzy.operations.model.vo.EbikeBikeBindVo; +import com.cdzy.operations.model.vo.EbikeBikeRadiusVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import org.postgresql.geometric.PGpolygon; @@ -58,4 +60,11 @@ public interface EbikeBikeInfoService extends IService { * @param launchVo 下架参数 */ void batchUnLaunch(EbikeBatchUnLaunchVo launchVo); + + /** + * 车辆 + * @param radiusVo 半径信息 + * @return 车辆列表 + */ + List userRadiusList(EbikeBikeRadiusVo radiusVo); } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java index f3746ff..64ab5b3 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeInfoServiceImpl.java @@ -6,11 +6,9 @@ import com.cdzy.common.model.request.PageParam; import com.cdzy.operations.enums.*; import com.cdzy.operations.mapper.*; import com.cdzy.operations.model.dto.EbikeBikeInfoDto; +import com.cdzy.operations.model.dto.EbikeDto; import com.cdzy.operations.model.entity.*; -import com.cdzy.operations.model.vo.EbikeBatchLaunchVo; -import com.cdzy.operations.model.vo.EbikeBatchUnLaunchVo; -import com.cdzy.operations.model.vo.EbikeBikeBindVo; -import com.cdzy.operations.model.vo.EbikeInventoryVo; +import com.cdzy.operations.model.vo.*; import com.cdzy.operations.service.EbikeBikeInfoService; import com.cdzy.operations.service.EbikeInventoryRecordService; import com.cdzy.operations.service.EbikeInventoryService; @@ -243,4 +241,9 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl userRadiusList(EbikeBikeRadiusVo radiusVo) { + return this.mapper.selectRadiusGeometryWithOrder(radiusVo.getPoint(),radiusVo.getRadius()*1000); + } + } diff --git a/ebike-operations/src/main/resources/mapper/EbikeBikeInfoMapper.xml b/ebike-operations/src/main/resources/mapper/EbikeBikeInfoMapper.xml index 4abdfbf..18ba823 100644 --- a/ebike-operations/src/main/resources/mapper/EbikeBikeInfoMapper.xml +++ b/ebike-operations/src/main/resources/mapper/EbikeBikeInfoMapper.xml @@ -4,9 +4,32 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + +