Administrator
2026-06-12 e28f4db774879138d947b32f7e9f1ec8e5e56077
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -93,18 +93,16 @@
    @Transactional(rollbackFor = Exception.class)
    public Long createOrder(AddOrderDto addOrderDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember member = ValidateEntityUtils
                .ensureColumnReturnEntity(memberId, MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
        //订单范围内才允许下单
        MallAddressInfo address = ValidateEntityUtils
                .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "收货地址信息不存在");
                .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "Please fill in the address first");
        String orderNo = MallUtils.getOrderNum();
        MallOrderInfo orderInfo = new MallOrderInfo();
        orderInfo.setOrderNo(orderNo);
        orderInfo.setOrderTime(new Date());
        orderInfo.setMemberId(member.getId());
        orderInfo.setMemberId(memberId);
        orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
        orderInfo.setRemark(addOrderDto.getRemark());
        orderInfo.setOrderType(addOrderDto.getOrderType());
@@ -115,131 +113,54 @@
        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();
            MallOrderItem orderItem = new MallOrderItem();
                // 积分商品提交订单
                if (addOrderDto.getOrderType() == 2) {
                    MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId());
                    if (mallGoods.getStock() < item.getCnt()) {
                        throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    }
            MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
            if (sku == null) {
                throw new FebsException("The product does not exist.");
            }
                    if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                        throw new FebsException(mallGoods.getGoodsName() + "已下架");
                    }
            if (sku.getStock() < item.getCnt()) {
                throw new FebsException("Insufficient stock");
            }
                    BigDecimal amount = mallGoods.getScore().multiply(BigDecimal.valueOf(item.getCnt()));
                    orderItem.setAmount(amount);
                    orderItem.setCnt(item.getCnt());
                    orderItem.setOrderId(orderInfo.getId());
                    orderItem.setPrice(mallGoods.getScore());
                    orderItem.setGoodsId(mallGoods.getId());
                    orderItem.setGoodsName(mallGoods.getGoodsName());
                    orderItem.setStyleName(mallGoods.getGoodsName());
                    orderItem.setSkuName(mallGoods.getGoodsName());
                    orderItem.setSkuImage(mallGoods.getThumb());
                    orderItem.setState(1);
            MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                    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());
                    if (sku == null) {
                        throw new FebsException("购买商品或sku不存在");
                    }
            if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                throw new FebsException("Discontinued");
            }
            //商品库存销量计算
            Integer goodsResult = mallGoodsMapper.upDateStockAndVolumeByGoodsId(mallGoods.getId(), item.getCnt());
            if(1 != goodsResult){
                throw new FebsException("Discontinued");
            }
                    if (sku.getStock() < item.getCnt()) {
                        throw new FebsException(sku.getSkuName() + "库存不足");
                    }
            BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
            orderItem.setAmount(amount);
            orderItem.setCnt(item.getCnt());
            orderItem.setOrderId(orderInfo.getId());
            orderItem.setPrice(sku.getPresentPrice());
            orderItem.setGoodsId(sku.getGoodsId());
            orderItem.setGoodsName(sku.getGoodsName());
            orderItem.setSkuId(sku.getId());
            orderItem.setState(1);
            orderItem.setStyleName(sku.getStyleName());
            orderItem.setSkuName(sku.getSkuName());
            orderItem.setSkuImage(sku.getSkuImage());
            orderItem.setIsNormal(mallGoods.getIsNormal());
            orderItem.setCostPrice(sku.getCostPrice());
                    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("无法重复领取同一个商品");
                        }
                    }
                    if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                        throw new FebsException(mallGoods.getGoodsName() + "已下架");
                    }
                    //商品库存销量计算
                    Integer goodsResult = mallGoodsMapper.upDateStockAndVolumeByGoodsId(mallGoods.getId(), item.getCnt());
                    if(1 != goodsResult){
                        throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    }
                    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());
                    orderItem.setPrice(sku.getPresentPrice());
                    orderItem.setGoodsId(sku.getGoodsId());
                    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());
                    orderItem.setIsNormal(mallGoods.getIsNormal());
                    orderItem.setCostPrice(sku.getCostPrice());
                    total = total.add(amount);
                    //规格的库存销量
                    Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt());
                    ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "库存不足");
                    if (addOrderDto.getType() == 1) {
                        mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
                    }
                }
                mallOrderItemMapper.insert(orderItem);
            total = total.add(amount);
            //规格的库存销量
            Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt());
            ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "Discontinued");
            if (addOrderDto.getType() == 1) {
                mallShoppingCartMapper.delBySkuId(sku.getId(), memberId);
            }
            mallOrderItemMapper.insert(orderItem);
        }
        mallMemberCoupon.setState(2);
        mallMemberCouponMapper.updateById(mallMemberCoupon);
        //运费
        BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount();
        orderInfo.setCarriage(delivaryAmount);
@@ -247,14 +168,10 @@
        total = total.add(delivaryAmount);
        orderInfo.setAmount(total);
        orderInfo.setAddressId(address.getId());
        orderInfo.setName(address.getName());
        orderInfo.setName(address.getFristName() + address.getName());
        orderInfo.setPhone(address.getPhone());
        orderInfo.setIsHome(addOrderDto.getIsHome());
        if (StrUtil.isBlank(address.getLatitude())||StrUtil.isBlank(address.getLongitude())) {
            throw new FebsException("请添加地址");
        }
        orderInfo.setAddress(address.getProvince()+address.getCity()+address.getArea() + address.getAddress());
        orderInfo.setAddress(address.getArea()+ address.getAddress()+address.getCity()+address.getProvince() + address.getCountry() );
        orderInfo.setLatitude(address.getLatitude());
        orderInfo.setLongitude(address.getLongitude());
        this.baseMapper.updateById(orderInfo);
@@ -394,11 +311,11 @@
        MallMember member = LoginUserUtil.getLoginUser();
        MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
        if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
            throw new FebsException("订单不存在");
            throw new FebsException("Order does not exist");
        }
        if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
            throw new FebsException("订单不是待付款, 无法取消");
            throw new FebsException("The order is not pending payment, so it cannot be canceled");
        }
        orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
@@ -406,8 +323,6 @@
        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;
        }
@@ -416,22 +331,22 @@
            for(MallOrderItem mallOrderItem : mallOrderItemList){
                MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
                if (sku == null) {
                    throw new FebsException("购买商品或sku不存在");
                    throw new FebsException("The product does not exist.");
                }
                if (sku.getStock() < mallOrderItem.getCnt()) {
                    throw new FebsException(sku.getSkuName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
                if(1 != goodsResult){
                    throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
                if(1 != skuResult){
                    throw new FebsException(sku.getSkuName() + "库存不足");
                    throw new FebsException("Insufficient stock");
                }
                Long memberCouponId = mallOrderItem.getMemberCouponId();
                MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
@@ -991,32 +906,23 @@
    @Override
    public FebsResponse createOrderVerify(ApiCreateOrderVerifyDto apiCreateOrderVerifyDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember member = memberMapper.selectById(memberId);
        List<AddOrderItemDto> items = apiCreateOrderVerifyDto.getItems();
        if(CollUtil.isEmpty(items)){
            return new FebsResponse().fail().message("请先挑选商品");
            return new FebsResponse().fail().message("Please select the product first");
        }
        for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) {
            MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
            if (sku == null) {
                return new FebsResponse().fail().message("购买商品或sku不存在");
                return new FebsResponse().fail().message("The product does not exist.");
            }
            if (sku.getStock() < item.getCnt()) {
                return new FebsResponse().fail().message(sku.getSkuName() + "库存不足");
                return new FebsResponse().fail().message("Insufficient stock");
            }
            MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
            if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架");
                return new FebsResponse().fail().message("Discontinued");
            }
            if(GoodsTypeEnum.HUO_DONG.getValue() == mallGoods.getIsNormal()){
                //活动商品判断是否在活动进行中
                MallActivity mallActivity = mallActivityMapper.selectById(mallGoods.getActivityId());
                if(mallActivity == null || mallActivity.getState() != 2){
                    return new FebsResponse().fail().message("活动不在进行中");
                }
            }
        }
        return new FebsResponse().success();