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<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) {
|
criteria.setOffset(page.offset());
|
List<OrderReturn> list = orderReturnMapper.findAll(criteria, criteria.getBlurry());
|
Long total = orderReturnMapper.countAll(criteria, criteria.getBlurry());
|
return PageUtil.toPage(list, total);
|
}
|
|
@Override
|
public List<OrderReturn> 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<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
|
@Transactional(rollbackFor = Exception.class)
|
public void deleteAll(List<Long> ids) {
|
orderReturnMapper.deleteBatchIds(ids);
|
}
|
|
@Override
|
public void download(List<OrderReturn> all, HttpServletResponse response) throws IOException {
|
List<Map<String, Object>> list = new ArrayList<>();
|
for (OrderReturn orderReturn : all) {
|
Map<String, Object> 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);
|
}
|
}
|