puzhibing
2026-04-23 a4d696725ae8e44a5c3dcade4ea65ff3310092e9
Merge remote-tracking branch 'origin/1.0' into 1.0
1个文件已删除
1个文件已添加
32个文件已修改
529 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysGroupService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpShift.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPoint.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/PointListQuery.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpPointSituationReportQuery.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpStationQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/ElectronicFenceDetailVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpStationManagementController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpElectronicFenceAreaMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpStationMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpTestElectronicFenceAreaMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpPointService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpTestElectronicFenceServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/resources/mapper/XpPointMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/resources/mapper/XpStationMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/resources/mapper/XpTestElectronicFenceAreaMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointSituationReportController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpPointSituationReportService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointSituationReportServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointSituationReportMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysGroupService.java
@@ -74,6 +74,11 @@
     */
    void deleteById(Long id);
    /**
     *  获取手机号脱敏
     * @param phoneNumber
     * @return
     */
    String getPhoneDesensitization(String phoneNumber);
    boolean getPhoneDesensitization();
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysGroupServiceImpl.java
@@ -321,7 +321,11 @@
        removeById(id);
    }
    /**
     *  获取手机号脱敏
     * @param phoneNumber
     * @return
     */
    @Override
    public String getPhoneDesensitization(String phoneNumber){
        boolean b = getPhoneDesensitization();
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpShift.java
@@ -55,4 +55,19 @@
    private String restEndTime;
    @ApiModelProperty(value = "上班最早打卡时间")
    private String maxStartTime;
    @ApiModelProperty(value = "上班最晚打卡时间")
    private String minStartTime;
    @ApiModelProperty(value = "下班最早结束时间")
    private String maxEndTime;
    @ApiModelProperty(value = "下班最晚结束时间")
    private String minEndTime;
    @ApiModelProperty(value = "是否跨天")
    private Boolean crossDay;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpPoint.java
@@ -131,4 +131,8 @@
    @TableField("station_sort_no")
    private Integer stationSortNo;
    @ApiModelProperty(value = "点位上下车 1仅上车点/ 2 仅下车/ 3上下车均可")
    private Integer pointOnOff;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/PointListQuery.java
@@ -10,6 +10,10 @@
@Data
@ApiModel(value = "点位管理列表查询query")
public class PointListQuery extends BasePage {
    @ApiModelProperty(value = "电子围栏区域id")
    private List<Long> electronicAreaIds;
    @ApiModelProperty(value = "查询参数(名称、poi、唯一ID)")
    private String queryParams;
    @ApiModelProperty(value = "运营状态 1=待启用 2=启用中 3=已停用 4=已失效")
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpPointSituationReportQuery.java
@@ -34,19 +34,21 @@
    /**
     * 上报运维id
     */
    @TableField("operations_user_id")
    @ApiModelProperty("上报运维id")
    private Long operationsUserId;
    private List<Long> operationsUserIds;
    @ApiModelProperty("上报运维人名称")
    private String operationsUserName;
    /**
     * 现场情况上报时间
     */
    @TableField("reporting_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime reportingTimeStart;
    /**
     * 现场情况上报时间
     */
    @TableField("reporting_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime reportingTimeEnd;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpStationQuery.java
@@ -12,6 +12,9 @@
    @ApiModelProperty(value = "ids")
    private List<Long> ids;
    @ApiModelProperty(value = "所属电子围栏id")
    private Long electronicId;
    @ApiModelProperty(value = "城市编码")
    private String cityCode;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/ElectronicFenceDetailVo.java
@@ -14,4 +14,24 @@
    @ApiModelProperty("电子围栏区域列表")
    private List<XpElectronicFenceArea> electronicFenceAreas;
    @ApiModelProperty("点位数量")
    private Numbers pointsNumbers;
    @ApiModelProperty("场站数量")
    private Numbers stationNumbers;
    @Data
    public static class Numbers {
        @ApiModelProperty("总数")
        public   Integer totalNum =0;
        @ApiModelProperty("草稿")
        public   Integer draft =0;
        @ApiModelProperty("启动中")
        public   Integer startingUp =0;
        @ApiModelProperty("待启动")
        public   Integer pendingLaunch =0;
        @ApiModelProperty("已停用")
        public   Integer disabled =0;
        @ApiModelProperty("已失效")
        public   Integer expired =0;
    }
}
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -1,12 +1,10 @@
package com.xiaopeng.automaticPilot.controller;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
@@ -20,7 +18,6 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.SystemEventType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
@@ -35,7 +32,6 @@
import com.xiaopeng.common.redis.service.RedisService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
@@ -46,7 +42,10 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -324,12 +323,15 @@
        long sequence = snowflake.nextId();
        MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence);
        //先将车辆修改状态,防止在异步通知之前被其他订单选中
        if(!dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER) &&
                !dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.TEST_CRUISE_ORDER)
                && mqttPublishDto.getCode()== 200){
            // 修改车子为接单状态
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1));
            // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力
        }
        if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -2,11 +2,7 @@
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.order.OrderChangeDto;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
import com.xiaopeng.api.vo.operation.VehiclePositionVo;
import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.itinerary.service.ActiveOrderService;
import com.xiaopeng.itinerary.service.XpPricingService;
@@ -14,22 +10,16 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -81,10 +71,5 @@
        activeOrderService.orderChange(dto, uid);
        return R.ok();
    }
    @Resource
    private MongoTemplate mongoTemplate;
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -107,8 +107,6 @@
        return R.ok(xpPricingService.getWaitTime(dto.getLongitude(), dto.getLatitude()));
    }
    /**
     * 播单
     */
@@ -134,9 +132,6 @@
        saveOrderVo.setOrderId(orderId);
        return R.ok(saveOrderVo);
    }
    /**
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -7,21 +7,17 @@
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.model.operation.XpElectronicFence;
import com.xiaopeng.api.model.operation.XpElectronicFenceArea;
import com.xiaopeng.api.model.operation.XpPoint;
import com.xiaopeng.api.model.operation.XpRegion;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.query.operation.ElectronicPageListQuery;
import com.xiaopeng.api.query.operation.PointListQuery;
import com.xiaopeng.api.query.operation.XpStationQuery;
import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.bean.BeanUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.map.constant.I18nKeyConstant;
import com.xiaopeng.map.service.XpElectronicFenceAreaService;
import com.xiaopeng.map.service.XpElectronicFenceService;
import com.xiaopeng.map.service.XpPointService;
import com.xiaopeng.map.service.XpRegionService;
import com.xiaopeng.map.service.*;
import com.xiaopeng.map.utils.OperationStrategyIndex;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -75,6 +71,9 @@
    @Autowired
    private XpPointService xpPointService;
    @Resource
    private XpStationService xpStationService;
    /**
     * 查询省市管理
     */
@@ -157,6 +156,63 @@
        List<XpElectronicFenceArea> electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id)
                .list();
        res.setElectronicFenceAreas(electronicFenceAreaList);
        //点位的总数
        if(!electronicFenceAreaList.isEmpty()){
            PointListQuery query1 = new PointListQuery();
            query1.setElectronicAreaIds(electronicFenceAreaList.stream().map(XpElectronicFenceArea::getId).collect(Collectors.toList()));
            List<XpPoint> pointList = xpPointService.findList(query1);
            ElectronicFenceDetailVo.Numbers pointsNumbers = new ElectronicFenceDetailVo.Numbers();
            if(CollUtil.isNotEmpty(pointList)){
                for (XpPoint xpPoint : pointList) {
                    if (xpPoint.getOperationStatus() == 1) {
                        pointsNumbers.setPendingLaunch(pointsNumbers.getPendingLaunch() + 1);
                    } else if (xpPoint.getOperationStatus() == 2) {
                        pointsNumbers.setStartingUp(pointsNumbers.getStartingUp() + 1);
                    }
                    else if (xpPoint.getOperationStatus() == 3) {
                        pointsNumbers.setExpired(pointsNumbers.getExpired() + 1);
                    }
                    else if (xpPoint.getOperationStatus() == 4) {
                        pointsNumbers.setDisabled(pointsNumbers.getDisabled() + 1);
                    }
                }
                pointsNumbers.setTotalNum(pointList.size());
            }
            res.setPointsNumbers(pointsNumbers);
        }
        //场站总数
        XpStationQuery query2 = new XpStationQuery();
        query2.setElectronicId(id);
        List<XpStation> stationList = xpStationService.findList(query2);
        ElectronicFenceDetailVo.Numbers stationNumbers = new ElectronicFenceDetailVo.Numbers();
        if(CollUtil.isNotEmpty(stationList)){
            //status 场站状态 0=草稿 1=待启用 2=启用中 3=已停用 4=失效
            for (XpStation xpStation : stationList) {
                switch (xpStation.getStatus()) {
                    case 0:
                        stationNumbers.setDraft(stationNumbers.getDraft() + 1);
                        break;
                    case 1:
                        stationNumbers.setPendingLaunch(stationNumbers.getPendingLaunch() + 1);
                        break;
                    case 2:
                        stationNumbers.setStartingUp(stationNumbers.getStartingUp() + 1);
                        break;
                    case 3:
                        stationNumbers.setDisabled(stationNumbers.getDisabled() + 1);
                        break;
                    case 4:
                        stationNumbers.setExpired(stationNumbers.getExpired() + 1);
                        break;
                }
            }
            stationNumbers.setTotalNum(stationList.size());
        }
        res.setStationNumbers(stationNumbers);
        return R.ok(res);
    }
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -210,6 +210,7 @@
        if (xpPoint == null) {
            throw new ServiceException("系统异常", I18nKeyConstant.SYSTEM_EXCEPTION);
        }
        pointAddDto.setStationSortNo(xpPoint.getStationSortNo());
        xpPointService.validatePointNameUnique(pointAddDto.getPointName(), pointAddDto.getId());
        BeanUtils.copyProperties(pointAddDto, xpPoint);
        if (Integer.valueOf(2).equals(pointAddDto.getOperationStatus()) && Integer.valueOf(5).equals(pointAddDto.getVerificationStatus())) {
@@ -236,12 +237,10 @@
        }
        xpPoint.setFpElectronicAreaId(null);
        Integer stationSortNo = xpPoint.getStationSortNo(); //点位在场站内排序
        Long stationId = pointAddDto.getStationId();
        Integer stationSortNo = pointAddDto.getStationSortNo(); //点位在场站内排序
        if(stationId != null && stationId > 0){
            if(stationSortNo == null){
                stationSortNo = 0;
            }
            stationSortNo = 0;
        }
        // 使用 lambdaUpdate 确保 pointPictures 为 null 时也能将数据库字段清空
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpStationManagementController.java
@@ -54,13 +54,21 @@
    @ApiOperation(value = "场站管理已经启动列表", tags = {"管理后台-运营-场站管理"})
    @GetMapping("/findListEnable")
    public R<List<XpStation>> findListEnable(@RequestParam String cityCode) {
    public R<List<XpStation>> findListByCityCode(@RequestParam String cityCode) {
        XpStationQuery query = new XpStationQuery();
        query.setCityCode(cityCode);
        return R.ok( xpStationService.findList(query));
    }
    @ApiOperation(value = "场站管理列表", tags = {"管理后台-运营-场站管理"})
    @PostMapping("/findList")
    public R<List<XpStation>> findList(@RequestBody XpStationQuery query) {
        List<XpStation> list = xpStationService.findList(query);
        return R.ok(list);
    }
    @ApiOperation(value = "场站管理分页列表", tags = {"管理后台-运营-场站管理"})
    @PostMapping("/pageList")
    public R<PageInfo<XpStation>> pageList(@RequestBody XpStationQuery query) {
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpElectronicFenceAreaMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.operation.XpElectronicFenceArea;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
@@ -12,6 +13,7 @@
 * @author liu
 * @since 2026-02-03
 */
@Mapper
public interface XpElectronicFenceAreaMapper extends BaseMapper<XpElectronicFenceArea> {
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpStationMapper.java
@@ -4,6 +4,7 @@
import com.xiaopeng.api.model.operation.XpStation;
import com.xiaopeng.api.query.operation.XpStationQuery;
import com.xiaopeng.common.core.web.page.PageInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -16,6 +17,7 @@
 * @author mitao
 * @since 2026-04-12
 */
@Mapper
public interface XpStationMapper extends BaseMapper<XpStation> {
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/mapper/XpTestElectronicFenceAreaMapper.java
@@ -2,8 +2,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.operation.XpElectronicFenceArea;
import com.xiaopeng.api.model.operation.XpTestElectronicFenceArea;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
@@ -13,6 +13,7 @@
 * @author liu
 * @since 2026-02-03
 */
@Mapper
public interface XpTestElectronicFenceAreaMapper extends BaseMapper<XpTestElectronicFenceArea> {
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpPointService.java
@@ -72,6 +72,8 @@
    boolean getInTime(LocalTime now,  Integer effectivePeriod, String effectiveTimePeriod);
    List<XpPoint> pointMap(PointMapQuery query);
    List<XpPoint> findList(PointListQuery query);
    List<XpPoint> listAll(PointListQuery query);
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
@@ -62,7 +62,6 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
@@ -370,6 +369,10 @@
        List<XpPoint> list = this.baseMapper.pointMap(query);
        return list;
    }
    @Override
    public List<XpPoint> findList(PointListQuery query) {
        return this.baseMapper.listAll(query);
    }
    @Override
    public List<XpPoint> listAll(PointListQuery query) {
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpTestElectronicFenceServiceImpl.java
@@ -68,7 +68,7 @@
    @Resource
    private PolygonOverlapService polygonOverlapService;
    @Resource
    @Autowired
    private XpTestElectronicFenceAreaMapper xpElectronicFenceAreaMapper;
    @Autowired
    private MongoTemplate mongoTemplate;
xp-robotaxi-map-boot/src/main/resources/mapper/XpPointMapper.xml
@@ -72,6 +72,14 @@
        select t1.*
        from xp_point t1
        where t1.is_deleted = 0
        <if test="query.electronicAreaIds != null and query.electronicAreaIds.size() > 0">
            and t1.electronic_area_id in
            <foreach collection="query.electronicAreaIds" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.cityCode != null and query.cityCode != ''">
            and t1.city_code = #{query.cityCode}
        </if>
xp-robotaxi-map-boot/src/main/resources/mapper/XpStationMapper.xml
@@ -19,6 +19,10 @@
                #{id}
            </foreach>
        </if>
        <if test="query.electronicId != null">
            and a.electronic_id = #{query.electronicId}
        </if>
        <if test="query.cityCode != null and query.cityCode != ''">
            and a.city_code = #{query.cityCode}
        </if>
xp-robotaxi-map-boot/src/main/resources/mapper/XpTestElectronicFenceAreaMapper.xml
@@ -11,7 +11,7 @@
        <result column="area_description" property="areaDescription" />
        <result column="area_status" property="areaStatus" />
        <result column="fence_points" property="fencePoints" />
        <result column="is_deleted" property="isDeleted" />
        <result column="is_deleted" property="deleted" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_by" property="createBy" />
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointSituationReportController.java
@@ -3,7 +3,10 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.util.StrUtil;
import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.model.account.SysUser;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.operation.XpPasswordFreePolicy;
import com.xiaopeng.api.model.operation.XpPointSituationReport;
import com.xiaopeng.api.query.operation.XpPointSituationReportQuery;
@@ -15,9 +18,11 @@
import com.xiaopeng.common.security.service.TokenService;
import com.xiaopeng.operation.exportExcle.XpPointSituationReportExportExcel;
import com.xiaopeng.operation.service.IXpPointSituationReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -29,9 +34,11 @@
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("")
@Api("现场情况上报")
public class XpPointSituationReportController {
    @Resource
@@ -39,6 +46,8 @@
    @Resource
    private TokenService tokenService;
    @Resource
    private XpOperationUserClient xpOperationUserClient;
@@ -48,19 +57,23 @@
    @ApiOperation(value = "现场情况上报分页列表", tags = {"管理后台-运维-现场情况上报"}, response = XpPasswordFreePolicy.class)
    @PostMapping("/api/v1/pointSituationReport/pageList")
    public R<PageInfo<XpPointSituationReportVo>> pageList(@RequestBody XpPointSituationReportQuery query) {
        PageInfo<XpPointSituationReportVo> pageInfo = xpPointSituationReportService.pageList(query);
        return R.ok(pageInfo);
    }
    /**
     * 删除路线规划配置
     * 详情现场情况上报
     */
    @ApiOperation(value = "详情现场情况上报", tags = {"管理后台-运维-现场情况上报"})
    @DeleteMapping("/api/v1/pointSituationReport/getdetail/{id}")
    @GetMapping("/api/v1/pointSituationReport/getdetail/{id}")
    public R<?> getdetail(@PathVariable Long id) {
        xpPointSituationReportService.getdetail(id);
        return R.ok();
        XpPointSituationReportVo detail = xpPointSituationReportService.getdetail(id);
        return R.ok(detail);
    }
@@ -70,13 +83,27 @@
    @ApiOperation(value = "删除现场情况上报", tags = {"管理后台-运维-现场情况上报"})
    @DeleteMapping("/api/v1/pointSituationReport/deleteById/{id}")
    public R<?> deleteById(@PathVariable Long id) {
        xpPointSituationReportService.deleteById(id);
        return R.ok();
        try {
            boolean b = xpPointSituationReportService.deleteById(id);
            if(b){
                return R.ok();
            }
            return R.fail("删除失败");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    @ApiOperation(value = "导出现场情况上报", tags = {"管理后台-运维-现场情况上报"})
    @PostMapping(value = "/api/v1/pointSituationReport/exportExcels")
    public void exportExcels(@RequestBody XpPointSituationReportQuery query) {
        if(query.getIds().isEmpty()){
            return;
        }
        List<XpPointSituationReportVo> exportList = xpPointSituationReportService.exportList(query);
        List<XpPointSituationReportExportExcel> exportExcels = new ArrayList<>();
        long sequence = 1L;
@@ -113,7 +140,7 @@
    }
    @ApiOperation(value = "现场情况上报", tags = {"运维APP-站点管理"}, response = XpPointSituationReport.class)
    @ApiOperation(value = "现场情况上报", tags = {"运维APP-现场情况上报"}, response = XpPointSituationReport.class)
    @PostMapping("/maintenance-app/api/v1/pointSituationReport/addPointSituationReport")
    public R<?> addPointSituationReport(@RequestBody XpPointSituationReport xpPointSituationReport){
        LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -1,5 +1,6 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.api.model.operation.XpTradingStrategy;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.operation.dto.XpTradingStrategyEditDTO;
@@ -44,6 +45,8 @@
    @ApiOperation(value = "获取交易策略配置", tags = {"inner-交易策略配置"})
    @GetMapping("/logan/inner/xpOperationStrategy/getOne")
    public R<XpTradingStrategyDetailVO> getOne() {
        // TODO[流量接入] 这里需要判断是哪个三方车队的,获取到对应的交易策略
        XpTradingStrategyDetailVO detail = tradingStrategyService.queryDetail();
        return R.ok(detail);
    }
@@ -60,4 +63,13 @@
        tradingStrategyService.editStrategy(dto);
        return R.ok();
    }
    @ApiOperation(value = "三方车队的交易策略", tags = {"流量接入-信息录入-设置交易策略"})
    @PostMapping("/api/v1/xp-rt/strategy")
    public R<?> add(@Validated @RequestBody XpTradingStrategy dto) {//创建只接收部分可设置的参数的dto
        // 通过key认证是哪个三方车队
        tradingStrategyService.save(dto);
        return R.ok();
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpPointSituationReportService.java
@@ -15,5 +15,5 @@
    List<XpPointSituationReportVo> exportList(XpPointSituationReportQuery query);
    void deleteById(Long id);
    boolean deleteById(Long id);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointSituationReportServiceImpl.java
@@ -1,5 +1,8 @@
package com.xiaopeng.operation.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
@@ -13,6 +16,7 @@
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.mapper.XpPointSituationReportMapper;
import com.xiaopeng.operation.service.IXpPointSituationReportService;
import net.bytebuddy.implementation.bytecode.Throw;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -34,6 +38,18 @@
    @Override
    public PageInfo<XpPointSituationReportVo> pageList(XpPointSituationReportQuery query) {
        //根据 上报运维人名称 查询数据
        if(StrUtil.isNotBlank(query.getOperationsUserName())){
            R<List<XpOperationsUser>> listR = xpOperationUserClient.listByName(query.getOperationsUserName());
            if(CollUtil.isNotEmpty(listR.getData())){
                List<Long> operationsUserIds = listR.getData().stream()
                        .map(XpOperationsUser::getId)
                        .collect(Collectors.toList());
                query.setOperationsUserIds(operationsUserIds);
            }else{
                query.setOperationsUserIds(ListUtil.toList(0L));
            }
        }
        // 创建分页对象
        PageInfo<XpPointSituationReportVo> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        // 调用Mapper查询
@@ -125,14 +141,14 @@
    @Override
    public void deleteById(Long id) {
    public boolean deleteById(Long id) {
        // 1. 检查记录是否存在
        XpPointSituationReport bean = this.getById(id);
        if (bean == null) {
            throw new ServiceException("密支付策略配置不存在");
            throw new ServiceException("点位现场情况上报信息不存在");
        }
        // 2. 逻辑删除(MyBatis-Plus自动处理)
        this.removeById(id);
        return super.removeById( bean.getId());
    }
}
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointSituationReportMapper.xml
@@ -12,7 +12,7 @@
        inner join xp_point as b on a.point_id = b.id
        WHERE a.is_deleted = 0
        <if test="query.id != null and query.id != ''">
            AND b.point_name  = #{query.id}
            AND a.id  = #{query.id}
        </if>
        <if test="query.ids != null and query.ids.size() > 0">
            AND a.id IN
@@ -33,6 +33,12 @@
        <if test="query.operationsUserId != null and query.operationsUserId != ''">
            AND a.operations_user_id = #{query.operationsUserId}
        </if>
          <if test="query.operationsUserIds != null and query.operationsUserIds.size() > 0">
            AND a.operations_user_id IN
            <foreach collection="query.operationsUserIds" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.reportingTimeStart != null">
            AND a.reporting_time &gt;= #{query.reportingTimeStart}
        </if>
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java
File was deleted
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java
New file
@@ -0,0 +1,54 @@
package com.xiaopeng.pushMessage.webSocket.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
import com.xiaopeng.api.model.maintenance.XpTask;
import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
//public class TestMsgHandler implements BusinessMsgHandler{
public class TestMsgSchedule  {
    @Resource
    XpTaskClient xpTaskClient;
    @Autowired
    private WebSocketUserService webSocketUserService;
    @PostConstruct
    public void setup() {
        Executors.newSingleThreadScheduledExecutor()
                .scheduleWithFixedDelay(this::send, 10, 1, TimeUnit.MINUTES);
    }
    public void send() {
        String msg;
        XpTask xpTask = xpTaskClient.queryInfoByVehicleId(20L).getData();
        HashMap<String, Object> ret = new HashMap<>();
        ret.put("type", "task");
        ret.put("data", xpTask);
        try {
            msg = om.writeValueAsString(ret);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Message serialization failed", e);
        }
        webSocketUserService.broadcastMessage(msg);
    }
    @Autowired ObjectMapper om;
    @Autowired MongoTemplate mongoTemplate;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java
@@ -10,7 +10,7 @@
import javax.annotation.Resource;
@Slf4j
@Configuration
//@Configuration
public class MiniprogramConfigurer extends WebMvcConfigurerAdapter {
    @Resource
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -10,7 +10,10 @@
import com.xiaopeng.vehicleConvoy.model.query.FleetPageQuery;
import com.xiaopeng.vehicleConvoy.model.query.FleetUserPageQuery;
import com.xiaopeng.vehicleConvoy.model.query.FleetVehiclePageQuery;
import com.xiaopeng.vehicleConvoy.model.vo.*;
import com.xiaopeng.vehicleConvoy.model.vo.FleetDetailVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetPageVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetUserVO;
import com.xiaopeng.vehicleConvoy.model.vo.FleetVehicleVO;
import com.xiaopeng.vehicleConvoy.service.IXpFleetOperationsService;
import com.xiaopeng.vehicleConvoy.service.IXpFleetService;
import io.swagger.annotations.*;
@@ -220,4 +223,17 @@
    public R<List<XpFleet>> getList() {
        return R.ok(xpFleetService.list());
    }
    @ApiOperation(value = "品牌信息", tags = {"流量接入-信息录入-品牌展示信息"})
    @PostMapping("/api/v1/xp-rt/brand-info")
    public R<?> JoinUs(
            @ApiParam(value = "车辆信息", required = true)
            @RequestBody XpFleet fleet
    ) {
        //包含接收订单的URL
        xpFleetService.save(fleet);
        return R.ok();
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -1,12 +1,13 @@
package com.xiaopeng.vehicleConvoy.controller;
import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@@ -59,4 +60,29 @@
        List<Long> vehicleIds = xpFleetVehicleService.listVehicleIdsByFleetId(fleetId);
        return R.ok(vehicleIds);
    }
    @ApiOperation(value = "添加车辆", tags = {"流量接入-信息录入-车辆"})
    @PostMapping("/api/v1/xp-rt/vehicle")
    public R<?> add(
            @ApiParam(value = "车辆信息", required = true)
            @RequestBody XpFleetVehicle fleetVehicle
            ) {
        xpFleetVehicleService.save(fleetVehicle);
        return R.ok();
    }
    @Resource
    MongoTemplate mongoTemplate;
    @ApiOperation(value = "车辆", tags = {"流量接入-信息录入-车辆"})
    @PostMapping("/api/v1/xp-rt/vehicle/position")
    public R<?> JoinUs(
            @ApiParam(value = "车辆位置信息", required = true)
            @RequestBody VehiclePosition vp
    ) {
        mongoTemplate.save(vp);
        return R.ok();
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1163,15 +1163,13 @@
        return R.ok(vehicleDoorStatus);
    }
    @Resource
    XpVehicleClient xpVehicleClient;
    /**
     * 周围车辆点位查询
     */
    @ApiOperation(value = "周围车辆点位查询", notes = "", tags = {"小程序-周围车辆点位查询"})
    @GetMapping("/api/v1/mini-program/vehicle/nearby")
    @XpClientCheck(checkToken = false)
    public R<List<XpVehicleVO>> carAround(@RequestParam double lon,@RequestParam double lat) {
    @XpClientCheck(checkToken = false, checkOtpToken = false)
    public R<List<XpVehicleVO>> carAround(@RequestParam double lon, @RequestParam double lat) {
        Point point = new Point(lon, lat);
        Distance distance = new Distance(3, Metrics.KILOMETERS);
@@ -1180,20 +1178,51 @@
                .maxDistance(distance.getNormalizedValue());
        Query query = new Query(criteria);
        List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class);
        if (CollectionUtils.isEmpty(vehiclePositions)) {
            return R.ok(new ArrayList<>());
        }
        List<XpVehicleVO> xpVehicleList = vehiclePositions.stream()
                .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance))
                .map(vp -> {
                    XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vp.getVin()).getData();
                    XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getVehicleVin, vp.getVin()));
                    if (xpVehicle == null) {
                        return null;
                    }
                    XpVehicleVO vo = new XpVehicleVO();
                    BeanUtils.copyProperties(xpVehicle, vo);
                    vo.setDirection(vp.getCourse());
                    return vo;
                })
                .filter(v -> v.getState() == 0)
                .filter(Objects::nonNull)
                .filter(v -> v.getState() != null && v.getState() == 0)
                .limit(5)
                .collect(Collectors.toList());
        return R.ok(xpVehicleList);
    }
    @ApiOperation(value = "上报车辆位置", notes = "", tags = {"流量接入-上报车辆位置"})
    @PostMapping("/api/v1/xp-rt/vehicle/position")
    public R<List<XpVehicleVO>> pushVehiclePosition(@RequestBody VehiclePosition vp) {
        // 更新到mongodb,用于被分配订单
        // 如果是接单中,更新导航路线
        return R.ok();
    }
    /**
     * {@Link OrderStatusEnum}
     * @param vp
     * @return
     */
    @ApiOperation(value = "更新车辆状态", notes = "", tags = {"流量接入-更新车辆状态"})
    @PostMapping("/api/v1/xp-rt/vehicle/status")
    public R<List<XpVehicleVO>> pushVehicleStatus(@RequestBody VehiclePosition vp) {
        // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单
        // 更新order状态
        return R.ok();
    }
}