|  | @@ -6,10 +6,10 @@ import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
	
		
			
				|  |  | -import com.yami.shop.bean.app.param.OrderRefundParam;
 | 
	
		
			
				|  |  |  import com.yami.shop.bean.dto.hb.*;
 | 
	
		
			
				|  |  |  import com.yami.shop.bean.enums.*;
 | 
	
		
			
				|  |  |  import com.yami.shop.bean.model.*;
 | 
	
		
			
				|  |  | +import com.yami.shop.bean.param.OrderRefundParam;
 | 
	
		
			
				|  |  |  import com.yami.shop.common.config.Constant;
 | 
	
		
			
				|  |  |  import com.yami.shop.common.exception.GlobalException;
 | 
	
		
			
				|  |  |  import com.yami.shop.common.util.Arith;
 | 
	
	
		
			
				|  | @@ -202,6 +202,8 @@ public class HBOrderService implements IHBOrderService {
 | 
	
		
			
				|  |  |          order.setHbOrderStatus(operatorType);
 | 
	
		
			
				|  |  |          if (operatorType == 70) {
 | 
	
		
			
				|  |  |              order.setHbOrderStatus(80);
 | 
	
		
			
				|  |  | +        } else if (operatorType == 60) {
 | 
	
		
			
				|  |  | +            order.setHbOrderStatus(60);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          orderMapper.updateById(order);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -217,7 +219,7 @@ public class HBOrderService implements IHBOrderService {
 | 
	
		
			
				|  |  |              orderRefundParam.setRefundType(1);
 | 
	
		
			
				|  |  |              orderRefundParam.setIsReceiver(false);
 | 
	
		
			
				|  |  |              orderRefundParam.setBuyerReason("17");
 | 
	
		
			
				|  |  | -            orderRefundParam.setBuyerDesc(bodyJson.getString("remark"));
 | 
	
		
			
				|  |  | +            orderRefundParam.setBuyerDesc(bodyJson.getString("reason"));
 | 
	
		
			
				|  |  |              orderRefundParam.setBuyerMobile(order.getUserMobile());
 | 
	
		
			
				|  |  |              orderRefundParam.setGoodsNum(order.getProductNums());
 | 
	
		
			
				|  |  |              orderRefundParam.setRefundAmount(order.getActualTotal());
 | 
	
	
		
			
				|  | @@ -232,11 +234,9 @@ public class HBOrderService implements IHBOrderService {
 | 
	
		
			
				|  |  |                  orderRefundSku.setProductCount(orderItem.getProdCount());
 | 
	
		
			
				|  |  |                  orderRefundSku.setSkuPrice(orderItem.getPrice());
 | 
	
		
			
				|  |  |                  orderRefundSkuList.add(orderRefundSku);
 | 
	
		
			
				|  |  | -                orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            String afterSaleOrder = applyAgain(orderRefundParam);
 | 
	
		
			
				|  |  | +            orderRefundParam.setOrderRefundSkuList(orderRefundSkuList);
 | 
	
		
			
				|  |  | +            String afterSaleOrder = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
 | 
	
		
			
				|  |  |              orderRefundService.createRefundOrder(order.getOrderNumber(), afterSaleOrder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -478,183 +478,8 @@ public class HBOrderService implements IHBOrderService {
 | 
	
		
			
				|  |  |          return HBR.success(createOrderRequest);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 退货退款
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    private void returnRefund(String orderNumber) {
 | 
	
		
			
				|  |  | -        Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
 | 
	
		
			
				|  |  | -                .eq(Order::getOrderNumber, orderNumber)
 | 
	
		
			
				|  |  | -                .in(Order::getHbOrderStatus, List.of(OrderStatus.CONSIGNMENT.value(), OrderStatus.SUCCESS.value()))
 | 
	
		
			
				|  |  | -        );
 | 
	
		
			
				|  |  | -        if (null != order) {
 | 
	
		
			
				|  |  | -            //判定已完成的时间
 | 
	
		
			
				|  |  | -            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.SUCCESS.value()) && isPaymentOver7Days(order.getPayTime())) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("支付完成已经超过7天,不支持退款");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            //可以直接退积分或者是钱
 | 
	
		
			
				|  |  | -            if (order.getActualTotal() > 0) {
 | 
	
		
			
				|  |  | -                //退,微信支付
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                //退,积分
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 生成退款单 请求
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param orderRefundParam 退款单数据
 | 
	
		
			
				|  |  | -     * @return
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    private String applyAgain(OrderRefundParam orderRefundParam) {
 | 
	
		
			
				|  |  | -        log.info(" 海博申请退款参数:{}", JSONObject.toJSONString(orderRefundParam));
 | 
	
		
			
				|  |  | -        List<OrderRefundSku> orderRefundSkuList = orderRefundParam.getOrderRefundSkuList();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Order order = orderMapper.getOrderAndOrderItemByOrderNumber(orderRefundParam.getOrderNumber());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (!Objects.equals(order.getIsPayed(), 1)) {
 | 
	
		
			
				|  |  | -            throw new GlobalException("当前订单还未付款,无法申请");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (!orderRefundService.checkRefundDate(order)) {
 | 
	
		
			
				|  |  | -            throw new GlobalException("当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
 | 
	
		
			
				|  |  | -            throw new GlobalException("该订单已有商品正在退款中,不能再进行整单退款");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        OrderRefund newOrderRefund = new OrderRefund();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 获取所有正在进行中的退款订单
 | 
	
		
			
				|  |  | -        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        for (OrderRefund orderRefund : orderRefunds) {
 | 
	
		
			
				|  |  | -            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("该订单正在进行整单退款,无法进行新的退款操作");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//            if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
 | 
	
		
			
				|  |  | -//                throw new GlobalException("该商品正在进行退款中,无法进行新的退款操作");
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 如果存在分销订单,则计算分销总金额
 | 
	
		
			
				|  |  | -        List<OrderItem> orderItemList = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
 | 
	
		
			
				|  |  | -        // 判断退款单类型(1:整单退款,2:单个物品退款)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
 | 
	
		
			
				|  |  | -            // 全部物品退款
 | 
	
		
			
				|  |  | -            // 计算该订单项的分销金额
 | 
	
		
			
				|  |  | -            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList));
 | 
	
		
			
				|  |  | -            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
 | 
	
		
			
				|  |  | -            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
 | 
	
		
			
				|  |  | -            newOrderRefund.setOrderItemId(0L);
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            CullenUtils.validateDataThrowException(orderRefundSkuList.isEmpty(), "退款商品不能为空...");
 | 
	
		
			
				|  |  | -            // 部分物品退款
 | 
	
		
			
				|  |  | -            OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
 | 
	
		
			
				|  |  | -                    .eq(OrderItem::getOrderItemId, orderRefundParam.getOrderItemId())
 | 
	
		
			
				|  |  | -                    .eq(OrderItem::getOrderNumber, orderRefundParam.getOrderNumber()));
 | 
	
		
			
				|  |  | -            if (orderItem == null) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("该物品在订单中不存在");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            boolean isCanRefund = false;
 | 
	
		
			
				|  |  | -            //  查看是否有支付金额和积分都为空的订单,有则抛出异常
 | 
	
		
			
				|  |  | -            for (OrderItem item : orderItemList) {
 | 
	
		
			
				|  |  | -                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
 | 
	
		
			
				|  |  | -                    isCanRefund = true;
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (isCanRefund) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("该订单部分订单项支付金额和积分为0,无法使用部分退款!");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (order.getPlatformAmount() > 0 && !Arith.isEquals(orderRefundParam.getRefundAmount(), orderItem.getActualTotal())) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("该订单有使用平台优惠,无法使用部分退款!");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            // 计算该订单项的分销金额
 | 
	
		
			
				|  |  | -            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(Collections.singletonList(orderItem)));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
 | 
	
		
			
				|  |  | -            newOrderRefund.setPlatformRefundAmount(orderItem.getPlatformShareReduce());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 退款物品数量为null或者0时,则为退款全部数量
 | 
	
		
			
				|  |  | -            if (orderRefundParam.getGoodsNum() <= 0) {
 | 
	
		
			
				|  |  | -                orderRefundParam.setGoodsNum(orderItem.getProdCount());
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 判断退款数量是否溢出
 | 
	
		
			
				|  |  | -            if (orderRefundParam.getGoodsNum() > orderItem.getProdCount()) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("退款物品数量已超出订单中的数量,不允许申请");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 判断退款金额是否超出订单金额
 | 
	
		
			
				|  |  | -            double refundSingleAmount = Arith.div(orderRefundParam.getRefundAmount(), orderRefundParam.getGoodsNum(), 3);
 | 
	
		
			
				|  |  | -            double singleAmount = Arith.div(orderItem.getActualTotal(), orderItem.getProdCount(), 3);
 | 
	
		
			
				|  |  | -            if (refundSingleAmount > orderItem.getProductTotalAmount() || refundSingleAmount > singleAmount) {
 | 
	
		
			
				|  |  | -                throw new GlobalException("退款金额已超出订单金额,无法申请");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId());
 | 
	
		
			
				|  |  | -            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
 | 
	
		
			
				|  |  | -            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.PADYED.value()) && order.getFreightAmount() > 0) {
 | 
	
		
			
				|  |  | -                int orderItenCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
 | 
	
		
			
				|  |  | -                if (Objects.equals(orderRefunds.size(), orderItenCount - 1)) {
 | 
	
		
			
				|  |  | -                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(), order.getFreightAmount()));
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        newOrderRefund.setShopId(order.getShopId());
 | 
	
		
			
				|  |  | -        newOrderRefund.setUserId(order.getUserId());
 | 
	
		
			
				|  |  | -        newOrderRefund.setOrderId(order.getOrderId());
 | 
	
		
			
				|  |  | -        newOrderRefund.setOrderNumber(order.getOrderNumber());
 | 
	
		
			
				|  |  | -        newOrderRefund.setRefundSn(String.valueOf(snowflake.nextId()));
 | 
	
		
			
				|  |  | -        newOrderRefund.setRefundType(orderRefundParam.getRefundType());
 | 
	
		
			
				|  |  | -        newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
 | 
	
		
			
				|  |  | -        newOrderRefund.setApplyType(orderRefundParam.getApplyType());
 | 
	
		
			
				|  |  | -        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
 | 
	
		
			
				|  |  | -            newOrderRefund.setIsReceiver(true);
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
 | 
	
		
			
				|  |  | -        newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc());
 | 
	
		
			
				|  |  | -        newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile());
 | 
	
		
			
				|  |  | -        newOrderRefund.setPhotoFiles(orderRefundParam.getPhotoFiles());
 | 
	
		
			
				|  |  | -        newOrderRefund.setReturnMoneySts(ReturnMoneyStsType.APPLY.value());
 | 
	
		
			
				|  |  | -        newOrderRefund.setApplyTime(new Date());
 | 
	
		
			
				|  |  | -        newOrderRefund.setUpdateTime(new Date());
 | 
	
		
			
				|  |  | -        log.info("生成退款单:{}", newOrderRefund);
 | 
	
		
			
				|  |  | -        OrderRefund orderRefund = orderRefundService.applyRefund(newOrderRefund);
 | 
	
		
			
				|  |  | -        if (ObjectUtil.isNotEmpty(orderRefundSkuList)) {
 | 
	
		
			
				|  |  | -            orderRefundSkuList.forEach(c -> {
 | 
	
		
			
				|  |  | -                c.setOrderRefundId(orderRefund.getRefundId());
 | 
	
		
			
				|  |  | -                orderRefundSkuMapper.insert(c);
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//        orderRefundService.removeById(refundId);
 | 
	
		
			
				|  |  | -//        orderRefundSkuMapper.delete(new LambdaQueryWrapper<OrderRefundSku>().eq(OrderRefundSku::getOrderRefundId,refundId));
 | 
	
		
			
				|  |  | -        return newOrderRefund.getRefundSn();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private boolean isPaymentOver7Days(Date paymentDate) {
 | 
	
		
			
				|  |  | -        // 1. 将支付时间转换为 Instant
 | 
	
		
			
				|  |  | -        Instant paymentInstant = paymentDate.toInstant();
 | 
	
		
			
				|  |  | -        // 2. 增加 7 天(精确到毫秒,考虑时区)
 | 
	
		
			
				|  |  | -        Instant expirationInstant = paymentInstant.plus(7, java.time.temporal.ChronoUnit.DAYS);
 | 
	
		
			
				|  |  | -        // 3. 获取当前时间
 | 
	
		
			
				|  |  | -        Instant nowInstant = Instant.now();
 | 
	
		
			
				|  |  | -        // 4. 比较时间
 | 
	
		
			
				|  |  | -        return nowInstant.isAfter(expirationInstant) || nowInstant.equals(expirationInstant);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |