xuhy
2026-04-25 6da3cde42c90fa5383cf1b48e632cb1107c80d3e
Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

# Conflicts:
# xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
1个文件已删除
1 文件已重命名
2个文件已添加
17个文件已修改
428 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/vo/UserCouponListVo.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/CouponVo.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/XpActivityVo.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/OrderDistanceVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderHistoryTrajectoryVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatus.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatusVo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -3,6 +3,7 @@
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.account.model.dto.ReceiveCouponDto;
import com.xiaopeng.account.model.dto.SendCouponDto;
import com.xiaopeng.account.model.query.XpUserCouponListQuery;
@@ -360,4 +361,15 @@
        UserCouponListVo userCouponList = xpAppUserCouponService.getUserCouponList(orderMoney, uid);
        return R.ok(userCouponList);
    }
    /**
     * 获取用户活动领取的优惠券
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/getXpAppUserCoupon")
    public R<List<XpAppUserCoupon>> getXpAppUserCoupon(@RequestParam Long activityId){
        List<XpAppUserCoupon> list = xpAppUserCouponService.list(new QueryWrapper<XpAppUserCoupon>()
                .eq("activity_id", activityId).eq("is_deleted", 0));
        return R.ok(list);
    }
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -16,7 +16,7 @@
import com.xiaopeng.account.model.vo.XpAppUserCouponVo;
import com.xiaopeng.account.service.IXpAppUserCouponService;
import com.xiaopeng.account.util.holiday.HolidayUtil;
import com.xiaopeng.account.vo.CouponVo;
import com.xiaopeng.api.vo.account.CouponVo;
import com.xiaopeng.account.vo.UserCouponListVo;
import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest;
import com.xiaopeng.api.dto.account.UcUserInfo;
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/vo/UserCouponListVo.java
@@ -1,5 +1,6 @@
package com.xiaopeng.account.vo;
import com.xiaopeng.api.vo.account.CouponVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java
@@ -6,6 +6,7 @@
import com.xiaopeng.api.dto.statistics.UserStatisticsDTO;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.vo.account.UserCouponVo;
import com.xiaopeng.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
@@ -14,6 +15,7 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
 * 小程序用户Feign客户端降级工厂
@@ -58,6 +60,11 @@
                return null;
            }
            @Override
            public R<List<XpAppUserCoupon>> getXpAppUserCoupon(Long activityId) {
                log.error("获取用户活动领取的优惠券失败,原因: {}", cause.getMessage());
                return R.fail("获取用户活动领取的优惠券失败,原因: "+cause.getMessage());
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
@@ -121,6 +121,12 @@
                log.error("保存订单轨迹数据失败,原因: {}", cause.getMessage());
                return R.fail("保存订单轨迹数据失败");
            }
            @Override
            public R<Integer> determineUserType(Long userId) {
                log.error("确定用户类型失败,原因: {}", cause.getMessage());
                return R.fail("确定用户类型失败");
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -3,6 +3,7 @@
import com.xiaopeng.api.dto.account.GetUserCouponDto;
import com.xiaopeng.api.dto.account.UseUserCouponDto;
import com.xiaopeng.api.factory.account.XpAppUserCouponClientFallbackFactory;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.vo.account.UserCouponVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
@@ -11,8 +12,10 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.List;
/**
 * 小程序用户Feign客户端
@@ -53,4 +56,12 @@
    @ApiOperation(value = "活动发放优惠券", tags = {"管理后台-活动发放优惠券"})
     R<String> saveInfo_activity(@RequestBody UseUserCouponDto dto) ;
    /**
     * 获取用户活动领取的优惠券
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/getXpAppUserCoupon")
    R<List<XpAppUserCoupon>> getXpAppUserCoupon(@RequestParam Long activityId);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -153,5 +153,11 @@
    /**
     * 判断用户类型
     * @param userId
     * @return 1=老用户,2=新用户,3=流失用户
     */
    @PostMapping("/logan/inner/order/determineUserType")
    R<Integer> determineUserType(@RequestParam Long userId);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityUser.java
@@ -1,5 +1,6 @@
package com.xiaopeng.api.model.operation;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -41,7 +42,7 @@
    private Integer userType;
    @ApiModelProperty(value = "指定用户json数组")
    private String userList;
    private JSONArray userList;
    @ApiModelProperty(value = "策略组名称")
    private String strategyName;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java
@@ -1,9 +1,12 @@
package com.xiaopeng.api.model.operation;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.api.vo.account.CouponVo;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -14,6 +17,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -37,13 +41,16 @@
    private String acticityName;
    @ApiModelProperty(value = "活动类型 如新人活动、媒体邀约活动、日常提频等")
    private Integer activityType;
    private Integer acticityType;
    @ApiModelProperty(value = "是否开启活动总限额")
    private boolean enableTotalLimit;
    private Integer aggregateLimit;
    @ApiModelProperty(value = "是否开启活动总限额")
    private BigDecimal totalLimit;
    @ApiModelProperty(value = "总限额")
    private BigDecimal limitation;
    @ApiModelProperty(value = "封面图片json")
    private JSONObject coverImage;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -65,10 +72,65 @@
    @ApiModelProperty(value = "邀请启用 1=是 0=否")
    private Boolean inviteEnable;
    @ApiModelProperty(value = "图片")
    private String img;
    @ApiModelProperty("微信通知(0=否,1=是)")
    private Integer wechatNotification;
    @ApiModelProperty(value = "富文本内容")
    private String richText;
    @ApiModelProperty("微信通知到账提醒(0=否,1=是)")
    private Integer wechatReceivedReminder;
    @ApiModelProperty("微信通知即将过期提醒(0=否,1=是)")
    private Integer wechatAboutExpireReminder;
    @ApiModelProperty("微信通知即将过期天数")
    private Integer wechatAboutExpireDays;
    @ApiModelProperty("微信通知活动开始提醒(0=否,1=是)")
    private Integer wechatActicityStart;
    @ApiModelProperty("微信通知临近券生效前X分钟通知")
    private Integer wechatActicityStartMinutes;
    @ApiModelProperty("短信通知(0=否,1=是)")
    private Integer smsNotification;
    @ApiModelProperty("短信通知到账提醒(0=否,1=是)")
    private Integer smsReceivedReminder;
    @ApiModelProperty("短信通知即将过期提醒(0=否,1=是)")
    private Integer smsAboutExpireReminder;
    @ApiModelProperty("短信通知即将过期天数")
    private Integer smsAboutExpireDays;
    @ApiModelProperty("短信通知活动开始提醒(0=否,1=是)")
    private Integer smsActicityStart;
    @ApiModelProperty("短信通知临近券生效前X分钟通知")
    private Integer smsActicityStartMinutes;
    @ApiModelProperty("短信通知屏蔽开始时间")
    private LocalDateTime smsStartBlockingTime;
    @ApiModelProperty("短信通知屏蔽结束时间")
    private LocalDateTime smsEndBlockingTime;
    @ApiModelProperty("小程序弹窗通知(0=否,1=是)")
    private Integer miniProgramNotification;
    @ApiModelProperty("小程序弹窗标题")
    private String miniProgramPopupTitle;
    @ApiModelProperty("小程序弹窗按钮文案")
    private String miniProgramBtnText;
    @ApiModelProperty("小程序弹窗券到账提醒(0=否,1=是)")
    private String miniProgramReceivedReminder;
    @ApiModelProperty("小程序弹窗即将过期提醒(0=否,1=是)")
    private String miniProgramAboutExpireReminder;
    @ApiModelProperty("小程序弹窗临近券生效前X分钟")
    private Integer miniProgramAboutExpireMinutes;
    @ApiModelProperty("通知内容")
    private String expireMinutesNotificationContent;
    @ApiModelProperty("小程序弹窗临近到期时间前X天")
    private Integer aboutExpireDays;
    @ApiModelProperty("通知内容")
    private String expireDaysNotificationContent;
    @ApiModelProperty("是否开启浮窗(0=否,1=是)")
    private Integer enableFloatWindow;
    @ApiModelProperty("浮窗优先级权重")
    private Integer floatWindowPriority;
    @ApiModelProperty("浮窗跳转链接")
    private String floatWindowJumpUrl;
    @ApiModelProperty(value = "是否第一次 1=是 0=否")
    @TableField(exist = false)
    private Boolean isFirst;
    @ApiModelProperty(value = "优惠券")
    @TableField(exist = false)
    private List<CouponVo> coupons;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/CouponVo.java
File was renamed from xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/vo/CouponVo.java
@@ -1,4 +1,4 @@
package com.xiaopeng.account.vo;
package com.xiaopeng.api.vo.account;
import io.swagger.annotations.ApiModel;
@@ -30,4 +30,6 @@
    private String stackable;
    @ApiModelProperty("生效规则")
    private String effectAndInvalid;
    @ApiModelProperty("数量")
    private Long quantity;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/XpActivityVo.java
File was deleted
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -3,13 +3,23 @@
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.model.operation.XpActicityCoupon;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.api.model.operation.XpCoupon;
import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
import com.xiaopeng.api.vo.operation.XpActivityVo;
import com.xiaopeng.api.vo.account.CouponVo;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.bean.BeanUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.service.*;
import com.xiaopeng.operation.service.IXpActicityCouponService;
import com.xiaopeng.operation.service.IXpActicityService;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import com.xiaopeng.operation.service.IXpCouponService;
import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -23,7 +33,10 @@
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * <p>
@@ -49,6 +62,14 @@
    @Resource
    private IXpActicityStrategyService xpActicityStrategyService;
    @Resource
    private IXpCouponService xpCouponService;
    @Resource
    private XpAppUserCouponClient appUserCouponClient;
    /**
     * 获取所有白名单手机号
     * @return
@@ -72,26 +93,57 @@
     * @return 活动信息,id 和 img
     */
    @GetMapping("/api/v1/mini-program/acticity/firstEnter")
    @ApiOperation(value = "获取是否第一次推送活动", tags = {"管理后台-活动首次进入情况"})
    public R<XpActivityVo> firstEnter(HttpServletRequest request){
    @ApiOperation(value = "获取是否第一次推送活动", tags = {"小程序-首页活动"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpActivity> firstEnter(HttpServletRequest request){
        String uid = request.getHeader("XP-Uid");
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        XpActivity activity = service.activiting();
        List<XpActicityCoupon> cps = couponService.lambdaQuery().eq(XpActicityCoupon::getActivityId, activity.getId()).list();
        XpActivityVo ret = new XpActivityVo();
        XpActivity activity = service.activiting(Long.valueOf(uid));
        if (activity !=null) {
            BeanUtils.copyBeanProp(ret, activity);
            List<XpAppUserCoupon> couponList = appUserCouponClient.getXpAppUserCoupon(activity.getId()).getData();
            Set<Long> longSet = couponList.stream().map(XpAppUserCoupon::getCouponId).collect(Collectors.toSet());
            if(longSet.isEmpty()){
                return R.ok();
            }
            List<XpCoupon> xpCoupons1 = xpCouponService.listByIds(longSet);
            List<CouponVo> couponVos = new ArrayList<>();
            for (XpCoupon xpCoupon : xpCoupons1) {
                XpAppUserCoupon xpAppUserCoupon = couponList.stream().filter(s -> s.getCouponId().equals(xpCoupon.getId())).findFirst().get();
                CouponVo vo = new CouponVo();
                vo.setId(xpCoupon.getId());
                vo.setConditionalAmount(xpCoupon.getConditionalAmount());
                vo.setAmount(xpCoupon.getAmount());
                vo.setCouponType(xpCoupon.getCouponType());
                vo.setCouponName(xpCoupon.getCouponName());
                vo.setCouponDesc(xpCoupon.getCouponDescription());
                vo.setEndTime(xpAppUserCoupon.getExpirationTime().toString());
                long count = couponList.stream().filter(s -> s.getCouponId().equals(xpCoupon.getId())).count();
                vo.setQuantity(count);
                couponVos.add(vo);
            }
            Duration duration = Duration.between(LocalDateTime.now(), activity.getEndTime());
            Boolean isFirst = ops.setIfAbsent(CacheConstants.firstEnterActivity(String.valueOf(activity.getId()), uid),"1", duration);
            ret.setIsFirst(isFirst);
            ret.setCoupons(cps);
            activity.setIsFirst(isFirst);
            activity.setCoupons(couponVos);
        }
        return R.ok(ret);
        return R.ok(activity);
    }
    IXpActicityCouponService couponService;
    /**
     * 是否第一次进入某活动
     * @return 活动信息,id 和 img
     */
    @GetMapping("/api/v1/mini-program/acticity/getFloatActicity")
    @ApiOperation(value = "获取首页活动悬浮图标数据", tags = {"小程序-首页活动"})
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<XpActivity> getFloatActicity(HttpServletRequest request){
        String uid = request.getHeader("XP-Uid");
        XpActivity activity = service.getFloatActicity(Long.valueOf(uid));
        return R.ok(activity);
    }
    @Resource
    IXpActicityStrategyService strategyService;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java
@@ -23,9 +23,17 @@
    List<String> findListToIds(String acticityName);
    XpActivity activiting();
    XpActivity activiting(Long uid);
    void save(XpActivityDto dto);
    XpActivityDto detail(Long id);
    /**
     * 获取悬浮弹窗活动数据
     * @param uid
     * @return
     */
    XpActivity getFloatActicity(Long uid);
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -1,7 +1,9 @@
package com.xiaopeng.operation.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.api.dto.operation.XpActivityDto;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.api.model.operation.XpActivity;
@@ -21,6 +23,7 @@
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -47,6 +50,11 @@
    @Resource
    private IXpActivityNoticeService activityNotice;
    @Resource
    private XpOrderClient xpOrderClient;
    @Override
    public PageInfo<XpActivityDto> pageList(XpActivityPageListQuery query) {
        PageInfo<XpActivityDto> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
@@ -63,17 +71,27 @@
        query.like(XpActivity::getActicityName, acticityName);
        return listObjs(query, Object::toString);
    }
    @Override
    public XpActivity activiting() {
        LambdaQueryWrapper<XpActivity> query = new LambdaQueryWrapper<>();
        LocalDateTime now = LocalDateTime.now();
        query.le(XpActivity::getStartTime, now)
                .ge(XpActivity::getEndTime, now);
        List<XpActivity> list = list(query);
        if(!list.isEmpty()){
            return list.get(new Random().nextInt(list.size()));
        }
        return null;
    public XpActivity activiting(Long uid) {
        //获取当前用户可参与的活动
        List<Integer> actitctiyIds = new ArrayList<>();
        //全部用户
        List<XpActicityUser> list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", 1));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        //判断用户类型 2=老用户,3=新用户,4=流失用户
        Integer userType = xpOrderClient.determineUserType(uid).getData();
        list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", userType));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        //指定用户
        list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", 5)
                .last("  and JSON_CONTAINS(user_list, '" + uid + "', '$')"));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        XpActivity one = this.getOne(new QueryWrapper<XpActivity>().eq("status", 2).eq("is_deleted", 0)
                .eq("mini_program_notification", 1).in(!actitctiyIds.isEmpty(), "id", actitctiyIds)
                .last(" and now() between start_time and end_time order by float_window_priority desc limit 1"));
        return one;
    }
    @Override
@@ -112,4 +130,31 @@
        return ret;
    }
    /**
     * 获取悬浮弹窗活动数据
     * @param uid
     * @return
     */
    @Override
    public XpActivity getFloatActicity(Long uid) {
        //获取当前用户可参与的活动
        List<Integer> actitctiyIds = new ArrayList<>();
        //全部用户
        List<XpActicityUser> list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", 1));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        //判断用户类型 2=老用户,3=新用户,4=流失用户
        Integer userType = xpOrderClient.determineUserType(uid).getData();
        list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", userType));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        //指定用户
        list = userService.list(new QueryWrapper<XpActicityUser>().eq("is_deleted", 0).eq("user_type", 5)
                .last("  and JSON_CONTAINS(user_list, '" + uid + "', '$')"));
        actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
        XpActivity one = this.getOne(new QueryWrapper<XpActivity>().eq("status", 2).eq("is_deleted", 0)
                .eq("enable_float_window", 1).in(!actitctiyIds.isEmpty(), "id", actitctiyIds)
                .last(" and now() between start_time and end_time order by float_window_priority desc limit 1"));
        return one;
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java
@@ -186,7 +186,7 @@
                nearestNextVo.setStationId(xpPoint.getStationId()==null?null:xpPoint.getStationId().toString());
                // 判断是否收藏
                if(pointIdsByUserId!=null && !pointIdsByUserId.getData().isEmpty()){
                if(pointIdsByUserId.getData()!=null && !pointIdsByUserId.getData().isEmpty()){
                    if(pointIdsByUserId.getData().contains(xpPoint.getId())){
                        nearestNextVo.setIsCollect(1);
                    }
@@ -734,6 +734,7 @@
            orderDistanceVo.setMinDistance(xpSystemSetting.getMinOrderDistance());
            orderDistanceVo.setAdsorptionDistance(xpSystemSetting.getAdsorptionDistance());
            orderDistanceVo.setNearPointDistance(xpSystemSetting.getNearPointDistance());
            orderDistanceVo.setTemperatureUnit(xpSystemSetting.getTemperatureUnit());
            return orderDistanceVo;
        }
        return orderDistanceVo;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/OrderDistanceVo.java
@@ -20,4 +20,7 @@
    @ApiModelProperty(value = "吸附距离")
    private Integer adsorptionDistance;
    @ApiModelProperty(value = "天气单位")
    private String temperatureUnit;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -154,7 +154,7 @@
    @GetMapping("/getOrderHistoryTrajectory/{orderId}")
    @ApiOperation(value = "根据订单号查询实际行驶路径", notes = "客服系统对接")
    @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path")
    public R<List<TrajectoryVo>> getOrderHistoryTrajectory(@PathVariable Long orderId){
    public R<OrderHistoryTrajectoryVo> getOrderHistoryTrajectory(@PathVariable Long orderId){
        List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(Query.query(Criteria.where("orderId").is(orderId)), OrderTrajectory.class);
        List<TrajectoryVo> collect = orderTrajectoryList.stream().map(trajectory -> {
            String[] split = trajectory.getLocation().split(",");
@@ -163,7 +163,9 @@
            jsonObject.setLat(Double.parseDouble(split[1]));
            return jsonObject;
        }).collect(Collectors.toList());
        return R.ok(collect);
        OrderHistoryTrajectoryVo vo = new OrderHistoryTrajectoryVo();
        vo.setActualPath(collect);
        return R.ok(vo);
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -68,6 +68,8 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -707,4 +709,25 @@
        vo.setSlaveMacList(jsonObject.getList("slaveMacList", String.class));
        return R.ok(vo);
    }
    /**
     * 判断用户类型
     * @param userId
     * @return 2=老用户,3=新用户,4=流失用户
     */
    @PostMapping("/logan/inner/order/determineUserType")
    public R<Integer> determineUserType(@RequestParam Long userId){
        //判断流失用户
        XpOrder one = xpOrderService.getOne(new QueryWrapper<XpOrder>().eq("app_user_id", userId).in("status", Arrays.asList(9, 10)).last(" order by create_time desc limit 1"));
        if(null != one){
            long time = LocalDateTime.now().toEpochSecond(ZoneOffset.of("GMT+8")) - one.getCreateTime().toEpochSecond(ZoneOffset.of("GMT+8"));
            if(time >= 60 * 60 * 24 * 5){
                return R.ok(4);
            }
            return R.ok(2);
        }else{
            return R.ok(3);
        }
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderHistoryTrajectoryVo.java
New file
@@ -0,0 +1,17 @@
package com.xiaopeng.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel
public class OrderHistoryTrajectoryVo {
    @ApiModelProperty("预估行驶路径")
    private List<TrajectoryVo> estimatedPath;
    @ApiModelProperty("实际行驶路径")
    private List<TrajectoryVo> actualPath;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatus.java
New file
@@ -0,0 +1,14 @@
package com.xiaopeng.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class VehicleSeatStatus {
    @ApiModelProperty("座椅状态")
    private String seatOccupied;
    @ApiModelProperty("安全带状态")
    private String seatbeltFastened;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleSeatStatusVo.java
@@ -9,11 +9,11 @@
@ApiModel
public class VehicleSeatStatusVo {
    @ApiModelProperty("主驾")
    private String frontLeft;
    private VehicleSeatStatus frontLeft;
    @ApiModelProperty("副驾")
    private String frontRight;
    private VehicleSeatStatus frontRight;
    @ApiModelProperty("左后")
    private String rearLeft;
    private VehicleSeatStatus rearLeft;
    @ApiModelProperty("右后")
    private String rearRight;
    private VehicleSeatStatus rearRight;
}