| | |
| | | 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.OrderProductSnapshot; |
| | | import com.oying.modules.sh.domain.OrderReturn; |
| | | import com.oying.modules.sh.domain.OrderReturnProductSnapshot; |
| | | import com.oying.modules.sh.domain.request.AuditOrderReturn; |
| | | import com.oying.utils.FileUtil; |
| | | import com.oying.modules.sh.domain.request.ProductOrder; |
| | | import com.oying.modules.sh.domain.request.ReturnOrder; |
| | | import com.oying.modules.sh.domain.vo.OrderResponse; |
| | | import com.oying.modules.sh.domain.vo.OrderReturnResponse; |
| | | import com.oying.modules.sh.service.*; |
| | | 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 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 |
| | |
| | | public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, OrderReturn> implements OrderReturnService { |
| | | |
| | | private final OrderReturnMapper orderReturnMapper; |
| | | private final OrderOperationLogService operationLogService; |
| | | private final OrderService orderService; |
| | | private final OrderReturnProductSnapshotService productSnapshotService; |
| | | private final RedisUtils redisUtils; |
| | | private final SwiftPassService swiftPassService; |
| | | private final OrderAddressSnapshotService addressSnapshotService; |
| | | private static final String ORDER_RETURN_KEY = "oying:order:refund"; |
| | | private static final String ORDER_CODE = "REFUND"; |
| | | public static final Integer DAY = 30; |
| | | |
| | | @Override |
| | | public PageResult<OrderReturn> queryAll(OrderReturnQueryCriteria criteria, Page<Object> page) { |
| | | return PageUtil.toPage(orderReturnMapper.findAll(criteria, 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); |
| | | return orderReturnMapper.findAll(criteria, criteria.getBlurry()); |
| | | } |
| | | |
| | | @Override |
| | | public OrderReturn getByReturnNum(String returnNum) { |
| | | return orderReturnMapper.getByReturnNum(returnNum); |
| | | public OrderReturnResponse getByReturnNum(String returnNum) { |
| | | OrderReturn orderReturn = orderReturnMapper.getByReturnNum(returnNum); |
| | | return new OrderReturnResponse(orderReturn, |
| | | addressSnapshotService.queryByOrderNum(orderReturn.getOrderNum()), |
| | | operationLogService.getByOrderNum(orderReturn.getOrderNum(), ORDER_CODE)); |
| | | } |
| | | |
| | | @Override |
| | | public void updatePayStatus(String returnNum, String status, String time) { |
| | | orderReturnMapper.updatePayStatus(returnNum, status, time); |
| | | public void updatePayStatus(String returnNum, String refundStatus, String successTime) { |
| | | orderReturnMapper.updatePayStatus(returnNum, refundStatus, successTime); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void create(OrderReturn resources) { |
| | | orderReturnMapper.insert(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(), 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); |
| | | List<OrderReturnProductSnapshot> productSnapshots = new ArrayList<>(); |
| | | for (ProductOrder productOrder : resources.getProductOrders()) { |
| | | for (OrderProductSnapshot snapshot : order.getProductSnapshots()) { |
| | | if (productOrder.getProductId().equals(snapshot.getProductId())) { |
| | | OrderReturnProductSnapshot productSnapshot = getSnapshot(snapshot, returnNum); |
| | | productSnapshots.add(productSnapshot); |
| | | } |
| | | } |
| | | } |
| | | productSnapshotService.saveBatch(productSnapshots); |
| | | } |
| | | |
| | | private static OrderReturnProductSnapshot getSnapshot(OrderProductSnapshot snapshot, String returnNum) { |
| | | OrderReturnProductSnapshot productSnapshot = new OrderReturnProductSnapshot(); |
| | | productSnapshot.setReturnNum(returnNum); |
| | | productSnapshot.setStoreId(snapshot.getStoreId()); |
| | | productSnapshot.setProductId(snapshot.getProductId()); |
| | | productSnapshot.setProductCode(snapshot.getProductCode() != null ? snapshot.getProductCode() : null); |
| | | productSnapshot.setProductBarcode(snapshot.getProductBarcode()); |
| | | productSnapshot.setProductName(snapshot.getProductName()); |
| | | productSnapshot.setProductTitle(snapshot.getProductTitle()); |
| | | productSnapshot.setProductMainImage(snapshot.getProductMainImage()); |
| | | productSnapshot.setProductDescription(snapshot.getProductDescription()); |
| | | productSnapshot.setParamData(snapshot.getParamData() != null ? snapshot.getParamData() : null); |
| | | productSnapshot.setUnitPrice(snapshot.getUnitPrice()); |
| | | productSnapshot.setDetailCount(snapshot.getDetailCount()); |
| | | productSnapshot.setOriginalPrice(snapshot.getOriginalPrice()); |
| | | productSnapshot.setPaidPrice(snapshot.getPaidPrice()); |
| | | productSnapshot.setActuallyPayPrice(snapshot.getActuallyPayPrice()); |
| | | return productSnapshot; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancel(String returnNum) { |
| | | OrderReturn orderReturn = orderReturnMapper.getByReturnNum(returnNum); |
| | | if (orderReturn == null) { |
| | | throw new BadRequestException("订单不存在!"); |
| | | } |
| | | if (!orderReturn.getUserId().equals(SecurityUtils.getCurrentUserId())) { |
| | | throw new BadRequestException("不能修改他人订单"); |
| | | } |
| | | orderReturnMapper.updateStatus(returnNum, OrderStatusEnum.FIFTEEN.getKey(), OrderStatusEnum.FIFTEEN.getValue(), |
| | | ReturnAuditEnum.THREE.getKey()); |
| | | OrderResponse response = orderService.getByOrderNum(orderReturn.getOrderNum()); |
| | | operationLogService.create(response, OrderStatusEnum.FIFTEEN, null); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void audit(AuditOrderReturn resources) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteAll(List<Long> ids) { |
| | | orderReturnMapper.deleteBatchIds(ids); |
| | | 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 |
| | |
| | | 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())); |