From 095210f9149c73e6e00d997b39fd6c44a65e4d38 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期二, 28 四月 2026 22:04:17 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java |  157 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 157 insertions(+), 0 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
index f05f6b0..0c6b615 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
@@ -3,15 +3,31 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.config.wx.WxPayProperties;
+import com.doumee.config.wx.WxPayV3Service;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.OrdersMapper;
 import com.doumee.dao.business.OrdersRefundMapper;
+import com.doumee.dao.business.model.Orders;
 import com.doumee.dao.business.model.OrdersRefund;
+import com.doumee.dao.dto.OrdersRefundPageDTO;
+import com.doumee.dao.vo.OrdersRefundPageVO;
 import com.doumee.service.business.OrdersRefundService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -19,11 +35,21 @@
  * @author rk
  * @date 2026/04/13
  */
+@Slf4j
 @Service
 public class OrdersRefundServiceImpl implements OrdersRefundService {
 
     @Autowired
     private OrdersRefundMapper ordersRefundMapper;
+
+    @Autowired
+    private OrdersMapper ordersMapper;
+
+    @Autowired
+    private WxPayV3Service wxPayV3Service;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
 
     @Override
     public Integer create(OrdersRefund ordersRefund) {
@@ -110,4 +136,135 @@
         QueryWrapper<OrdersRefund> wrapper = new QueryWrapper<>(ordersRefund);
         return ordersRefundMapper.selectCount(wrapper);
     }
+
+    @Override
+    public PageData<OrdersRefundPageVO> refundPage(PageWrap<OrdersRefundPageDTO> pageWrap) {
+        OrdersRefundPageDTO model = pageWrap.getModel();
+        IPage<OrdersRefund> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+
+        MPJLambdaWrapper<OrdersRefund> wrapper = new MPJLambdaWrapper<>();
+        wrapper.selectAll(OrdersRefund.class)
+                .select("o.code as orderCode")
+                .select("o.goods_info as goodsInfo")
+                .select("o.type as orderType")
+                .select("o.good_level as goodLevel")
+                .select("o.total_amount as totalAmount")
+                .select("o.pay_amount as payAmount")
+                .select("c2.name as goodLevelName")
+                .leftJoin("orders o on o.id = t.ORDER_ID and o.DELETED = 0")
+                .leftJoin("category c1 on c1.id = o.GOOD_TYPE and c1.DELETED = 0")
+                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
+                .eq(OrdersRefund::getDeleted, 0);
+
+        if (model != null) {
+            if (StringUtils.isNotBlank(model.getOrderCode())) {
+                wrapper.like("o.code", model.getOrderCode());
+            }
+            if (StringUtils.isNotBlank(model.getGoodsInfo())) {
+                wrapper.like("o.goods_info", model.getGoodsInfo());
+            }
+            if (model.getOrderType() != null) {
+                wrapper.eq("o.type", model.getOrderType());
+            }
+            if (model.getRefundStatus() != null) {
+                wrapper.eq(OrdersRefund::getStatus, model.getRefundStatus());
+            }
+            if (model.getCreateStartTime() != null) {
+                wrapper.ge(OrdersRefund::getCreateTime, model.getCreateStartTime());
+            }
+            if (model.getCreateEndTime() != null) {
+                wrapper.le(OrdersRefund::getCreateTime, model.getCreateEndTime());
+            }
+        }
+
+        wrapper.orderByDesc(OrdersRefund::getCreateTime);
+
+        IPage<OrdersRefund> refundPage = ordersRefundMapper.selectJoinPage(page, OrdersRefund.class, wrapper);
+
+        // 杞崲涓� VO
+        List<OrdersRefundPageVO> voList = new ArrayList<>();
+        if (refundPage != null && refundPage.getRecords() != null) {
+            for (OrdersRefund r : refundPage.getRecords()) {
+                OrdersRefundPageVO vo = new OrdersRefundPageVO();
+                vo.setId(r.getId());
+                vo.setOrderId(r.getOrderId());
+                vo.setOrderCode(r.getOrderCode());
+                vo.setGoodsInfo(r.getGoodsInfo());
+                vo.setOrderType(r.getOrderType());
+                vo.setGoodLevelName(r.getGoodLevelName());
+                vo.setTotalAmount(r.getTotalAmount());
+                vo.setPayAmount(r.getPayAmount());
+                vo.setRefundAmount(r.getRefundAmount());
+                vo.setCreateTime(r.getCreateTime());
+                vo.setRefundStatus(r.getStatus());
+                voList.add(vo);
+            }
+        }
+
+        PageData<OrdersRefundPageVO> result = new PageData<>(
+                refundPage != null ? refundPage.getCurrent() : pageWrap.getPage(),
+                refundPage != null ? refundPage.getSize() : pageWrap.getCapacity());
+        result.setRecords(voList);
+        if (refundPage != null) {
+            result.setTotal(refundPage.getTotal());
+        }
+        return result;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void retryRefund(Integer id) {
+        // 1. 鏌ヨ閫�娆捐褰�
+        OrdersRefund refundRecord = ordersRefundMapper.selectById(id);
+        if (refundRecord == null || Constants.ONE.equals(refundRecord.getDeleted())) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "閫�娆捐褰曚笉瀛樺湪");
+        }
+        if (!Constants.TWO.equals(refundRecord.getStatus())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呴��娆惧け璐ョ殑璁板綍鍙噸鏂伴��娆�");
+        }
+
+        // 2. 鏌ヨ鍏宠仈璁㈠崟
+        Orders order = ordersMapper.selectById(refundRecord.getOrderId());
+        if (order == null || Constants.ONE.equals(order.getDeleted())) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍏宠仈璁㈠崟涓嶅瓨鍦�");
+        }
+        if (StringUtils.isBlank(order.getOutTradeNo())) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟缂哄皯寰俊鏀粯鍗曞彿");
+        }
+
+        // 3. 鍙戣捣寰俊閫�娆�
+        String outRefundNo = com.doumee.core.utils.ID.nextGUID();
+        com.wechat.pay.java.service.refund.model.Refund refundResult;
+        try {
+            refundResult = wxPayV3Service.refund(
+                    outRefundNo,
+                    order.getOutTradeNo(),
+                    order.getPayAmount(),
+                    refundRecord.getRefundAmount(),
+                    "閲嶆柊閫�娆�",
+                    wxPayProperties.getV3RefundNotifyUrl());
+        } catch (Exception e) {
+            log.error("閲嶆柊閫�娆捐皟鐢ㄥ紓甯�, refundRecordId={}", id, e);
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫�娆惧け璐ワ紝璇风◢鍚庨噸璇�");
+        }
+
+        // 4. 鏇存柊閫�娆捐褰�
+        Date now = new Date();
+        com.wechat.pay.java.service.refund.model.Status wxStatus = refundResult.getStatus();
+        OrdersRefund update = new OrdersRefund();
+        update.setId(id);
+        update.setRefundCode(outRefundNo);
+        update.setUpdateTime(now);
+
+        if (com.wechat.pay.java.service.refund.model.Status.SUCCESS.equals(wxStatus)) {
+            update.setStatus(Constants.ONE);
+            update.setRefundTime(now);
+        } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(wxStatus)) {
+            update.setStatus(Constants.ZERO);
+        } else {
+            update.setStatus(Constants.TWO);
+            update.setRefundRemark("閲嶆柊閫�娆句粛鐒跺け璐�");
+        }
+        ordersRefundMapper.updateById(update);
+    }
 }

--
Gitblit v1.9.3