Administrator
2025-05-15 852b685fc99028dbd47f14e50939e00216ee26e7
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)
@@ -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();
@@ -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,39 @@
        //过期时间修改成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();
            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).setScale(0, RoundingMode.HALF_DOWN);
                    scoreAmountMap.put(skuId, scoreAmount);
                }
            }
        }
        return scoreAmountMap;
    }
    /**
@@ -497,73 +546,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.getScoreAmount()),
                            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) {
@@ -616,6 +728,7 @@
        if(CollUtil.isNotEmpty(items)){
            for(MallOrderItem mallOrderItem : items){
                mallOrderItem.setItemAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getAmount());
                mallOrderItem.setScoreAmount(mallOrderItemMapper.selectById(mallOrderItem.getId()).getScoreAmount());
            }
        }
@@ -655,10 +768,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 +778,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
@@ -1006,6 +1087,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 +1125,8 @@
            if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架");
            }
            //判断
        }
        return new FebsResponse().success();