From 529ad9dd8d1876b57e852bc45b602ba3ccc8df2a Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Wed, 10 Apr 2024 17:19:08 +0800 Subject: [PATCH] 公告-首页公告调整 --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 212 +++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 157 insertions(+), 55 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 978a305..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,10 +13,7 @@ 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; @@ -34,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; @@ -123,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(); @@ -150,7 +166,10 @@ orderItem.setState(1); if (addOrderDto.getType() == 1) { - mallShoppingCartMapper.delBySkuId(item.getSkuId(), member.getId()); + LambdaQueryWrapper<MallShoppingCart> delQuery = new LambdaQueryWrapper<>(); + delQuery.eq(MallShoppingCart::getGoodsId, item.getSkuId()) + .eq(MallShoppingCart::getMemberId, member.getId()); + mallShoppingCartMapper.delete(delQuery); } total = total.add(amount); } else { @@ -197,48 +216,12 @@ //是否使用优惠卷 if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){ Long memberCouponId = addOrderDto.getMemberCouponId(); - MallMemberCoupon 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()+"无法使用"); - } - //卷是否和商品绑定 - Long skuGoodsId = sku.getGoodsId(); - Long couponId = mallMemberCoupon.getCouponId(); - MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(mallMemberCoupon.getCouponId()); - if(ObjectUtil.isEmpty(mallGoodsCoupon)){ - throw new FebsException(mallGoodsCoupon.getName()+"无法使用"); - } - Integer stateCoupon = mallGoodsCoupon.getState(); - if(2 != stateCoupon){ - throw new FebsException(mallGoodsCoupon.getName()+"无法使用"); - } - List<CouponGoods> couponGoods = couponGoodsMapper.selectByGoodIdAndCouponId(skuGoodsId, couponId); - if(ObjectUtil.isEmpty(couponGoods)){ - throw new FebsException(sku.getGoodsName()+"无法使用"+mallMemberCoupon.getCouponName()); - } -// Long goodsId = mallMemberCoupon.getGoodsId(); -// if(goodsId != sku.getGoodsId()){ -// throw new FebsException(sku.getGoodsName()+"无法使用"+mallMemberCoupon.getCouponName()); -// } - BigDecimal costAmount = mallGoodsCoupon.getCostAmount(); - BigDecimal realAmount = mallGoodsCoupon.getRealAmount(); - if(amount.compareTo(costAmount) >= 0){ - Integer type = mallGoodsCoupon.getType(); - if(MallGoodsCoupon.TYPE_TWO == type){ - BigDecimal divideTime = amount.divide(costAmount, 0, BigDecimal.ROUND_DOWN);//累计减免次数 - BigDecimal multiply = divideTime.multiply(realAmount);//实际减免金额 - amount = (amount.subtract(multiply).compareTo(BigDecimal.ZERO) > 0 ? amount.subtract(multiply) : BigDecimal.ZERO); - } - if(MallGoodsCoupon.TYPE_ONE == type){ - amount = (amount.subtract(realAmount).compareTo(BigDecimal.ZERO) > 0 ? amount.subtract(realAmount) : BigDecimal.ZERO); + if(ObjectUtil.isNotEmpty(couponAmountMap.get(item.getSkuId()))){ + BigDecimal skuCouponAmount = couponAmountMap.get(item.getSkuId());//使用折扣卷后的应该支付的钱 + if(skuCouponAmount.compareTo(BigDecimal.ZERO) > 0){ + amount = skuCouponAmount; } orderItem.setMemberCouponId(memberCouponId); - mallMemberCoupon.setState(2); - mallMemberCouponMapper.updateById(mallMemberCoupon); } } orderItem.setAmount(amount); @@ -274,6 +257,9 @@ } mallOrderItemMapper.insert(orderItem); } + + mallMemberCoupon.setState(2); + mallMemberCouponMapper.updateById(mallMemberCoupon); //运费 BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount(); orderInfo.setCarriage(delivaryAmount); @@ -297,10 +283,108 @@ 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) { - BigDecimal bigDecimal = new BigDecimal(980); - BigDecimal divide = bigDecimal.divide(new BigDecimal(100), 0, BigDecimal.ROUND_DOWN); - System.out.println(divide); + 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); + } @@ -322,9 +406,8 @@ 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"); +// mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue()); +// memberWalletService.add(orderInfo.getAmount(), member.getId(), "prizeScore"); return; } @@ -450,7 +533,6 @@ mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); agentProducer.sendOrderCoupon(orderInfo.getId()); - agentProducer.sendGetScoreMsg(orderInfo.getId()); break; case "4": if (orderInfo.getOrderType() != 2) { @@ -464,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: @@ -530,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); @@ -580,8 +668,7 @@ orderInfo.setReceivingTime(new Date()); this.baseMapper.updateById(orderInfo); - agentProducer.sendVipLevelUp(orderInfo.getId()); - + agentProducer.sendGetScoreMsg(orderInfo.getId()); //生成一条团长提成记录 // Long orderInfoId = orderInfo.getId(); // List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId); @@ -953,4 +1040,19 @@ return new FebsResponse().success(); } + @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