xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -25,6 +25,7 @@ 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.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.NavigationCouponPickerVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.common.core.domain.R; @@ -154,6 +155,8 @@ } } @PostMapping("/logan/inner/appUserCoupon/useUserCoupon") public R<BigDecimal> useUserCoupon(@RequestBody UseUserCouponDto dto) { XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId()); @@ -390,5 +393,14 @@ } /** * 计算优惠金额 * @param vo * @return */ @PostMapping("/logan/inner/appUserCoupon/calculateDiscountAmount") public R<BigDecimal> calculateDiscountAmount(@RequestParam CalculateDiscountAmountVo vo){ BigDecimal bigDecimal = xpAppUserCouponService.calculateDiscountAmount(vo); return R.ok(bigDecimal); } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
@@ -14,10 +14,12 @@ import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.NavigationCouponPickerVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; @@ -111,4 +113,12 @@ * @return */ List<CouponReceiptRecordDto> getCouponReceiptRecord(PageInfo<CouponReceiptRecordDto> pageInfo, CouponReceiptRecordVo vo); /** * 计算优惠金额 * @param vo * @return */ BigDecimal calculateDiscountAmount(CalculateDiscountAmountVo vo); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -19,6 +19,7 @@ import com.xiaopeng.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.CouponVo; import com.xiaopeng.account.vo.UserCouponListVo; import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest; @@ -48,6 +49,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -630,4 +632,62 @@ } return list; } /** * 计算优惠金额 * @param vo * @return */ @Override public BigDecimal calculateDiscountAmount(CalculateDiscountAmountVo vo) { XpAppUserCoupon userCoupon = this.getById(vo.getUserCouponId()); if(null == userCoupon){ return BigDecimal.ZERO; } if(1 != userCoupon.getStatus()){ return BigDecimal.ZERO; } XpCoupon xpCoupon = xpCouponClient.getCouponById(userCoupon.getCouponId()).getData(); if(null == xpCoupon){ return BigDecimal.ZERO; } BigDecimal conditionalAmount = xpCoupon.getConditionalAmount(); BigDecimal upperLimit = xpCoupon.getUpperLimit(); //抵扣券 if(1 == xpCoupon.getCouponType() && (null == conditionalAmount || conditionalAmount.compareTo(vo.getOrderMoney()) <= 0)){ //没有达到预设条件 if(vo.getOrderMoney().compareTo((null == conditionalAmount ? BigDecimal.ZERO : conditionalAmount)) < 0){ return BigDecimal.ZERO; } //计算优惠金额 BigDecimal multiply = vo.getOrderMoney().multiply(xpCoupon.getAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)); BigDecimal multiply1 = BigDecimal.ZERO; if(null != upperLimit){ //计算最高优惠金额 multiply1 = vo.getOrderMoney().multiply(upperLimit.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)); } //超出最高优惠金额,按照最高优惠金额进行扣减 if(multiply.compareTo(multiply1) > 0){ return multiply1; }else{ return multiply; } } //抹零券 if(3 == xpCoupon.getCouponType() && (null == conditionalAmount || conditionalAmount.compareTo(vo.getOrderMoney()) <= 0)){ //没有达到预设条件 if(vo.getOrderMoney().compareTo((null == conditionalAmount ? BigDecimal.ZERO : conditionalAmount)) < 0){ return BigDecimal.ZERO; } return vo.getOrderMoney().subtract(xpCoupon.getAmount()); } //满减券 if(2 == xpCoupon.getCouponType() && (null == conditionalAmount || conditionalAmount.compareTo(vo.getOrderMoney()) <= 0)){ if(vo.getOrderMoney().compareTo((null == conditionalAmount ? BigDecimal.ZERO : conditionalAmount)) >= 0){ return xpCoupon.getAmount(); } } return BigDecimal.ZERO; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java
@@ -7,6 +7,7 @@ import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; @@ -65,6 +66,12 @@ log.error("获取用户活动领取的优惠券失败,原因: {}", cause.getMessage()); return R.fail("获取用户活动领取的优惠券失败,原因: "+cause.getMessage()); } @Override public R<BigDecimal> calculateDiscountAmount(CalculateDiscountAmountVo vo) { log.error("计算优惠金额失败,原因: {}", cause.getMessage()); return R.fail("计算优惠金额失败"); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -4,6 +4,7 @@ import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.factory.account.XpAppUserCouponClientFallbackFactory; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; @@ -64,4 +65,14 @@ */ @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); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/CalculateDiscountAmountVo.java
New file @@ -0,0 +1,17 @@ package com.xiaopeng.api.vo.account; import lombok.Data; import java.math.BigDecimal; @Data public class CalculateDiscountAmountVo { /** * 订单金额 */ private BigDecimal orderMoney; /** * 优惠券id */ private Long userCouponId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/FareBreakdownVo.java
@@ -20,6 +20,8 @@ private List<FareBreakdownDetailVo> longDistance; @ApiModelProperty(value = "红包抵扣金额") private BigDecimal redPacketMoney; @ApiModelProperty("优惠券id") private Long userCouponId; @ApiModelProperty(value = "优惠券抵扣金额") private BigDecimal couponMoney; @ApiModelProperty(value = "订单金额") xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -500,13 +500,13 @@ * + * 获取行程费用明细 */ @PutMapping("/api/v1/mini-program/order/fare-breakdown/{orderId}") @PutMapping("/api/v1/mini-program/order/fare-breakdown") @ApiOperation(value = "获取行程费用明细", tags = {"小程序-获取行程费用明细"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R<FareBreakdownVo> fareBreakdown(@PathVariable("orderId") Long orderId, HttpServletRequest request) { public R<FareBreakdownVo> fareBreakdown(@RequestBody com.xiaopeng.order.vo.FareBreakdownVo vo, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); return xpOrderService.fareBreakdown(orderId, uid); return xpOrderService.fareBreakdown(vo, uid); } /** xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -186,7 +186,7 @@ */ void addCruiseMission(XpOrder order, Integer status); R<FareBreakdownVo> fareBreakdown(Long orderId, String uid); R<FareBreakdownVo> fareBreakdown(com.xiaopeng.order.vo.FareBreakdownVo vo, String uid); R payment(XpOrderPayDto dto, String uid); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -46,6 +46,7 @@ import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.OrderType; import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; import com.xiaopeng.api.vo.account.UserCouponVo; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType; @@ -3096,8 +3097,15 @@ } @Override public R<FareBreakdownVo> fareBreakdown(Long orderId, String uid) { XpOrder order = this.getById(orderId); public R<FareBreakdownVo> fareBreakdown(com.xiaopeng.order.vo.FareBreakdownVo vo, String uid) { XpOrder order = this.getById(vo.getOrderId()); //根据新的优惠券计算优惠金额 if(null != order.getCouponId()){ CalculateDiscountAmountVo discountAmountVo = new CalculateDiscountAmountVo(); BigDecimal data = xpAppUserCouponClient.calculateDiscountAmount(discountAmountVo).getData(); order.setCouponId(vo.getUserCouponId()); order.setCouponMoney(data); } order.setAppUserId(null); FareBreakdownVo res = new FareBreakdownVo(); res.setChangeMoneyFlag(order.getChangeMoneyFlag()); @@ -3107,7 +3115,7 @@ List<FareBreakdownDetailVo> duration = new ArrayList<>(); List<FareBreakdownDetailVo> longDistance = new ArrayList<>(); List<XpOrderDetail> xpOrderDetails = xpOrderDetailMapper.selectList(new LambdaQueryWrapper<XpOrderDetail>().eq(XpOrderDetail::getOrderId, orderId)); List<XpOrderDetail> xpOrderDetails = xpOrderDetailMapper.selectList(new LambdaQueryWrapper<XpOrderDetail>().eq(XpOrderDetail::getOrderId, vo.getOrderId())); for (XpOrderDetail xpOrderDetail : xpOrderDetails) { FareBreakdownDetailVo detail = new FareBreakdownDetailVo(); detail.setType(xpOrderDetail.getType()); @@ -3131,6 +3139,7 @@ res.setDuration(duration); res.setLongDistance(longDistance); res.setRedPacketMoney(order.getRedPacketMoney()); res.setUserCouponId(order.getCouponId()); res.setCouponMoney(order.getCouponMoney()); res.setOrderMoney(order.getOrderMoney()); res.setKilometer(order.getMileageKilometers() == null ? BigDecimal.ZERO : BigDecimal.valueOf(order.getMileageKilometers()).multiply(BigDecimal.valueOf(1000))); @@ -3149,6 +3158,8 @@ return R.ok(res); } @Override public R payment(XpOrderPayDto dto, String uid) { // mvp版本不做支付 使用优惠券抵扣为0元订单处理 处理订单状态即可 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/FareBreakdownVo.java
New file @@ -0,0 +1,15 @@ package com.xiaopeng.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel public class FareBreakdownVo { @ApiModelProperty("订单id") private Long orderId; @ApiModelProperty("优惠券id") private Long userCouponId; }