@ -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 发送售后消息