i
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Override
public JsonData initNewUserCoupon(NewUserCouponRequest newUserCouponRequest) {
+ log.info("into {}", JSON.toJSONString(newUserCouponRequest));
LoginUser loginUser = new LoginUser();
loginUser.setId(newUserCouponRequest.getUserId());
loginUser.setName(newUserCouponRequest.getName());
diff --git a/nla-coupon-service/src/main/resources/application.yml b/nla-coupon-service/src/main/resources/application.yml
index 5b5f297..201c080 100644
--- a/nla-coupon-service/src/main/resources/application.yml
+++ b/nla-coupon-service/src/main/resources/application.yml
@@ -72,3 +72,14 @@ mq:
coupon_release_routing_key: coupon.release.routing.key
#消息过期时间,毫秒,临时改为6分钟
ttl: 360000
+
+
+feign:
+ client:
+ config:
+ default:
+ # 设置Feign的连接超时时间(秒)
+ connectTimeout: 5000
+ # 设置Feign的读取超时时间(秒)
+ readTimeout: 10000
+
diff --git a/nla-order-service/src/main/java/cn/nla/order/controller/ProductOrderController.java b/nla-order-service/src/main/java/cn/nla/order/controller/ProductOrderController.java
index dcf6a55..17bd311 100644
--- a/nla-order-service/src/main/java/cn/nla/order/controller/ProductOrderController.java
+++ b/nla-order-service/src/main/java/cn/nla/order/controller/ProductOrderController.java
@@ -33,18 +33,18 @@ import java.io.IOException;
public class ProductOrderController {
@Resource
private ProductOrderService orderService;
+
/**
* 查询订单状态
- *
+ *
* 此接口没有登录拦截,可以增加一个秘钥进行rpc通信
*/
@ApiOperation("查询订单状态")
@GetMapping("query_state")
- public JsonData queryProductOrderState(@ApiParam("订单号") @RequestParam("out_trade_no")String outTradeNo){
- log.info("获取订单查询: {}",outTradeNo);
+ public JsonData queryProductOrderState(@ApiParam("订单号") @RequestParam("out_trade_no") String outTradeNo) {
+ log.info("获取订单查询: {}", outTradeNo);
String state = orderService.queryProductOrderState(outTradeNo);
- return StringUtils.isBlank(state)?JsonData.buildResult(BizCodeEnum.ORDER_CONFIRM_NOT_EXIST):JsonData.buildSuccess(state);
-
+ return StringUtils.isBlank(state) ? JsonData.buildResult(BizCodeEnum.ORDER_CONFIRM_NOT_EXIST) : JsonData.buildSuccess(state);
}
@ApiOperation("提交订单")
@@ -52,19 +52,19 @@ public class ProductOrderController {
public void confirmOrder(@ApiParam("订单对象") @RequestBody ConfirmOrderRequest orderRequest, HttpServletResponse response) {
JsonData jsonData = orderService.confirmOrder(orderRequest);
if (jsonData.getCode() == 0) {
- String client = orderRequest.getClientType();
- String payType = orderRequest.getPayType();
- //如果是支付宝网页支付,都是跳转网页,APP除外
- if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.ALIPAY.name())) {
- log.info("创建支付宝订单成功:{}", orderRequest.toString());
- if (client.equalsIgnoreCase(ClientType.H5.name())) {
- writeData(response, jsonData);
- } else if (client.equalsIgnoreCase(ClientType.APP.name())) {
- //APP SDK支付 TODO
- }
- } else if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.WECHAT.name())) {
- //微信支付 TODO
- }
+// String client = orderRequest.getClientType();
+// String payType = orderRequest.getPayType();
+// //如果是支付宝网页支付,都是跳转网页,APP除外
+// if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.ALIPAY.name())) {
+// log.info("创建支付宝订单成功:{}", orderRequest.toString());
+// if (client.equalsIgnoreCase(ClientType.H5.name())) {
+// writeData(response, jsonData);
+// } else if (client.equalsIgnoreCase(ClientType.APP.name())) {
+// //APP SDK支付 TODO
+// }
+// } else if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.WECHAT.name())) {
+// //微信支付 TODO
+// }
} else {
log.error("创建订单失败{}", jsonData);
}
diff --git a/nla-order-service/src/main/java/cn/nla/order/feign/CouponFeignService.java b/nla-order-service/src/main/java/cn/nla/order/feign/CouponFeignService.java
new file mode 100644
index 0000000..7530f58
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/feign/CouponFeignService.java
@@ -0,0 +1,21 @@
+package cn.nla.order.feign;
+
+import cn.nla.common.util.JsonData;
+import cn.nla.order.model.request.LockCouponRecordRequest;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Feign调用优惠券服务接口
+ */
+@FeignClient(name = "nla-coupon-service")
+public interface CouponFeignService {
+ /**
+ * 领取优惠券
+ */
+ @GetMapping("/cop/coupon/v1/promotion/{coupon_id}")
+ JsonData findUserCouponRecordById(@PathVariable("record_id") long recordId);
+
+ @PostMapping("/cop/coupon/v1/lock_records")
+ JsonData lockCouponRecords(@RequestBody LockCouponRecordRequest recordRequest);
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/feign/ProductFeignService.java b/nla-order-service/src/main/java/cn/nla/order/feign/ProductFeignService.java
new file mode 100644
index 0000000..98db4b3
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/feign/ProductFeignService.java
@@ -0,0 +1,23 @@
+package cn.nla.order.feign;
+
+import cn.nla.common.util.JsonData;
+import cn.nla.order.model.request.LockProductRequest;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@FeignClient(name = "nla-product-service")
+public interface ProductFeignService {
+ /**
+ * 订单详情查询
+ */
+ @RequestMapping("/pdt/cart/v1/confirm_order_cart_items")
+ JsonData confirmOrderCartItem(@RequestBody List productIdList);
+
+ /**
+ * 商品库存锁定
+ */
+ @PostMapping("/cop/couponRecord/v1/lock_products")
+ JsonData lockProducts(@RequestBody LockProductRequest lockProductRequest);
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/feign/UserFeignService.java b/nla-order-service/src/main/java/cn/nla/order/feign/UserFeignService.java
new file mode 100644
index 0000000..a2d8223
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/feign/UserFeignService.java
@@ -0,0 +1,15 @@
+package cn.nla.order.feign;
+
+import cn.nla.common.util.JsonData;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+@FeignClient(name = "nla-user-service")
+public interface UserFeignService {
+ /**
+ * 查询用户地址,接口本身有防止水平权限
+ */
+ @GetMapping("/user/address/v1/find/{address_id}")
+ JsonData detail(@PathVariable("address_id") long addressId);
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/VO/CouponRecordVO.java b/nla-order-service/src/main/java/cn/nla/order/model/VO/CouponRecordVO.java
new file mode 100644
index 0000000..cfe6220
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/VO/CouponRecordVO.java
@@ -0,0 +1,64 @@
+package cn.nla.order.model.VO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class CouponRecordVO {
+ 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;
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/VO/OrderItemVO.java b/nla-order-service/src/main/java/cn/nla/order/model/VO/OrderItemVO.java
new file mode 100644
index 0000000..7aa2286
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/VO/OrderItemVO.java
@@ -0,0 +1,42 @@
+package cn.nla.order.model.VO;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 购物项
+ */
+@Data
+public class OrderItemVO {
+ /**
+ * 商品id
+ */
+ @JsonProperty("product_id")
+ private Long productId;
+ /**
+ * 购买数量
+ */
+ @JsonProperty("buy_num")
+ private Integer buyNum;
+ /**
+ * 商品标题
+ */
+ @JsonProperty("product_title")
+ private String productTitle;
+ /**
+ * 图片
+ */
+ @JsonProperty("product_img")
+ private String productImg;
+ /**
+ * 商品单价
+ */
+ private BigDecimal amount;
+ /**
+ * 总价格,单价+数量
+ */
+ @JsonProperty("total_amount")
+ private BigDecimal totalAmount;
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/VO/ProductOrderAddressVO.java b/nla-order-service/src/main/java/cn/nla/order/model/VO/ProductOrderAddressVO.java
new file mode 100644
index 0000000..dba9cd9
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/VO/ProductOrderAddressVO.java
@@ -0,0 +1,55 @@
+package cn.nla.order.model.VO;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class ProductOrderAddressVO {
+
+
+ private Long id;
+
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ /**
+ * 是否默认收货地址:0->否;1->是
+ */
+ @JsonProperty("default_status")
+ private Integer defaultStatus;
+
+ /**
+ * 收发货人姓名
+ */
+ @JsonProperty("receive_name")
+ private String receiveName;
+
+ /**
+ * 收货人电话
+ */
+ private String phone;
+
+ /**
+ * 省/直辖市
+ */
+ private String province;
+
+ /**
+ * 市
+ */
+ private String city;
+
+ /**
+ * 区
+ */
+ private String region;
+
+ /**
+ * 详细地址
+ */
+
+ @JsonProperty("detail_address")
+ private String detailAddress;
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/request/LockCouponRecordRequest.java b/nla-order-service/src/main/java/cn/nla/order/model/request/LockCouponRecordRequest.java
new file mode 100644
index 0000000..5f7abb8
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/request/LockCouponRecordRequest.java
@@ -0,0 +1,23 @@
+package cn.nla.order.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(value = "优惠券锁定对象",description = "优惠券锁定对象")
+@Data
+public class LockCouponRecordRequest {
+ /**
+ * 优惠券记录id列表
+ */
+ @ApiModelProperty(value = "优惠券记录id列表",example = "[1,2,3]")
+ private List lockCouponRecordIds;
+ /**
+ * 订单号
+ */
+ @ApiModelProperty(value = "订单号",example = "3234fw234rfd232")
+ private String orderOutTradeNo;
+
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/request/LockProductRequest.java b/nla-order-service/src/main/java/cn/nla/order/model/request/LockProductRequest.java
new file mode 100644
index 0000000..cdfa963
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/request/LockProductRequest.java
@@ -0,0 +1,21 @@
+package cn.nla.order.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(value = "商品锁定对象",description = "商品锁定对象协议")
+@Data
+public class LockProductRequest {
+
+ @ApiModelProperty(value = "订单id",example = "12312312312")
+ @JsonProperty("order_out_trade_no")
+ private String orderOutTradeNo;
+
+ @ApiModelProperty(value = "订单项")
+ @JsonProperty("order_item_list")
+ private List orderItemList;
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/model/request/OrderItemRequest.java b/nla-order-service/src/main/java/cn/nla/order/model/request/OrderItemRequest.java
new file mode 100644
index 0000000..a9ffe6a
--- /dev/null
+++ b/nla-order-service/src/main/java/cn/nla/order/model/request/OrderItemRequest.java
@@ -0,0 +1,18 @@
+package cn.nla.order.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel(value = "商品子项")
+@Data
+public class OrderItemRequest {
+
+ @ApiModelProperty(value = "商品id",example = "1")
+ @JsonProperty("product_id")
+ private long productId;
+ @ApiModelProperty(value = "购买数量",example = "2")
+ @JsonProperty("buy_num")
+ private int buyNum;
+}
diff --git a/nla-order-service/src/main/java/cn/nla/order/service/ProductOrderService.java b/nla-order-service/src/main/java/cn/nla/order/service/ProductOrderService.java
index 22f30b7..60e58d9 100644
--- a/nla-order-service/src/main/java/cn/nla/order/service/ProductOrderService.java
+++ b/nla-order-service/src/main/java/cn/nla/order/service/ProductOrderService.java
@@ -31,5 +31,5 @@ public interface ProductOrderService extends IService {
*/
JsonData confirmOrder(ConfirmOrderRequest request);
- String queryProductOrderState(String outTradeNo);
+ String queryProductOrderState(String outTradeNo);
}
diff --git a/nla-order-service/src/main/java/cn/nla/order/service/impl/ProductOrderServiceImpl.java b/nla-order-service/src/main/java/cn/nla/order/service/impl/ProductOrderServiceImpl.java
index e01f033..8be405c 100644
--- a/nla-order-service/src/main/java/cn/nla/order/service/impl/ProductOrderServiceImpl.java
+++ b/nla-order-service/src/main/java/cn/nla/order/service/impl/ProductOrderServiceImpl.java
@@ -1,14 +1,42 @@
package cn.nla.order.service.impl;
+import cn.nla.common.constant.CacheKey;
+import cn.nla.common.enums.BizCodeEnum;
+import cn.nla.common.enums.CouponStateEnum;
+import cn.nla.common.exception.BizException;
+import cn.nla.common.interceptor.LoginInterceptor;
+import cn.nla.common.model.LoginUser;
+import cn.nla.common.util.CommonUtil;
import cn.nla.common.util.JsonData;
+import cn.nla.order.feign.CouponFeignService;
+import cn.nla.order.feign.ProductFeignService;
+import cn.nla.order.feign.UserFeignService;
+import cn.nla.order.model.VO.CouponRecordVO;
+import cn.nla.order.model.VO.OrderItemVO;
+import cn.nla.order.model.VO.ProductOrderAddressVO;
import cn.nla.order.model.entity.ProductOrderEntity;
import cn.nla.order.mapper.ProductOrderMapper;
import cn.nla.order.model.request.ConfirmOrderRequest;
+import cn.nla.order.model.request.LockCouponRecordRequest;
+import cn.nla.order.model.request.LockProductRequest;
+import cn.nla.order.model.request.OrderItemRequest;
import cn.nla.order.service.ProductOrderService;
+import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
*
* 订单表 服务实现类
@@ -17,14 +45,117 @@ import org.springframework.stereotype.Service;
* @author YJs
* @since 2024-08-13
*/
+@Slf4j
@Service
public class ProductOrderServiceImpl extends ServiceImpl implements ProductOrderService {
+ @Autowired
+ private StringRedisTemplate redisTemplate;
+
+ @Resource
+ private UserFeignService userFeignService;
+
+ @Resource
+ private CouponFeignService couponFeignService;
+
+ @Resource
+ private ProductFeignService productFeignService;
+
@Override
public JsonData confirmOrder(ConfirmOrderRequest request) {
+ LoginUser loginUser = LoginInterceptor.threadLocal.get();
+ String orderToken = request.getToken();
+ if (StringUtils.isBlank(orderToken)) {
+ throw new BizException(BizCodeEnum.ORDER_CONFIRM_TOKEN_NOT_EXIST);
+ }
+ //原子操作 校验令牌,删除令牌
+// String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
+// Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
+// List.of(String.format(CacheKey.SUBMIT_ORDER_TOKEN_KEY, loginUser.getId())), orderToken);
+// if (result == 0L) {
+// throw new BizException(BizCodeEnum.ORDER_CONFIRM_TOKEN_EQUAL_FAIL);
+// }
+ String orderOutTradeNo = CommonUtil.getStringNumRandom(32);
+ //获取收货地址详情
+ ProductOrderAddressVO addressVO = this.getUserAddress(request.getAddressId());
+ log.info("收货地址信息:{}", addressVO);
+
+ //获取用户加入购物车的商品
+ List productIdList = request.getProductIdList();
+ JsonData cartItemDate = productFeignService.confirmOrderCartItem(productIdList);
+ List orderItemList = cartItemDate.getData(new TypeReference<>() {
+ });
+ log.info("获取的商品:{}", orderItemList);
+ if (orderItemList == null) {
+ //购物车商品不存在
+ throw new BizException(BizCodeEnum.ORDER_CONFIRM_CART_ITEM_NOT_EXIST);
+ }
+
+ //验证价格,减去商品优惠券
+ this.checkPrice(orderItemList, request);
+ //锁定优惠券
+ this.lockCouponRecords(request, orderOutTradeNo);
+ //锁定库存
+ this.lockProductStocks(orderItemList, orderOutTradeNo);
+// //创建订单
+// ProductOrderDO productOrderDO = this.saveProductOrder(request, loginUser, orderOutTradeNo, addressVO);
+
+
return null;
}
+ /**
+ * 锁定优惠券
+ */
+ private void lockCouponRecords(ConfirmOrderRequest orderRequest, String orderOutTradeNo) {
+ List lockCouponRecordIds = new ArrayList<>();
+ if (orderRequest.getCouponRecordId() > 0) {
+ lockCouponRecordIds.add(orderRequest.getCouponRecordId());
+ LockCouponRecordRequest lockCouponRecordRequest = new LockCouponRecordRequest();
+ lockCouponRecordRequest.setOrderOutTradeNo(orderOutTradeNo);
+ lockCouponRecordRequest.setLockCouponRecordIds(lockCouponRecordIds);
+ //发起锁定优惠券请求
+ JsonData jsonData = couponFeignService.lockCouponRecords(lockCouponRecordRequest);
+ if (jsonData.getCode() != 0) {
+ throw new BizException(BizCodeEnum.COUPON_RECORD_LOCK_FAIL);
+ }
+ }
+ }
+
+ /**
+ * 锁定商品库存
+ */
+ private void lockProductStocks(List orderItemList, String orderOutTradeNo) {
+ List itemRequestList = orderItemList.stream().map(obj -> {
+ OrderItemRequest request = new OrderItemRequest();
+ request.setBuyNum(obj.getBuyNum());
+ request.setProductId(obj.getProductId());
+ return request;
+ }).collect(Collectors.toList());
+ LockProductRequest lockProductRequest = new LockProductRequest();
+ lockProductRequest.setOrderOutTradeNo(orderOutTradeNo);
+ lockProductRequest.setOrderItemList(itemRequestList);
+ JsonData jsonData = productFeignService.lockProducts(lockProductRequest);
+ if (jsonData.getCode() != 0) {
+ log.error("锁定商品库存失败:{}", lockProductRequest);
+ throw new BizException(BizCodeEnum.ORDER_CONFIRM_LOCK_PRODUCT_FAIL);
+ }
+ }
+
+ /**
+ * 获取收货地址详情(后端通过id调用服务拿到地址)
+ */
+ private ProductOrderAddressVO getUserAddress(long addressId) {
+ JsonData addressData = userFeignService.detail(addressId);
+ if (addressData.getCode() != 0) {
+ log.error("获取收获地址失败,msg:{}", addressData);
+ throw new BizException(BizCodeEnum.ADDRESS_NO_EXITS);
+ }
+ return addressData.getData(new TypeReference<>() {
+ });
+ }
+
+
@Override
public String queryProductOrderState(String outTradeNo) {
ProductOrderEntity productOrderDO = baseMapper.selectOne(new QueryWrapper()
@@ -35,4 +166,80 @@ public class ProductOrderServiceImpl extends ServiceImpl orderItemList, ConfirmOrderRequest orderRequest) {
+ //统计商品总价格
+ BigDecimal realPayAmount = new BigDecimal("0");
+ if (orderItemList != null) {
+ for (OrderItemVO orderItemVO : orderItemList) {
+ BigDecimal itemRealPayAmount = orderItemVO.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.getRealPayAmount()) != 0) {
+ log.error("订单验价失败:{}", orderRequest);
+ throw new BizException(BizCodeEnum.ORDER_CONFIRM_PRICE_FAIL);
+ }
+ }
+
+
+ /**
+ * 获取优惠券
+ */
+ private CouponRecordVO getCartCouponRecord(Long couponRecordId) {
+ if (couponRecordId == null || couponRecordId < 0) {
+ return null;
+ }
+ JsonData couponData = couponFeignService.findUserCouponRecordById(couponRecordId);
+ if (couponData.getCode() != 0) {
+ throw new BizException(BizCodeEnum.ORDER_CONFIRM_COUPON_FAIL);
+ }
+ if (couponData.getCode() == 0) {
+ CouponRecordVO couponRecordVO = couponData.getData(new TypeReference<>() {
+ });
+ if (!couponAvailable(couponRecordVO)) {
+ log.error("优惠券使用失败");
+ throw new BizException(BizCodeEnum.COUPON_UNAVAILABLE);
+ }
+ return couponRecordVO;
+ }
+ return null;
+ }
+
+
+ /**
+ * 判断优惠券是否可用
+ */
+ 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;
+ }
+
}
diff --git a/nla-order-service/src/main/resources/application.yml b/nla-order-service/src/main/resources/application.yml
index fd1f578..600812e 100644
--- a/nla-order-service/src/main/resources/application.yml
+++ b/nla-order-service/src/main/resources/application.yml
@@ -31,3 +31,11 @@ mybatis-plus:
# level:
# root: INFO
+feign:
+ client:
+ config:
+ default:
+ # 设置Feign的连接超时时间(秒)
+ connectTimeout: 5000
+ # 设置Feign的读取超时时间(秒)
+ readTimeout: 10000
diff --git a/nla-product-service/pom.xml b/nla-product-service/pom.xml
index bbd98ab..d2d4835 100644
--- a/nla-product-service/pom.xml
+++ b/nla-product-service/pom.xml
@@ -24,5 +24,9 @@
org.projectlombok
lombok