puzhibing
2026-04-28 5f4b99714b633c9c838d94ccc240ab23333e3343
添加计算优惠金额的接口
2个文件已添加
9个文件已修改
161 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/account/CalculateDiscountAmountVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/FareBreakdownVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/FareBreakdownVo.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}