xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ElectronicFenceAddDto.java
@@ -53,5 +53,5 @@ private String operationStrategy; @ApiModelProperty(value = "电子围栏区域") @NotEmpty(message = "电子围栏区域不能为空") private List<XpTestElectronicFenceArea> electronicFenceAreas; private List<XpElectronicFenceArea> electronicFenceAreas; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ElectronicFenceUpdateDto.java
@@ -54,7 +54,7 @@ private String operationStrategy; @ApiModelProperty(value = "电子围栏区域") @NotEmpty(message = "电子围栏区域不能为空") private List<XpTestElectronicFenceArea> electronicFenceAreas; private List<XpElectronicFenceArea> electronicFenceAreas; @ApiModelProperty(value = "范围扩大 需要新增的点位ID列表") private List<Long> addPointIdList; xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/TestElectronicFenceAddDto.java
New file @@ -0,0 +1,57 @@ package com.xiaopeng.api.dto.operation; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.operation.XpElectronicFenceArea; import com.xiaopeng.api.model.operation.XpTestElectronicFenceArea; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data @ApiModel(value = "电子围栏新增DTO") public class TestElectronicFenceAddDto implements Serializable { @ApiModelProperty(value = "围栏名称") @NotEmpty(message = "围栏名称不能为空") private String electronicName; @ApiModelProperty(value = "围栏名称") @NotEmpty(message = "所属市区不能为空") private String cityCode; @ApiModelProperty(value = "围栏编号唯一 规则:城市首字母-类型简写-4位自增流水号(如 SZ-OP-001)") private String electronicNumber; @ApiModelProperty(value = "面积") private BigDecimal area; @ApiModelProperty(value = "围栏状态 0=草稿 1=待启用 2=启用中 3=已停用 草稿传0 发布传1") @NotNull(message = "围栏状态不能为空") private Integer status; @ApiModelProperty(value = "生效类型 1=立即生效 2=定时生效") @NotNull(message = "生效类型不能为空") private Integer effectType; @ApiModelProperty(value = "生效时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime effectTime; @ApiModelProperty(value = "失效类型 1=永不失效 2=定时失效") @NotNull(message = "失效类型不能为空") private Integer failureType; @ApiModelProperty(value = "失效时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime failureTime; @ApiModelProperty(value = "运营策略") @NotBlank(message = "运营策略不能为空") private String operationStrategy; @ApiModelProperty(value = "电子围栏区域") @NotEmpty(message = "电子围栏区域不能为空") private List<XpTestElectronicFenceArea> electronicFenceAreas; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/TestElectronicFenceUpdateDto.java
New file @@ -0,0 +1,66 @@ package com.xiaopeng.api.dto.operation; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.operation.XpTestElectronicFenceArea; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.time.LocalDateTime; import java.util.List; @Data @ApiModel(value = "电子围栏编辑DTO") public class TestElectronicFenceUpdateDto implements Serializable { @ApiModelProperty(value = "id") @NotNull(message = "id不能为空") private Long id; @ApiModelProperty(value = "城市code") private String cityCode; @ApiModelProperty(value = "围栏名称") @NotEmpty(message = "围栏名称不能为空") private String electronicName; @ApiModelProperty(value = "围栏编号唯一 规则:城市首字母-类型简写-4位自增流水号(如 SZ-OP-001)") private String electronicNumber; @ApiModelProperty(value = "围栏状态 0=草稿 1=待启用 2=启用中 3=已停用") @NotNull(message = "围栏状态不能为空") private Integer status; @ApiModelProperty(value = "生效类型 1=立即生效 2=定时生效") @NotNull(message = "生效类型不能为空") private Integer effectType; @ApiModelProperty(value = "生效时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime effectTime; @ApiModelProperty(value = "失效类型 1=永不失效 2=定时失效") @NotNull(message = "失效类型不能为空") private Integer failureType; @ApiModelProperty(value = "失效时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime failureTime; @ApiModelProperty(value = "运营策略") @NotBlank(message = "运营策略不能为空") private String operationStrategy; @ApiModelProperty(value = "电子围栏区域") @NotEmpty(message = "电子围栏区域不能为空") private List<XpTestElectronicFenceArea> electronicFenceAreas; @ApiModelProperty(value = "范围扩大 需要新增的点位ID列表") private List<Long> addPointIdList; @ApiModelProperty(value = "范围缩小 需要改为失效状态的点位ID列表") private List<Long> delPointIdList; @ApiModelProperty(value = "禁行区覆盖点位 需要改为停用状态的点位ID列表") private List<Long> disablePointIdList; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/VehicleMacClientFallbackFactory.java
New file @@ -0,0 +1,22 @@ package com.xiaopeng.api.factory.vehicleConvoy; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleControlClient; import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleMacClient; import com.xiaopeng.api.vo.vehicleConvoy.GetBleInfoVo; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @Slf4j public class VehicleMacClientFallbackFactory implements FallbackFactory<VehicleMacClient> { @Override public VehicleMacClient create(Throwable cause) { return new VehicleMacClient() { @Override public BaseVehicleUserDto getBleInfo(GetBleInfoVo vo) { log.error("查询蓝牙详情失败:{}", cause.getMessage()); return null; } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/VehicleMacClient.java
New file @@ -0,0 +1,30 @@ package com.xiaopeng.api.feignClient.vehicleConvoy; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.factory.vehicleConvoy.UserVehicleClientFallbackFactory; import com.xiaopeng.api.factory.vehicleConvoy.VehicleMacClientFallbackFactory; import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo; import com.xiaopeng.api.vo.vehicleConvoy.GetBleInfoVo; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * 蓝牙解锁车门 */ @FeignClient(contextId = "VehicleMacClient", value = ServiceNameConstantsEnum.XP_DIGITAL_KEY_BOOT, fallbackFactory = VehicleMacClientFallbackFactory.class) public interface VehicleMacClient { /** * 查询蓝牙详情 * @param vo */ @PostMapping("/logan/key/ble/getBleInfo") BaseVehicleUserDto getBleInfo(GetBleInfoVo vo); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpQualificationAudit.java
@@ -62,4 +62,7 @@ @ApiModelProperty(value = "审核状态 1待审核 2审核通过 3审核驳回") private Integer auditStatus; @ApiModelProperty(value = "审核备注") private Integer auditRemark; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/vehicleConvoy/GetBleInfoVo.java
New file @@ -0,0 +1,9 @@ package com.xiaopeng.api.vo.vehicleConvoy; import lombok.Data; @Data public class GetBleInfoVo { private String vin; } xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/dto/ServiceNameConstantsEnum.java
@@ -73,5 +73,9 @@ * 小鹏数字秘钥服务 */ String XP_SMART_DIGITAL_KEY_BOOT = "xp-smart-digital-key-boot"; /** * 小鹏数字秘钥服务 */ String XP_DIGITAL_KEY_BOOT = "xp-digital-key-boot"; } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpTestElectronicFenceManagementController.java
@@ -3,10 +3,7 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.ElectronicFenceAreaUpdateStatusDto; import com.xiaopeng.api.dto.operation.ElectronicFenceOperationStrategyValidateDto; import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto; import com.xiaopeng.api.dto.operation.*; import com.xiaopeng.api.model.operation.*; import com.xiaopeng.api.query.operation.ElectronicPageListQuery; import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; @@ -104,7 +101,7 @@ */ @PostMapping("/add") @ApiOperation(value = "新增电子围栏") public R add(@Validated @RequestBody ElectronicFenceAddDto dto) { public R add(@Validated @RequestBody TestElectronicFenceAddDto dto) { validateFenceTime(dto.getStatus(), dto.getEffectType(), dto.getEffectTime(), dto.getFailureType(), dto.getFailureTime()); return xpElectronicFenceService.addElectronic(dto); } @@ -157,7 +154,7 @@ @ApiOperation(value = "编辑电子围栏") @Transactional @ShardingSphereTransactionType(TransactionType.BASE) public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) { public R edit(@Validated @RequestBody TestElectronicFenceUpdateDto dto) { validateFenceTime(dto.getStatus(), dto.getEffectType(), dto.getEffectTime(), dto.getFailureType(), dto.getFailureTime()); return xpElectronicFenceService.editElectronic(dto); } xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpTestElectronicFenceService.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto; import com.xiaopeng.api.dto.operation.TestElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.TestElectronicFenceUpdateDto; import com.xiaopeng.api.model.operation.XpTestElectronicFence; import com.xiaopeng.api.query.operation.ElectronicPageListQuery; import com.xiaopeng.common.core.domain.R; @@ -23,9 +25,9 @@ public interface XpTestElectronicFenceService extends IService<XpTestElectronicFence> { PageInfo<XpTestElectronicFence> pageList(ElectronicPageListQuery query); R addElectronic(ElectronicFenceAddDto dto); R addElectronic(TestElectronicFenceAddDto dto); R editElectronic(ElectronicFenceUpdateDto dto); R editElectronic(TestElectronicFenceUpdateDto dto); GeoJsonPolygon convertToGeoJsonPolygon(String fencePointsStr); xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpTestElectronicFenceServiceImpl.java
@@ -8,6 +8,8 @@ import com.google.common.collect.ImmutableMap; import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto; import com.xiaopeng.api.dto.operation.TestElectronicFenceAddDto; import com.xiaopeng.api.dto.operation.TestElectronicFenceUpdateDto; import com.xiaopeng.api.model.map.XpGeoFencingPolygon; import com.xiaopeng.api.model.map.XpGeoFencingProhibitedPolygon; import com.xiaopeng.api.model.operation.*; @@ -208,7 +210,7 @@ @Override @Transactional @ShardingSphereTransactionType(TransactionType.BASE) public R addElectronic(ElectronicFenceAddDto dto) { public R addElectronic(TestElectronicFenceAddDto dto) { validateElectronicNameUnique(dto.getElectronicName(), null); // 获取现有的运营区域(areaType=1) LambdaQueryWrapper<XpTestElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>(); @@ -341,7 +343,7 @@ @Override @Transactional @ShardingSphereTransactionType(TransactionType.BASE) public R editElectronic(ElectronicFenceUpdateDto dto) { public R editElectronic(TestElectronicFenceUpdateDto dto) { validateElectronicNameUnique(dto.getElectronicName(), dto.getId()); // 获取现有的运营区域(areaType=1),排除当前正在编辑的电子围栏 LambdaQueryWrapper<XpTestElectronicFenceArea> xpElectronicFenceAreaLambdaQueryWrapper = new LambdaQueryWrapper<>(); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -12,6 +12,8 @@ import com.xiaopeng.api.dto.order.PopOrderDto; import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO; import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleMacClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; @@ -19,6 +21,7 @@ import com.xiaopeng.api.vo.operation.NearestNextVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.*; import com.xiaopeng.api.vo.vehicleConvoy.GetBleInfoVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.core.utils.WebUtils; @@ -86,7 +89,11 @@ private MongoTemplate mongoTemplate; @Resource private XpVehicleClient xpVehicleClient; private OrderTrajectoryService orderTrajectoryService; @Resource private VehicleMacClient vehicleMacClient; /** * 获取订单统计数据(内部接口) @@ -683,6 +690,11 @@ if (StringUtils.isBlank(token)) { return R.ok(); } XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); GetBleInfoVo getBleInfoVo = new GetBleInfoVo(); getBleInfoVo.setVin(xpVehicle.getVehicleVin()); BaseVehicleUserDto baseVehicleUserDto = vehicleMacClient.getBleInfo(getBleInfoVo); return R.ok(token); } }