liujie
2026-03-06 9dacd7aaead0cdbdd398408286e012ae30670c53
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

# Conflicts:
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
3 文件已复制
1个文件已删除
9 文件已重命名
1个文件已添加
15个文件已修改
187 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsRoleMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/ExportOperationsUserVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/xp-robotaxi-automatic-pilot-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-gateway-boot/xp-robotaxi-gateway-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/xp-robotaxi-itinerary-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-job-boot/xp-robotaxi-job-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpClockInServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/xp-robotaxi-maintenance-boot.iml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/xp-robotaxi-map-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/InvitationAddDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/InvitationPageListQuery.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpInvitationCodeMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/xp-robotaxi-operation-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/xp-robotaxi-order-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-payment-boot/xp-modules-account.iml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-payment-boot/xp-robotaxi-payment-boot.iml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/xp-robotaxi-push-message-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-remote-driving-boot/xp-robotaxi-remote-driving-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpFleetServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/xp-robotaxi-vehicle-convoy-boot.iml 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/TokenController.java
@@ -1,5 +1,6 @@
package com.xiaopeng.account.controller;
import com.xiaopeng.account.constant.I18nKeyConstant;
import com.xiaopeng.account.service.ISysUserService;
import com.xiaopeng.account.service.IXpOperationsUserService;
import com.xiaopeng.account.service.impl.SysLoginService;
@@ -11,8 +12,10 @@
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.vo.account.LoginOperationUser;
import com.xiaopeng.api.vo.account.LoginUser;
import com.xiaopeng.api.vo.operation.SmsVo;
import com.xiaopeng.common.core.constant.VerificationCodeConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.JwtUtils;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.redis.service.RedisService;
@@ -151,7 +154,6 @@
        if (!xpOperationsUser.getStatus()) {
            return R.fail("账号已禁用!");
        }
        // todo 后续补充验证码
        // 生成6位数短信验证码
        String code = String.valueOf((int) (Math.random() * 1000000));
        String codeType = "";
@@ -167,19 +169,18 @@
                codeType = VerificationCodeConstants.UPDATE_PASSWORD_CODE;
                break;
        }
        //TODO 短信服务开通后再开启
        // SmsVo vo = new SmsVo();
        // vo.setAppId(sms_appid);
        // vo.setPushType(1);
        // vo.setReceivers(appLoginPasswordDTO.getPhoneNumber());
        // vo.setTemplateCode("RobotaxiVerifyCodeSmsTpl");
        // vo.setAppPushConfigCode("RobotaxiVerifyCodeSms");
        // vo.setParams(new HashMap<>());
        // vo.getParams().put("code", code);
        // SmsDto smsDto = smsClient.pushSms(vo);
        // if(null == smsDto || smsDto.getCode() != 200){
        //     throw new ServiceException("短信发送失败", I18nKeyConstant.SMS_PUSH_FAILED);
        // }
        SmsVo vo = new SmsVo();
        vo.setAppId(sms_appid);
        vo.setPushType(1);
        vo.setReceivers(appLoginPasswordDTO.getPhoneNumber());
        vo.setTemplateCode("RobotaxiVerifyCodeSmsTpl");
        vo.setAppPushConfigCode("RobotaxiVerifyCodeSms");
        vo.setParams(new HashMap<>());
        vo.getParams().put("code", code);
        SmsDto smsDto = smsClient.pushSms(vo);
        if(null == smsDto || smsDto.getCode() != 200){
         throw new ServiceException("短信发送失败", I18nKeyConstant.SMS_PUSH_FAILED);
        }
        redisService.setCacheObject(codeType+appLoginPasswordDTO.getPhoneNumber(), code, 60L, TimeUnit.SECONDS);
        return R.ok();
    }
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsRoleMapper.xml
@@ -48,7 +48,7 @@
            ur.operations_user_id AS operationsUserId,
            ur.role_id AS roleId
        FROM xp_operations_role ur
        WHERE ur.operations_user_id = #{operationsUserId}
        WHERE ur.operations_user_id = #{userId}
    </select>
</mapper>
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/ExportOperationsUserVo.java
@@ -35,7 +35,7 @@
    /**
     * 状态
     */
    @Excel(name = "状态", sort = 5)
    @Excel(name = "状态", sort = 5,readConverterExp = "0=禁用,1=启用")
    private String status;
    /**
     * 创建时间
xp-robotaxi-automatic-pilot-boot/xp-robotaxi-automatic-pilot-boot.iml
xp-robotaxi-gateway-boot/xp-robotaxi-gateway-boot.iml
copy from xp-robotaxi-map-boot/xp-modules-account.iml copy to xp-robotaxi-gateway-boot/xp-robotaxi-gateway-boot.iml
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -362,11 +362,11 @@
        }
        // 10. 检查等待时间
        Integer waitTime = getWaitTime(routeAndFareDto.getOrigin().getLongitude(), routeAndFareDto.getOrigin().getLatitude());
        if (waitTime > 3) {
            throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
        }
        fareVo.setWaitingTime(waitTime);
//        Integer waitTime = getWaitTime(routeAndFareDto.getOrigin().getLongitude(), routeAndFareDto.getOrigin().getLatitude());
//        if (waitTime > 3) {
//            throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
//        }
//        fareVo.setWaitingTime(waitTime);
        // 11. 生成订单ID并缓存
@@ -468,16 +468,16 @@
        }
        // 判断当天取消的次数 后台配置 redis 查询
        Object cancelOrder = redisService.getCacheObject("CANCEL_ORDER_" + uid);
        log.info("取消次数:{}", cancelOrder);
        // 静默处理
        boolean isSilent = false;
        if (cancelOrder != null) {
            Integer num = Integer.valueOf(cancelOrder.toString());
            if (num >= cancelCount) {
                isSilent = true;
            }
        }
//        Object cancelOrder = redisService.getCacheObject("CANCEL_ORDER_" + uid);
//        log.info("取消次数:{}", cancelOrder);
//        // 静默处理
//        boolean isSilent = false;
//        if (cancelOrder != null) {
//            Integer num = Integer.valueOf(cancelOrder.toString());
//            if (num >= cancelCount) {
//                isSilent = true;
//            }
//        }
        // 获取起步里程
@@ -574,10 +574,10 @@
        Long orderId = addOrderR.getData();
        xpOrder.setId(orderId);
        // 静默处理 不推单
        if (isSilent) {
            log.info("订单取消次数达到上限,执行静默处理,不推单。");
            return orderId.toString();
        }
//        if (isSilent) {
//            log.info("订单取消次数达到上限,执行静默处理,不推单。");
//            return orderId.toString();
//        }
        // 最大距离
        Object maxPushDistanceObj = redisService.getCacheObject(CacheConstants.MAX_PUSH_DISTANCE);
@@ -600,13 +600,12 @@
                String value = orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + routeAndFareDto.getRoutePlanRule();
                if (isPriorityDispatch) {
                    // 头部  value 订单_经纬度_状态_用户id_订单编号_距离_时间
//                    redisService.addToHead(s, orderId + "_" + xpPoint.getPointLon() + "," + xpPoint.getPointLat() + "_0" + "_" + uid + "_" + xpOrder.getOrderNumber() + "_" + distance + "_" + duration + "_" + routeAndFareDto.getRoutePlanRule());
                    redisService.addToHead(s, value);
                    log.info("添加到队列头部:{} {}", s, value);
                } else {
                    // 尾部
                    redisService.addToTail(s, value);
                    log.info("添加到队列头部:{} {}", s, value);
                    log.info("添加到队列尾部:{} {}", s, value);
                }
                xpOrder.setQueueName(s);
                xpOrderClient.updateOrder(xpOrder);
xp-robotaxi-itinerary-boot/xp-robotaxi-itinerary-boot.iml
xp-robotaxi-job-boot/xp-robotaxi-job-boot.iml
copy from xp-robotaxi-map-boot/xp-modules-account.iml copy to xp-robotaxi-job-boot/xp-robotaxi-job-boot.iml
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpClockInServiceImpl.java
@@ -168,9 +168,9 @@
        xpClockIn.setClockOutLat(dto.getUserLat());
        xpClockIn.setClockOutAddress(dto.getClockOutAddress());
        if (xpClockIn.getClockOutTime().isBefore(endLocalDateTime)) {
            xpClockIn.setClockInResult(2);
            xpClockIn.setClockOutResult(2);
        } else {
            xpClockIn.setClockInResult(1);
            xpClockIn.setClockOutResult(1);
        }
        xpClockIn.setAppUserId(null);
        this.updateById(xpClockIn);
xp-robotaxi-maintenance-boot/xp-robotaxi-maintenance-boot.iml
File was renamed from xp-robotaxi-maintenance-boot/xp-modules-account.iml
@@ -4,6 +4,7 @@
    <content url="file://$MODULE_DIR$" dumb="true">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
    </content>
  </component>
</module>
xp-robotaxi-map-boot/xp-robotaxi-map-boot.iml
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpInvitationCodeController.java
@@ -19,6 +19,7 @@
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.common.log.annotation.Log;
import com.xiaopeng.common.log.enums.BusinessType;
import com.xiaopeng.operation.dto.InvitationAddDto;
import com.xiaopeng.operation.exportExcle.XpInvitationCodeExportExcel;
import com.xiaopeng.operation.exportExcle.XpWhitelistExportExcel;
import com.xiaopeng.operation.importExcel.InvitationCodeImportExcel;
@@ -76,15 +77,12 @@
    /**
     * 生成邀请码
     */
    @PutMapping("/api/v1/invitation/add")
    @PostMapping("/api/v1/invitation/add")
    @ResponseBody
    @ApiOperation(value = "生成邀请码")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "手机号 多个逗号隔开", name = "phones", dataType = "String", required = true)
    })
    @Transactional
    public R add(@RequestParam("phones") String phones){
        return xpInvitationCodeService.add(phones);
    public R add(@RequestBody InvitationAddDto dto){
        return xpInvitationCodeService.add(dto.getPhones());
    }
    /**
     * 解绑
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
@@ -114,6 +114,9 @@
    @ApiOperation(value = "编辑白名单")
    @Transactional
    public R edit(@Validated @RequestBody WhitelistEditDto dto) {
        if (!StringUtils.hasLength(dto.getAccount())) {
            return R.fail("请输入账号");
        }
        SysUser sysUser = tokenService.getLoginUser().getSysUser();
        XpWhitelist xpWhitelist = new XpWhitelist();
        BeanUtils.copyProperties(dto, xpWhitelist);
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/dto/InvitationAddDto.java
New file
@@ -0,0 +1,18 @@
package com.xiaopeng.operation.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@ApiModel(value = "邀请码生成InvitationAddDto")
public class InvitationAddDto implements Serializable {
    @NotBlank(message = "手机号不能为空")
    @ApiModelProperty(value = "手机号")
    private String phones;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/InvitationPageListQuery.java
@@ -5,6 +5,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "邀请码管理列表查询query")
public class InvitationPageListQuery extends BasePage {
@@ -14,5 +16,6 @@
    private String status;
    @ApiModelProperty(value = "绑定账号")
    private String bindAccount;
    @ApiModelProperty(value = "选择的id集合")
    private List<Long> ids;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java
@@ -5,6 +5,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "白名单管理列表查询query")
public class WhitelistPageListQuery extends BasePage {
@@ -14,5 +16,7 @@
    private Boolean status;
    @ApiModelProperty(value = "来源 1=添加 2=邀请码")
    private Integer whitelistSource;
    @ApiModelProperty(value = "选中的记录id集合")
    private List<Long> ids;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -341,11 +341,11 @@
        }
        // 10. 检查等待时间
        Integer waitTime = getWaitTime(routeAndFareDto.getOrigin().getLongitude(), routeAndFareDto.getOrigin().getLatitude());
        if (waitTime > 3) {
            throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
        }
        fareVo.setWaitingTime(waitTime);
//        Integer waitTime = getWaitTime(routeAndFareDto.getOrigin().getLongitude(), routeAndFareDto.getOrigin().getLatitude());
//        if (waitTime > 3) {
//            throw new ServiceException("当前区域正在等待中,请耐心等待", I18nKeyConstant.WAITING_TIME);
//        }
//        fareVo.setWaitingTime(waitTime);
        // 11. 生成订单ID并缓存
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
@@ -51,7 +51,6 @@
    @Override
    public List<XpWhitelist> exportList(WhitelistPageListQuery query) {
        List<XpWhitelist> list = this.baseMapper.exportList(query);
        return list;
    }
@@ -99,6 +98,13 @@
        if (!PhoneUtil.isPhone(dto.getAccount())) {
            throw new ServiceException("以下帐号格式不正确:", I18nKeyConstant.ACCOUNT_FORMAT_ERROR, new Object[]{dto.getAccount()});
        }
        XpWhitelist old = this.lambdaQuery()
                .eq(XpWhitelist::getAccount, dto.getAccount())
                .ne(XpWhitelist::getId, dto.getId())
                .last("limit 1").one();
        if (old != null) {
            return R.fail("该账号已存在");
        }
        XpWhitelist whitelist = this.getById(dto.getId());
        StringBuilder operationContent = new StringBuilder("编辑账号:");
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -263,7 +263,7 @@
            // 更改 暂不限制数量
            List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
            log.info("根据距离找车 {}", positionList);
            // 获取车辆的区域信息
            if (positionList.isEmpty()) {
                continue;
@@ -272,10 +272,10 @@
            // 获取车辆的信息 筛选出可用车辆
            R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount()));
            log.info("筛选可用车辆结果 {}", vehiclePositionVos);
            if (vehiclePositionVos.getCode() != 200) {
                continue;
            }
            List<VehiclePositionVo> availableVehiclesNearby = BeanUtil.copyToList(positionList, VehiclePositionVo.class);
            List<String> data = vehiclePositionVos.getData();
@@ -286,6 +286,7 @@
            if (!availableVehiclesNearby.isEmpty()) {
                if (availableVehiclesNearby.size() > 1) {
                    log.info("附近有 {} 辆车,进入权重按断流程", availableVehiclesNearby.size());
                    // 走权重
                    // 订单价值
@@ -776,8 +777,9 @@
                            continue;
                        }
                        XpVehicle vehiclePosition = vehiclePositionR.getData();
                        if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType() == 1) {
                            lock.unlock();
                        log.info("符合条件的车辆 {} ,直接推单XPU", vehiclePosition.getPlateNumber());
                        log.info("当前车辆状态 {}", vehiclePosition.getStatus());
                        if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType()==1) {
                            continue;
                        }
                        //  关闭巡游单子
@@ -794,9 +796,11 @@
                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
                        pushOrderDto.setStage(1);
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
//                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
                        redisService.popFirstElement(quoteName);
                        log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName);
                        return;
                    } catch (Exception e) {
                        e.printStackTrace();
@@ -818,7 +822,9 @@
                            continue;
                        }
                        XpVehicle vehicleId1 = vehicleR.getData();
                        if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType() == 1) {
                        log.info("附近只有一个车辆 {} ,直接推单XPU", vehicleId1.getPlateNumber());
                        log.info("当前车辆状态 {}", vehicleId1.getStatus());
                        if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType()==1) {
                            lock.unlock();
                            continue;
                        }
@@ -835,8 +841,10 @@
                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
                        pushOrderDto.setStage(1);
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
//                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
                        redisService.popFirstElement(quoteName);
                        log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName);
                        return;
                    } catch (Exception e) {
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpInvitationCodeMapper.xml
@@ -36,6 +36,12 @@
        <if test="query.bindAccount != null and query.bindAccount != ''">
            and bind_account like concat('%',#{query.bindAccount},'%')
        </if>
        <if test="query.ids != null and query.ids.size()>0">
            and id in
            <foreach item="item" collection="query.ids" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        ORDER BY create_time DESC
    </select>
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml
@@ -36,6 +36,12 @@
        <if test="query.whitelistSource != null">
            and whitelist_source = #{query.source}
        </if>
        <if test="query.ids != null and query.ids.size()>0">
            and id in
            <foreach item="item" collection="query.ids" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        order by create_time desc
    </select>
xp-robotaxi-operation-boot/xp-robotaxi-operation-boot.iml
xp-robotaxi-order-boot/xp-robotaxi-order-boot.iml
xp-robotaxi-payment-boot/xp-modules-account.iml
File was deleted
xp-robotaxi-payment-boot/xp-robotaxi-payment-boot.iml
copy from xp-robotaxi-maintenance-boot/xp-modules-account.iml copy to xp-robotaxi-payment-boot/xp-robotaxi-payment-boot.iml
File was copied from xp-robotaxi-maintenance-boot/xp-modules-account.iml
@@ -3,7 +3,6 @@
  <component name="AdditionalModuleElements">
    <content url="file://$MODULE_DIR$" dumb="true">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
    </content>
  </component>
</module>
xp-robotaxi-push-message-boot/xp-robotaxi-push-message-boot.iml
xp-robotaxi-remote-driving-boot/xp-robotaxi-remote-driving-boot.iml
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpFleetServiceImpl.java
@@ -124,6 +124,12 @@
                }).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(vehicleList)) {
            xpFleetVehicleService.saveBatch(vehicleList);
            //推送车辆和区域的绑定关系个车端
        }
        return R.ok();
xp-robotaxi-vehicle-convoy-boot/xp-robotaxi-vehicle-convoy-boot.iml