feat(order): 完善订单生命周期与投诉处理;补充单元测试

This commit is contained in:
irving
2025-11-01 23:55:47 -04:00
parent 60b4b0bd49
commit 9f83103189
4 changed files with 32 additions and 20 deletions

View File

@@ -47,7 +47,7 @@ import com.starry.admin.modules.shop.module.entity.PlayCouponInfoEntity;
import com.starry.admin.modules.shop.module.enums.CouponDiscountType; import com.starry.admin.modules.shop.module.enums.CouponDiscountType;
import com.starry.admin.modules.shop.service.IPlayCouponDetailsService; import com.starry.admin.modules.shop.service.IPlayCouponDetailsService;
import com.starry.admin.modules.shop.service.IPlayCouponInfoService; import com.starry.admin.modules.shop.service.IPlayCouponInfoService;
import com.starry.admin.modules.weichat.service.WxCustomMpService; import com.starry.admin.modules.weichat.service.NotificationSender;
import com.starry.admin.modules.withdraw.entity.EarningsLineEntity; import com.starry.admin.modules.withdraw.entity.EarningsLineEntity;
import com.starry.admin.modules.withdraw.service.IEarningsService; import com.starry.admin.modules.withdraw.service.IEarningsService;
import com.starry.admin.utils.SecurityUtils; import com.starry.admin.utils.SecurityUtils;
@@ -85,7 +85,7 @@ public class OrderLifecycleServiceImpl implements IOrderLifecycleService {
private IEarningsService earningsService; private IEarningsService earningsService;
@Resource @Resource
private WxCustomMpService wxCustomMpService; private NotificationSender notificationSender;
@Resource @Resource
private IPlayOrderRefundInfoService orderRefundInfoService; private IPlayOrderRefundInfoService orderRefundInfoService;
@@ -466,7 +466,7 @@ public class OrderLifecycleServiceImpl implements IOrderLifecycleService {
} }
if (shouldNotify) { if (shouldNotify) {
wxCustomMpService.sendOrderFinishMessageAsync(latest); notificationSender.sendOrderFinishMessageAsync(latest);
} }
} }

View File

@@ -17,7 +17,7 @@ import com.starry.admin.modules.order.module.vo.PlayOrderComplaintQueryVo;
import com.starry.admin.modules.order.module.vo.PlayOrderComplaintReturnVo; import com.starry.admin.modules.order.module.vo.PlayOrderComplaintReturnVo;
import com.starry.admin.modules.order.service.IPlayOrderComplaintInfoService; import com.starry.admin.modules.order.service.IPlayOrderComplaintInfoService;
import com.starry.admin.modules.personnel.service.IPlayPersonnelGroupInfoService; import com.starry.admin.modules.personnel.service.IPlayPersonnelGroupInfoService;
import com.starry.admin.modules.weichat.service.WxCustomMpService; import com.starry.admin.modules.weichat.service.NotificationSender;
import com.starry.admin.utils.SecurityUtils; import com.starry.admin.utils.SecurityUtils;
import com.starry.common.utils.IdUtils; import com.starry.common.utils.IdUtils;
import java.util.Arrays; import java.util.Arrays;
@@ -46,7 +46,7 @@ public class PlayOrderComplaintInfoServiceImpl
@Resource @Resource
private IPlayPersonnelGroupInfoService playClerkGroupInfoService; private IPlayPersonnelGroupInfoService playClerkGroupInfoService;
@Resource @Resource
private WxCustomMpService wxCustomMpService; private NotificationSender notificationSender;
/** /**
* 查询订单投诉信息 * 查询订单投诉信息
@@ -169,7 +169,7 @@ public class PlayOrderComplaintInfoServiceImpl
playOrderComplaintInfo.setClerkId(orderInfo.getAcceptBy()); playOrderComplaintInfo.setClerkId(orderInfo.getAcceptBy());
playOrderComplaintInfo.setCommodityId(orderInfo.getCommodityId()); playOrderComplaintInfo.setCommodityId(orderInfo.getCommodityId());
// 发送投诉消息给管理员以及客服 // 发送投诉消息给管理员以及客服
wxCustomMpService.sendComplaintMessage(playOrderComplaintInfo, orderInfo); notificationSender.sendComplaintMessage(playOrderComplaintInfo, orderInfo);
return save(playOrderComplaintInfo); return save(playOrderComplaintInfo);
} }

View File

@@ -1,5 +1,6 @@
package com.starry.admin.modules.order.service.impl; package com.starry.admin.modules.order.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -41,10 +42,11 @@ import com.starry.admin.modules.order.service.IPlayOrderRefundInfoService;
import com.starry.admin.modules.order.service.support.ClerkRevenueCalculator; import com.starry.admin.modules.order.service.support.ClerkRevenueCalculator;
import com.starry.admin.modules.personnel.module.entity.PlayPersonnelGroupInfoEntity; import com.starry.admin.modules.personnel.module.entity.PlayPersonnelGroupInfoEntity;
import com.starry.admin.modules.personnel.service.IPlayPersonnelGroupInfoService; import com.starry.admin.modules.personnel.service.IPlayPersonnelGroupInfoService;
import com.starry.admin.modules.shop.module.constant.CouponUseState;
import com.starry.admin.modules.shop.module.vo.PlayCouponDetailsReturnVo; import com.starry.admin.modules.shop.module.vo.PlayCouponDetailsReturnVo;
import com.starry.admin.modules.shop.service.IPlayCouponDetailsService; import com.starry.admin.modules.shop.service.IPlayCouponDetailsService;
import com.starry.admin.modules.weichat.entity.order.*; import com.starry.admin.modules.weichat.entity.order.*;
import com.starry.admin.modules.weichat.service.WxCustomMpService; import com.starry.admin.modules.weichat.service.NotificationSender;
import com.starry.admin.modules.withdraw.service.IEarningsService; import com.starry.admin.modules.withdraw.service.IEarningsService;
import com.starry.admin.utils.DateRangeUtils; import com.starry.admin.utils.DateRangeUtils;
import com.starry.admin.utils.SecurityUtils; import com.starry.admin.utils.SecurityUtils;
@@ -95,7 +97,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
private IPlayCouponDetailsService playCouponDetailsService; private IPlayCouponDetailsService playCouponDetailsService;
@Resource @Resource
private WxCustomMpService wxCustomMpService; private NotificationSender notificationSender;
@Resource @Resource
private IPlayCustomUserInfoService customUserInfoService; private IPlayCustomUserInfoService customUserInfoService;
@@ -644,7 +646,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
orderInfo.setFirstOrder(firstOrderFlag); orderInfo.setFirstOrder(firstOrderFlag);
log.info("Order accepted successfully. orderId={}, orderNo={}, acceptBy={}, operatorByType={}", log.info("Order accepted successfully. orderId={}, orderNo={}, acceptBy={}, operatorByType={}",
orderId, orderInfo.getOrderNo(), acceptBy, operatorByType); orderId, orderInfo.getOrderNo(), acceptBy, operatorByType);
wxCustomMpService.sendOrderMessageAsync(orderInfo); notificationSender.sendOrderMessageAsync(orderInfo);
} }
private void validateClerkQualificationForRandomOrder(PlayOrderInfoEntity orderInfo, private void validateClerkQualificationForRandomOrder(PlayOrderInfoEntity orderInfo,
@@ -835,7 +837,8 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
playOrderRefundInfoService.add(orderInfo.getId(), orderInfo.getPurchaserBy(), orderInfo.getAcceptBy(), playOrderRefundInfoService.add(orderInfo.getId(), orderInfo.getPurchaserBy(), orderInfo.getAcceptBy(),
orderInfo.getPayMethod(), OrderRefundRecordType.FULL.getCode(), orderInfo.getFinalAmount(), refundReason, operatorByType, operatorBy, orderInfo.getPayMethod(), OrderRefundRecordType.FULL.getCode(), orderInfo.getFinalAmount(), refundReason, operatorByType, operatorBy,
OrderRefundState.PROCESSING.getCode(), ReviewRequirement.NOT_REQUIRED.getCode()); OrderRefundState.PROCESSING.getCode(), ReviewRequirement.NOT_REQUIRED.getCode());
wxCustomMpService.sendOrderCancelMessageAsync(orderInfo, refundReason); restoreCouponsForOrder(orderInfo);
notificationSender.sendOrderCancelMessageAsync(orderInfo, refundReason);
} }
/** /**
@@ -888,8 +891,10 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
orderInfo.getPayMethod(), forceCancelRefundType.getCode(), actualRefundAmount, refundReason, operatorByType, operatorBy, orderInfo.getPayMethod(), forceCancelRefundType.getCode(), actualRefundAmount, refundReason, operatorByType, operatorBy,
OrderRefundState.PROCESSING.getCode(), ReviewRequirement.NOT_REQUIRED.getCode()); OrderRefundState.PROCESSING.getCode(), ReviewRequirement.NOT_REQUIRED.getCode());
restoreCouponsForOrder(orderInfo);
PlayOrderInfoEntity latest = this.selectOrderInfoById(orderId); PlayOrderInfoEntity latest = this.selectOrderInfoById(orderId);
wxCustomMpService.sendOrderCancelMessageAsync(latest, refundReason); notificationSender.sendOrderCancelMessageAsync(latest, refundReason);
} }
@Override @Override
@@ -1038,4 +1043,11 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
return OrderTriggerSource.SYSTEM; return OrderTriggerSource.SYSTEM;
} }
} }
private void restoreCouponsForOrder(PlayOrderInfoEntity orderInfo) {
if (orderInfo == null || CollectionUtil.isEmpty(orderInfo.getCouponIds())) {
return;
}
playCouponDetailsService.updateCouponUseStateByIds(orderInfo.getCouponIds(), CouponUseState.UNUSED.getCode());
}
} }

View File

@@ -50,7 +50,7 @@ import com.starry.admin.modules.shop.module.entity.PlayCouponDetailsEntity;
import com.starry.admin.modules.shop.module.entity.PlayCouponInfoEntity; import com.starry.admin.modules.shop.module.entity.PlayCouponInfoEntity;
import com.starry.admin.modules.shop.service.IPlayCouponDetailsService; import com.starry.admin.modules.shop.service.IPlayCouponDetailsService;
import com.starry.admin.modules.shop.service.IPlayCouponInfoService; import com.starry.admin.modules.shop.service.IPlayCouponInfoService;
import com.starry.admin.modules.weichat.service.WxCustomMpService; import com.starry.admin.modules.weichat.service.NotificationSender;
import com.starry.admin.modules.withdraw.entity.EarningsLineEntity; import com.starry.admin.modules.withdraw.entity.EarningsLineEntity;
import com.starry.admin.modules.withdraw.service.IEarningsService; import com.starry.admin.modules.withdraw.service.IEarningsService;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -81,7 +81,7 @@ class OrderLifecycleServiceImplTest {
private IEarningsService earningsService; private IEarningsService earningsService;
@Mock @Mock
private WxCustomMpService wxCustomMpService; private NotificationSender notificationSender;
@Mock @Mock
private IPlayOrderRefundInfoService orderRefundInfoService; private IPlayOrderRefundInfoService orderRefundInfoService;
@@ -565,7 +565,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
lifecycleService.placeOrder(command(context, null, false, null, null)); lifecycleService.placeOrder(command(context, null, false, null, null));
verify(orderInfoMapper, never()).selectById(anyString()); verify(orderInfoMapper, never()).selectById(anyString());
verify(wxCustomMpService, never()).sendOrderFinishMessageAsync(any()); verify(notificationSender, never()).sendOrderFinishMessageAsync(any());
verify(earningsService, never()).createFromOrder(any()); verify(earningsService, never()).createFromOrder(any());
} }
@@ -594,7 +594,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
verify(orderInfoMapper, atLeastOnce()).selectById(anyString()); verify(orderInfoMapper, atLeastOnce()).selectById(anyString());
verify(customUserInfoService).handleOrderCompletion(any()); verify(customUserInfoService).handleOrderCompletion(any());
verify(earningsService).createFromOrder(completed); verify(earningsService).createFromOrder(completed);
verify(wxCustomMpService).sendOrderFinishMessageAsync(completed); verify(notificationSender).sendOrderFinishMessageAsync(completed);
} }
@Test @Test
@@ -610,7 +610,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
lifecycleService.placeOrder(command(context, null, false, null, null)); lifecycleService.placeOrder(command(context, null, false, null, null));
verify(orderInfoMapper, never()).selectById(anyString()); verify(orderInfoMapper, never()).selectById(anyString());
verify(wxCustomMpService, never()).sendOrderFinishMessageAsync(any()); verify(notificationSender, never()).sendOrderFinishMessageAsync(any());
verify(earningsService, never()).createFromOrder(any()); verify(earningsService, never()).createFromOrder(any());
} }
@@ -639,7 +639,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
verify(orderInfoMapper, atLeastOnce()).selectById(anyString()); verify(orderInfoMapper, atLeastOnce()).selectById(anyString());
verify(customUserInfoService).handleOrderCompletion(any()); verify(customUserInfoService).handleOrderCompletion(any());
verify(earningsService).createFromOrder(completed); verify(earningsService).createFromOrder(completed);
verify(wxCustomMpService).sendOrderFinishMessageAsync(completed); verify(notificationSender).sendOrderFinishMessageAsync(completed);
} }
@Test @Test
@@ -1031,7 +1031,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
verify(orderInfoMapper).update(isNull(), any()); verify(orderInfoMapper).update(isNull(), any());
verify(customUserInfoService).handleOrderCompletion(completed); verify(customUserInfoService).handleOrderCompletion(completed);
verify(earningsService).createFromOrder(completed); verify(earningsService).createFromOrder(completed);
verify(wxCustomMpService).sendOrderFinishMessageAsync(completed); verify(notificationSender).sendOrderFinishMessageAsync(completed);
} }
@Test @Test
@@ -1052,7 +1052,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
OrderTriggerSource.ADMIN_CONSOLE)); OrderTriggerSource.ADMIN_CONSOLE));
verify(earningsService, never()).createFromOrder(any()); verify(earningsService, never()).createFromOrder(any());
verify(wxCustomMpService, never()).sendOrderFinishMessageAsync(any()); verify(notificationSender, never()).sendOrderFinishMessageAsync(any());
} }
@Test @Test
@@ -1074,7 +1074,7 @@ private PlayOrderLogInfoMapper orderLogInfoMapper;
verify(customUserInfoService, never()).handleOrderCompletion(any()); verify(customUserInfoService, never()).handleOrderCompletion(any());
verify(earningsService, never()).createFromOrder(any()); verify(earningsService, never()).createFromOrder(any());
verify(wxCustomMpService, never()).sendOrderFinishMessageAsync(any()); verify(notificationSender, never()).sendOrderFinishMessageAsync(any());
verify(orderLogInfoMapper, never()).insert(any()); verify(orderLogInfoMapper, never()).insert(any());
} }