From 86f2368f146af23c9e16507f790752e79858a29f Mon Sep 17 00:00:00 2001
From: Hentua <wangdoubleone@gmail.com>
Date: Thu, 22 Feb 2024 22:34:31 +0800
Subject: [PATCH] fix
---
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 201 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 193 insertions(+), 8 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 3eb553e..1b46a1c 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -13,16 +13,15 @@
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.*;
-import cc.mrbird.febs.mall.vo.ApiLeaderListVo;
-import cc.mrbird.febs.mall.vo.OrderDetailVo;
-import cc.mrbird.febs.mall.vo.OrderListVo;
-import cc.mrbird.febs.mall.vo.OrderRefundVo;
+import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.model.OrderStateDto;
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.pay.util.WeixinServiceUtil;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
+import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService;
+import cc.mrbird.febs.vip.service.IMallVipConfigService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
@@ -32,6 +31,7 @@
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -45,6 +45,7 @@
import java.math.BigDecimal;
import java.util.*;
+import java.util.stream.Collectors;
/**
* @author wzy
@@ -82,6 +83,11 @@
private final IApiMallTeamLeaderService iApiMallTeamLeaderService;
private final IMallElectronicFenceService iMallElectronicFenceService;
private final MallElectronicFenceMapper mallElectronicFenceMapper;
+ private final MallMemberCouponMapper mallMemberCouponMapper;
+ private final MallGoodsCouponMapper mallGoodsCouponMapper;
+ private final CouponGoodsMapper couponGoodsMapper;
+
+ private final IMallVipConfigService mallVipConfigService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -115,6 +121,24 @@
this.baseMapper.insert(orderInfo);
BigDecimal total = BigDecimal.ZERO;
+ /**
+ * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额
+ */
+ Map<Long, BigDecimal> couponAmountMap = new HashMap<>();
+ MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
+ if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
+ Long memberCouponId = addOrderDto.getMemberCouponId();
+ mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+ if(ObjectUtil.isEmpty(mallMemberCoupon)){
+ throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
+ }
+ Integer state = mallMemberCoupon.getState();
+ if(1 != state){
+ throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
+ }
+ List<AddOrderItemDto> items = addOrderDto.getItems();
+ couponAmountMap = getCouponAmountMap(memberCouponId, items);
+ }
for (AddOrderItemDto item : addOrderDto.getItems()) {
MallOrderItem orderItem = new MallOrderItem();
@@ -141,6 +165,12 @@
orderItem.setSkuImage(mallGoods.getThumb());
orderItem.setState(1);
+ if (addOrderDto.getType() == 1) {
+ LambdaQueryWrapper<MallShoppingCart> delQuery = new LambdaQueryWrapper<>();
+ delQuery.eq(MallShoppingCart::getGoodsId, item.getSkuId())
+ .eq(MallShoppingCart::getMemberId, member.getId());
+ mallShoppingCartMapper.delete(delQuery);
+ }
total = total.add(amount);
} else {
MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
@@ -183,6 +213,17 @@
}
BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
+ //是否使用优惠卷
+ if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
+ Long memberCouponId = addOrderDto.getMemberCouponId();
+ if(ObjectUtil.isNotEmpty(couponAmountMap.get(item.getSkuId()))){
+ BigDecimal skuCouponAmount = couponAmountMap.get(item.getSkuId());//使用折扣卷后的应该支付的钱
+ if(skuCouponAmount.compareTo(BigDecimal.ZERO) > 0){
+ amount = skuCouponAmount;
+ }
+ orderItem.setMemberCouponId(memberCouponId);
+ }
+ }
orderItem.setAmount(amount);
orderItem.setCnt(item.getCnt());
orderItem.setOrderId(orderInfo.getId());
@@ -191,6 +232,13 @@
orderItem.setGoodsName(sku.getGoodsName());
orderItem.setSkuId(sku.getId());
orderItem.setState(1);
+ if(ObjectUtil.isNotEmpty(member.getReferrerId())){
+ orderItem.setMemberInviteId(member.getReferrerId());
+ }
+ if(ObjectUtil.isNotEmpty(addOrderDto.getMemberInviteId())){
+ orderItem.setMemberInviteId(addOrderDto.getMemberInviteId());
+ }
+
orderItem.setStyleName(sku.getStyleName());
orderItem.setSkuName(sku.getSkuName());
orderItem.setSkuImage(sku.getSkuImage());
@@ -209,6 +257,9 @@
}
mallOrderItemMapper.insert(orderItem);
}
+
+ mallMemberCoupon.setState(2);
+ mallMemberCouponMapper.updateById(mallMemberCoupon);
//运费
BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount();
orderInfo.setCarriage(delivaryAmount);
@@ -232,6 +283,110 @@
return orderInfo.getId();
}
+ /**
+ * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额
+ * @param memberCouponId 优惠卷ID
+ * @param items 商品明细
+ * @return Map<Long,BigDecimal> skuId,实际支付金额
+ */
+ @Override
+ public Map<Long,BigDecimal> getCouponAmountMap(Long memberCouponId,List<AddOrderItemDto> items){
+ HashMap<Long,BigDecimal> couponAmountMap = new HashMap<>();
+ MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+ if(ObjectUtil.isEmpty(mallMemberCoupon)){
+ return couponAmountMap;
+ }
+ Integer state = mallMemberCoupon.getState();
+ if(1 != state){
+ return couponAmountMap;
+ }
+ Long couponId = mallMemberCoupon.getCouponId();//优惠卷ID
+ List<Long> goodsIdsAll = couponGoodsMapper.selectByCouponId(couponId);
+ List<MallGoodsSku> skusAll = mallGoodsSkuMapper.selectSkuIdsByGoodsId(goodsIdsAll);//获取该优惠卷绑定的全部商品sku
+ List<Long> skuIdsAll = skusAll.stream().map(MallGoodsSku::getId).collect(Collectors.toList());//获取该优惠卷绑定的全部商品skuIDS
+ List<Long> skuIds = items.stream().map(AddOrderItemDto::getSkuId).collect(Collectors.toList());//订单中的全部skuIds
+
+ /**
+ * 获取这张优惠卷生效的skuIds
+ */
+ Set<Long> intersection = skuIdsAll.stream()
+ .filter(item -> skuIds.contains(item))
+ .collect(Collectors.toSet());//获取两个集合的交集
+ if(CollUtil.isEmpty(intersection)){
+ return couponAmountMap;
+ }
+ HashMap<Long,BigDecimal> skuMap = new HashMap<>();//每个订单详情的ID和amount的map
+ List<MallGoodsSku> skus = mallGoodsSkuMapper.selectByIds(new ArrayList<>(intersection));
+ BigDecimal totalAmount = BigDecimal.ZERO;//订单中的总金额
+ Map<Long, AddOrderItemDto> itemMap = new HashMap<>();// 预先将items转换为Map,以skuId作为键
+ for (AddOrderItemDto addOrderItemDto : items) {
+ itemMap.put(addOrderItemDto.getSkuId(), addOrderItemDto);
+ }
+ for(MallGoodsSku mallGoodsSku : skus){
+ Long id = mallGoodsSku.getId();
+ BigDecimal presentPrice = mallGoodsSku.getPresentPrice();
+ // 检查itemMap中是否存在该商品
+ AddOrderItemDto addOrderItemDto = itemMap.get(id);
+ if (addOrderItemDto != null) {
+ BigDecimal skuAmount = presentPrice.multiply(BigDecimal.valueOf(addOrderItemDto.getCnt()));
+ totalAmount = totalAmount.add(skuAmount);
+ skuMap.put(id,skuAmount);
+ }
+ }
+
+ /**
+ * 计算每个商品利用优惠卷打折的具体金额
+ */
+ MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(mallMemberCoupon.getCouponId());
+ BigDecimal costAmount = mallGoodsCoupon.getCostAmount();
+ BigDecimal realAmount = mallGoodsCoupon.getRealAmount();
+ if(totalAmount.compareTo(costAmount) < 0){
+ return couponAmountMap;
+ }
+ HashMap<Long,BigDecimal> skuMapPercent = new HashMap<>();//每个订单详情的ID和amount的map
+ for (Map.Entry<Long,BigDecimal> entry : skuMap.entrySet()) {
+ Long keySkuId = entry.getKey();
+ BigDecimal valueSkuAmount = entry.getValue();
+ BigDecimal divide = valueSkuAmount.divide(totalAmount, 4, BigDecimal.ROUND_DOWN);//每个商品占符合满减的总额的比例
+ skuMapPercent.put(keySkuId,divide);
+ Integer type = mallGoodsCoupon.getType();
+ if(MallGoodsCoupon.TYPE_ONE == type){
+ BigDecimal bigDecimal = realAmount.multiply(divide).setScale(0, BigDecimal.ROUND_DOWN);//每个SKU的减免金额(比例*减免金额)
+ BigDecimal skuRealAmount = valueSkuAmount.subtract(bigDecimal.compareTo(BigDecimal.ZERO) > 0 ? bigDecimal : BigDecimal.ZERO);//实际支付金额
+ couponAmountMap.put(keySkuId,skuRealAmount);
+ }
+ if(MallGoodsCoupon.TYPE_TWO == type){
+ BigDecimal divideTime = totalAmount.divide(costAmount, 0, BigDecimal.ROUND_DOWN);//累计减免次数
+ BigDecimal multiply = divideTime.multiply(realAmount);//实际减免金额
+ BigDecimal bigDecimal = multiply.multiply(divide).setScale(0, BigDecimal.ROUND_DOWN);//每个SKU的减免金额(比例*实际减免金额)
+ BigDecimal skuRealAmount = valueSkuAmount.subtract(bigDecimal.compareTo(BigDecimal.ZERO) > 0 ? bigDecimal : BigDecimal.ZERO);//实际支付金额
+ couponAmountMap.put(keySkuId,skuRealAmount);
+ }
+ }
+ return couponAmountMap;
+ }
+
+ public static void main(String[] args) {
+ List<Integer> a = new ArrayList<>();
+ a.add(1);
+ a.add(2);
+ a.add(3);
+ List<Integer> b = new ArrayList<>();
+ b.add(3);
+ b.add(4);
+ b.add(5);
+ boolean b1 = a.retainAll(b);
+ System.out.println(b1);
+ System.out.println(a);
+ System.out.println(b);
+ List<Integer> intersection = a.stream()
+ .filter(item -> b.contains(item))
+ .collect(Collectors.toList());
+
+ System.out.println(intersection);
+
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
@@ -250,7 +405,11 @@
orderInfo.setCancelType(MallOrderInfo.CANCEL_BY_SELF);
this.baseMapper.updateById(orderInfo);
-
+ if (orderInfo.getOrderType() == 2) {
+// mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue());
+// memberWalletService.add(orderInfo.getAmount(), member.getId(), "prizeScore");
+ return;
+ }
List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfo.getId());
if(CollUtil.isNotEmpty(mallOrderItemList)){
@@ -273,6 +432,12 @@
Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
if(1 != skuResult){
throw new FebsException(sku.getSkuName() + "库存不足");
+ }
+ Long memberCouponId = mallOrderItem.getMemberCouponId();
+ MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+ if(ObjectUtil.isNotEmpty(mallMemberCoupon)){
+ mallMemberCoupon.setState(1);
+ mallMemberCouponMapper.updateById(mallMemberCoupon);
}
}
}
@@ -366,6 +531,8 @@
orderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue());
mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2);
+
+ agentProducer.sendOrderCoupon(orderInfo.getId());
break;
case "4":
if (orderInfo.getOrderType() != 2) {
@@ -379,7 +546,7 @@
orderInfo.setPayTime(new Date());
orderInfo.setPayResult("1");
- mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue());
+ mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2);
break;
default:
@@ -445,6 +612,12 @@
if (ObjectUtil.isNull(orderInfo)) {
throw new FebsException("订单不存在");
}
+ List<MallOrderItem> items = orderInfo.getItems();
+ if(CollUtil.isNotEmpty(items)){
+ for(MallOrderItem mallOrderItem : items){
+ mallOrderItem.setItemAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getAmount());
+ }
+ }
OrderDetailVo orderDetailVo = MallOrderInfoConversion.INSTANCE.entityToDetailVo(orderInfo);
@@ -495,6 +668,7 @@
orderInfo.setReceivingTime(new Date());
this.baseMapper.updateById(orderInfo);
+ agentProducer.sendGetScoreMsg(orderInfo.getId());
//生成一条团长提成记录
// Long orderInfoId = orderInfo.getId();
// List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId);
@@ -866,8 +1040,19 @@
return new FebsResponse().success();
}
- public static void main(String[] args) {
- System.out.print(AgentLevelEnum.ZERO_LEVEL.name());
+ @Override
+ public FebsResponse chooseCoupon(ApiChooseCouponDto chooseCouponDto) {
+ Map<Long, BigDecimal> couponAmountMap = getCouponAmountMap(chooseCouponDto.getMemberCouponId(), chooseCouponDto.getItems());
+ ArrayList<ApiCouponAmountMapVo> objects = new ArrayList<>();
+ for (Map.Entry<Long,BigDecimal> entry : couponAmountMap.entrySet()) {
+ Long keySkuId = entry.getKey();
+ BigDecimal valueSkuAmount = entry.getValue();
+ ApiCouponAmountMapVo apiCouponAmountMapVo = new ApiCouponAmountMapVo();
+ apiCouponAmountMapVo.setId(keySkuId);
+ apiCouponAmountMapVo.setAmount(valueSkuAmount);
+ objects.add(apiCouponAmountMapVo);
+ }
+ return new FebsResponse().success().data(objects);
}
}
--
Gitblit v1.9.1