xiaoyong931011
2022-09-13 61797ff1f2e016c918690ee078e7c1ffd66da28e
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -75,14 +75,21 @@
    private final MallMemberMapper mallMemberMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallLeaderAchieveMapper mallLeaderAchieveMapper;
    private final IApiMallTeamLeaderService iApiMallTeamLeaderService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createOrder(AddOrderDto addOrderDto) {
        synchronized(this){
        MallMember member = LoginUserUtil.getLoginUser();
        String takeUniqueCode = addOrderDto.getTakeUniqueCode();
        if(StrUtil.isEmpty(takeUniqueCode)){
            throw new FebsException("请选择自提点");
        }
        MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(takeUniqueCode);
        if(ObjectUtil.isEmpty(mallTeamLeader)){
            throw new FebsException("请重新选择团长");
        }
        String orderNo = MallUtils.getOrderNum();
@@ -105,83 +112,86 @@
        BigDecimal total = BigDecimal.ZERO;
        BigDecimal carriage = BigDecimal.ZERO;
        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() + "库存不足");
                }
                // 积分商品提交订单
                if (addOrderDto.getOrderType() == 2) {
                    MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId());
                    if (mallGoods.getStock() < item.getCnt()) {
                        throw new FebsException(mallGoods.getGoodsName() + "库存不足");
                    }
                if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                    throw new FebsException(mallGoods.getGoodsName() + "已下架");
                }
                    if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                        throw new FebsException(mallGoods.getGoodsName() + "已下架");
                    }
                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);
                    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);
                total = total.add(amount);
            } else {
                MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
                if (sku == null) {
                    throw new FebsException("购买商品或sku不存在");
                }
                    total = total.add(amount);
                } else {
                    MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
                    if (sku == null) {
                        throw new FebsException("购买商品或sku不存在");
                    }
                if (sku.getStock() < item.getCnt()) {
                    throw new FebsException(sku.getSkuName() + "库存不足");
                }
                    if (sku.getStock() < item.getCnt()) {
                        throw new FebsException(sku.getSkuName() + "库存不足");
                    }
                MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
                    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 (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() + "已下架");
                    }
                    mallGoods.setStock(mallGoods.getStock() - item.getCnt());
                    mallGoods.setVolume(mallGoods.getVolume() + item.getCnt());
                    mallGoodsMapper.updateById(mallGoods);
                    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());
                    total = total.add(amount);
                    carriage = carriage.add(mallGoods.getCarriage());
                    sku.setStock(sku.getStock() - item.getCnt());
                    sku.setSkuVolume(sku.getSkuVolume() + item.getCnt());
                    mallGoodsSkuMapper.updateById(sku);
                    if (addOrderDto.getType() == 1) {
                        mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
                    }
                }
                if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
                    throw new FebsException(mallGoods.getGoodsName() + "已下架");
                }
                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());
                total = total.add(amount);
                carriage = carriage.add(mallGoods.getCarriage());
                sku.setStock(sku.getStock() - item.getCnt());
                sku.setSkuVolume(sku.getSkuVolume() + item.getCnt());
                mallGoodsSkuMapper.updateById(sku);
                if (addOrderDto.getType() == 1) {
                    mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
                }
            }
            mallOrderItemMapper.insert(orderItem);
                mallOrderItemMapper.insert(orderItem);
        }
        //配送费
        BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount();
@@ -208,6 +218,7 @@
        agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L);
        return orderInfo.getId();
        }
    }
@@ -456,7 +467,8 @@
    @Override
    public OrderDetailVo findOrderDetailsById(Long id) {
        MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id);
        if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
//        if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
        if (ObjectUtil.isNull(orderInfo)) {
            throw new FebsException("订单不存在");
        }
@@ -500,19 +512,41 @@
            throw new FebsException("还未送至自提点");
        }
        List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectByItemIdAndOrderIdAndState(null, orderInfo.getId(), 3);
        if(CollUtil.isNotEmpty(mallRefundEntities)){
            throw new FebsException("请先处理退款商品");
        }
        orderInfo.setStatus(OrderStatusEnum.FINISH.getValue());
        orderInfo.setReceivingTime(new Date());
        this.baseMapper.updateById(orderInfo);
        //生成一条团长提成记录
        MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
        mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
        mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
        BigDecimal subtract = orderInfo.getAmount().subtract(orderInfo.getCarriage() == null ? BigDecimal.ZERO : orderInfo.getCarriage());
        mallLeaderAchieve.setAmount(subtract);
        mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
        mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
        mallLeaderAchieveMapper.insert(mallLeaderAchieve);
        Long orderInfoId = orderInfo.getId();
        List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId);
        if(CollUtil.isNotEmpty(mallOrderItemList)){
            MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
            BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
//            DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
//            BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
            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
@@ -686,95 +720,56 @@
        if(1 != deliveryState){
            return new FebsResponse().fail().message("订单不是待配送状态");
        }
        QueryWrapper<MallRefundEntity> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",member.getId());
        objectQueryWrapper.eq("order_id",mallOrderInfo.getId());
        MallRefundEntity mallRefund = mallRefundMapper.selectOne(objectQueryWrapper);
        MallRefundEntity mallRefundEntity = new MallRefundEntity();
        if(ObjectUtil.isEmpty(mallRefund)){
            mallRefundEntity.setRefundNo(mallOrderInfo.getOrderNo()+"_r");
            mallRefundEntity.setMemberId(member.getId());
            mallRefundEntity.setOrderId(mallOrderInfo.getId());
            mallRefundEntity.setType(1);
            mallRefundEntity.setState(3);
            mallRefundEntity.setAmount(mallOrderInfo.getAmount());
            mallRefundMapper.insert(mallRefundEntity);
        }else{
            if(mallRefund.getState() == 1){
                return new FebsResponse().fail().message("订单已退款");
            }
            if(mallRefund.getState() == 3){
                return new FebsResponse().fail().message("订单退款中");
            }
            if(mallRefund.getState() == 2){
                mallRefundEntity.setId(mallRefund.getId());
                mallRefundEntity.setRefundNo(mallRefund.getRefundNo());
                mallRefundEntity.setMemberId(mallRefund.getMemberId());
                mallRefundEntity.setOrderId(mallRefund.getOrderId());
                mallRefundEntity.setType(mallRefund.getType());
        //根据子订单生成退款记录
        List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
        if(CollUtil.isEmpty(mallOrderItemList)){
            return new FebsResponse().fail().message("订单不存在");
        }
        for(MallOrderItem mallOrderItem : mallOrderItemList){
            QueryWrapper<MallRefundEntity> objectQueryWrapper = new QueryWrapper<>();
            objectQueryWrapper.eq("member_id",member.getId());
            objectQueryWrapper.eq("order_id",mallOrderInfo.getId());
            objectQueryWrapper.eq("item_id",mallOrderItem.getId());
            MallRefundEntity mallRefund = mallRefundMapper.selectOne(objectQueryWrapper);
            MallRefundEntity mallRefundEntity = new MallRefundEntity();
            if(ObjectUtil.isEmpty(mallRefund)){
                mallRefundEntity.setRefundNo(mallOrderInfo.getOrderNo()+"_RITEM"+mallOrderItem.getId());
                mallRefundEntity.setMemberId(member.getId());
                mallRefundEntity.setOrderId(mallOrderInfo.getId());
                mallRefundEntity.setItemId(mallOrderItem.getId());
                if("余额支付".equals(mallOrderInfo.getPayMethod())){
                    mallRefundEntity.setType(3);
                }else if("微信支付".equals(mallOrderInfo.getPayMethod())){
                    mallRefundEntity.setType(1);
                }else{
                    mallRefundEntity.setType(3);
                }
                mallRefundEntity.setState(3);
                mallRefundEntity.setAmount(mallRefund.getAmount());
                mallRefundMapper.updateById(mallRefundEntity);
                mallRefundEntity.setAmount(mallOrderItem.getAmount());
                mallRefundMapper.insert(mallRefundEntity);
            }else{
                if(mallRefund.getState() == 1){
                    return new FebsResponse().fail().message("订单已退款");
                }
                if(mallRefund.getState() == 2 || mallRefund.getState() == 3){
                    mallRefundEntity.setId(mallRefund.getId());
                    mallRefundEntity.setRefundNo(mallRefund.getRefundNo());
                    mallRefundEntity.setMemberId(mallRefund.getMemberId());
                    mallRefundEntity.setOrderId(mallRefund.getOrderId());
                    mallRefundEntity.setItemId(mallRefund.getItemId());
                    mallRefundEntity.setType(mallRefund.getType());
                    mallRefundEntity.setState(3);
                    mallRefundEntity.setAmount(mallRefund.getAmount());
                    mallRefundMapper.updateById(mallRefundEntity);
                }
            }
            ApiLeaderRefundOrderDto apiLeaderRefundOrderDto = new ApiLeaderRefundOrderDto();
            apiLeaderRefundOrderDto.setOrderId(mallOrderInfo.getId());
            apiLeaderRefundOrderDto.setItemId(mallOrderItem.getId());
            apiLeaderRefundOrderDto.setAgreeState(1);
            iApiMallTeamLeaderService.leaderRefundOrder(apiLeaderRefundOrderDto);
        }
        //退款订单编号
        String orderNo = mallOrderInfo.getOrderNo();
        //退款退款编号
        String refundNo = mallRefundEntity.getRefundNo();
        //退款订单金额
        BigDecimal orderAmount = mallOrderInfo.getAmount();
        BigDecimal aa = new BigDecimal(100);
        int orderMoney = orderAmount.multiply(aa).intValue();
        //退款退款金额
        BigDecimal refundAmount = mallRefundEntity.getAmount();
        BigDecimal bb = new BigDecimal(100);
        int refundMoney = refundAmount.multiply(bb).intValue();
        Long refundId = mallRefundEntity.getId();
        MallRefundEntity mallRefundOld = mallRefundMapper.selectById(refundId);
        MallOrderInfo mallOrderInfoOld = this.baseMapper.selectByOrderNo(orderNo);
        //余额支付退款
        if(OrderPayMethodEnum.BALANCE.getName().equals(mallOrderInfo.getPayMethod())){
            mallRefundOld.setState(1);
            mallRefundMapper.updateById(mallRefundOld);
            mallOrderInfoOld.setStatus(OrderStatusEnum.REFUNDED.getValue());
            this.baseMapper.updateById(mallOrderInfoOld);
            mallMoneyFlowService.addMoneyFlow(mallOrderInfoOld.getMemberId(), mallOrderInfoOld.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
            memberWalletService.add(refundAmount, member.getId(), "balance");
            mallOrderItemMapper.updateStateByOrderId(3,mallOrderInfoOld.getId());
            return new FebsResponse().success().message("退款成功");
        }
        Boolean flag = false;
        Boolean debug = xcxProperties.getDebug();
        if (debug) {
            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null);
            flag = b;
        } else {
            log.info("开始调用退款接口。。。退款编号为{}", refundNo);
            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orderMoney, refundMoney, null);
            flag = b;
        }
        /**
         * 更新退款表
         * 更新订单表
         */
        if(flag){
            mallRefundOld.setState(1);
            mallRefundMapper.updateById(mallRefundOld);
            mallOrderInfoOld.setStatus(OrderStatusEnum.REFUNDED.getValue());
            this.baseMapper.updateById(mallOrderInfoOld);
            mallOrderItemMapper.updateStateByOrderId(3,mallOrderInfoOld.getId());
            mallMoneyFlowService.addMoneyFlow(mallOrderInfoOld.getMemberId(), mallOrderInfoOld.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
        }else{
            mallRefundOld.setState(2);
            mallRefundMapper.updateById(mallRefundOld);
            return new FebsResponse().fail().message("退款失败,请联系客服人员");
        }
        return new FebsResponse().success().message("退款成功");
        return new FebsResponse().success();
    }
    @Override
@@ -816,4 +811,16 @@
        return new FebsResponse().success().message("已申请");
    }
    @Override
    public FebsResponse cancelRefundOrder(Long id) {
        MallRefundEntity mallRefundEntity = mallRefundMapper.selectById(id);
        mallRefundEntity.setState(2);
        mallRefundMapper.updateById(mallRefundEntity);
        Long itemId = mallRefundEntity.getItemId();
        MallOrderItem mallOrderItem = mallOrderItemMapper.selectById(itemId);
        mallOrderItem.setState(1);
        mallOrderItemMapper.updateById(mallOrderItem);
        return new FebsResponse().success().message("已取消");
    }
}