|
@@ -2,42 +2,36 @@ package cn.iocoder.yudao.module.trade.service.aftersale;
|
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
-import cn.hutool.core.util.RandomUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
|
|
import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi;
|
|
|
import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDisagreeReqVO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRefuseReqVO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;
|
|
|
-import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO;
|
|
|
-import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;
|
|
|
-import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
|
|
|
-import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO;
|
|
|
+import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;
|
|
|
+import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
|
|
|
+import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;
|
|
|
+import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
|
|
|
+import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
|
|
|
+import cn.iocoder.yudao.module.trade.convert.aftersale.AfterSaleConvert;
|
|
|
+import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
|
|
-import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleLogMapper;
|
|
|
-import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper;
|
|
|
+import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.AfterSaleMapper;
|
|
|
+import cn.iocoder.yudao.module.trade.dal.redis.no.TradeNoRedisDAO;
|
|
|
import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum;
|
|
|
-import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
|
|
|
-import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
|
|
|
-import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
|
|
|
+import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleStatusEnum;
|
|
|
+import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleTypeEnum;
|
|
|
+import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
|
|
|
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
|
|
|
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
|
|
|
-import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog;
|
|
|
-import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO;
|
|
|
-import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;
|
|
|
-import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.util.AfterSaleLogUtils;
|
|
|
+import cn.iocoder.yudao.module.trade.framework.aftersale.core.annotations.AfterSaleLog;
|
|
|
+import cn.iocoder.yudao.module.trade.framework.aftersale.core.utils.AfterSaleLogUtils;
|
|
|
import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
|
|
|
import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
|
|
|
import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
|
|
|
import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.support.TransactionSynchronization;
|
|
@@ -46,10 +40,8 @@ import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.List;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
-import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
|
|
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
/**
|
|
@@ -60,7 +52,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
@Validated
|
|
|
-public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSaleLogService {
|
|
|
+public class AfterSaleServiceImpl implements AfterSaleService {
|
|
|
|
|
|
@Resource
|
|
|
private TradeOrderUpdateService tradeOrderUpdateService;
|
|
@@ -70,9 +62,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
private DeliveryExpressService deliveryExpressService;
|
|
|
|
|
|
@Resource
|
|
|
- private TradeAfterSaleMapper tradeAfterSaleMapper;
|
|
|
+ private AfterSaleMapper tradeAfterSaleMapper;
|
|
|
@Resource
|
|
|
- private TradeAfterSaleLogMapper tradeAfterSaleLogMapper;
|
|
|
+ private TradeNoRedisDAO tradeNoRedisDAO;
|
|
|
|
|
|
@Resource
|
|
|
private PayRefundApi payRefundApi;
|
|
@@ -81,34 +73,34 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
private TradeOrderProperties tradeOrderProperties;
|
|
|
|
|
|
@Override
|
|
|
- public PageResult<TradeAfterSaleDO> getAfterSalePage(TradeAfterSalePageReqVO pageReqVO) {
|
|
|
+ public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) {
|
|
|
return tradeAfterSaleMapper.selectPage(pageReqVO);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public PageResult<TradeAfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) {
|
|
|
+ public PageResult<AfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) {
|
|
|
return tradeAfterSaleMapper.selectPage(userId, pageParam);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public TradeAfterSaleDO getAfterSale(Long userId, Long id) {
|
|
|
+ public AfterSaleDO getAfterSale(Long userId, Long id) {
|
|
|
return tradeAfterSaleMapper.selectByIdAndUserId(id, userId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public TradeAfterSaleDO getAfterSale(Long id) {
|
|
|
+ public AfterSaleDO getAfterSale(Long id) {
|
|
|
return tradeAfterSaleMapper.selectById(id);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CREATE)
|
|
|
- public Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) {
|
|
|
+ public Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO) {
|
|
|
// 第一步,前置校验
|
|
|
TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO);
|
|
|
|
|
|
// 第二步,存储售后订单
|
|
|
- TradeAfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
|
|
|
+ AfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
|
|
|
return afterSale.getId();
|
|
|
}
|
|
|
|
|
@@ -119,7 +111,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
* @param createReqVO 售后创建信息
|
|
|
* @return 交易订单项
|
|
|
*/
|
|
|
- private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) {
|
|
|
+ private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppAfterSaleCreateReqVO createReqVO) {
|
|
|
// 校验订单项存在
|
|
|
TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(userId, createReqVO.getOrderItemId());
|
|
|
if (orderItem == null) {
|
|
@@ -149,24 +141,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID);
|
|
|
}
|
|
|
// 如果是【退货退款】的情况,需要额外校验是否发货
|
|
|
- if (createReqVO.getWay().equals(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay())
|
|
|
+ if (createReqVO.getWay().equals(AfterSaleWayEnum.RETURN_AND_REFUND.getWay())
|
|
|
&& !TradeOrderStatusEnum.haveDelivered(order.getStatus())) {
|
|
|
throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED);
|
|
|
}
|
|
|
return orderItem;
|
|
|
}
|
|
|
|
|
|
- private TradeAfterSaleDO createAfterSale(AppTradeAfterSaleCreateReqVO createReqVO,
|
|
|
- TradeOrderItemDO orderItem) {
|
|
|
+ private AfterSaleDO createAfterSale(AppAfterSaleCreateReqVO createReqVO,
|
|
|
+ TradeOrderItemDO orderItem) {
|
|
|
// 创建售后单
|
|
|
- TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, orderItem);
|
|
|
- afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑
|
|
|
- afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());
|
|
|
+ AfterSaleDO afterSale = AfterSaleConvert.INSTANCE.convert(createReqVO, orderItem);
|
|
|
+ afterSale.setNo(tradeNoRedisDAO.generate(TradeNoRedisDAO.AFTER_SALE_NO_PREFIX));
|
|
|
+ afterSale.setStatus(AfterSaleStatusEnum.APPLY.getStatus());
|
|
|
// 标记是售中还是售后
|
|
|
TradeOrderDO order = tradeOrderQueryService.getOrder(orderItem.getUserId(), orderItem.getOrderId());
|
|
|
afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索
|
|
|
afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus())
|
|
|
- ? TradeAfterSaleTypeEnum.AFTER_SALE.getType() : TradeAfterSaleTypeEnum.IN_SALE.getType());
|
|
|
+ ? AfterSaleTypeEnum.AFTER_SALE.getType() : AfterSaleTypeEnum.IN_SALE.getType());
|
|
|
tradeAfterSaleMapper.insert(afterSale);
|
|
|
|
|
|
// 更新交易订单项的售后状态
|
|
@@ -174,7 +166,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), null,
|
|
|
- TradeAfterSaleStatusEnum.APPLY.getStatus());
|
|
|
+ AfterSaleStatusEnum.APPLY.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
return afterSale;
|
|
@@ -185,14 +177,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_APPLY)
|
|
|
public void agreeAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单存在,并状态未审批
|
|
|
- TradeAfterSaleDO afterSale = validateAfterSaleAuditable(id);
|
|
|
+ AfterSaleDO afterSale = validateAfterSaleAuditable(id);
|
|
|
|
|
|
// 更新售后单的状态
|
|
|
// 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态
|
|
|
// 情况二:退货退款:需要等用户退货后,才能发起退款
|
|
|
- Integer newStatus = afterSale.getWay().equals(TradeAfterSaleWayEnum.REFUND.getWay()) ?
|
|
|
- TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus() : TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus();
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO()
|
|
|
+ Integer newStatus = afterSale.getWay().equals(AfterSaleWayEnum.REFUND.getWay()) ?
|
|
|
+ AfterSaleStatusEnum.WAIT_REFUND.getStatus() : AfterSaleStatusEnum.SELLER_AGREE.getStatus();
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.APPLY.getStatus(), new AfterSaleDO()
|
|
|
.setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
@@ -204,13 +196,13 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_APPLY)
|
|
|
- public void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO) {
|
|
|
+ public void disagreeAfterSale(Long userId, AfterSaleDisagreeReqVO auditReqVO) {
|
|
|
// 校验售后单存在,并状态未审批
|
|
|
- TradeAfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId());
|
|
|
+ AfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId());
|
|
|
|
|
|
// 更新售后单的状态
|
|
|
- Integer newStatus = TradeAfterSaleStatusEnum.SELLER_DISAGREE.getStatus();
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO()
|
|
|
+ Integer newStatus = AfterSaleStatusEnum.SELLER_DISAGREE.getStatus();
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.APPLY.getStatus(), new AfterSaleDO()
|
|
|
.setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())
|
|
|
.setAuditReason(auditReqVO.getAuditReason()));
|
|
|
|
|
@@ -229,18 +221,18 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
* @param id 售后编号
|
|
|
* @return 售后单
|
|
|
*/
|
|
|
- private TradeAfterSaleDO validateAfterSaleAuditable(Long id) {
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
+ private AfterSaleDO validateAfterSaleAuditable(Long id) {
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus())) {
|
|
|
+ if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.APPLY.getStatus())) {
|
|
|
throw exception(AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY);
|
|
|
}
|
|
|
return afterSale;
|
|
|
}
|
|
|
|
|
|
- private void updateAfterSaleStatus(Long id, Integer status, TradeAfterSaleDO updateObj) {
|
|
|
+ private void updateAfterSaleStatus(Long id, Integer status, AfterSaleDO updateObj) {
|
|
|
int updateCount = tradeAfterSaleMapper.updateByIdAndStatus(id, status, updateObj);
|
|
|
if (updateCount == 0) {
|
|
|
throw exception(AFTER_SALE_UPDATE_STATUS_FAIL);
|
|
@@ -250,26 +242,26 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_DELIVERY)
|
|
|
- public void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO) {
|
|
|
+ public void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO) {
|
|
|
// 校验售后单存在,并状态未退货
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId());
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId());
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus())) {
|
|
|
+ if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.SELLER_AGREE.getStatus())) {
|
|
|
throw exception(AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE);
|
|
|
}
|
|
|
DeliveryExpressDO express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId());
|
|
|
|
|
|
// 更新售后单的物流信息
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(), new TradeAfterSaleDO()
|
|
|
- .setStatus(TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.SELLER_AGREE.getStatus(), new AfterSaleDO()
|
|
|
+ .setStatus(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())
|
|
|
.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo())
|
|
|
.setDeliveryTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
|
|
|
+ AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
|
|
|
MapUtil.<String, Object>builder().put("expressName", express.getName())
|
|
|
.put("logisticsNo", deliveryReqVO.getLogisticsNo()).build());
|
|
|
|
|
@@ -281,15 +273,15 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE)
|
|
|
public void receiveAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单存在,并状态为已退货
|
|
|
- TradeAfterSaleDO afterSale = validateAfterSaleReceivable(id);
|
|
|
+ AfterSaleDO afterSale = validateAfterSaleReceivable(id);
|
|
|
|
|
|
// 更新售后单的状态
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO()
|
|
|
- .setStatus(TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now()));
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new AfterSaleDO()
|
|
|
+ .setStatus(AfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus());
|
|
|
+ AfterSaleStatusEnum.WAIT_REFUND.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
}
|
|
@@ -297,24 +289,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_RECEIVE)
|
|
|
- public void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO) {
|
|
|
+ public void refuseAfterSale(Long userId, AfterSaleRefuseReqVO refuseReqVO) {
|
|
|
// 校验售后单存在,并状态为已退货
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId());
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId());
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
+ if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY);
|
|
|
}
|
|
|
|
|
|
// 更新售后单的状态
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO()
|
|
|
- .setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()).setReceiveTime(LocalDateTime.now())
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new AfterSaleDO()
|
|
|
+ .setStatus(AfterSaleStatusEnum.SELLER_REFUSE.getStatus()).setReceiveTime(LocalDateTime.now())
|
|
|
.setReceiveReason(refuseReqVO.getRefuseMemo()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
|
|
|
+ AfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
|
|
|
MapUtil.of("reason", refuseReqVO.getRefuseMemo()));
|
|
|
|
|
|
// TODO 发送售后消息
|
|
@@ -329,12 +321,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
* @param id 售后编号
|
|
|
* @return 售后单
|
|
|
*/
|
|
|
- private TradeAfterSaleDO validateAfterSaleReceivable(Long id) {
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
+ private AfterSaleDO validateAfterSaleReceivable(Long id) {
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
+ if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY);
|
|
|
}
|
|
|
return afterSale;
|
|
@@ -345,11 +337,11 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_REFUND)
|
|
|
public void refundAfterSale(Long userId, String userIp, Long id) {
|
|
|
// 校验售后单的状态,并状态待退款
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus())) {
|
|
|
+ if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.WAIT_REFUND.getStatus())) {
|
|
|
throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND);
|
|
|
}
|
|
|
|
|
@@ -357,12 +349,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
createPayRefund(userIp, afterSale);
|
|
|
|
|
|
// 更新售后单的状态为【已完成】
|
|
|
- updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus(), new TradeAfterSaleDO()
|
|
|
- .setStatus(TradeAfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.WAIT_REFUND.getStatus(), new AfterSaleDO()
|
|
|
+ .setStatus(AfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.COMPLETE.getStatus());
|
|
|
+ AfterSaleStatusEnum.COMPLETE.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|
|
@@ -370,16 +362,16 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
tradeOrderUpdateService.updateOrderItemWhenAfterSaleSuccess(afterSale.getOrderItemId(), afterSale.getRefundPrice());
|
|
|
}
|
|
|
|
|
|
- private void createPayRefund(String userIp, TradeAfterSaleDO afterSale) {
|
|
|
+ private void createPayRefund(String userIp, AfterSaleDO afterSale) {
|
|
|
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
|
|
|
|
|
@Override
|
|
|
public void afterCommit() {
|
|
|
// 创建退款单
|
|
|
- PayRefundCreateReqDTO createReqDTO = TradeAfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties);
|
|
|
+ PayRefundCreateReqDTO createReqDTO = AfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties);
|
|
|
Long payRefundId = payRefundApi.createRefund(createReqDTO);
|
|
|
// 更新售后单的退款单号
|
|
|
- tradeAfterSaleMapper.updateById(new TradeAfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId));
|
|
|
+ tradeAfterSaleMapper.updateById(new AfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId));
|
|
|
}
|
|
|
});
|
|
|
}
|
|
@@ -389,23 +381,23 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
@AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CANCEL)
|
|
|
public void cancelAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单的状态,并状态待退款
|
|
|
- TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
+ AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
|
if (afterSale == null) {
|
|
|
throw exception(AFTER_SALE_NOT_FOUND);
|
|
|
}
|
|
|
- if (!ObjectUtils.equalsAny(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
+ if (!ObjectUtils.equalsAny(afterSale.getStatus(), AfterSaleStatusEnum.APPLY.getStatus(),
|
|
|
+ AfterSaleStatusEnum.SELLER_AGREE.getStatus(),
|
|
|
+ AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
|
|
|
throw exception(AFTER_SALE_CANCEL_FAIL_STATUS_NOT_APPLY_OR_AGREE_OR_BUYER_DELIVERY);
|
|
|
}
|
|
|
|
|
|
// 更新售后单的状态为【已取消】
|
|
|
- updateAfterSaleStatus(afterSale.getId(), afterSale.getStatus(), new TradeAfterSaleDO()
|
|
|
- .setStatus(TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus()));
|
|
|
+ updateAfterSaleStatus(afterSale.getId(), afterSale.getStatus(), new AfterSaleDO()
|
|
|
+ .setStatus(AfterSaleStatusEnum.BUYER_CANCEL.getStatus()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
- TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus());
|
|
|
+ AfterSaleStatusEnum.BUYER_CANCEL.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|
|
@@ -415,52 +407,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
|
|
|
@Override
|
|
|
public Long getApplyingAfterSaleCount(Long userId) {
|
|
|
- return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, TradeAfterSaleStatusEnum.APPLYING_STATUSES);
|
|
|
- }
|
|
|
-
|
|
|
- @Deprecated
|
|
|
- private void createAfterSaleLog(Long userId, Integer userType, TradeAfterSaleDO afterSale,
|
|
|
- Integer beforeStatus, Integer afterStatus) {
|
|
|
- TradeAfterSaleLogCreateReqDTO logDTO = new TradeAfterSaleLogCreateReqDTO()
|
|
|
- .setUserId(userId)
|
|
|
- .setUserType(userType)
|
|
|
- .setAfterSaleId(afterSale.getId())
|
|
|
- .setOperateType(afterStatus.toString());
|
|
|
- // TODO 废弃,待删除
|
|
|
- this.createLog(logDTO);
|
|
|
- }
|
|
|
-
|
|
|
- // TODO @CHENCHEN:这个注释,写在接口就好了,补充重复写哈;@date 应该是 @since
|
|
|
- /**
|
|
|
- * 日志记录
|
|
|
- *
|
|
|
- * @param logDTO 日志记录
|
|
|
- * @author 陈賝
|
|
|
- * @date 2023/6/12 14:18
|
|
|
- */
|
|
|
- @Override
|
|
|
- @Async
|
|
|
- public void createLog(TradeAfterSaleLogCreateReqDTO logDTO) {
|
|
|
- try {
|
|
|
- TradeAfterSaleLogDO afterSaleLog = new TradeAfterSaleLogDO()
|
|
|
- .setUserId(logDTO.getUserId())
|
|
|
- .setUserType(logDTO.getUserType())
|
|
|
- .setAfterSaleId(logDTO.getAfterSaleId())
|
|
|
- .setOperateType(logDTO.getOperateType())
|
|
|
- .setContent(logDTO.getContent());
|
|
|
- tradeAfterSaleLogMapper.insert(afterSaleLog);
|
|
|
- // TODO @CHENCHEN:代码排版哈;空格要正确
|
|
|
- }catch (Exception exception){
|
|
|
- log.error("[createLog][request({}) 日志记录错误]", toJsonString(logDTO), exception);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // TODO @puhui999:应该返回 do 哈。
|
|
|
- @Override
|
|
|
- public List<TradeAfterSaleLogRespVO> getLog(Long afterSaleId) {
|
|
|
- // TODO 不熟悉流程先这么滴
|
|
|
- List<TradeAfterSaleLogDO> saleLogDOs = tradeAfterSaleLogMapper.selectList(TradeAfterSaleLogDO::getAfterSaleId, afterSaleId);
|
|
|
- return TradeAfterSaleConvert.INSTANCE.convertList(saleLogDOs);
|
|
|
+ return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, AfterSaleStatusEnum.APPLYING_STATUSES);
|
|
|
}
|
|
|
|
|
|
}
|