|
@@ -1,8 +1,8 @@
|
|
|
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.enums.UserTypeEnum;
|
|
|
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;
|
|
@@ -17,18 +17,23 @@ import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSa
|
|
|
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.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.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.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.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;
|
|
@@ -61,6 +66,8 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
private TradeOrderUpdateService tradeOrderUpdateService;
|
|
|
@Resource
|
|
|
private TradeOrderQueryService tradeOrderQueryService;
|
|
|
+ @Resource
|
|
|
+ private DeliveryExpressService deliveryExpressService;
|
|
|
|
|
|
@Resource
|
|
|
private TradeAfterSaleMapper tradeAfterSaleMapper;
|
|
@@ -93,10 +100,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
return tradeAfterSaleMapper.selectById(id);
|
|
|
}
|
|
|
|
|
|
- // TODO 芋艿:拼团失败,要不要发起售后的方式退款?还是走取消逻辑?
|
|
|
-
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CREATE)
|
|
|
public Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) {
|
|
|
// 第一步,前置校验
|
|
|
TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO);
|
|
@@ -163,15 +169,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索
|
|
|
afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus())
|
|
|
? TradeAfterSaleTypeEnum.AFTER_SALE.getType() : TradeAfterSaleTypeEnum.IN_SALE.getType());
|
|
|
- // TODO 退还积分
|
|
|
tradeAfterSaleMapper.insert(afterSale);
|
|
|
|
|
|
// 更新交易订单项的售后状态
|
|
|
tradeOrderUpdateService.updateOrderItemWhenAfterSaleCreate(orderItem.getId(), afterSale.getId());
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(orderItem.getUserId(), UserTypeEnum.MEMBER.getValue(),
|
|
|
- afterSale, null, afterSale.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), null,
|
|
|
+ TradeAfterSaleStatusEnum.APPLY.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
return afterSale;
|
|
@@ -179,6 +184,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_APPLY)
|
|
|
public void agreeAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单存在,并状态未审批
|
|
|
TradeAfterSaleDO afterSale = validateAfterSaleAuditable(id);
|
|
@@ -192,14 +198,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), newStatus);
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), newStatus);
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_APPLY)
|
|
|
public void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO) {
|
|
|
// 校验售后单存在,并状态未审批
|
|
|
TradeAfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId());
|
|
@@ -211,8 +217,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setAuditReason(auditReqVO.getAuditReason()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), newStatus);
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), newStatus);
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|
|
@@ -246,6 +251,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_DELIVERY)
|
|
|
public void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO) {
|
|
|
// 校验售后单存在,并状态未退货
|
|
|
TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId());
|
|
@@ -255,6 +261,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.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()
|
|
@@ -263,14 +270,17 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setDeliveryTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.MEMBER.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
+ TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
|
|
|
+ MapUtil.<String, Object>builder().put("expressName", express.getName())
|
|
|
+ .put("logisticsNo", deliveryReqVO.getLogisticsNo()).build());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE)
|
|
|
public void receiveAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单存在,并状态为已退货
|
|
|
TradeAfterSaleDO afterSale = validateAfterSaleReceivable(id);
|
|
@@ -280,14 +290,15 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setStatus(TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
+ TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_RECEIVE)
|
|
|
public void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO) {
|
|
|
// 校验售后单存在,并状态为已退货
|
|
|
TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId());
|
|
@@ -304,8 +315,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setReceiveReason(refuseReqVO.getRefuseMemo()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
+ TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
|
|
|
+ MapUtil.of("reason", refuseReqVO.getRefuseMemo()));
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|
|
@@ -332,6 +344,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_REFUND)
|
|
|
public void refundAfterSale(Long userId, String userIp, Long id) {
|
|
|
// 校验售后单的状态,并状态待退款
|
|
|
TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
@@ -350,8 +363,8 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setStatus(TradeAfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.ADMIN.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.COMPLETE.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
+ TradeAfterSaleStatusEnum.COMPLETE.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|
|
@@ -374,6 +387,8 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CANCEL)
|
|
|
public void cancelAfterSale(Long userId, Long id) {
|
|
|
// 校验售后单的状态,并状态待退款
|
|
|
TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
|
|
@@ -391,8 +406,8 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
|
|
|
.setStatus(TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus()));
|
|
|
|
|
|
// 记录售后日志
|
|
|
- createAfterSaleLog(userId, UserTypeEnum.MEMBER.getValue(),
|
|
|
- afterSale, afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus());
|
|
|
+ AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
|
|
|
+ TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus());
|
|
|
|
|
|
// TODO 发送售后消息
|
|
|
|