|
@@ -1,6 +1,7 @@
|
|
|
package com.chelvc.cloud.vehicle.server.service.impl;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
@@ -8,7 +9,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.chelvc.cloud.user.client.UserClient;
|
|
|
import com.chelvc.cloud.user.client.dto.UserDTO;
|
|
|
import com.chelvc.cloud.user.client.model.Scope;
|
|
|
+import com.chelvc.cloud.vehicle.client.constant.CouponType;
|
|
|
import com.chelvc.cloud.vehicle.client.constant.ReserveStatus;
|
|
|
+import com.chelvc.cloud.vehicle.client.constant.UserCouponStatus;
|
|
|
import com.chelvc.cloud.vehicle.client.dto.*;
|
|
|
import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
|
|
|
import com.chelvc.cloud.vehicle.client.param.OrderPagingParam;
|
|
@@ -51,6 +54,8 @@ import java.security.SecureRandom;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.stream.Collector;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 订单Service业务层处理
|
|
@@ -78,6 +83,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
private final BalanceDetailService balanceDetailService;
|
|
|
private final OmsOrderRefundService orderRefundService;
|
|
|
|
|
|
+ private final GoodsService goodsService;
|
|
|
+
|
|
|
// 定义字符池
|
|
|
private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
|
|
|
private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
@@ -138,6 +145,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
// orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
|
|
|
orderItem.setGiftIntegration(0L);
|
|
|
orderItem.setGiftGrowth(0);
|
|
|
+ Long merchantId = goodsService.queryMerchantIdByGoodId(orderItem.getGoodsId());
|
|
|
+ orderItem.setMerchantId(merchantId);
|
|
|
orderItemList.add(orderItem);
|
|
|
}else{
|
|
|
cartPromotionItemList = omsCartItemService.listPromotion(orderParam.getCartIds());
|
|
@@ -159,6 +168,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
// orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
|
|
|
orderItem.setGiftIntegration(0L);
|
|
|
orderItem.setGiftGrowth(0);
|
|
|
+ orderItem.setMerchantId(cartPromotionItem.getMerchantId());
|
|
|
orderItemList.add(orderItem);
|
|
|
}
|
|
|
}
|
|
@@ -167,20 +177,20 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
// Asserts.fail("库存不足,无法下单");
|
|
|
// }
|
|
|
//判断使用使用了优惠券
|
|
|
- if (orderParam.getCouponId() == null) {
|
|
|
+ boolean flag = false;
|
|
|
+ if (orderParam.getUserCouponId() == null) {
|
|
|
//不用优惠券
|
|
|
for (OmsOrderItem orderItem : orderItemList) {
|
|
|
orderItem.setCouponAmount(new BigDecimal(0));
|
|
|
}
|
|
|
} else {
|
|
|
- //使用优惠券
|
|
|
-// UserCouponDTO userCouponDTO = getUseCoupon(cartPromotionItemList, orderParam.getCouponId());
|
|
|
-// if (userCouponDTO == null) {
|
|
|
-// Asserts.check(true, "该优惠券不可用");
|
|
|
-// }
|
|
|
-// //对下单商品的优惠券进行处理
|
|
|
-// assert userCouponDTO != null;
|
|
|
-// handleCouponAmount(orderItemList, userCouponDTO);
|
|
|
+ UserCoupon coupon = userCouponService.checkUseCoupon(orderParam.getUserCouponId(), userId);
|
|
|
+ if (coupon == null) {
|
|
|
+ Asserts.check(true, "该优惠券不可用");
|
|
|
+ }
|
|
|
+ //对下单商品的优惠券进行处理
|
|
|
+ assert coupon != null;
|
|
|
+ flag = handleCouponAmount(orderItemList, coupon);
|
|
|
}
|
|
|
//判断是否使用积分
|
|
|
if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
|
|
@@ -216,10 +226,10 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
order.setFreightAmount(new BigDecimal(0));
|
|
|
order.setPromotionAmount(calcPromotionAmount(orderItemList));
|
|
|
order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
|
|
|
- if (orderParam.getCouponId() == null) {
|
|
|
+ if (orderParam.getUserCouponId() == null || !flag) {
|
|
|
order.setCouponAmount(new BigDecimal(0));
|
|
|
} else {
|
|
|
- order.setCouponId(orderParam.getCouponId());
|
|
|
+ order.setCouponId(orderParam.getUserCouponId());
|
|
|
order.setCouponAmount(calcCouponAmount(orderItemList));
|
|
|
}
|
|
|
if (orderParam.getUseIntegration() == null) {
|
|
@@ -283,8 +293,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
omsOrderItemService.add(orderItemList);
|
|
|
omsOrderOperateHistoryService.insertOmsOrderOperateHistory(order.getId(), userId, order.getStatus());
|
|
|
//如使用优惠券更新优惠券使用状态
|
|
|
- if (orderParam.getCouponId() != null) {
|
|
|
- updateCouponStatus(orderParam.getCouponId(), userId, 1);
|
|
|
+ if (orderParam.getUserCouponId() != null && flag) {
|
|
|
+ updateCouponStatus(orderParam.getUserCouponId(), userId, 1);
|
|
|
}
|
|
|
//如使用积分需要扣除积分
|
|
|
// if (orderParam.getUseIntegration() != null) {
|
|
@@ -630,6 +640,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
return;
|
|
|
}
|
|
|
example.setUsed(useStatus);
|
|
|
+ example.setStatus(UserCouponStatus.USED);
|
|
|
+ example.setConsumptionTime(new Date());
|
|
|
this.userCouponService.updateUserCouponUserd(example, couponId, userId);
|
|
|
}
|
|
|
|
|
@@ -753,13 +765,19 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
// return integrationAmount;
|
|
|
// }
|
|
|
|
|
|
+ /**
|
|
|
+ * 对优惠券优惠进行处理
|
|
|
+ *
|
|
|
+ * @param orderItemList order_item列表
|
|
|
+ * @param userCoupon 可用优惠券详情
|
|
|
+ */
|
|
|
/**
|
|
|
* 对优惠券优惠进行处理
|
|
|
*
|
|
|
* @param orderItemList order_item列表
|
|
|
* @param userCouponDTO 可用优惠券详情
|
|
|
*/
|
|
|
- private void handleCouponAmount(List<OmsOrderItem> orderItemList, UserCouponDTO userCouponDTO) {
|
|
|
+ /*private void handleCouponAmount(List<OmsOrderItem> orderItemList, CouponDTO userCouponDTO) {
|
|
|
if (userCouponDTO.getType().equals(0)) {
|
|
|
//全场通用
|
|
|
calcPerCouponAmount(orderItemList, userCouponDTO.getCouponDTO());
|
|
@@ -772,6 +790,101 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(userCouponDTO, orderItemList, 1);
|
|
|
calcPerCouponAmount(couponOrderItemList, userCouponDTO.getCouponDTO());
|
|
|
}
|
|
|
+ }*/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对优惠券优惠进行处理
|
|
|
+ *
|
|
|
+ * @param orderItemList order_item列表
|
|
|
+ * @param userCoupon 可用优惠券详情
|
|
|
+ */
|
|
|
+ private boolean handleCouponAmount(List<OmsOrderItem> orderItemList, UserCoupon userCoupon) {
|
|
|
+ boolean flag = false; //是否使用优惠券
|
|
|
+ BigDecimal amount = userCoupon.getAmount();
|
|
|
+ BigDecimal doorsillAmount = userCoupon.getDoorsillAmount();
|
|
|
+ Long merchantId = userCoupon.getMerchantId();
|
|
|
+ BigDecimal totalAmount = calcTotalAmount(orderItemList);
|
|
|
+ if (CouponType.GIVE.equals(userCoupon.getType())) {
|
|
|
+ //全场通用
|
|
|
+ for (OmsOrderItem orderItem : orderItemList) {
|
|
|
+ if(merchantId == 0L){
|
|
|
+ if(totalAmount.compareTo(amount) > 0){
|
|
|
+ orderItem.setCouponAmount(amount);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ } else if(merchantId.equals(orderItem.getMerchantId())){
|
|
|
+ Map<Long, BigDecimal> map = handle(orderItemList);
|
|
|
+ BigDecimal merchantAmount = map.get(merchantId);
|
|
|
+ if(merchantAmount.compareTo(amount) > 0){
|
|
|
+ orderItem.setCouponAmount(amount);
|
|
|
+ return true;
|
|
|
+ } else if(merchantAmount.compareTo(amount) <= 0 && totalAmount.compareTo(amount) > 0){
|
|
|
+ orderItem.setCouponAmount(merchantAmount);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (CouponType.REDUCE.equals(userCoupon.getType())) {
|
|
|
+ //满减
|
|
|
+ for (OmsOrderItem orderItem : orderItemList) {
|
|
|
+ if(merchantId == 0L){
|
|
|
+ if(totalAmount.compareTo(amount) <= 0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(totalAmount.compareTo(doorsillAmount) <= 0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ orderItem.setCouponAmount(amount);
|
|
|
+ return true;
|
|
|
+ } else if(merchantId.equals(orderItem.getMerchantId())){
|
|
|
+ Map<Long, BigDecimal> map = handle(orderItemList);
|
|
|
+ BigDecimal merchantAmount = map.get(merchantId);
|
|
|
+ if(merchantAmount.compareTo(doorsillAmount) <= 0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(merchantAmount.compareTo(amount) > 0){
|
|
|
+ orderItem.setCouponAmount(amount);
|
|
|
+ } else if(merchantAmount.compareTo(amount) <= 0 && totalAmount.compareTo(amount) > 0){
|
|
|
+ orderItem.setCouponAmount(merchantAmount);
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (CouponType.DISCOUNT.equals(userCoupon.getType())) {
|
|
|
+ //折扣
|
|
|
+ if(amount.compareTo(BigDecimal.ZERO) <= 0 || amount.compareTo(BigDecimal.TEN) >= 0){
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+ for (OmsOrderItem orderItem : orderItemList) {
|
|
|
+ if(merchantId == 0L){
|
|
|
+ BigDecimal multiply = totalAmount.multiply(amount.divide(BigDecimal.TEN, 2, RoundingMode.UP));
|
|
|
+ orderItem.setCouponAmount(totalAmount.subtract(multiply));
|
|
|
+ return true;
|
|
|
+ } else if(merchantId.equals(orderItem.getMerchantId())){
|
|
|
+ Map<Long, BigDecimal> map = handle(orderItemList);
|
|
|
+ BigDecimal merchantAmount = map.get(merchantId);
|
|
|
+ BigDecimal multiply = merchantAmount.multiply(amount.divide(BigDecimal.TEN, 2, RoundingMode.UP));
|
|
|
+ orderItem.setCouponAmount(merchantAmount.subtract(multiply));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Map<Long, BigDecimal> handle(List<OmsOrderItem> orderItemList){
|
|
|
+ List<OrderPriceGroupDTO> list = orderItemList.stream()
|
|
|
+ .map(e -> new OrderPriceGroupDTO(e.getMerchantId(),
|
|
|
+ e.getGoodsPrice().multiply(new BigDecimal(e.getGoodsQuantity()))))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ return list.stream()
|
|
|
+ .collect(Collectors.groupingBy(OrderPriceGroupDTO::getMerchantId,
|
|
|
+ Collectors.reducing(BigDecimal.ZERO, OrderPriceGroupDTO::getAmount,
|
|
|
+ BigDecimal::add)));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -779,12 +892,12 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
*
|
|
|
* @param orderItemList 可用优惠券的下单商品商品
|
|
|
*/
|
|
|
- private void calcPerCouponAmount(List<OmsOrderItem> orderItemList, CouponDTO coupon) {
|
|
|
+ private void calcPerCouponAmount(List<OmsOrderItem> orderItemList, UserCoupon coupon) {
|
|
|
BigDecimal totalAmount = calcTotalAmount(orderItemList);
|
|
|
for (OmsOrderItem orderItem : orderItemList) {
|
|
|
//(商品价格/可用商品总价)*优惠券面额
|
|
|
BigDecimal couponAmount =
|
|
|
- orderItem.getGoodsPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(BigDecimal.valueOf(coupon.getAmount()));
|
|
|
+ orderItem.getGoodsPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(coupon.getAmount());
|
|
|
orderItem.setCouponAmount(couponAmount);
|
|
|
}
|
|
|
}
|
|
@@ -1136,6 +1249,14 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public OmsOrder queryCheckOrder(Long orderId, Long userId) {
|
|
|
+ LambdaQueryWrapper<OmsOrder> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.eq(OmsOrder::getId, orderId);
|
|
|
+ wrapper.eq(OmsOrder::getUserId, userId);
|
|
|
+ return baseMapper.selectOne(wrapper);
|
|
|
+ }
|
|
|
+
|
|
|
private int updateStatusById(Long id, Integer status) {
|
|
|
UpdateWrapper<OmsOrder> update = Wrappers.update();
|
|
|
update.set("status", status);
|