puzhibing
2026-04-30 1ee6637e101e539b7e327c779087d81de9d8b129
开发优惠券发放逻辑
1个文件已删除
4个文件已添加
15个文件已修改
657 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SysGroupClientFallbackFactory.java 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | 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 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpOfficialPartner.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/OfficialPartnerResult.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpRideGuideServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/OfficialPartnerUtil.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/OfficialPartnerVo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/PushNewOrderVo.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UpdateOrderStatusVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -403,4 +403,16 @@
        BigDecimal bigDecimal = xpAppUserCouponService.calculateDiscountAmount(vo);
        return R.ok(bigDecimal);
    }
    /**
     * 批量保存数据
     * @param xpAppUserCoupons
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/saveBatch")
    public R<?> saveBatch(@RequestParam List<XpAppUserCoupon> xpAppUserCoupons){
        xpAppUserCouponService.saveBatch(xpAppUserCoupons);
        return R.ok();
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/SysGroupClientFallbackFactory.java
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java
@@ -72,6 +72,11 @@
                log.error("计算优惠金额失败,原因: {}", cause.getMessage());
                return R.fail("计算优惠金额失败");
            }
            @Override
            public R<?> saveBatch(List<XpAppUserCoupon> xpAppUserCoupons) {
                return R.fail("批量保存数据失败");
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
@@ -15,6 +15,7 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
 * 订单Feign客户端降级工厂
@@ -134,6 +135,11 @@
                log.error("获取用户订单数量失败,原因: {}", cause.getMessage());
                return R.fail("获取用户订单数量失败");
            }
            @Override
            public R<List<Long>> getUserTypeIdList(Integer userType) {
                return R.fail("获取各类型用户数据失败");
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -31,12 +31,14 @@
    @PostMapping("/logan/inner/appUserCoupon/getUserCoupon")
    R<UserCouponVo> getUserCoupon(@RequestBody GetUserCouponDto dto);
    @PostMapping("/logan/inner/appUserCoupon/useUserCoupon")
    R<BigDecimal> useUserCoupon(@RequestBody UseUserCouponDto dto);
    /**
     * 退回用户的优惠卷
     *
     * @param dto
     * @return
     */
@@ -50,29 +52,39 @@
    /**
     * userIds 、couponId、activityId、activityName、activityStartTime、activityEndTime、activityRemarks
     *
     * @param dto
     * @return
     */
    @PostMapping("/api/v1/appUserCoupon/saveInfo_activity")
    @ApiOperation(value = "活动发放优惠券", tags = {"管理后台-活动发放优惠券"})
     R<String> saveInfo_activity(@RequestBody UseUserCouponDto dto) ;
    R<String> saveInfo_activity(@RequestBody UseUserCouponDto dto);
    /**
     * 获取用户活动领取的优惠券
     *
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/getXpAppUserCoupon")
    R<List<XpAppUserCoupon>> getXpAppUserCoupon(@RequestParam Long activityId);
    /**
     * 计算优惠金额
     *
     * @param vo
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount")
    R<BigDecimal> calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo);
    /**
     * 批量保存数据
     * @param xpAppUserCoupons
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/saveBatch")
    R<?> saveBatch(@RequestParam List<XpAppUserCoupon> xpAppUserCoupons);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -15,6 +15,8 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * 订单Feign客户端
 *
@@ -169,4 +171,13 @@
     */
    @PostMapping("/logan/inner/order/getUserOrderNum")
    R<Long> getUserOrderNum(@RequestParam Long userId);
    /**
     * 判断用户类型
     * @param userType
     * @return 2=老用户,3=新用户,4=流失用户
     */
    @PostMapping("/logan/inner/order/getUserTypeIdList")
    R<List<Long>> getUserTypeIdList(@RequestParam Integer userType);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpOfficialPartner.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
@@ -39,4 +40,20 @@
     * 应用APPSecret
     */
    private String appSecret;
    /**
     * 下单调用接口地址
     */
    private String createOrderUrl;
    /**
     * 取消订单接口地址
     */
    private String cancelOrderUrl;
    /**
     * 改派订单接口地址
     */
    private String changeOrderUrl;
    /**
     * 修改目的地接口地址
     */
    private String changeDestinationUrl;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/OfficialPartnerResult.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.api.vo.operation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("合作商接口调用结果")
public class OfficialPartnerResult {
    @ApiModelProperty("状态码 0 表示成功")
    private Integer code;
    @ApiModelProperty("状态码描述")
    private String msg;
    @ApiModelProperty("数据")
    private Object data;
}
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -143,7 +143,7 @@
        String fenceId = null;
        if(!operatingArea.isEmpty()){
            fenceId = operatingArea.get(0);
            List<Document> pointsInFence = xpGeoFencingPolygonService.findPointsByParentId(fenceId, "parentId", "prohibited_area");
            List<Document> pointsInFence = xpGeoFencingPolygonService.findPointsByParentId(fenceId, "fenceId", "prohibited_area");
            for (Document document : pointsInFence) {
                List<GeoPoint> points = document.getList("points", GeoPoint.class);
                List<String> coordinatesList = new ArrayList<>();
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpRideGuideServiceImpl.java
@@ -78,12 +78,11 @@
            JSONObject jsonObject = JSON.parseObject(xpRideGuide.getGuideImage());
            String downloadUrl = null;
            try {
                // 1
                downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
//            try {
//                downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
//            } catch (UnsupportedEncodingException e) {
//                throw new RuntimeException(e);
//            }
            jsonObject.put("url", downloadUrl);
            xpRideGuide.setGuideImage(jsonObject.toJSONString());
        }
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/OfficialPartnerUtil.java
New file
@@ -0,0 +1,84 @@
package com.xiaopeng.operation.utils;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.model.operation.XpOfficialPartner;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.vo.operation.OfficialPartnerResult;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.operation.service.IXpOfficialPartnerService;
import com.xiaopeng.operation.vo.PushNewOrderVo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * 合作商工具类
 */
@Component
public class OfficialPartnerUtil {
    @Resource
    private IXpOfficialPartnerService xpOfficialPartnerService;
    @Resource
    private UserResourcesClient userResourcesClient;
    /**
     * 推送新的订单给合作商
     * @param officialPartnerId
     * @return
     */
    public R<?> pusNewOrder(Integer officialPartnerId, XpOrder xpOrder) {
        XpOfficialPartner xpOfficialPartner = xpOfficialPartnerService.getById(officialPartnerId);
        String createOrderUrl = xpOfficialPartner.getCreateOrderUrl();
        PushNewOrderVo pushNewOrderVo = buildNewOrder(xpOrder);
        HttpRequest post = HttpUtil.createPost(createOrderUrl);
        post.body(JSON.toJSONString(pushNewOrderVo));
        HttpResponse execute = post.execute();
        if(!execute.isOk()){
            throw new ServiceException("调用合作商接口失败-通知新订单接口");
        }
        OfficialPartnerResult officialPartnerResult = JSON.parseObject(execute.body(), OfficialPartnerResult.class);
        if(0 == officialPartnerResult.getCode()){
            return R.ok();
        }
        return R.fail(officialPartnerResult.getMsg());
    }
    /**
     * 构建推送订单数据
     * @param xpOrder
     * @return
     */
    private PushNewOrderVo buildNewOrder(XpOrder xpOrder){
        PushNewOrderVo vo = new PushNewOrderVo();
        vo.setOrderNum(xpOrder.getOrderNumber());
        vo.setVehicleModelId(null);
        vo.setVehicleModelName("");
        vo.setPlacementLongitude(xpOrder.getPlacementLon());
        vo.setPlacementLatitude(xpOrder.getPlacementLat());
        vo.setPlacementAddress(xpOrder.getPlacementAddress());
        vo.setStartLongitude(xpOrder.getStartLon());
        vo.setStartLatitude(xpOrder.getStartLat());
        vo.setStartAddress(xpOrder.getStartAddress());
        vo.setEndLongitude(xpOrder.getEndLon());
        vo.setEndLatitude(xpOrder.getEndLat());
        vo.setEndAddress(xpOrder.getEndAddress());
        vo.setUserId(xpOrder.getAppUserId());
        UcUserInfo ucUserInfo = userResourcesClient.getBaseUserByUid(xpOrder.getAppUserId().toString());
        if(ucUserInfo != null){
            vo.setUserPhone(ucUserInfo.getMobile());
        }
        return vo;
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -126,6 +126,9 @@
    @Resource
    private  XpAppUserCouponClient xpAppUserCouponClient;
    @Resource
    private OfficialPartnerUtil officialPartnerUtil;
    // 自定义线程池
    private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
@@ -1075,29 +1078,33 @@
                            continue;
                        }
                        //  关闭巡游单子
                        R stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehiclePosition.getVehicleVin());
                        if (stringR == null || stringR.getCode() != 200) {
                            log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
                            continue;
                        //非合作商的车辆需要处理巡游单
                        if(null != vehiclePosition.getOfficialPartnerId()){
                            //  关闭巡游单子
                            R stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehiclePosition.getVehicleVin());
                            if (stringR == null || stringR.getCode() != 200) {
                                log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
                                continue;
                            }
                            log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
                            // 下发命令
                            PushOrderDto pushOrderDto = new PushOrderDto();
                            pushOrderDto.setVin(vehiclePosition.getVehicleVin());
                            pushOrderDto.setOrderId(xpOrder.getId().toString());
                            pushOrderDto.setStartLatitude(xpOrder.getStartLat());
                            pushOrderDto.setStartLongitude(xpOrder.getStartLon());
                            pushOrderDto.setEndLatitude(xpOrder.getEndLat());
                            pushOrderDto.setEndLongitude(xpOrder.getEndLon());
                            pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
                            pushOrderDto.setOrderType(OrderType.USER_ORDER);
                            pushOrderDto.setStage(1);
                            // 调用推送服务  orderId + carVin
                            orderMissionClient.pushOrder(pushOrderDto);
                            log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
                        }else {
                            //合作商的车辆需要调用合作商的订单通知接口
                            officialPartnerUtil.pusNewOrder(vehiclePosition.getOfficialPartnerId(), xpOrder);
                        }
                        log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
                        // 下发命令
                        PushOrderDto pushOrderDto = new PushOrderDto();
                        pushOrderDto.setVin(vehiclePosition.getVehicleVin());
                        pushOrderDto.setOrderId(xpOrder.getId().toString());
                        pushOrderDto.setStartLatitude(xpOrder.getStartLat());
                        pushOrderDto.setStartLongitude(xpOrder.getStartLon());
                        pushOrderDto.setEndLatitude(xpOrder.getEndLat());
                        pushOrderDto.setEndLongitude(xpOrder.getEndLon());
                        pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
                        pushOrderDto.setStage(1);
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
                        redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                        return true;
@@ -1138,25 +1145,30 @@
                            continue;
                        }
                        //  关闭巡游单子
                        R<?> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehicleId1.getVehicleVin());
                        if (stringR == null || stringR.getCode() != 200) {
                            log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
                            continue;
                        if(null == vehicleId1.getOfficialPartnerId()){
                            //  关闭巡游单子
                            R<?> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehicleId1.getVehicleVin());
                            if (stringR == null || stringR.getCode() != 200) {
                                log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
                                continue;
                            }
                            log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
                            PushOrderDto pushOrderDto = new PushOrderDto();
                            pushOrderDto.setVin(vehiclePosition.getVin());
                            pushOrderDto.setOrderId(xpOrder.getId().toString());
                            pushOrderDto.setStartLatitude(xpOrder.getStartLat());
                            pushOrderDto.setStartLongitude(xpOrder.getStartLon());
                            pushOrderDto.setEndLatitude(xpOrder.getEndLat());
                            pushOrderDto.setEndLongitude(xpOrder.getEndLon());
                            pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
                            pushOrderDto.setOrderType(OrderType.USER_ORDER);
                            pushOrderDto.setStage(1);
                            // 调用推送服务  orderId + carVin
                            orderMissionClient.pushOrder(pushOrderDto);
                        }else {
                            //合作商的车辆需要调用合作商的订单通知接口
                            officialPartnerUtil.pusNewOrder(vehicleId1.getOfficialPartnerId(), xpOrder);
                        }
                        log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
                        PushOrderDto pushOrderDto = new PushOrderDto();
                        pushOrderDto.setVin(vehiclePosition.getVin());
                        pushOrderDto.setOrderId(xpOrder.getId().toString());
                        pushOrderDto.setStartLatitude(xpOrder.getStartLat());
                        pushOrderDto.setStartLongitude(xpOrder.getStartLon());
                        pushOrderDto.setEndLatitude(xpOrder.getEndLat());
                        pushOrderDto.setEndLongitude(xpOrder.getEndLon());
                        pushOrderDto.setEndPoiName(xpOrder.getEndPointName());
                        pushOrderDto.setOrderType(OrderType.USER_ORDER);
                        pushOrderDto.setStage(1);
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
                        redisService.popFirstElement(quoteName);
                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/ActivityTask.java
@@ -1,18 +1,24 @@
package com.xiaopeng.operation.utils.task;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.api.model.operation.XpActicityStrategy;
import com.xiaopeng.api.model.operation.XpActicityUser;
import com.xiaopeng.api.model.operation.XpActivity;
import com.xiaopeng.operation.service.IXpActicityService;
import com.xiaopeng.operation.service.IXpActicityStrategyService;
import com.xiaopeng.operation.service.IXpActicityUserService;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.feignClient.account.UserResourcesClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.model.account.XpAppUserCoupon;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.operation.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -29,6 +35,206 @@
    @Resource
    private IXpActicityUserService xpActicityUserService;
    @Resource
    private IXpWhitelistService xpWhitelistService;
    @Resource
    private IXpActicityCouponService xpActicityCouponService;
    @Resource
    private IXpCouponService xpCouponService;
    @Resource
    private XpAppUserCouponClient xpAppUserCouponClient;
    @Resource
    private XpOrderClient xpOrderClient;
    @Resource
    private UserResourcesClient userResourcesClient;
    @Scheduled(cron = "0 0/1 * * * *")
    public void taskOrder1() {
        List<XpActivity> list = xpActicityService.list(new QueryWrapper<XpActivity>().in("status", Arrays.asList(1, 2)).eq("is_deleted", 0));
        for (XpActivity xpActivity : list) {
            Integer status = xpActivity.getStatus();
            if(1 == status && LocalDateTime.now().isAfter(xpActivity.getStartTime()) && LocalDateTime.now().isBefore(xpActivity.getEndTime())){
                xpActivity.setStatus(2);
                //发放优惠券-发放一次的优惠券
                List<XpActicityStrategy> list1 = xpActicityStrategyService.list(new QueryWrapper<XpActicityStrategy>().eq("actitcity_id", xpActivity.getId())
                        .eq("distribution_rules", 2));
                for (XpActicityStrategy xpActicityStrategy : list1) {
                    List<XpActicityCoupon> acticityCoupons = xpActicityCouponService.list(new QueryWrapper<XpActicityCoupon>().eq("actitcity_strategy_id", xpActicityStrategy.getId()));
                    List<XpCoupon> xpCoupons = xpCouponService.listByIds(acticityCoupons.stream().map(XpActicityCoupon::getCouponId).collect(Collectors.toList()));
                    List<XpActicityUser> list2 = xpActicityUserService.list(new QueryWrapper<XpActicityUser>().eq("actitcity_stratege_id", xpActicityStrategy.getId()));
                    for (XpActicityUser xpActicityUser : list2) {
                        Integer userType = xpActicityUser.getUserType();
                        //全部白名单用户
                        if(1 == userType){
                            List<XpWhitelist> list3 = xpWhitelistService.list(new QueryWrapper<XpWhitelist>().eq("is_deleted", 0).eq("status", 1));
                            List<XpAppUserCoupon> xpAppUserCoupons = new ArrayList<>();
                            for (XpWhitelist xpWhitelist : list3) {
                                for (XpActicityCoupon acticityCoupon : acticityCoupons) {
                                    XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
                                    if(null != xpCoupon){
                                        XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
                                        xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
                                        xpAppUserCoupon.setMoney(xpCoupon.getAmount());
                                        Integer expireRules = xpActicityStrategy.getExpireRules();
                                        //次日0点失效
                                        if(1 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            LocalDateTime localDateTime = now.plusDays(1);
                                            LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
                                            xpAppUserCoupon.setExpirationTime(localDateTime1);
                                        }
                                        //指定有效天数
                                        if(2 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
                                        }
                                        //指定日期失效
                                        if(3 == expireRules){
                                            String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                                            LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                                            xpAppUserCoupon.setExpirationTime(localDateTime);
                                        }
                                        xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
                                        xpAppUserCoupon.setAppUserId(xpWhitelist.getAppUserId());
                                        xpAppUserCoupon.setStatus(1);
                                        xpAppUserCoupon.setActivityId(xpActivity.getId());
                                        xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
                                        xpAppUserCoupon.setDeleted(false);
                                        xpAppUserCoupon.setCreateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setPhone(xpWhitelist.getAccount());
                                        xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
                                        xpAppUserCoupons.add(xpAppUserCoupon);
                                    }
                                }
                            }
                            if(!xpAppUserCoupons.isEmpty()){
                                xpAppUserCouponClient.saveBatch(xpAppUserCoupons);
                            }
                        }
                        //老用户
                        if(2 == userType || 3 == userType || 4 == userType){
                            List<Long> longList = xpOrderClient.getUserTypeIdList(userType).getData();
                            List<XpAppUserCoupon> xpAppUserCoupons = new ArrayList<>();
                            for (Long userId : longList) {
                                UcUserInfo baseUserByUid = userResourcesClient.getBaseUserByUid(userId.toString());
                                for (XpActicityCoupon acticityCoupon : acticityCoupons) {
                                    XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
                                    if(null != xpCoupon){
                                        XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
                                        xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
                                        xpAppUserCoupon.setMoney(xpCoupon.getAmount());
                                        Integer expireRules = xpActicityStrategy.getExpireRules();
                                        //次日0点失效
                                        if(1 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            LocalDateTime localDateTime = now.plusDays(1);
                                            LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
                                            xpAppUserCoupon.setExpirationTime(localDateTime1);
                                        }
                                        //指定有效天数
                                        if(2 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
                                        }
                                        //指定日期失效
                                        if(3 == expireRules){
                                            String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                                            LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                                            xpAppUserCoupon.setExpirationTime(localDateTime);
                                        }
                                        xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
                                        xpAppUserCoupon.setAppUserId(userId);
                                        xpAppUserCoupon.setStatus(1);
                                        xpAppUserCoupon.setActivityId(xpActivity.getId());
                                        xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
                                        xpAppUserCoupon.setDeleted(false);
                                        xpAppUserCoupon.setCreateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setPhone(baseUserByUid.getMobile());
                                        xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
                                        xpAppUserCoupons.add(xpAppUserCoupon);
                                    }
                                }
                            }
                            if(!xpAppUserCoupons.isEmpty()){
                                xpAppUserCouponClient.saveBatch(xpAppUserCoupons);
                            }
                        }
                        //指定用户
                        if(5 == userType){
                            List<Long> userList = xpActicityUser.getUserList();
                            List<XpAppUserCoupon> xpAppUserCoupons = new ArrayList<>();
                            for (Long userId : userList) {
                                UcUserInfo baseUserByUid = userResourcesClient.getBaseUserByUid(userId.toString());
                                for (XpActicityCoupon acticityCoupon : acticityCoupons) {
                                    XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
                                    if(null != xpCoupon){
                                        XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
                                        xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
                                        xpAppUserCoupon.setMoney(xpCoupon.getAmount());
                                        Integer expireRules = xpActicityStrategy.getExpireRules();
                                        //次日0点失效
                                        if(1 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            LocalDateTime localDateTime = now.plusDays(1);
                                            LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
                                            xpAppUserCoupon.setExpirationTime(localDateTime1);
                                        }
                                        //指定有效天数
                                        if(2 == expireRules){
                                            LocalDateTime now = LocalDateTime.now();
                                            xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
                                        }
                                        //指定日期失效
                                        if(3 == expireRules){
                                            String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                                            LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                                            xpAppUserCoupon.setExpirationTime(localDateTime);
                                        }
                                        xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
                                        xpAppUserCoupon.setAppUserId(userId);
                                        xpAppUserCoupon.setStatus(1);
                                        xpAppUserCoupon.setActivityId(xpActivity.getId());
                                        xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
                                        xpAppUserCoupon.setDeleted(false);
                                        xpAppUserCoupon.setCreateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
                                        xpAppUserCoupon.setPhone(baseUserByUid.getMobile());
                                        xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
                                        xpAppUserCoupons.add(xpAppUserCoupon);
                                    }
                                }
                            }
                            if(!xpAppUserCoupons.isEmpty()){
                                xpAppUserCouponClient.saveBatch(xpAppUserCoupons);
                            }
                        }
                    }
                }
            }else if(2 == status & LocalDateTime.now().isAfter(xpActivity.getEndTime())){
                xpActivity.setStatus(3);
            }
            xpActicityService.updateById(xpActivity);
        }
    }
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/OfficialPartnerVo.java
@@ -17,4 +17,12 @@
    private String appKey;
    @ApiModelProperty("应用APPSecret")
    private String appSecret;
    @ApiModelProperty("下单调用接口地址")
    private String createOrderUrl;
    @ApiModelProperty("取消订单接口地址")
    private String cancelOrderUrl;
    @ApiModelProperty("改派订单接口地址")
    private String changeOrderUrl;
    @ApiModelProperty("修改目的地接口地址")
    private String changeDestinationUrl;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/vo/PushNewOrderVo.java
New file
@@ -0,0 +1,38 @@
package com.xiaopeng.operation.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class PushNewOrderVo {
    @ApiModelProperty("订单编号")
    private String orderNum;
    @ApiModelProperty("车型id")
    private Long vehicleModelId;
    @ApiModelProperty("车型名称")
    private String vehicleModelName;
    @ApiModelProperty("下单地点经度")
    private Double placementLongitude;
    @ApiModelProperty("下单地点纬度")
    private Double placementLatitude;
    @ApiModelProperty("下单地址")
    private String placementAddress;
    @ApiModelProperty("订单起点经度")
    private Double startLongitude;
    @ApiModelProperty("订单起点纬度")
    private Double startLatitude;
    @ApiModelProperty("订单起点地址")
    private String startAddress;
    @ApiModelProperty("订单终点经度")
    private Double endLongitude;
    @ApiModelProperty("订单终点纬度")
    private Double endLatitude;
    @ApiModelProperty("订单终点地址")
    private String endAddress;
    @ApiModelProperty("用户id")
    private Long userId;
    @ApiModelProperty("用户手机号")
    private String userPhone;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -15,8 +15,10 @@
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
import com.xiaopeng.api.feignClient.operation.XpWhiteListClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleMacClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.operation.XpWhitelist;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
@@ -46,6 +48,7 @@
import com.xiaopeng.order.service.IXpOrderService;
import com.xiaopeng.order.vo.BluetoothTokenVo;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
@@ -71,10 +74,8 @@
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -101,6 +102,8 @@
    @Resource
    private SysGroupMenuClient groupMenuClient;
    @Resource
    private XpWhiteListClient xpWhiteListClient;
    /**
@@ -738,6 +741,59 @@
    /**
     * 判断用户类型
     * @param userType
     * @return 2=老用户,3=新用户,4=流失用户
     */
    @PostMapping("/logan/inner/order/getUserTypeIdList")
    public R<List<Long>> getUserTypeIdList(@RequestParam Integer userType){
        List<XpWhitelist> data = xpWhiteListClient.getXpWhitelistByName("").getData();
        //判断流失用户
        if(4 == userType){
            Set<Long> collect = data.stream().map(XpWhitelist::getAppUserId).collect(Collectors.toSet());
            List<XpOrder> one = xpOrderService.list(new QueryWrapper<XpOrder>().in("app_user_id", collect).in("status", Arrays.asList(9, 10)).last(" order by create_time desc limit 1"));
            if(one.isEmpty()){
                return R.ok(new ArrayList<>());
            }
            List<Long> appUserIds = new ArrayList<>();
            for (XpOrder order : one) {
                long time = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - order.getCreateTime().toEpochSecond(ZoneOffset.of("+8"));
                if(time >= 60 * 60 * 24 * 5){
                    appUserIds.add(order.getAppUserId());
                }
            }
            return R.ok(appUserIds);
        }
        //新用户
        if(3 == userType){
            Set<Long> collect = data.stream().map(XpWhitelist::getAppUserId).collect(Collectors.toSet());
            List<XpOrder> one = xpOrderService.list(new QueryWrapper<XpOrder>().in("app_user_id", collect).in("status", Arrays.asList(9, 10)).last(" order by create_time desc limit 1"));
            if(one.isEmpty()){
                return R.ok(new ArrayList<>(collect));
            }
            collect.removeAll(one.stream().map(XpOrder::getAppUserId).collect(Collectors.toList()));
            return R.ok(new ArrayList<>(collect));
        }
        //老用户
        if(2 == userType){
            Set<Long> collect = data.stream().map(XpWhitelist::getAppUserId).collect(Collectors.toSet());
            List<XpOrder> one = xpOrderService.list(new QueryWrapper<XpOrder>().in("app_user_id", collect).in("status", Arrays.asList(9, 10)).last(" order by create_time desc limit 1"));
            if(one.isEmpty()){
                return R.ok(new ArrayList<>());
            }
            List<Long> appUserIds = new ArrayList<>();
            for (XpOrder order : one) {
                appUserIds.add(order.getAppUserId());
            }
            return R.ok(appUserIds);
        }
        return R.ok(new ArrayList<>());
    }
    /**
     * 获取用户订单数量
     * @param userId
     * @return
@@ -748,4 +804,16 @@
                .ne("status", 0).eq("is_deleted", 0));
        return R.ok(count);
    }
    @PostMapping("/drainage/v1/order/updateOrderStatus")
    @ApiOperation(value = "更新订单状态", notes = "流量接入-基础信息")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "token", name = "token", required = true, paramType = "header")
    })
    public R<?> officialPartnerUpdateOrderStatus(@RequestBody UpdateOrderStatusVo vo){
        xpOrderService.officialPartnerUpdateOrderStatus(vo);
        return R.ok();
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -27,6 +27,7 @@
import com.xiaopeng.order.model.vo.XpOrderPageVO;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.OrderInfoVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
import com.xiaopeng.order.vo.UserOrderListVo;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
@@ -266,4 +267,10 @@
     */
    OrderInfoVo getOrderInfo(Long orderId);
    /**
     * 合作商更新订单状态
     * @param vo
     */
    void officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -96,6 +96,7 @@
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import com.xiaopeng.order.vo.OrderDetailVo;
import com.xiaopeng.order.vo.OrderInfoVo;
import com.xiaopeng.order.vo.UpdateOrderStatusVo;
import com.xiaopeng.order.vo.UserOrderListVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -4102,4 +4103,15 @@
        }
        return vo;
    }
    /**
     *
     * 合作商更新订单状态
     * @param vo
     */
    @Override
    public void officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo) {
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UpdateOrderStatusVo.java
New file
@@ -0,0 +1,23 @@
package com.xiaopeng.order.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel("更新订单状态")
public class UpdateOrderStatusVo {
    @ApiModelProperty("订单编号")
    private String orderNum;
    @ApiModelProperty("状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成")
    private Integer orderStatus;
    @ApiModelProperty("接单车辆id")
    private Long vehicleId;
    @ApiModelProperty("接单车牌号")
    private String vehiclePlateNumber;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1206,5 +1206,4 @@
    }
}