puzhibing
2026-04-23 50615394c0c84fad22fcc81499d6ef0adf88309a
新增加测试demo围栏管理功能
5个文件已添加
8个文件已修改
230 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ElectronicFenceAddDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ElectronicFenceUpdateDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/TestElectronicFenceAddDto.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/TestElectronicFenceUpdateDto.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/VehicleMacClientFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/VehicleMacClient.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpQualificationAudit.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/vehicleConvoy/GetBleInfoVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/dto/ServiceNameConstantsEnum.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpTestElectronicFenceManagementController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpTestElectronicFenceService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpTestElectronicFenceServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
}