| 
					
				 | 
			
			
				@@ -393,6 +393,75 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public HttpResponseResult<UserOrderRefundBill> orderRefound(String orderNo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserOrderVo detail = orderService.detail(orderNo, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return HttpResponseResult.failed("未找到订单信息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!OrderStatusEnum.PAID.equals(detail.getStatus())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return HttpResponseResult.failed("订单状态异常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询订单下未退款的所有详情订单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isEmpty(orderDetails)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return HttpResponseResult.failed("订单中没有可退款商品"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //退款的详情id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Long> detilIds = orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        OrderRefundReq orderRefundReq = new OrderRefundReq(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundReq.setOrderId(detail.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundReq.setUserId(detail.getUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundReq.setReason("测试退款"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundReq.setOredrDetilIds(detilIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //退款金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal actualPrice = BigDecimal.ZERO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Optional<Long> first = detilIds.stream().filter(o -> o.equals(vo.getId())).findFirst(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!first.isPresent()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>> refundCreateFunction = refundCreate.get(vo.getGoodType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!Objects.isNull(refundCreateFunction)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                orderRefundReq.setOredrDetil(vo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                HttpResponseResult<RefundCreateRes> apply = refundCreateFunction.apply(orderRefundReq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (apply.getStatus()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    actualPrice = actualPrice.add(apply.getData().getActualPrice()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                actualPrice = actualPrice.add(vo.getActualPrice()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String join = StringUtil.join(detilIds, ","); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserOrderRefund orderRefunds = new UserOrderRefund(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setUserId(detail.getUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setOrderId(detail.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setOrderNo(detail.getOrderNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setOredrDetilIds(join); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setStatus(AuthStatusEnum.PASS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setApplyAmount(actualPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setActualAmount(actualPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefunds.setReason("测试退款"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        save(orderRefunds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<Long> collect = orderRefundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CollectionUtils.isNotEmpty(collect)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!Objects.isNull(refundAfterConsumer)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    refundAfterConsumer.accept(vo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return doOrderRefundTest(orderRefunds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     HttpResponseResult<UserOrderRefundBill> doOrderRefund(UserOrderRefund orderRefund) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -441,6 +510,39 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return HttpResponseResult.succeed(orderRefundBill); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    HttpResponseResult<UserOrderRefundBill> doOrderRefundTest(UserOrderRefund orderRefund) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(UserOrderPayment::getStatus, TradeStatusEnum.succeeded) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (null == payment) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("订单状态异常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RefundBill refundBill = new RefundBill(payment.getOpenType(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        refundBill.setTradeNo(payment.getTransNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        refundBill.setPaymentNo(payment.getPaymentNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //单号生成 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long billNo = idGeneratorService.generatorId("billNo"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //入退款单表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserOrderRefundBill orderRefundBill = new UserOrderRefundBill(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundBill.setRefundId(orderRefund.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundBill.setBillNo(billNo.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundBill.setRefundAmt(orderRefund.getActualAmount()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundBill.setStatus(TradeStatusEnum.succeeded); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        refundBillService.save(orderRefundBill); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        updateById(orderRefund); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //处理退款业务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        orderRefundSuccessBizHandle(orderRefund.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return HttpResponseResult.succeed(orderRefundBill); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /*** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 处理回调-退款成功 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @author liweifan 
			 |