xin
2025-08-19 d6d06b62f76cb972bb220035401520e100cb1a35
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderReturnServiceImpl.java
@@ -1,9 +1,17 @@
package com.oying.modules.sh.service.impl;
import com.oying.exception.BadRequestException;
import com.oying.modules.hwc.service.SwiftPassService;
import com.oying.modules.sh.domain.Order;
import com.oying.modules.sh.domain.OrderReturn;
import com.oying.modules.sh.domain.request.AuditOrderReturn;
import com.oying.modules.sh.domain.request.ReturnOrder;
import com.oying.utils.FileUtil;
import com.oying.modules.sh.service.OrderReturnProductSnapshotService;
import com.oying.modules.sh.service.OrderService;
import com.oying.utils.*;
import com.oying.utils.enums.GenerateEnum;
import com.oying.utils.enums.OrderStatusEnum;
import com.oying.utils.enums.PayTypeEnum;
import com.oying.utils.enums.ReturnAuditEnum;
import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,16 +21,11 @@
import com.oying.modules.sh.mapper.OrderReturnMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oying.utils.PageUtil;
import java.util.List;
import java.util.Map;
import java.sql.Timestamp;
import java.util.*;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import com.oying.utils.PageResult;
/**
 * @author lixin
@@ -34,6 +37,11 @@
public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, OrderReturn> implements OrderReturnService {
    private final OrderReturnMapper orderReturnMapper;
    private final OrderService orderService;
    private final OrderReturnProductSnapshotService productSnapshotService;
    private final RedisUtils redisUtils;
    private final SwiftPassService swiftPassService;
    private static final String ORDER_RETURN_KEY = "oying:order:refund";
    @Override
    public PageResult<OrderReturn> queryAll(OrderReturnQueryCriteria criteria, Page<Object> page) {
@@ -60,8 +68,56 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(ReturnOrder resources) {
    public synchronized void create(ReturnOrder resources) {
        Order order = orderService.queryByOrderNum(resources.getOrderNum());
        if (order == null) {
            throw new BadRequestException("订单不存在!");
        }
        if (Objects.equals(order.getOrderStatus(), OrderStatusEnum.ZERO.getKey())) {
            throw new BadRequestException("订单未支付");
        }
        OrderReturn returnOrder1 = orderReturnMapper.getByOrderNum(resources.getOrderNum(), ReturnAuditEnum.ZERO.getKey());
        if (returnOrder1 != null) {
            throw new BadRequestException("退款订单已提交");
        }
        OrderReturn returnOrder2 = orderReturnMapper.getByOrderNum(resources.getOrderNum(), ReturnAuditEnum.TWO.getKey());
        if (returnOrder2 != null) {
            throw new BadRequestException("退款订单已处理");
        }
        if (!DateUtil.isBefore(order.getPayTime(), DateUtil.DAY)) {
            throw new BadRequestException("订单已超过售后有效期");
        }
        // 退款订单
        OrderReturn returnOrder = new OrderReturn();
        // 退款订单号
        String returnNum = redisUtils.generateSn(ORDER_RETURN_KEY, GenerateEnum.ORDER_RETURN.getKey());
        returnOrder.setReturnNum(returnNum);
        returnOrder.setReturnStatus(ReturnAuditEnum.ZERO.getKey());
        returnOrder.setReturnStatusDescribe(ReturnAuditEnum.ZERO.getValue());
        returnOrder.setOrderNum(resources.getOrderNum());
        returnOrder.setOrderTime(order.getOrderTime());
        returnOrder.setOrderStoreNum(order.getOrderStoreNum());
        returnOrder.setPackagingPrice(order.getPackagingPrice());
        returnOrder.setSendPrice(order.getSendPrice());
        returnOrder.setSendType(order.getSendType() != null ? order.getSendType() : null);
        returnOrder.setRiderId(order.getRiderId() != null ? order.getRiderId() : null);
        returnOrder.setRiderPhone(order.getRiderPhone() != null ? order.getRiderPhone() : null);
        returnOrder.setRiderName(order.getRiderName() != null ? order.getRiderName() : null);
        returnOrder.setPayType(order.getPayType());
        returnOrder.setUserId(order.getUserId());
        returnOrder.setUsername(order.getUsername());
        returnOrder.setStoreId(order.getStoreId());
        returnOrder.setStoreName(order.getStoreName());
        returnOrder.setStoreLogo(order.getStoreLogo());
        returnOrder.setOriginalPrice(order.getOriginalPrice());
        returnOrder.setPaidPrice(order.getPaidPrice());
        returnOrder.setActuallyPayPrice(order.getActuallyPayPrice());
        returnOrder.setReason(resources.getReason());
        returnOrder.setRemark(resources.getRemark());
        returnOrder.setPhotos(resources.getPhotos());
        returnOrder.setAuditStatus(ReturnAuditEnum.ZERO.getKey());
        orderReturnMapper.insert(returnOrder);
    }
    @Override
@@ -74,8 +130,50 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void audit(AuditOrderReturn resources) {
    public synchronized void audit(AuditOrderReturn resources) {
        OrderReturn orderReturn = orderReturnMapper.getByReturnNum(resources.getReturnNum());
        if (orderReturn == null) {
            throw new BadRequestException("订单不存在");
        }
        if (!Objects.equals(orderReturn.getReturnStatus(), ReturnAuditEnum.ZERO.getKey())) {
            throw new BadRequestException("订单已处理或取消");
        }
        if (resources.getAmount().compareTo(orderReturn.getActuallyPayPrice()) > 0) {
            throw new BadRequestException("退款金额超过订单金额");
        }
        switch (resources.getAuditStatus()) {
            case ONE:
                break;
            case TWO:
                long total = BigDecimalUtils.yuanToCents(orderReturn.getActuallyPayPrice());
                long refund = BigDecimalUtils.yuanToCents(resources.getAmount());
                orderReturn.setRefundPrice(resources.getAmount());
                PayTypeEnum status = PayTypeEnum.find(orderReturn.getPayType());
                switch (status) {
                    case HWC:
                    case HWC2:
                        if (refund > 0) {
                            Map<String, String> re = swiftPassService.refund(orderReturn.getReturnNum(), orderReturn.getOrderNum(),
                                    resources.getMessage(), refund, total, status);
                            orderReturn.setChannel(re.get("refund_channel"));
                        }
                        break;
                    default:
                        throw new BadRequestException("暂未开通其余支付模式");
                }
                break;
            default:
                throw new BadRequestException("审核状态错误");
        }
        // 审核状态
        orderReturn.setAuditStatus(resources.getAuditStatus().getKey());
        // 审核人
        orderReturn.setAuditUser(SecurityUtils.getCurrentUsername());
        // 审核时间
        orderReturn.setAuditTime(new Timestamp(System.currentTimeMillis()));
        // 审核信息
        orderReturn.setAuditMessage(resources.getMessage());
        orderReturnMapper.updateById(orderReturn);
    }
    @Override
@@ -100,7 +198,7 @@
            map.put("退款状态", orderReturn.getRefundStatus());
            map.put("退款成功时间", orderReturn.getSuccessTime());
            map.put("退款渠道", orderReturn.getChannel());
            map.put("退款原因", orderReturn.getReason());
            map.put("退货类型", orderReturn.getReason());
            map.put("备注", orderReturn.getRemark());
            map.put("图片", orderReturn.getPhotos());
            map.put("审核状态", ReturnAuditEnum.getValue(orderReturn.getAuditStatus()));