Browse Source

[add] 活动订单、普通商品订单退款

BKGin 9 months ago
parent
commit
da0f721753

+ 182 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/OrderGoodsRefund.java

@@ -0,0 +1,182 @@
+package com.yiqi.order.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yiqi.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.yiqi.common.core.domain.BaseEntity;
+import lombok.Data;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+/**
+ * 洗衣退款订单对象 order_cloth_refund
+ *
+ * @author douya
+ * @date 2024-08-13
+ */
+@ApiModel("普通商品退款订单")
+@TableName("order_goods_refund")
+@Data
+public class OrderGoodsRefund extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ApiModelProperty("主键ID")
+    @TableId(type = IdType.AUTO)
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    @Excel(name = "原订单编号")
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    /**
+     * 退款编号
+     */
+    @Excel(name = "退款编号")
+    @ApiModelProperty("退款编号")
+    private String refundNo;
+
+    /**
+     * 门店ID
+     */
+    @Excel(name = "门店ID")
+    @ApiModelProperty("门店ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    /**
+     * 来源类型
+     */
+    @Excel(name = "来源类型")
+    @ApiModelProperty("来源类型")
+    private String sourceType;
+
+    /**
+     * 客户ID
+     */
+    @Excel(name = "客户ID")
+    @ApiModelProperty("客户ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long appUserId;
+
+    /**
+     * 联系人
+     */
+    @Excel(name = "联系人")
+    @ApiModelProperty("联系人")
+    private String contactName;
+
+    /**
+     * 联系人手机号
+     */
+    @Excel(name = "联系人手机号")
+    @ApiModelProperty("联系人手机号")
+    private String contactPhone;
+
+    /**
+     * 订单总金额
+     */
+    @Excel(name = "订单总金额")
+    @ApiModelProperty("订单总金额")
+    private BigDecimal orderAmount;
+
+    /**
+     * 支付金额
+     */
+    @Excel(name = "支付金额")
+    @ApiModelProperty("支付金额")
+    private BigDecimal payAmount;
+
+    /**
+     * 支付信息
+     */
+    @Excel(name = "支付信息")
+    @ApiModelProperty("支付信息")
+    private String payInfo;
+
+    /**
+     * 支付方式(0=微信,1=支付宝,2=现金,3=会员卡)
+     */
+    @Excel(name = "支付方式", readConverterExp = "0==微信,1=支付宝,2=现金,3=会员卡")
+    @ApiModelProperty("支付方式(0=微信,1=支付宝,2=现金,3=会员卡)")
+    private String payType;
+
+    /**
+     * 支付宝/微信支付订单号
+     */
+    @Excel(name = "支付宝/微信支付订单号")
+    @ApiModelProperty("支付宝/微信支付订单号")
+    private String outTradeOrderNo;
+
+    /**
+     * 退款金额
+     */
+    @Excel(name = "退款金额")
+    @ApiModelProperty("退款金额")
+    private BigDecimal refundAmount;
+
+    /**
+     * 退款信息
+     */
+    @Excel(name = "退款信息")
+    @ApiModelProperty("退款信息")
+    private String refundInfo;
+
+    /**
+     * 退款申请时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "退款申请时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("退款申请时间")
+    private Date refundApplyTime;
+
+    /**
+     * 退款时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "退款时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("退款时间")
+    private Date refundTime;
+
+    /**
+     * 退款状态(0=正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消)
+     */
+    @Excel(name = "退款状态", readConverterExp = "0==正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消")
+    @ApiModelProperty("退款状态(0=正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消)")
+    private String refundStatus;
+
+    /**
+     * 退款原因
+     */
+    @Excel(name = "退款原因")
+    @ApiModelProperty("退款原因")
+    private String refundReason;
+
+    /**
+     * 拒绝原因
+     */
+    @Excel(name = "拒绝原因")
+    @ApiModelProperty("拒绝原因")
+    private String rejectReason;
+
+    /**
+     * 删除状态(0=正常,2=删除)
+     */
+    @ApiModelProperty("删除状态(0=正常,2=删除)")
+    private String delFlag;
+
+
+}

+ 14 - 0
yiqi-common/src/main/java/com/yiqi/order/service/IOrderGoodsRefundService.java

@@ -0,0 +1,14 @@
+package com.yiqi.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yiqi.order.domain.OrderGoodsRefund;
+
+/**
+ * @Author BKGin
+ * @Email libra14xu@gmail.com
+ * @Date 2024-09-16
+ */
+public interface IOrderGoodsRefundService extends IService<OrderGoodsRefund> {
+
+    OrderGoodsRefund getOrderClothRefundByRefundNo(String refundNo);
+}

+ 3 - 3
yiqi-common/src/main/java/com/yiqi/order/service/IOrderGoodsService.java

@@ -123,11 +123,11 @@ public interface IOrderGoodsService extends IService<OrderGoods> {
      */
     public int refundOrderGoodsApply(OrderGoodsRefundDTO orderGoodsRefundDTO, String sourceType);
 
-    public R refundSuccess(String orderNo);
+    public R refundSuccess(String refundNo, String orderNo);
 
-    public R refundClosed(String orderNo);
+    public R refundClosed(String refundNo, String orderNo);
 
-    public R refundError(String orderNo);
+    public R refundError(String refundNo, String orderNo);
 
     /**
      * 商品订单退款审核,审批同意

+ 14 - 0
yiqi-core/src/main/java/com/yiqi/order/mapper/OrderGoodsRefundMapper.java

@@ -0,0 +1,14 @@
+package com.yiqi.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yiqi.order.domain.OrderGoodsRefund;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Author BKGin
+ * @Email libra14xu@gmail.com
+ * @Date 2024-09-16
+ */
+@Mapper
+public interface OrderGoodsRefundMapper extends BaseMapper<OrderGoodsRefund> {
+}

+ 28 - 2
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderActivityServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yiqi.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.common.exception.ServiceException;
@@ -23,6 +24,8 @@ import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.EnumUtils;
 import com.yiqi.common.utils.OrderNoUtils;
 import com.yiqi.common.utils.SecurityUtils;
+import com.yiqi.delay.DelayMessage;
+import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.order.domain.OrderActivity;
 import com.yiqi.order.domain.OrderActivityItem;
 import com.yiqi.order.domain.dto.*;
@@ -69,6 +72,8 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
     private IPayService payService;
     @Autowired
     private IAppUserBillMstrService appUserBillMstrService;
+    @Autowired
+    private DelayQueueCache delayQueueCache;
 
     /**
      * 查询活动订单
@@ -239,8 +244,29 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
         orderActivity.buildUpdateData();
         baseMapper.updateById(orderActivity);
 
-        // 退款内容
-        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderActivityRefundData(orderActivity), new RefundBaseDTO(orderNoUtils.getActivityOrderNo()));
+        // 退款
+        if (orderActivity.getPayType().equals(PayType.WECHAT.getCode()) || orderActivity.getPayType().equals(PayType.ALIPAY.getCode())) {
+            PayRefundDTO payRefundDTO = new PayRefundDTO(orderActivity.getPayType(), orderActivity.getOrderNo(), orderActivity.getPayAmount(), null, orderActivity.getOutTradeOrderNo(), null);
+            //执行微信退款逻辑
+            payRefundDTO.setTotalAmount(orderActivity.getPayAmount());
+            payRefundDTO.setStoreId(orderActivity.getOrgId());
+            RefundResponseDTO refundResponse = payService.refundApply(payRefundDTO);
+
+            if (refundResponse.getRefundResult().equals(PayResult.success.getCode())) {
+                refundSuccess(orderActivity.getOrderNo());
+            } else if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
+                refundError(orderActivity.getOrderNo());
+            } else {
+                //增加到延迟支付查询队列
+                DelayMessage delayMessage = new DelayMessage(payRefundDTO.getOutRequestNo(), DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(), JSONUtil.toJsonStr(payRefundDTO));
+                //暂不执行
+                delayQueueCache.addDelayJob(delayMessage, RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
+            }
+
+        }
+
+//        // 退款内容
+//        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderActivityRefundData(orderActivity), new RefundBaseDTO(orderNoUtils.getActivityOrderNo()));
         return 1;
     }
 

+ 22 - 0
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderGoodsRefundServiceImpl.java

@@ -0,0 +1,22 @@
+package com.yiqi.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yiqi.order.domain.OrderGoodsRefund;
+import com.yiqi.order.mapper.OrderGoodsRefundMapper;
+import com.yiqi.order.service.IOrderGoodsRefundService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author BKGin
+ * @Email libra14xu@gmail.com
+ * @Date 2024-09-16
+ */
+@Service
+public class OrderGoodsRefundServiceImpl extends ServiceImpl<OrderGoodsRefundMapper, OrderGoodsRefund> implements IOrderGoodsRefundService {
+    @Override
+    public OrderGoodsRefund getOrderClothRefundByRefundNo(String refundNo) {
+        return getOne(new QueryWrapper<OrderGoodsRefund>().lambda()
+                .eq(OrderGoodsRefund::getRefundNo, refundNo));
+    }
+}

+ 122 - 7
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderGoodsServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
 
 import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.yiqi.app.domain.AppGoodsMarket;
@@ -99,6 +100,8 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     private IOrderPayInfoService orderPayInfoService;
     @Autowired
     private DelayQueueCache delayQueueCache;
+    @Autowired
+    private IOrderGoodsRefundService orderGoodsRefundService;
 
     //<editor-folder desc="基础韩素">
 
@@ -624,13 +627,64 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         orderGoods.buildUpdateData();
         baseMapper.updateById(orderGoods);
 
-        // 退款内容
-        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderGoodsRefundData(orderGoods), new RefundBaseDTO(orderNoUtils.getGoodsOrderNo()));
+        OrderGoodsRefund orderGoodsRefund = new OrderGoodsRefund();
+        BeanUtils.copyProperties(orderGoods, orderGoodsRefund);
+        orderGoodsRefund.setId(null);
+        orderGoodsRefund.setRefundNo(orderNoUtils.getGoodsOrderNo());
+        orderGoodsRefund.setRefundAmount(orderGoods.getRefundAmount());
+        orderGoodsRefund.setRefundApplyTime(DateUtils.getNowDate());
+        orderGoodsRefund.setRefundReason(orderGoodsRefundDTO.getRefundReason());
+        orderGoodsRefund.setRefundStatus(OrderRefundStatus.REFUND_APPLYING.getCode());
+        orderGoodsRefundService.save(orderGoodsRefund);
+
+        // 退款
+        if (orderGoods.getPayType().equals(PayType.CASH.getCode())) {
+            refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+        }
+        if (orderGoods.getPayType().equals(PayType.BALANCE.getCode())) {
+            //充值卡支付退单
+            Boolean res = rechargePasswordCardService.orderRefundByBalance(orderGoods.getOrderNo(), orderGoods.getRefundAmount());
+            if (res) {
+                refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+            }
+        }
+        if (orderGoods.getPayType().equals(PayType.WECHAT.getCode()) || orderGoods.getPayType().equals(PayType.ALIPAY.getCode())) {
+            PayRefundDTO payRefundDTO = new PayRefundDTO(orderGoods.getPayType(), orderGoods.getOrderNo(), orderGoods.getPayAmount(), orderGoodsRefund.getRefundNo(), orderGoods.getOutTradeOrderNo(), orderGoodsRefundDTO.getRefundReason());
+            //执行微信退款逻辑
+            payRefundDTO.setTotalAmount(orderGoods.getPayAmount());
+            payRefundDTO.setStoreId(orderGoods.getOrgId());
+            RefundResponseDTO refundResponse = payService.refundApply(payRefundDTO);
+
+            if (refundResponse.getRefundResult().equals(PayResult.success.getCode())) {
+                refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+            } else if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
+                refundError(orderGoods.getOrderNo());
+            } else {
+                //增加到延迟支付查询队列
+                DelayMessage delayMessage = new DelayMessage(payRefundDTO.getOutRequestNo(), DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(), JSONUtil.toJsonStr(payRefundDTO));
+                //暂不执行
+                delayQueueCache.addDelayJob(delayMessage, RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
+            }
+
+        }
+
+//        // 退款内容
+//        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderGoodsRefundData(orderGoods), new RefundBaseDTO(orderNoUtils.getGoodsOrderNo()));
         return 1;
     }
 
     @Override
-    public R refundSuccess(String orderNo) {
+    public R refundSuccess(String refundNo, String orderNo) {
+        if (StrUtil.isNotBlank(refundNo)) {
+            OrderGoodsRefund orderGoodsRefund = orderGoodsRefundService.getOrderClothRefundByRefundNo(refundNo);
+            orderGoodsRefund.setRefundStatus(OrderRefundStatus.REFUND_SUCCESS.getCode());
+            orderGoodsRefund.setRefundTime(DateUtils.getNowDate());
+            orderGoodsRefundService.updateById(orderGoodsRefund);
+            if (orderNo == null) {
+                orderNo = orderGoodsRefund.getOrderNo();
+            }
+        }
+
         OrderGoods orderGoods = this.getOne(new QueryWrapper<OrderGoods>().lambda().eq(OrderGoods::getOrderNo, orderNo));
         if (orderGoods == null) {
             throw new GlobalException("订单不存在");
@@ -662,7 +716,17 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     }
 
     @Override
-    public R refundClosed(String orderNo) {
+    public R refundClosed(String refundNo, String orderNo) {
+        if (StrUtil.isNotBlank(refundNo)) {
+            OrderGoodsRefund orderGoodsRefund = orderGoodsRefundService.getOrderClothRefundByRefundNo(refundNo);
+            orderGoodsRefund.setRefundStatus(OrderRefundStatus.REFUND_SUCCESS.getCode());
+            orderGoodsRefund.setRefundTime(DateUtils.getNowDate());
+            orderGoodsRefundService.updateById(orderGoodsRefund);
+            if (orderNo == null) {
+                orderNo = orderGoodsRefund.getOrderNo();
+            }
+        }
+
         OrderGoods orderGoods = this.getOne(new QueryWrapper<OrderGoods>().lambda().eq(OrderGoods::getOrderNo, orderNo));
         if (orderGoods == null) {
             throw new GlobalException("订单不存在");
@@ -673,7 +737,17 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
     }
 
     @Override
-    public R refundError(String orderNo) {
+    public R refundError(String refundNo, String orderNo) {
+        if (StrUtil.isNotBlank(refundNo)) {
+            OrderGoodsRefund orderGoodsRefund = orderGoodsRefundService.getOrderClothRefundByRefundNo(refundNo);
+            orderGoodsRefund.setRefundStatus(OrderRefundStatus.REFUND_SUCCESS.getCode());
+            orderGoodsRefund.setRefundTime(DateUtils.getNowDate());
+            orderGoodsRefundService.updateById(orderGoodsRefund);
+            if (orderNo == null) {
+                orderNo = orderGoodsRefund.getOrderNo();
+            }
+        }
+
         OrderGoods orderGoods = this.getOne(new QueryWrapper<OrderGoods>().lambda().eq(OrderGoods::getOrderNo, orderNo));
         if (orderGoods == null) {
             throw new GlobalException("订单不存在");
@@ -712,8 +786,49 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         orderGoods.buildUpdateData();
         baseMapper.updateById(orderGoods);
 
-        // 退款流程
-        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderGoodsRefundData(orderGoods), new RefundBaseDTO(orderNoUtils.getGoodsOrderNo()));
+        OrderGoodsRefund orderGoodsRefund = new OrderGoodsRefund();
+        BeanUtils.copyProperties(orderGoods, orderGoodsRefund);
+        orderGoodsRefund.setId(null);
+        orderGoodsRefund.setRefundNo(orderNoUtils.getGoodsOrderNo());
+        orderGoodsRefund.setRefundAmount(orderGoods.getRefundAmount());
+        orderGoodsRefund.setRefundApplyTime(DateUtils.getNowDate());
+        orderGoodsRefund.setRefundReason(null);
+        orderGoodsRefund.setRefundStatus(OrderRefundStatus.REFUND_APPLYING.getCode());
+        orderGoodsRefundService.save(orderGoodsRefund);
+
+        // 退款
+        if (orderGoods.getPayType().equals(PayType.CASH.getCode())) {
+            refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+        }
+        if (orderGoods.getPayType().equals(PayType.BALANCE.getCode())) {
+            //充值卡支付退单
+            Boolean res = rechargePasswordCardService.orderRefundByBalance(orderGoods.getOrderNo(), orderGoods.getRefundAmount());
+            if (res) {
+                refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+            }
+        }
+        if (orderGoods.getPayType().equals(PayType.WECHAT.getCode()) || orderGoods.getPayType().equals(PayType.ALIPAY.getCode())) {
+            PayRefundDTO payRefundDTO = new PayRefundDTO(orderGoods.getPayType(), orderGoods.getOrderNo(), orderGoods.getPayAmount(), orderGoodsRefund.getRefundNo(), orderGoods.getOutTradeOrderNo(), null);
+            //执行微信退款逻辑
+            payRefundDTO.setTotalAmount(orderGoods.getPayAmount());
+            payRefundDTO.setStoreId(orderGoods.getOrgId());
+            RefundResponseDTO refundResponse = payService.refundApply(payRefundDTO);
+
+            if (refundResponse.getRefundResult().equals(PayResult.success.getCode())) {
+                refundSuccess(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+            } else if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
+                refundError(orderGoodsRefund.getRefundNo(), orderGoods.getOrderNo());
+            } else {
+                //增加到延迟支付查询队列
+                DelayMessage delayMessage = new DelayMessage(payRefundDTO.getOutRequestNo(), DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(), JSONUtil.toJsonStr(payRefundDTO));
+                //暂不执行
+                delayQueueCache.addDelayJob(delayMessage, RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
+            }
+
+        }
+
+//        // 退款流程
+//        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderGoodsRefundData(orderGoods), new RefundBaseDTO(orderNoUtils.getGoodsOrderNo()));
         return 1;
     }
 

+ 3 - 3
yiqi-core/src/main/java/com/yiqi/order/service/impl/PayServiceImpl.java

@@ -276,11 +276,11 @@ public class PayServiceImpl implements IPayService {
             }
             case goods_order_header: {
                 if (OrderRefundStatus.REFUND_SUCCESS.getCode().equals(refundStatus)) {
-                    orderGoodsService.refundSuccess(orderNo);
+                    orderGoodsService.refundSuccess(null, orderNo);
                 } else if (OrderRefundStatus.REFUND_CANCEL.getCode().equals(refundStatus)) {
-                    orderGoodsService.refundClosed(orderNo);
+                    orderGoodsService.refundClosed(null, orderNo);
                 } else {
-                    orderGoodsService.refundError(orderNo);
+                    orderGoodsService.refundError(null, orderNo);
                 }
                 return;
             }

+ 6 - 0
yiqi-core/src/main/resources/mapper/order/OrderGoodsRefundMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.yiqi.order.mapper.OrderGoodsRefundMapper">
+
+</mapper>