xuhy
2026-04-23 df036edff1c901a4a4f52c41fae67d4a91976c2b
[feat] 巡游打卡统计
3个文件已添加
8个文件已修改
170 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/BrandInfo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/ChargeType.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/Classification.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpCruiseCheckInRecordMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRecordService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/BrandInfo.java
New file
@@ -0,0 +1,28 @@
package com.xiaopeng.api.dto.open_api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class BrandInfo {
    @ApiModelProperty(value = "品牌名称")
    private String brandName;
    @ApiModelProperty(value = "品牌LOGO")
    private String logo;
    @ApiModelProperty(value = "所属分类")
    private Classification classification;
    @ApiModelProperty(value = "计价类型")
    private ChargeType chargeType;
    @ApiModelProperty(value = "负责人姓名")
    private String operationsUserName;
    @ApiModelProperty(value = "负责人-手机号")
    private String phoneNumber;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/ChargeType.java
New file
@@ -0,0 +1,7 @@
package com.xiaopeng.api.dto.open_api;
public enum ChargeType {
    FIXED_PRICE, TWO_PART_PRICE, REAL_TIME_PRICING
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/open_api/Classification.java
New file
@@ -0,0 +1,19 @@
package com.xiaopeng.api.dto.open_api;
public enum Classification {
    /**
     * 1. Taxi (出租车)
     * 2. Premier (专车)
     * 3. Express (快车)
     * 4. Hitch (顺风车)
     * 5. Designated Driver (代驾)
     * 6. Carpool (拼车)
     */
    Taxi,
    Premier,
    Express,
    Hitch,
    Carpool,
    DesignatedDriver,
}
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -332,6 +332,7 @@
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1));
            // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力
        }
        if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpCruiseCheckInRuleController.java
@@ -17,6 +17,7 @@
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
@@ -114,7 +115,7 @@
    @ApiOperation(value = "巡游打卡统计", tags = {"管理后台-巡游打卡管理"})
    @PostMapping("/maintenance-admin/api/v1/cruiseCheckInRecord/statistic")
    public R<XpCruiseCheckInRecordVO> pageList(@RequestBody XpCruiseCheckInStatisticsQuery  query) {
    public R<XpCruiseCheckInStatisticsVO> pageList(@RequestBody XpCruiseCheckInStatisticsQuery  query) {
        return R.ok(xpCruiseCheckInRecordService.statistics(query));
    }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/mapper/XpCruiseCheckInRecordMapper.java
@@ -6,6 +6,7 @@
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -16,7 +17,7 @@
    XpCruiseCheckInRecordVO detail(@Param("id")Long id);
    XpCruiseCheckInRecordVO selectCruiseCheckInStatistics(@Param("userIds") XpCruiseCheckInStatisticsQuery query);
    XpCruiseCheckInStatisticsVO selectCruiseCheckInStatistics(@Param("query") XpCruiseCheckInStatisticsQuery query);
    List<XpCruiseCheckInRecordVO> selectCruiseCheckInRecordList(@Param("query") XpCruiseCheckInRecordQuery query);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpCruiseCheckInRecordService.java
@@ -6,6 +6,7 @@
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO;
import java.util.List;
@@ -15,7 +16,7 @@
    XpCruiseCheckInRecordVO detail(Long id);
    XpCruiseCheckInRecordVO statistics(XpCruiseCheckInStatisticsQuery query);
    XpCruiseCheckInStatisticsVO statistics(XpCruiseCheckInStatisticsQuery query);
    List<XpCruiseCheckInRecordVO> all(XpCruiseCheckInRecordQuery query);
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRecordServiceImpl.java
@@ -10,12 +10,15 @@
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInRecordVO;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsQuery;
import com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -32,19 +35,27 @@
        PageInfo<XpCruiseCheckInRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<XpCruiseCheckInRecordVO> list = xpCruiseCheckInRecordMapper.selectCruiseCheckInRecordList(pageInfo, query);
        pageInfo.setRecords(list);
        List<Long> ids = list.stream().map(XpCruiseCheckInRecordVO::getOperationsUserId).collect(Collectors.toList());
        List<XpOperationsUser> xpOperationsUsers = xpOperationsUserClient.listByIds(ids).getData();
        Map<Long, XpOperationsUser> userMap = xpOperationsUsers.stream().collect(Collectors.toMap(XpOperationsUser::getId, Function.identity()));
        list.forEach(record -> {
            XpOperationsUser user = userMap.get(record.getOperationsUserId());
            if (user != null) {
                record.setOperationsUserId(user.getId());
                record.setOperationsUserName(user.getNickName());
                record.setPhoneNumber(user.getPhoneNumber());
            }
        });
        list = list.stream().map(record -> {
                    XpOperationsUser user = userMap.get(record.getOperationsUserId());
                    if (user == null) return null;
                    record.setOperationsUserId(user.getId());
                    record.setOperationsUserName(user.getNickName());
                    record.setPhoneNumber(user.getPhoneNumber());
                    if (StringUtils.isNotBlank(query.getOperationsUserName()) && !record.getOperationsUserName().contains(query.getOperationsUserName())) {
                        return null;
                    }
                    if (StringUtils.isNotBlank(query.getPhoneNumber()) && !record.getPhoneNumber().contains(query.getPhoneNumber())) {
                        return null;
                    }
                    return record;
                })
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        pageInfo.setRecords(list);
        return pageInfo;
    }
@@ -65,22 +76,10 @@
    }
    @Override
    public XpCruiseCheckInRecordVO statistics(XpCruiseCheckInStatisticsQuery query) {
    public XpCruiseCheckInStatisticsVO statistics(XpCruiseCheckInStatisticsQuery query) {
        XpCruiseCheckInRecordVO vo = xpCruiseCheckInRecordMapper.selectCruiseCheckInStatistics(query);
        return xpCruiseCheckInRecordMapper.selectCruiseCheckInStatistics(query);
        List<Long> ids = Collections.singletonList(vo.getOperationsUserId());
        List<XpOperationsUser> xpOperationsUsers = xpOperationsUserClient.listByIds(ids).getData();
        Map<Long, XpOperationsUser> userMap = xpOperationsUsers.stream().collect(Collectors.toMap(XpOperationsUser::getId, Function.identity()));
        XpOperationsUser user = userMap.get(vo.getOperationsUserId());
        if (user != null) {
            vo.setOperationsUserId(user.getId());
            vo.setOperationsUserName(user.getNickName());
            vo.setPhoneNumber(user.getPhoneNumber());
        }
        return vo;
    }
    @Override
@@ -91,14 +90,22 @@
        List<Long> ids = list.stream().map(XpCruiseCheckInRecordVO::getOperationsUserId).collect(Collectors.toList());
        List<XpOperationsUser> xpOperationsUsers = xpOperationsUserClient.listByIds(ids).getData();
        Map<Long, XpOperationsUser> userMap = xpOperationsUsers.stream().collect(Collectors.toMap(XpOperationsUser::getId, Function.identity()));
        list.forEach(record -> {
            XpOperationsUser user = userMap.get(record.getOperationsUserId());
            if (user != null) {
                record.setOperationsUserId(user.getId());
                record.setOperationsUserName(user.getNickName());
                record.setPhoneNumber(user.getPhoneNumber());
            }
        });
        list = list.stream().map(record -> {
                    XpOperationsUser user = userMap.get(record.getOperationsUserId());
                    if (user == null) return null;
                    record.setOperationsUserId(user.getId());
                    record.setOperationsUserName(user.getNickName());
                    record.setPhoneNumber(user.getPhoneNumber());
                    if (StringUtils.isNotBlank(query.getOperationsUserName()) && !record.getOperationsUserName().contains(query.getOperationsUserName())) {
                        return null;
                    }
                    if (StringUtils.isNotBlank(query.getPhoneNumber()) && !record.getPhoneNumber().contains(query.getPhoneNumber())) {
                        return null;
                    }
                    return record;
                })
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        return list;
    }
xp-robotaxi-maintenance-boot/src/main/resources/mapper/maintenance/XpCruiseCheckInRecordMapper.xml
@@ -30,8 +30,6 @@
        SELECT
            r.id,
            r.operations_user_id,
            u.nick_name AS operations_user_name,
            u.phone_number,
            r.check_location_id,
            cl.location_address,
            r.cruise_check_in_rule_id,
@@ -54,17 +52,11 @@
        <if test="query.checkInResult != null and query.checkInResult != 3">
            AND r.check_in_result = #{query.checkInResult}
        </if>
        <if test="query.operationsUserName != null and query.operationsUserName != ''">
            AND u.nick_name LIKE CONCAT('%', #{query.operationsUserName}, '%')
        </if>
        <if test="query.ruleName != null and query.ruleName != ''">
            AND cr.name LIKE CONCAT('%', #{query.ruleName}, '%')
        </if>
        <if test="query.locationAddress != null and query.locationAddress != ''">
            AND cl.location_address LIKE CONCAT('%', #{query.locationAddress}, '%')
        </if>
        <if test="query.phoneNumber != null and query.phoneNumber != ''">
            AND u.phone_number = #{query.phoneNumber}
        </if>
        <if test="query.startDate != null">
            AND DATE(r.check_in_time) &gt;= #{query.startDate}
@@ -95,7 +87,7 @@
          AND r.is_deleted = '0'
    </select>
    <select id="selectCruiseCheckInStatistics" resultMap="CruiseCheckInStatisticsMap">
    <select id="selectCruiseCheckInStatistics" resultType="com.xiaopeng.maintenance.vo.XpCruiseCheckInStatisticsVO">
        SELECT
        DATE(r.check_in_time) AS date,
        COUNT(CASE WHEN r.check_in_result = 1 THEN 1 END) AS punctual,
@@ -104,7 +96,7 @@
        COUNT(CASE WHEN r.field_situation = 2 THEN 1 END) AS traffic
        FROM xp_cruise_check_in_record r
        LEFT JOIN xp_cruise_check_in_rule cr ON r.cruise_check_in_rule_id = cr.id AND cr.is_deleted = '0'
        LEFT JOIN xp_fleet_operations fo ON u.id = fo.operationsUserId
        LEFT JOIN xp_fleet_operations fo ON r.operations_user_id = fo.operationsUserId
        LEFT JOIN xp_fleet f ON fo.fleetId = f.id
        WHERE r.is_deleted = '0'
        AND r.check_in_time IS NOT NULL
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -1,6 +1,9 @@
package com.xiaopeng.vehicleConvoy.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xiaopeng.api.dto.open_api.BrandInfo;
import com.xiaopeng.api.feignClient.account.XpOperationsUserClient;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.api.model.vehicleConvoy.XpFleetOperations;
import com.xiaopeng.common.core.domain.R;
@@ -224,16 +227,28 @@
        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
            @RequestBody BrandInfo brandInfo
    ) {
        //包含接收订单的URL
        xpFleetService.save(fleet);
        XpFleet xpFleet = new XpFleet();
        XpOperationsUser operationsUser = new XpOperationsUser();
        operationsUser.setNickName(brandInfo.getOperationsUserName());
        operationsUser.setPhoneNumber(brandInfo.getPhoneNumber());
        operationsUser.setDeviceType(1);
        xpFleet.setFleetName(brandInfo.getBrandName());
//        xpFleetService.save(fleet);
        return R.ok();
    }
    XpOperationsUserClient xpOperationsUserClient;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1205,9 +1205,14 @@
    public R<List<XpVehicleVO>> pushVehiclePosition(@RequestBody VehiclePosition vp) {
        // 更新到mongodb,用于被分配订单
        // 如果是接单中,更新导航路线
        return R.ok();
    }
    /**
     * {@Link OrderStatusEnum}
@@ -1221,6 +1226,7 @@
        // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单
        // 更新order状态
        return R.ok();
    }