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 @@ } }