From c095cf1ef192a1ac4cfd1868bdf70de2b340a2f5 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期六, 18 四月 2026 15:51:40 +0800
Subject: [PATCH] resolve conflict

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java                           |   53 ++++--
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java                       |    7 
 xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    3 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java               |   22 ++
 xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml                                |   22 ++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                        |   65 ++++++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpActicityClient.java                          |   22 ++
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java                     |   12 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java                   |    3 
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java            |   51 ++++-
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/XpAppUserCouponPageListQuery.java                      |   35 ++++
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java                    |    5 
 xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java            |   12 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/UcUserInfo.java                                          |    6 
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java                |   32 +++
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java               |   11 +
 xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml                                |    8 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpActicityClientFallbackFactory.java               |   26 +++
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java             |   14 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java                     |    4 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java                              |   28 +++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpWhitelist.java                                     |   10 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpWhitelistExportExcel.java             |   11 +
 23 files changed, 416 insertions(+), 46 deletions(-)

diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
index c964bcf..50a41ce 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.account.controller;
 
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xiaopeng.account.model.dto.ReceiveCouponDto;
 import com.xiaopeng.account.model.dto.SendCouponDto;
@@ -11,19 +12,23 @@
 import com.xiaopeng.account.service.IXpAppUserCouponService;
 import com.xiaopeng.api.dto.account.GetUserCouponDto;
 import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest;
-import com.xiaopeng.api.vo.account.NavigationCouponPickerVo;
 import com.xiaopeng.api.dto.account.UseUserCouponDto;
 import com.xiaopeng.api.feignClient.account.UserResourcesClient;
+import com.xiaopeng.api.feignClient.operation.XpActicityClient;
 import com.xiaopeng.api.feignClient.operation.XpCouponClient;
 import com.xiaopeng.api.feignClient.operation.XpOpenCityClient;
 import com.xiaopeng.api.model.account.XpAppUserCoupon;
 import com.xiaopeng.api.model.operation.XpCoupon;
+import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery;
+import com.xiaopeng.api.vo.account.NavigationCouponPickerVo;
 import com.xiaopeng.api.vo.account.UserCouponVo;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.math.BigDecimal;
@@ -51,6 +56,9 @@
     private final UserResourcesClient userResourcesClient;
     private final XpCouponClient xpCouponClient;
 
+    @Resource
+    private XpActicityClient xpActicityClient;
+
 
     public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient, UserResourcesClient userResourcesClient, XpCouponClient xpCouponClient) {
         this.xpAppUserCouponService = xpAppUserCouponService;
@@ -59,6 +67,18 @@
         this.xpCouponClient = xpCouponClient;
     }
 
+    @PostMapping("/v1/api/appUserCoupon/pageList")
+    @ApiOperation(value = "用户优惠券列表",tags = {"管理后台-用户优惠券列表"},response = XpAppUserCouponListVo.class)
+    public R<PageInfo<XpAppUserCouponListVo>> pageList(@RequestBody XpAppUserCouponPageListQuery query) {
+
+        if(StrUtil.isNotBlank(query.getActicityName()) ){
+            List<String> acticityIds = xpActicityClient.findListToIds(query.getActicityName()).getData();
+            query.setActicityIds(acticityIds);
+        }
+
+        PageInfo<XpAppUserCouponListVo> pageList = xpAppUserCouponService.pageList(query);
+        return R.ok(pageList);
+    }
 
     @PostMapping("/logan/inner/appUserCoupon/getUserCoupon")
     public R<UserCouponVo> getUserCoupon(@RequestBody GetUserCouponDto dto) {
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
index 3f7b824..58464fc 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
@@ -5,7 +5,11 @@
 import com.xiaopeng.account.model.query.XpUserCouponListQuery;
 import com.xiaopeng.account.model.vo.XpAppUserCouponListVo;
 import com.xiaopeng.api.model.account.XpAppUserCoupon;
+import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery;
+import com.xiaopeng.common.core.web.page.PageInfo;
 import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -19,4 +23,7 @@
 
     Page<XpAppUserCouponListVo> userCouponList(@Param("page") Page<XpAppUserCouponListVo> page, @Param("query") XpUserCouponListQuery query, @Param("uid") Long uid);
 
+
+    List<XpAppUserCouponListVo> pageList(@Param("pageInfo") PageInfo<XpAppUserCouponListVo> pageInfo, @Param("query") XpAppUserCouponPageListQuery query);
+
 }
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
index 4e6e93c..976999e 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponListVo.java
@@ -1,5 +1,7 @@
 package com.xiaopeng.account.model.vo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -12,8 +14,14 @@
 @ApiModel("用户优惠券列表Vo")
 public class XpAppUserCouponListVo {
 
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
     @ApiModelProperty(value = "Id")
     private String couponId;
+
+    @ApiModelProperty(value = "用户id 根据手机号获取")
+    private Long appUserId;
 
     @ApiModelProperty(value = "优惠券名称")
     private String title;
@@ -45,4 +53,8 @@
 
     @ApiModelProperty(value = "优惠券说明")
     private String couponDesc;
+
+    @ApiModelProperty(value = "活动名称")
+    private String acticityName;
+
 }
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
index 84498ed..1d9584a 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
@@ -4,12 +4,15 @@
 import com.xiaopeng.account.model.dto.ReceiveCouponDto;
 import com.xiaopeng.account.model.dto.SendCouponDto;
 import com.xiaopeng.account.model.query.XpUserCouponListQuery;
+import com.xiaopeng.account.model.vo.XpAppUserCouponListVo;
 import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo;
 import com.xiaopeng.account.model.vo.XpAppUserCouponVo;
 import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest;
 import com.xiaopeng.api.model.account.XpAppUserCoupon;
+import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery;
 import com.xiaopeng.api.vo.account.NavigationCouponPickerVo;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.web.page.PageInfo;
 
 import java.util.List;
 
@@ -23,6 +26,8 @@
  */
 public interface IXpAppUserCouponService extends IService<XpAppUserCoupon> {
 
+    PageInfo<XpAppUserCouponListVo> pageList(XpAppUserCouponPageListQuery query);
+
     /**
      * 获取用户优惠券列表
      * @param query
diff --git a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
index 8a806f5..a4a1535 100644
--- a/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
+++ b/xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -5,7 +5,6 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import com.xiaopeng.account.mapper.XpAppUserCouponMapper;
 import com.xiaopeng.account.model.dto.ReceiveCouponDto;
 import com.xiaopeng.account.model.dto.SendCouponDto;
@@ -18,6 +17,7 @@
 import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest;
 import com.xiaopeng.api.dto.account.UcUserInfo;
 import com.xiaopeng.api.enums.NavigationCouponBubbleType;
+import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery;
 import com.xiaopeng.api.vo.account.NavigationCouponItemVo;
 import com.xiaopeng.api.vo.account.NavigationCouponPickerVo;
 import com.xiaopeng.api.feignClient.account.UserResourcesClient;
@@ -27,6 +27,7 @@
 import com.xiaopeng.api.model.operation.XpCoupon;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.utils.DateUtils;
+import com.xiaopeng.common.core.web.page.PageInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -63,6 +64,15 @@
     private UserResourcesClient userResourcesClient;
 
 
+    @Override
+    public PageInfo<XpAppUserCouponListVo> pageList(XpAppUserCouponPageListQuery query) {
+        PageInfo<XpAppUserCouponListVo> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
+        List<XpAppUserCouponListVo> list = this.baseMapper.pageList(pageInfo,query);
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+
     /**
      * 获取用户优惠券列表
      *
diff --git a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
index c48fb82..48b7ae4 100644
--- a/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
+++ b/xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -7,7 +7,27 @@
         id, full_money, money, expiration_time, status, coupon_type, app_user_id, coupon_id, activity_id, activity_type, is_deleted, create_time, update_time, create_by, update_by
     </sql>
 
-
+    <select id="pageList" resultType="com.xiaopeng.account.model.vo.XpAppUserCouponListVo">
+        select a.*
+        from xp_app_user_coupon as a
+        where a.is_deleted = 0 and a.app_user_id = #{appUserId}
+        <if test="query.createTimeStart != null ">
+            a.create_time >= #{query.createTimeStart}
+        </if>
+        <if test="query.createTimeEnd != null ">
+            a.create_time &lt;= #{query.createTimeEnd}
+        </if>
+        <if test="query.status != null">
+            and a.status = #{query.status}
+        </if>
+        <if test="query.acticityIds != null">
+            and a.activity_id in
+            <foreach item="item" collection="query.acticityIds" separator="," open="(" close=")" index="">
+                #{item}
+            </foreach>
+        </if>
+        order by a.create_time desc
+    </select>
 
     <select id="userCouponList" resultType="com.xiaopeng.account.model.vo.XpAppUserCouponListVo">
         select t.*,t.status  from (
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/UcUserInfo.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/UcUserInfo.java
index bcb0549..665656f 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/UcUserInfo.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/UcUserInfo.java
@@ -12,13 +12,13 @@
     private String appId;
     private String headImg;
     private Long id;
-    private String mobile;
-    private String nickName;
+    private String mobile;//用户手机号
+    private String nickName;//用户名称
     private List<String> orderList;
     private Integer orderType;
     private Integer state;
     private Integer type;
-    private Long uid;
+    private Long uid; //用户id
     private List<String> bindCars; // 空时为 null
     private Integer musicVip;      // 0-非音频会员,1-音频会员
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpActicityClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpActicityClientFallbackFactory.java
new file mode 100644
index 0000000..d84e8f6
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpActicityClientFallbackFactory.java
@@ -0,0 +1,26 @@
+package com.xiaopeng.api.factory.operation;
+
+import com.xiaopeng.api.feignClient.operation.XpActicityClient;
+import com.xiaopeng.common.core.domain.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Slf4j
+@Component
+public class XpActicityClientFallbackFactory implements FallbackFactory<XpActicityClient> {
+
+    @Override
+    public XpActicityClient create(Throwable cause) {
+        return new XpActicityClient() {
+
+            @Override
+            public R<List<String>> findListToIds(String acticityName) {
+                return R.ok();
+            }
+        };
+    }
+
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpActicityClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpActicityClient.java
new file mode 100644
index 0000000..7a071d8
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpActicityClient.java
@@ -0,0 +1,22 @@
+package com.xiaopeng.api.feignClient.operation;
+
+
+import com.xiaopeng.api.factory.operation.XpCouponClientFallbackFactory;
+import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(contextId = "XpActicityClient",
+        value = ServiceNameConstantsEnum.XP_OPERATION_SERVICE,
+        fallbackFactory = XpCouponClientFallbackFactory.class)
+public interface XpActicityClient {
+
+
+
+    @PostMapping("/logan/inner/acticity/findListToIds")
+    R<List<String>> findListToIds(@RequestParam("acticityName") String acticityName);
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpWhitelist.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpWhitelist.java
index e16ab1d..a931556 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpWhitelist.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpWhitelist.java
@@ -60,9 +60,15 @@
     @Max(value = 99999, message = "最大不能超过99999")
     private Integer maxOrderNum;
 
+    @ApiModelProperty(value = "用户id 根据手机号获取")
+    private Long appUserId;
+
     public Boolean getStatus() {
-        if (LocalDate.now().isAfter(expireTime)) {
-            return false;
+        if(expireTime!= null){
+            if (LocalDate.now().isAfter(expireTime)) {
+                return false;
+            }
+            return status;
         }
         return status;
     }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/XpAppUserCouponPageListQuery.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/XpAppUserCouponPageListQuery.java
new file mode 100644
index 0000000..0ea9705
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/account/XpAppUserCouponPageListQuery.java
@@ -0,0 +1,35 @@
+package com.xiaopeng.api.query.account;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xiaopeng.common.core.web.page.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class XpAppUserCouponPageListQuery extends BasePage {
+
+
+    @ApiModelProperty(value = "用户id 根据手机号获取")
+    private Long appUserId;
+
+
+    @ApiModelProperty(value = "状态 1-未使用 2-已使用 3-已过期 0待领取")
+    private Integer status;
+
+    @ApiModelProperty(value = "活动名称")
+    private String acticityName;
+
+    @ApiModelProperty(value = "领取时间开始")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime createTimeStart;
+
+    @ApiModelProperty(value = "领取时间结束")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime createTimeEnd;
+
+    private List<String> acticityIds;
+
+}
diff --git a/xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index d684e63..783548b 100644
--- a/xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -56,4 +56,5 @@
 com.xiaopeng.api.factory.map.XpStationClientFallbackFactory
 com.xiaopeng.api.factory.pushMessage.SubscribeMessageClientFallbackFactory
 com.xiaopeng.api.factory.account.UserSubscribeMessageClientFallbackFactory
-com.xiaopeng.api.factory.operation.XpTradingStrategyClientFallbackFactory
\ No newline at end of file
+com.xiaopeng.api.factory.operation.XpTradingStrategyClientFallbackFactory
+com.xiaopeng.api.factory.operation.XpActicityClientFallbackFactory
\ No newline at end of file
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
index ac5d93d..d2df9a8 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -1,9 +1,17 @@
 package com.xiaopeng.operation.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.operation.service.IXpActicityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
-import org.springframework.stereotype.Controller;
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -13,8 +21,24 @@
  * @author mitao
  * @since 2026-02-03
  */
-@Controller
-@RequestMapping("/xp-acticity")
+@Api(tags = "活动管理")
+@RequiredArgsConstructor(onConstructor_ = @Lazy)
 public class XpActicityController {
 
+    @Resource
+    private IXpActicityService xpActicityService;
+
+
+    /**
+     * 获取所有白名单手机号
+     * @return
+     */
+    @PostMapping("/logan/inner/acticity/findListToIds")
+    @ApiOperation(value = "获取活动信息ids", tags = {"管理后台-获取活动信息ids"})
+    public R<List<String>> findListToIds(@RequestParam String acticityName){
+        if(acticityName == null){
+            return R.ok();
+        }
+        return R.ok(xpActicityService.findListToIds(acticityName));
+    }
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
index 88450fd..d31d6a9 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
@@ -82,6 +82,14 @@
         return R.ok(xpWhitelistService.getAllWhiteList());
     }
 
+
+    @ApiOperation(value = "白名单管理详情", tags = {"管理后台-白名单管理详情"})
+    @GetMapping("/api/v1/whitelist/detail/{id}")
+    public R<XpWhitelist> detail(@PathVariable("id") Long id) {
+        return R.ok(xpWhitelistService.getById(id));
+    }
+
+
     @ApiOperation(value = "白名单管理分页列表", response = XpWhitelist.class)
     @PostMapping("/api/v1/whitelist/pageList")
     public R<PageInfo<XpWhitelist>> pageList(@RequestBody WhitelistPageListQuery query) {
@@ -412,6 +420,9 @@
             xpWhitelistExportExcel.setNickName(xpWhitelist.getNickName());
             xpWhitelistExportExcel.setStatus(xpWhitelist.getStatus());
             xpWhitelistExportExcel.setIsPriorityDispatch(xpWhitelist.getIsPriorityDispatch());
+            xpWhitelistExportExcel.setExpireTime(xpWhitelist.getExpireTime().toString());
+            xpWhitelistExportExcel.setMaxOrderNum(xpWhitelist.getMaxOrderNum());
+
             xpWhitelistExportExcel.setCreateBy(xpWhitelist.getCreateBy());
             LocalDateTime createTime = xpWhitelist.getCreateTime();
             // 将LocalDateTime转化为yyyy-MM-dd HH:mm:ss格式字符串
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpWhitelistExportExcel.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpWhitelistExportExcel.java
index 45008a4..938867e 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpWhitelistExportExcel.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpWhitelistExportExcel.java
@@ -1,6 +1,6 @@
 package com.xiaopeng.operation.exportExcle;
 
-import com.xiaopeng.common.core.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -39,9 +39,16 @@
 
     @ApiModelProperty(value = "优先派单 1=是 0=否")
     @cn.afterturn.easypoi.excel.annotation.Excel(name = "优先派单",width = 20,replace = {"是_true","否_false"})
-
     private Boolean isPriorityDispatch;
 
+    @ApiModelProperty(value = "有限期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @cn.afterturn.easypoi.excel.annotation.Excel(name = "有限期",width = 20)
+    private String expireTime;
+
+    @ApiModelProperty(value = "最大下单数量")
+    @cn.afterturn.easypoi.excel.annotation.Excel(name = "最大下单数量",width = 20)
+    private Integer maxOrderNum;
 
     @ApiModelProperty(value = "记录创建人,前端忽略")
     @cn.afterturn.easypoi.excel.annotation.Excel(name = "创建人",width = 20)
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java
index 8bc936e..28e760d 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/WhitelistPageListQuery.java
@@ -19,4 +19,7 @@
     @ApiModelProperty(value = "选中的记录id集合")
     private List<Long> ids;
 
+
+
+
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java
index 636ee4c..49c64fc 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActicityService.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xiaopeng.api.model.operation.XpActicity;
 
+import java.util.List;
+
 /**
  * <p>
  * 活动管理 服务类
@@ -13,4 +15,6 @@
  */
 public interface IXpActicityService extends IService<XpActicity> {
 
+
+    List<String> findListToIds(String acticityName);
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
index a3c5905..988a4be 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -1,10 +1,13 @@
 package com.xiaopeng.operation.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xiaopeng.api.model.operation.XpActicity;
 import com.xiaopeng.operation.mapper.XpActicityMapper;
 import com.xiaopeng.operation.service.IXpActicityService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -17,4 +20,15 @@
 @Service
 public class XpActicityServiceImpl extends ServiceImpl<XpActicityMapper, XpActicity> implements IXpActicityService {
 
+
+
+    @Override
+    public List<String> findListToIds(String acticityName){
+        LambdaQueryWrapper<XpActicity > query = new LambdaQueryWrapper<>();
+        query.select(XpActicity::getId);
+        query.eq(XpActicity::getDeleted, 0);
+        query.like(XpActicity::getActicityName, acticityName);
+        return listObjs(query, Object::toString);
+    }
+
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
index def55b3..00c88c5 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
@@ -2,6 +2,9 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.PhoneUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiaopeng.api.dto.account.UcUserInfo;
+import com.xiaopeng.api.feignClient.account.UserResourcesClient;
 import com.xiaopeng.api.model.account.SysUser;
 import com.xiaopeng.api.model.operation.XpWhitelist;
 import com.xiaopeng.api.model.operation.XpWhitelistOperlog;
@@ -15,7 +18,6 @@
 import com.xiaopeng.operation.mapper.XpWhitelistOperlogMapper;
 import com.xiaopeng.operation.query.WhitelistPageListQuery;
 import com.xiaopeng.operation.service.IXpWhitelistService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
 import org.apache.shardingsphere.transaction.core.TransactionType;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,15 +26,7 @@
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -48,6 +42,10 @@
 
     @Autowired
     private XpWhitelistOperlogMapper xpWhitelistOperlogMapper;
+    @Autowired
+    private UserResourcesClient userResourcesClient;
+
+
     @Override
     public PageInfo<XpWhitelist> pageList(WhitelistPageListQuery query) {
         PageInfo<XpWhitelist> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
@@ -60,6 +58,15 @@
     public List<XpWhitelist> exportList(WhitelistPageListQuery query) {
         List<XpWhitelist> list = this.baseMapper.exportList(query);
         return list;
+    }
+
+    //根据用户账号 通过接口获取用户id
+    public UcUserInfo getUserByAccount (String account){
+        UcUserInfo userByMobile = userResourcesClient.getUserByMobile(account);
+        if(userByMobile == null){
+            throw new ServiceException(account+"未获取到用户信息");
+        }
+        return userByMobile;
     }
 
     @Override
@@ -83,6 +90,7 @@
         Map<String, Long> reasonCountMap = new HashMap<>();
         Map<String, LinkedHashSet<String>> reasonSampleMap = new HashMap<>();
 
+        Map<String, UcUserInfo> userMap = new HashMap<>();
         Set<String> seenAccounts = new HashSet<>();
         List<String> candidates = new ArrayList<>();
         for (String account : accounts) {
@@ -94,7 +102,12 @@
                 recordFail(reasonCountMap, reasonSampleMap, "文件内重复", account, sampleLimitPerReason);
                 continue;
             }
-            candidates.add(account);
+            //根据用户账号 通过接口获取用户id
+            UcUserInfo userByAccount = this.getUserByAccount(account);
+            if(userByAccount != null){
+                candidates.add(account);
+                userMap.put(account, userByAccount);
+            }
         }
         if (CollUtil.isEmpty(candidates)) {
             return R.fail("所有帐号添加失败,请检查帐号格式或唯一性");
@@ -120,6 +133,8 @@
             }
             XpWhitelist xpWhitelist = new XpWhitelist();
             xpWhitelist.setAccount(account);
+            xpWhitelist.setNickName(userMap.get(account).getNickName());
+            xpWhitelist.setAppUserId(userMap.get(account).getUid());
             xpWhitelist.setStatus(true);
             xpWhitelist.setIsPriorityDispatch(dto.getIsPriorityDispatch());
             xpWhitelist.setWhitelistSource(1);
@@ -240,6 +255,7 @@
         if (!PhoneUtil.isMobile(dto.getAccount())) {
             throw new ServiceException("以下帐号格式不正确:", I18nKeyConstant.ACCOUNT_FORMAT_ERROR, new Object[]{dto.getAccount()});
         }
+        UcUserInfo userByAccount = this.getUserByAccount(dto.getAccount());
         XpWhitelist old = this.lambdaQuery()
                 .eq(XpWhitelist::getAccount, dto.getAccount())
                 .ne(XpWhitelist::getId, dto.getId())
@@ -249,13 +265,15 @@
         }
         XpWhitelist whitelist = this.getById(dto.getId());
 
+        whitelist.setAppUserId(userByAccount.getUid());
+
         StringBuilder operationContent = new StringBuilder("编辑账号:");
         StringBuilder accountBuilder = new StringBuilder();
         if (!whitelist.getAccount().equals(dto.getAccount())) {
             accountBuilder.append("白名单账号" + "\"" + whitelist.getAccount() + "\"" + "为" + "\"" + dto.getAccount() + "\"");
         }
         if (StringUtils.hasLength(whitelist.getNickName()) || StringUtils.hasLength(dto.getNickName())) {
-            if (!StringUtils.hasLength(whitelist.getNickName())) {
+            if (StringUtils.hasLength(whitelist.getNickName())) {
                 if (!whitelist.getNickName().equals(dto.getNickName())) {
                     accountBuilder.append("用户名称" + "\"" + whitelist.getNickName() + "\"" + "为" + "\"" + dto.getNickName() + "\"");
                 }
@@ -271,6 +289,15 @@
         if (whitelist.getIsPriorityDispatch() != dto.getIsPriorityDispatch()) {
             accountBuilder.append("优先派单" + "\"" + (whitelist.getIsPriorityDispatch() ? "是" : "否") + "\"" + "为" + "\"" + (dto.getIsPriorityDispatch() ? "是" : "否") + "\"");
         }
+        if ( !dto.getMaxOrderNum().equals(whitelist.getMaxOrderNum()) ) {
+            accountBuilder.append("最大下单数量" + "\"" + whitelist.getMaxOrderNum() + "\"" + "为" + "\"" + dto.getMaxOrderNum() + "\"");
+            whitelist.setMaxOrderNum(dto.getMaxOrderNum());
+        }
+        if (!whitelist.getExpireTime().isEqual(dto.getExpireTime())) {
+            accountBuilder.append("有限期" + "\"" + whitelist.getExpireTime() + "\"" + "为" + "\"" + dto.getExpireTime() + "\"");
+            whitelist.setExpireTime(dto.getExpireTime());
+        }
+
         XpWhitelistOperlog xpWhitelistOperlog = new XpWhitelistOperlog();
         xpWhitelistOperlog.setOperationName(sysUser.getNickName());
         xpWhitelistOperlog.setOperationAccount(sysUser.getPhoneNumber());
diff --git a/xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml b/xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml
index 23801ec..70c6bee 100644
--- a/xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml
+++ b/xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpWhitelistMapper.xml
@@ -4,11 +4,12 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, nick_name, account, status, is_priority_dispatch, whitelist_source,expire_time, is_deleted, create_time, update_time, create_by, update_by
+        id, nick_name, account, status, is_priority_dispatch, whitelist_source,expire_time,max_order_num, is_deleted, create_time, update_time, create_by, update_by
     </sql>
     <select id="pageList" resultType="com.xiaopeng.api.model.operation.XpWhitelist">
         select
-            id,nick_name as nickName,account,status,is_priority_dispatch as isPriorityDispatch,whitelist_source as whitelistSource,expire_time as expireTime
+            id,nick_name as nickName,account,status,is_priority_dispatch as isPriorityDispatch,whitelist_source as whitelistSource,
+            expire_time as expireTime,max_order_num as maxOrderNum
         ,create_time as createTime,update_time as updateTime,create_by as createBy,update_by as updateBy
         from xp_whitelist
         where is_deleted = 0
@@ -25,7 +26,8 @@
         order by create_time desc
     </select>
     <select id="exportList" resultType="com.xiaopeng.api.model.operation.XpWhitelist">
-        select id,nick_name as nickName,account,status,is_priority_dispatch as isPriorityDispatch,whitelist_source as whitelistSource,expire_time as expireTime
+        select id,nick_name as nickName,account,status,is_priority_dispatch as isPriorityDispatch,whitelist_source as whitelistSource,
+        expire_time as expireTime,max_order_num as maxOrderNum
         ,create_time as createTime,update_time as updateTime,create_by as createBy,update_by as updateBy
         from xp_whitelist
         where is_deleted = 0
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
index e97452f..c68088b 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -19,10 +19,13 @@
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.order.*;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.utils.WebUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.redis.service.RedisService;
 import com.xiaopeng.order.mangodb.model.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
 import com.xiaopeng.order.model.dto.XpOrderCommentDto;
 import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
 import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -62,6 +65,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -82,6 +86,7 @@
     private MongoTemplate mongoTemplate;
     @Resource
     private XpVehicleClient xpVehicleClient;
+    private OrderTrajectoryService orderTrajectoryService;
 
     /**
      * 获取订单统计数据(内部接口)
@@ -346,9 +351,9 @@
         String uid = request.getHeader("XP-Uid");
         OrderDetailVo orderDetailVo = xpOrderService.orderDetail(orderId, uid);
         BigDecimal orderMoney = orderDetailVo.getOrderMoney();
-        if(orderMoney==null){
+        if (orderMoney == null) {
             orderDetailVo.setOrderMoneyStr("0.00");
-        }else {
+        } else {
             orderDetailVo.setOrderMoneyStr(orderMoney.setScale(2, RoundingMode.HALF_UP).toString());
         }
         return R.ok(orderDetailVo);
@@ -361,10 +366,10 @@
     @ApiOperation(value = "获取历史下单成功起点10条数据列表", tags = {"小程序-获取历史下单成功起点10条数据列表"})
     @GetMapping("/base/v1/mini-program/history/startPoints")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
-    public R<List<XpHistoryStartPointsVo>> getHistoryStartPoints(double lon, double lat,Long electronicAreaId, HttpServletRequest request) {
+    public R<List<XpHistoryStartPointsVo>> getHistoryStartPoints(double lon, double lat, Long electronicAreaId, HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        return R.ok(xpOrderService.getHistoryStartPoints(uid, lon, lat,electronicAreaId));
+        return R.ok(xpOrderService.getHistoryStartPoints(uid, lon, lat, electronicAreaId));
     }
 
     /**
@@ -373,10 +378,10 @@
     @ApiOperation(value = "获取历史下单成功终点10条数据列表", tags = {"小程序-获取历史下单成功终点10条数据列表"})
     @GetMapping("/base/v1/mini-program/history/endPoints")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
-    public R<List<XpHistoryEndPointsVo>> getHistoryEndPoints(double lon, double lat,Long electronicAreaId, HttpServletRequest request) {
+    public R<List<XpHistoryEndPointsVo>> getHistoryEndPoints(double lon, double lat, Long electronicAreaId, HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        return R.ok(xpOrderService.getHistoryEndPoints(uid, lon, lat,electronicAreaId));
+        return R.ok(xpOrderService.getHistoryEndPoints(uid, lon, lat, electronicAreaId));
     }
 
 
@@ -464,7 +469,6 @@
     }
 
 
-
     /**
      * +
      * 获取行程费用明细
@@ -532,7 +536,7 @@
      */
     @ApiOperation(value = "行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8")
     @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus")
-    public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId ) {
+    public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId) {
 //        Integer status = OrderStatusEnum.SEE_OFF_GUESTS.getCode();
         return xpOrderService.carAbnormalUpdateOrderStatus(orderId);
     }
@@ -567,7 +571,7 @@
     @PostMapping("/api/v1/mini-program/order/queryOrderRoute")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
     public R<RouteVo> queryOrderRoute(@Validated @RequestBody QueryOrderRouteDTO dto, HttpServletRequest request) {
-        if(dto.getOrderId() == null){
+        if (dto.getOrderId() == null) {
             return R.fail("参数不能为空");
         }
         String uid = request.getHeader("XP-Uid");
@@ -592,6 +596,7 @@
         routeVo.setDirection(null != vehiclePosition ? vehiclePosition.getCourse() : 90);
         return R.ok(routeVo);
     }
+
     /**
      * 订单查询轨迹路线
      */
@@ -599,7 +604,7 @@
     @GetMapping("/api/v1/mini-program/order/queryOrderTrajectory")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
     public R<RouteVo> queryOrderTrajectory(@RequestParam String orderId, HttpServletRequest request) {
-        if(orderId == null){
+        if (orderId == null) {
             return R.fail("参数不能为空");
         }
         List<OrderTrajectory> trajectories = mongoTemplate.find(
@@ -610,7 +615,7 @@
         // 封装信息
         RouteVo routeVo = new RouteVo();
         List<LonLatDto> polyline = new ArrayList<>();
-        if(!CollectionUtils.isEmpty(trajectories)){
+        if (!CollectionUtils.isEmpty(trajectories)) {
             for (OrderTrajectory trajectory : trajectories) {
                 LonLatDto lonLatDto = new LonLatDto();
                 String[] split = trajectory.getLocation().split(",");
@@ -624,7 +629,6 @@
     }
 
 
-
     /**
      * 当日取消订单次数
      *
@@ -632,13 +636,30 @@
      * @return 订单数量
      */
     @PostMapping("/inner/order/todayCancellationCount")
-    public R<Integer> todayCancellationCount(@RequestParam Long userId){
+    public R<Integer> todayCancellationCount(@RequestParam Long userId) {
         long count = xpOrderService.count(new QueryWrapper<XpOrder>().eq("app_user_id", userId).eq("status", 0)
                 .eq("is_deleted", 0).last(" and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')"));
-        return R.ok((int)count);
+        return R.ok((int) count);
     }
 
 
 
-
-}
+    @ApiOperation(value = "通过订单id获取蓝牙开锁秘钥", tags = {"小程序-业务流程"})
+    @GetMapping("/api/v1/mini-program/bluetooth/getUnlocktToken/{orderId}")
+    @XpClientCheck(checkToken = false, checkOtpToken = true)
+    public R<String> getBluetoothToken(@PathVariable("orderId") Long orderId, HttpServletRequest request) {
+        String uid = request.getHeader("XP-Uid");
+        XpOrder xpOrder = xpOrderService.getById(orderId);
+        if (!Objects.equals(xpOrder.getAppUserId(), Long.valueOf(uid))) {
+            return R.ok();
+        }
+        if(!Arrays.asList(4, 5, 6, 7, 8).contains(xpOrder.getStatus())){
+            return R.ok();
+        }
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId);
+        if (StringUtils.isBlank(token)) {
+            return R.ok();
+        }
+        return R.ok(token);
+    }
+}
\ No newline at end of file
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index 6d8ca7d..09fb510 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -642,9 +642,25 @@
         Long userId = order.getAppUserId();
         if (order.getStatus() == 1) {
             order.setStatus(0);
+            Long appUserId = order.getAppUserId();
             order.setAppUserId(null);
             baseMapper.updateById(order);
+            order.setAppUserId(appUserId);
             redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+            //删除蓝牙秘钥
+            String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+            if(StringUtils.isNotBlank(token)){
+                redisService.deleteObject("rt:bluetooth:unlock:" + token);
+                redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+                XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+                BluetoothDeliverVo vo = new BluetoothDeliverVo();
+                vo.setVim(xpVehicle.getVehicleVin());
+                vo.setPassengerUid(order.getAppUserId());
+                BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+                if(null == delete || delete.getCode() != 0){
+                    log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+                }
+            }
             // 消息推送
             Map<String, Object> params = new HashMap<>();
             Map<String, Object> content = new HashMap<>();
@@ -1670,9 +1686,25 @@
             addCruiseMission(xpVehicle.getId());
         }
         order.setStatus(0);
+        Long appUserId = order.getAppUserId();
         order.setAppUserId(null);
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
 
         XpOrderCancel xpOrderCancel = new XpOrderCancel();
         xpOrderCancel.setOrderId(orderId);
@@ -1696,7 +1728,23 @@
         order.setStatus(0);
         order.setAppUserId(null);
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
+
         XpOrderCancel xpOrderCancel = new XpOrderCancel();
         xpOrderCancel.setOrderId(Long.valueOf(orderId));
         xpOrderCancel.setUserId(1l);
@@ -2044,10 +2092,26 @@
             throw new RuntimeException("订单状态错误");
         }
         order.setStatus(8);
+        Long appUserId = order.getAppUserId();
         order.setAppUserId(null);
         order.setTripEnd(LocalDateTime.now());
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 8, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId);
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + orderId);
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
 
         // 根据订单所属开通城市id 查询定价
         XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(),order.getVehicleId());
@@ -3331,6 +3395,7 @@
                     throw new ServiceException("下发蓝牙token失败");
                 }
                 if(deliver.getCode() != 0){
+                    log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber());
                     throw new ServiceException(deliver.getMsg());
                 }
                 log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber());
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java
index 0eef366..28f5d03 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/utils/TaskOrderCancelUtil.java
@@ -2,7 +2,13 @@
 
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
+import com.xiaopeng.api.feignClient.vehicleConvoy.BluetoothUnlockClient;
+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.vo.vehicleConvoy.BluetoothDeliverVo;
+import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.redis.service.RedisService;
 import com.xiaopeng.order.service.IXpOrderService;
 import lombok.extern.slf4j.Slf4j;
@@ -10,6 +16,7 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -24,6 +31,12 @@
 
     @Autowired
     private RedisService redisService;
+
+    @Resource
+    private XpVehicleClient xpVehicleClient;
+
+    @Resource
+    private BluetoothUnlockClient bluetoothUnlockClient;
 
     /**
      * 30秒执行一次
@@ -59,7 +72,22 @@
         order.setAppUserId(null);
         order.setStatus(0);
         xpOrderService.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
     }
 
 

--
Gitblit v1.7.1