订单验价开发

This commit is contained in:
jieyuu 2024-09-22 20:12:59 +08:00
parent 48da971fd5
commit 9e04504740
3 changed files with 196 additions and 0 deletions

View File

@ -0,0 +1,18 @@
package net.jieyuu.feign;
import net.jieyuu.utils.JsonData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "xdclass-coupon-service")
public interface CouponFeignService {
/**
* 查询用户的优惠券是否可用注意防止水平越权
* @param recordId
* @return
*/
@GetMapping("/api/coupon_record/v1/detail/{record_id}")
JsonData findUserCouponRecordById(@PathVariable("record_id") long recordId);
}

View File

@ -4,7 +4,9 @@ import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.jieyuu.enums.BizCodeEnum; import net.jieyuu.enums.BizCodeEnum;
import net.jieyuu.enums.CouponStateEnum;
import net.jieyuu.exception.BizException; import net.jieyuu.exception.BizException;
import net.jieyuu.feign.CouponFeignService;
import net.jieyuu.feign.ProductFeignService; import net.jieyuu.feign.ProductFeignService;
import net.jieyuu.feign.UserFeignService; import net.jieyuu.feign.UserFeignService;
import net.jieyuu.interceptor.LoginInterceptor; import net.jieyuu.interceptor.LoginInterceptor;
@ -17,10 +19,12 @@ import net.jieyuu.service.ProductOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.jieyuu.utils.CommonUtil; import net.jieyuu.utils.CommonUtil;
import net.jieyuu.utils.JsonData; import net.jieyuu.utils.JsonData;
import net.jieyuu.vo.CouponRecordVO;
import net.jieyuu.vo.ProductOrderAddressVO; import net.jieyuu.vo.ProductOrderAddressVO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
@ -44,6 +48,9 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
@Autowired @Autowired
private ProductFeignService productFeignService; private ProductFeignService productFeignService;
@Autowired
private CouponFeignService couponFeignService;
/** /**
* * 防重提交 * * 防重提交
* * 用户微服务-确认收货地址 * * 用户微服务-确认收货地址
@ -80,9 +87,101 @@ public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, Pro
if (orderItemList == null) { if (orderItemList == null) {
throw new BizException(BizCodeEnum.ORDER_CONFIRM_CART_ITEM_NOT_EXIST); throw new BizException(BizCodeEnum.ORDER_CONFIRM_CART_ITEM_NOT_EXIST);
} }
// 验证价格
this.checkPrice(orderItemList, orderRequest);
return null; return null;
} }
/**
* 验证价格
* 1)统计所有商品价格
* 2)获取优惠券总价再减去优惠券价格 总价减去优惠券价格 就是 最终价格
*
* @param orderItemList
* @param orderRequest
*/
private void checkPrice(List<OrderItemVO> orderItemList, ConfirmOrderRequest orderRequest) {
// 统计总价
BigDecimal realPayAmount = new BigDecimal("0");
if (orderItemList != null) {
for (OrderItemVO item : orderItemList) {
BigDecimal itemRealPayAmount = item.getTotalAmount();
realPayAmount = realPayAmount.add(itemRealPayAmount);
}
}
// 获取优惠券
CouponRecordVO couponRecordVO = getCartCouponRecord(orderRequest.getCouponRecordId());
// 计算购物车价格, 是否满足优惠券满减条件
// 计算购物车价格是否满足优惠券满减条件
if (couponRecordVO != null) {
// 计算是否满足满减条件
if (realPayAmount.compareTo(couponRecordVO.getConditionPrice()) < 0) {// 优惠券满足使用条件
throw new BizException(BizCodeEnum.ORDER_CONFIRM_COUPON_FAIL);
}
if (couponRecordVO.getPrice().compareTo(realPayAmount) > 0) { // 防止出现优惠券抵扣超过商品价格
realPayAmount = BigDecimal.ZERO;
}else{
realPayAmount= realPayAmount.subtract(couponRecordVO.getPrice());
}
}
// 验价
if(realPayAmount.compareTo(orderRequest.getTotalAmount())!=0){
log.error("订单验价失败:{}" , orderRequest);
throw new BizException(BizCodeEnum.ORDER_CONFIRM_PRICE_FAIL);
}
}
/**
* 获取优惠券
*
* @param couponRecordId
* @return
*/
private CouponRecordVO getCartCouponRecord(Long couponRecordId) {
if (couponRecordId == null || couponRecordId < 0) {
return null;
}
JsonData couponRecordData = couponFeignService.findUserCouponRecordById(couponRecordId);
if (couponRecordData.getCode() != 0) {
throw new BizException(BizCodeEnum.ORDER_CONFIRM_COUPON_FAIL);
}
if (couponRecordData.getCode() == 0) {
CouponRecordVO couponRecordVO = couponRecordData.getData(new TypeReference<CouponRecordVO>() {
});
if (!couponAvailable(couponRecordVO)) {
log.error("优惠券使用失败");
throw new BizException(BizCodeEnum.COUPON_UNAVAILABLE);
}
return couponRecordVO;
}
return null;
}
/**
* 判断优惠券是否可用
*
* @param couponRecordVO
* @return
*/
private boolean couponAvailable(CouponRecordVO couponRecordVO) {
if (couponRecordVO.getUseState().equalsIgnoreCase(CouponStateEnum.NEW.name())) {
long currentTimestamp = CommonUtil.getCurrentTimestamp();
long end = couponRecordVO.getEndTime().getTime();
long start = couponRecordVO.getStartTime().getTime();
if (currentTimestamp >= start && currentTimestamp <= end) {
return true;
}
}
return false;
}
/** /**
* 获取收货地址详情 * 获取收货地址详情
* *

View File

@ -0,0 +1,79 @@
package net.jieyuu.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class CouponRecordVO implements Serializable {
private Long id;
/**
* 优惠券id
*/
@JsonProperty("coupon_id")
private Long couponId;
/**
* 使用状态 可用 NEW,已使用USED,过期 EXPIRED;
*/
@JsonProperty("use_state")
private String useState;
/**
* 用户id
*/
@JsonProperty("user_id")
private Long userId;
/**
* 用户昵称
*/
@JsonProperty("user_name")
private String userName;
/**
* 优惠券标题
*/
@JsonProperty("coupon_title")
private String couponTitle;
/**
* 优惠券开始有效时间
*/
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
@JsonProperty("start_time")
private Date startTime;
/**
* 优惠券失效时间
*/
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", locale = "zh", timezone = "GMT+8")
@JsonProperty("end_time")
private Date endTime;
/**
* 订单id
*/
@JsonProperty("order_id")
private Long orderId;
/**
* 抵扣价格
*/
private BigDecimal price;
/**
* 满多少才可以使用
*/
@JsonProperty("condition_price")
private BigDecimal conditionPrice;
}