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.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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.oying.modules.sh.service.OrderReturnService; import com.oying.modules.sh.domain.dto.OrderReturnQueryCriteria; import com.oying.modules.sh.mapper.OrderReturnMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.sql.Timestamp; import java.util.*; import java.io.IOException; import javax.servlet.http.HttpServletResponse; /** * @author lixin * @description 服务实现 * @date 2025-06-11 **/ @Service @RequiredArgsConstructor public class OrderReturnServiceImpl extends ServiceImpl 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 queryAll(OrderReturnQueryCriteria criteria, Page page) { criteria.setOffset(page.offset()); List list = orderReturnMapper.findAll(criteria, criteria.getBlurry()); Long total = orderReturnMapper.countAll(criteria, criteria.getBlurry()); return PageUtil.toPage(list, total); } @Override public List queryAll(OrderReturnQueryCriteria criteria) { return orderReturnMapper.findAll(criteria, criteria.getBlurry()); } @Override public OrderReturn getByReturnNum(String returnNum) { return orderReturnMapper.getByReturnNum(returnNum); } @Override public void updatePayStatus(String returnNum, String status, String time) { orderReturnMapper.updatePayStatus(returnNum, status, time); } @Override @Transactional(rollbackFor = Exception.class) 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 @Transactional(rollbackFor = Exception.class) public void update(OrderReturn resources) { OrderReturn orderReturn = getById(resources.getReturnId()); orderReturn.copy(resources); orderReturnMapper.updateById(orderReturn); } @Override @Transactional(rollbackFor = Exception.class) 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 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 @Transactional(rollbackFor = Exception.class) public void deleteAll(List ids) { orderReturnMapper.deleteBatchIds(ids); } @Override public void download(List all, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); for (OrderReturn orderReturn : all) { Map map = new LinkedHashMap<>(); map.put("退单号", orderReturn.getReturnNum()); map.put("订单号", orderReturn.getOrderNum()); map.put("用户", orderReturn.getUserId()); map.put("门店ID", orderReturn.getStoreId()); map.put("原金额", orderReturn.getOriginalPrice()); map.put("折扣价", orderReturn.getPaidPrice()); map.put("实付金额", orderReturn.getActuallyPayPrice()); map.put("退款价格", orderReturn.getRefundPrice()); map.put("退款状态", orderReturn.getRefundStatus()); map.put("退款成功时间", orderReturn.getSuccessTime()); map.put("退款渠道", orderReturn.getChannel()); map.put("退货类型", orderReturn.getReason()); map.put("备注", orderReturn.getRemark()); map.put("图片", orderReturn.getPhotos()); map.put("审核状态", ReturnAuditEnum.getValue(orderReturn.getAuditStatus())); map.put("审核人", orderReturn.getAuditUser()); map.put("审核时间", orderReturn.getAuditTime()); map.put("审核信息", orderReturn.getAuditMessage()); map.put("创建人", orderReturn.getCreateBy()); map.put("创建时间", orderReturn.getCreateTime()); map.put("修改者", orderReturn.getUpdateBy()); map.put("修改时间", orderReturn.getUpdateTime()); list.add(map); } FileUtil.downloadExcel(list, response); } }