From d3e9f57c91ffc08e090bf8d4b8fcbf60f0d3a86f Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 19 May 2025 17:45:15 +0800 Subject: [PATCH] feat(mall): 添加会员等级当前进度相关数据 --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 293 ++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 193 insertions(+), 100 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 1b46a1c..2a89336 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 @@ -44,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -56,6 +57,7 @@ @RequiredArgsConstructor public class ApiMallOrderInfoServiceImpl extends ServiceImpl<MallOrderInfoMapper, MallOrderInfo> implements IApiMallOrderInfoService { + private final MallMemberWalletMapper mallMemberWalletMapper; private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallAddressInfoMapper mallAddressInfoMapper; @@ -88,6 +90,7 @@ private final CouponGoodsMapper couponGoodsMapper; private final IMallVipConfigService mallVipConfigService; + private final MallAchieveRecordMapper mallAchieveRecordMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -106,7 +109,7 @@ throw new FebsException("请重新选择收货地址信息"); } - String orderNo = MallUtils.getOrderNum(); + String orderNo = MallUtils.getOrderNum("O"); MallOrderInfo orderInfo = new MallOrderInfo(); orderInfo.setOrderNo(orderNo); orderInfo.setOrderTime(new Date()); @@ -121,6 +124,7 @@ this.baseMapper.insert(orderInfo); BigDecimal total = BigDecimal.ZERO; + BigDecimal totalScoreAmount = BigDecimal.ZERO; /** * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额 */ @@ -138,6 +142,15 @@ } List<AddOrderItemDto> items = addOrderDto.getItems(); couponAmountMap = getCouponAmountMap(memberCouponId, items); + } + /** + * 判断用户的积分是否足够 + */ + Map<Long, BigDecimal> scoreAmountMap = getScoreAmountMap(addOrderDto.getItems()); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + //判断scoreAmountMap中的总积分数量是否大于用户的积分数量 + if(scoreAmountMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(mallMemberWallet.getPrizeScore()) > 0){ + throw new FebsException("您的积分不足"); } for (AddOrderItemDto item : addOrderDto.getItems()) { MallOrderItem orderItem = new MallOrderItem(); @@ -195,13 +208,13 @@ } MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId()); - // 零撸专区购买 - if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) { - List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId()); - if (CollUtil.isNotEmpty(items)) { - throw new FebsException("无法重复领取同一个商品"); - } - } + // todo 纯积分商品一个账号限制购买一次 +// if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) { +// List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId()); +// if (CollUtil.isNotEmpty(items)) { +// throw new FebsException("积分商品一个账号只能购买一次"); +// } +// } if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { throw new FebsException(mallGoods.getGoodsName() + "已下架"); @@ -225,6 +238,7 @@ } } orderItem.setAmount(amount); + orderItem.setScoreAmount(scoreAmountMap.get(item.getSkuId())); orderItem.setCnt(item.getCnt()); orderItem.setOrderId(orderInfo.getId()); orderItem.setPrice(sku.getPresentPrice()); @@ -246,6 +260,7 @@ orderItem.setCostPrice(sku.getCostPrice()); total = total.add(amount); + totalScoreAmount = totalScoreAmount.add(scoreAmountMap.get(item.getSkuId())); //规格的库存销量 Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt()); if(1 != skuResult){ @@ -266,6 +281,7 @@ total = total.add(delivaryAmount); orderInfo.setAmount(total); + orderInfo.setScoreAmount(totalScoreAmount); orderInfo.setAddressId(address.getId()); orderInfo.setName(address.getName()); orderInfo.setPhone(address.getPhone()); @@ -281,6 +297,40 @@ //过期时间修改成24小时 agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L); return orderInfo.getId(); + } + + private Map<Long, BigDecimal> getScoreAmountMap(List<AddOrderItemDto> items) { + + Map<Long, BigDecimal> scoreAmountMap = new HashMap<>(); + //全部skuIds + Set<Long> skuIds = items.stream().map(AddOrderItemDto::getSkuId).collect(Collectors.toSet()); + LambdaQueryWrapper<MallGoodsSku> mallGoodsSkuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + mallGoodsSkuLambdaQueryWrapper.in(MallGoodsSku::getId, skuIds); + List<MallGoodsSku> skusAll = mallGoodsSkuMapper.selectList(mallGoodsSkuLambdaQueryWrapper); + //全部goodsId + Set<Long> goodsIdsAll = skusAll.stream().map(MallGoodsSku::getGoodsId).collect(Collectors.toSet()); + LambdaQueryWrapper<MallGoods> mallGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + mallGoodsLambdaQueryWrapper.in(MallGoods::getId, goodsIdsAll); + List<MallGoods> goodsAll = mallGoodsMapper.selectList(mallGoodsLambdaQueryWrapper); + //stream流操作goodsAll,返回一个Hashmap<id,MallGoods> + Map<Long, MallGoods> goodsMap = goodsAll.stream().collect(Collectors.toMap(MallGoods::getId, mallGoods -> mallGoods)); + + for (AddOrderItemDto item : items) { + Long skuId = item.getSkuId(); + Integer cnt = item.getCnt(); + MallGoodsSku sku = skusAll.stream().filter(s -> s.getId().equals(skuId)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(sku)) { + Long goodsId = sku.getGoodsId(); + MallGoods mallGoods = goodsMap.get(goodsId); + if (ObjectUtil.isNotEmpty(mallGoods)) { + BigDecimal multi = mallGoods.getStaticProp().divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_DOWN); + //获取该商品该规格的积分 + BigDecimal scoreAmount = sku.getOriginalPrice().multiply(multi).multiply(new BigDecimal(cnt)).setScale(0, RoundingMode.HALF_DOWN); + scoreAmountMap.put(skuId, scoreAmount); + } + } + } + return scoreAmountMap; } /** @@ -497,73 +547,136 @@ String payResultStr = ""; String wxResultStr = ""; - switch (payOrderDto.getType()) { - case "1": - BrandWCPayRequestData brandWCPayRequestData = null; - try { - brandWCPayRequestData = iXcxPayService.startPayment(orderInfo); - } catch (Exception e) { - throw new FebsException("支付失败"); - } - wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); - payResultStr = brandWCPayRequestData.getPrepay_id(); - orderInfo.setPayMethod("微信支付"); - break; - case "2": - if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { - payResultStr = orderInfo.getPayOrderNo(); - } else { - payResultStr = payService.aliPay(orderInfo); - } + if(orderInfo.getAmount().compareTo(BigDecimal.ZERO) <= 0){ + //先支付积分部分 + if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){ + balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); + mallMoneyFlowService.addMoneyFlow( + member.getId(), + orderInfo.getScoreAmount().negate(), + ScoreFlowTypeEnum.PAY.getValue(), + orderInfo.getOrderNo(), + FlowTypeEnum.PRIZE_SCORE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),orderInfo.getScoreAmount()), + 2 + ); + } + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("积分支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + payResultStr = orderInfo.getOrderNo(); + }else{ + switch (payOrderDto.getType()) { + case "1": + BrandWCPayRequestData brandWCPayRequestData = null; + try { + brandWCPayRequestData = iXcxPayService.startPayment(orderInfo); + } catch (Exception e) { + throw new FebsException("支付失败"); + } + wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); + payResultStr = brandWCPayRequestData.getPrepay_id(); + orderInfo.setPayMethod("微信支付"); + break; + case "2": + if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { + payResultStr = orderInfo.getPayOrderNo(); + } else { + payResultStr = payService.aliPay(orderInfo); + } - orderInfo.setPayOrderNo(payResultStr); - orderInfo.setPayMethod("支付宝支付"); - agentProducer.sendOrderReturn(orderInfo.getId()); - break; - case "3": - payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); + orderInfo.setPayOrderNo(payResultStr); + orderInfo.setPayMethod("支付宝支付"); + agentProducer.sendOrderReturn(orderInfo.getId()); + break; + case "3": - orderInfo.setPayOrderNo(orderInfo.getOrderNo()); - orderInfo.setPayMethod("余额支付"); - orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); - orderInfo.setPayTime(new Date()); - orderInfo.setPayResult("1"); - orderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue()); + payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); - mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); + //先支付积分部分 + if(orderInfo.getScoreAmount().compareTo(BigDecimal.ZERO) > 0){ + balanceScorePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); + mallMoneyFlowService.addMoneyFlow( + member.getId(), + orderInfo.getScoreAmount().negate(), + ScoreFlowTypeEnum.PAY.getValue(), + orderInfo.getOrderNo(), + FlowTypeEnum.PRIZE_SCORE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.PAY.getDesc(),orderInfo.getScoreAmount()), + 2 + ); + } - agentProducer.sendOrderCoupon(orderInfo.getId()); - break; - case "4": - if (orderInfo.getOrderType() != 2) { - throw new FebsException("非积分订单,无法使用积分支付"); - } - payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("余额支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + orderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue()); - orderInfo.setPayOrderNo(orderInfo.getOrderNo()); - orderInfo.setPayMethod("积分支付"); - orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); - orderInfo.setPayTime(new Date()); - orderInfo.setPayResult("1"); + mallMoneyFlowService.addMoneyFlow( + member.getId(), + orderInfo.getAmount().negate(), + ScoreFlowTypeEnum.PAY_BALANCE.getValue(), + orderInfo.getOrderNo(), + FlowTypeEnum.BALANCE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.PAY_BALANCE.getDesc(),orderInfo.getAmount()), + 2 + ); + agentProducer.sendOrderCoupon(orderInfo.getId()); + break; + case "4": + if (orderInfo.getOrderType() != 2) { + throw new FebsException("非积分订单,无法使用积分支付"); + } + payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "prizeScore"); - mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2); - break; - default: + orderInfo.setPayOrderNo(orderInfo.getOrderNo()); + orderInfo.setPayMethod("积分支付"); + orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); + orderInfo.setPayTime(new Date()); + orderInfo.setPayResult("1"); + mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), ScoreFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue(), null, 2); + break; + default: + + } } //订单支付成功产生一个提货码 String takeCode = ShareCodeUtil.toSerialCode(orderInfo.getId()); orderInfo.setTakeCode(takeCode); this.baseMapper.updateById(orderInfo); - Map<String, Object> map = new HashMap<>(); map.put("orderInfo", payResultStr); map.put("orderNo", orderInfo.getOrderNo()); map.put("orderId", orderInfo.getId()); map.put("wxResultStr", wxResultStr); - return map; + } + + private String balanceScorePay(MallOrderInfo orderInfo, String tradePwd, String field) { + if (StrUtil.isBlank(tradePwd)) { + throw new FebsException("支付密码错误"); + } + + MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); + if (StrUtil.isBlank(mallMember.getTradePassword())) { + throw new FebsException("未设置支付密码"); + } + + if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) { + throw new FebsException("支付密码错误"); + } + + int reduce = memberWalletService.reduce(orderInfo.getScoreAmount(), mallMember.getId(), field); + if (reduce == 2) { + throw new FebsException("积分不足"); + } + return orderInfo.getOrderNo(); } private String balancePay(MallOrderInfo orderInfo, String tradePwd, String field) { @@ -597,11 +710,11 @@ orderListDto.setMemberId(member.getId()); // IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectApiOrderListInPage(page, orderListDto); IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectNewApiOrderListInPage(page, orderListDto); - if (CollUtil.isNotEmpty(mallOrderInfos.getRecords())) { - mallOrderInfos.getRecords().forEach(item -> { - item.setItems(mallOrderItemMapper.selectListByOrderId(item.getId())); - }); - } +// if (CollUtil.isNotEmpty(mallOrderInfos.getRecords())) { +// mallOrderInfos.getRecords().forEach(item -> { +// item.setItems(mallOrderItemMapper.selectListByOrderId(item.getId())); +// }); +// } return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords()); } @@ -612,12 +725,13 @@ 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()); - } - } +// List<MallOrderItem> items = orderInfo.getItems(); +// if(CollUtil.isNotEmpty(items)){ +// for(MallOrderItem mallOrderItem : items){ +// mallOrderItem.setItemAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getAmount()); +// mallOrderItem.setScoreAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getScoreAmount()); +// } +// } OrderDetailVo orderDetailVo = MallOrderInfoConversion.INSTANCE.entityToDetailVo(orderInfo); @@ -655,10 +769,6 @@ throw new FebsException("该状态不能确认收货"); } -// if (orderInfo.getDeliveryState() != OrderDeliveryStateEnum.DELIVERY_FINISH.getValue()) { -// throw new FebsException("还未送至自提点"); -// } - List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectByItemIdAndOrderIdAndState(null, orderInfo.getId(), 3); if(CollUtil.isNotEmpty(mallRefundEntities)){ throw new FebsException("请先处理退款商品"); @@ -669,34 +779,6 @@ this.baseMapper.updateById(orderInfo); agentProducer.sendGetScoreMsg(orderInfo.getId()); - //生成一条团长提成记录 -// Long orderInfoId = orderInfo.getId(); -// List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId); -// if(CollUtil.isNotEmpty(mallOrderItemList)){ -// -// MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode()); -// Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch(); -// BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent()); -// -// if(1 == profitSwitch){ -// for(MallOrderItem mallOrderItem : mallOrderItemList){ -// Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState(); -// if(1 == state){ -// MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve(); -// mallLeaderAchieve.setMemberId(orderInfo.getMemberId()); -// mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo()); -// mallLeaderAchieve.setOrderItemId(mallOrderItem.getId()); -// BigDecimal itemAmount = mallOrderItem.getAmount(); -// mallLeaderAchieve.setAmount(itemAmount); -// BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN); -// mallLeaderAchieve.setProfitAmount(bigDecimal); -// mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode()); -// mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE); -// mallLeaderAchieveMapper.insert(mallLeaderAchieve); -// } -// } -// } -// } } @Override @@ -869,7 +951,7 @@ mallGoodsComment.setSkuName(mallGoodsSku.getSkuName()); mallGoodsComment.setStyleId(mallGoodsSku.getStyleId()); mallGoodsComment.setStyleName(mallGoodsSku.getStyleName()); - mallGoodsComment.setShowState(MallGoodsComment.SHOW_STATE_ENABLE); + mallGoodsComment.setShowState(MallGoodsComment.SHOW_STATE_DISABLED); mallGoodsCommentMapper.insert(mallGoodsComment); } } @@ -1006,6 +1088,15 @@ if(CollUtil.isEmpty(items)){ return new FebsResponse().fail().message("请先挑选商品"); } + /** + * 判断用户的积分是否足够 + */ + Map<Long, BigDecimal> scoreAmountMap = getScoreAmountMap(apiCreateOrderVerifyDto.getItems()); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + //判断scoreAmountMap中的总积分数量是否大于用户的积分数量 + if(scoreAmountMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(mallMemberWallet.getPrizeScore()) > 0){ + throw new FebsException("您的积分不足"); + } for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) { MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); if (sku == null) { @@ -1035,6 +1126,8 @@ if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) { return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架"); } + + //判断 } return new FebsResponse().success(); -- Gitblit v1.9.1