新增订单强制取消功能
- 新增管理后台强制取消进行中订单接口 - 实现已接单/服务中订单强制取消业务逻辑 - 支持自定义退款金额,默认退回全额支付金额 - 新增订单强制取消请求VO类及参数校验 - 新增单元测试验证强制取消功能的正确性 - 更新服务接口定义及文档注释
This commit is contained in:
@@ -7,6 +7,7 @@ import static org.mockito.Mockito.*;
|
||||
import com.starry.admin.common.exception.CustomException;
|
||||
import com.starry.admin.modules.clerk.service.IPlayClerkLevelInfoService;
|
||||
import com.starry.admin.modules.clerk.service.IPlayClerkUserInfoService;
|
||||
import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity;
|
||||
import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService;
|
||||
import com.starry.admin.modules.order.mapper.PlayOrderInfoMapper;
|
||||
import com.starry.admin.modules.order.module.constant.OrderConstant;
|
||||
@@ -15,10 +16,12 @@ import com.starry.admin.modules.order.module.dto.OrderCreationRequest;
|
||||
import com.starry.admin.modules.order.module.dto.PaymentInfo;
|
||||
import com.starry.admin.modules.order.module.dto.RandomOrderRequirements;
|
||||
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
|
||||
import com.starry.admin.modules.order.service.IPlayOrderRefundInfoService;
|
||||
import com.starry.admin.modules.order.service.impl.PlayOrderInfoServiceImpl;
|
||||
import com.starry.admin.modules.personnel.service.IPlayPersonnelGroupInfoService;
|
||||
import com.starry.admin.modules.shop.service.IPlayCouponDetailsService;
|
||||
import com.starry.admin.modules.weichat.service.WxCustomMpService;
|
||||
import com.starry.admin.modules.withdraw.service.IEarningsService;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
@@ -64,6 +67,12 @@ class PlayOrderInfoServiceTest {
|
||||
@Mock
|
||||
private IPlayPersonnelGroupInfoService playClerkGroupInfoService;
|
||||
|
||||
@Mock
|
||||
private IPlayOrderRefundInfoService playOrderRefundInfoService;
|
||||
|
||||
@Mock
|
||||
private IEarningsService earningsService;
|
||||
|
||||
@InjectMocks
|
||||
private PlayOrderInfoServiceImpl orderService;
|
||||
|
||||
@@ -434,4 +443,65 @@ class PlayOrderInfoServiceTest {
|
||||
// 3. 复杂业务流程的正确执行
|
||||
// 实际收入计算:185元 * 20% = 37元,但由于优惠券由店员承担,需要减去15元,最终收入22元
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("管理员强制取消已接单/服务中订单 - 成功流程")
|
||||
void testForceCancelOngoingOrderByAdminSuccess() {
|
||||
String orderId = "order_force_cancel";
|
||||
PlayOrderInfoEntity inProgressOrder = new PlayOrderInfoEntity();
|
||||
inProgressOrder.setId(orderId);
|
||||
inProgressOrder.setOrderStatus(OrderConstant.ORDER_STATUS_2);
|
||||
inProgressOrder.setAcceptBy("clerk-1");
|
||||
inProgressOrder.setPurchaserBy("customer-1");
|
||||
inProgressOrder.setFinalAmount(BigDecimal.valueOf(100));
|
||||
inProgressOrder.setPayMethod("1");
|
||||
|
||||
PlayOrderInfoEntity cancelledOrder = new PlayOrderInfoEntity();
|
||||
cancelledOrder.setId(orderId);
|
||||
cancelledOrder.setOrderStatus(OrderConstant.ORDER_STATUS_4);
|
||||
|
||||
PlayCustomUserInfoEntity customUserInfo = new PlayCustomUserInfoEntity();
|
||||
customUserInfo.setId("customer-1");
|
||||
customUserInfo.setAccountBalance(BigDecimal.valueOf(200));
|
||||
|
||||
when(orderInfoMapper.selectById(orderId)).thenReturn(inProgressOrder, cancelledOrder);
|
||||
when(orderInfoMapper.updateById(any(PlayOrderInfoEntity.class))).thenReturn(1);
|
||||
when(customUserInfoService.getById("customer-1")).thenReturn(customUserInfo);
|
||||
|
||||
doNothing().when(customUserInfoService).updateAccountBalanceById(eq("customer-1"), any(BigDecimal.class),
|
||||
any(BigDecimal.class), anyString(), anyString(), any(BigDecimal.class), any(BigDecimal.class), eq(orderId));
|
||||
doNothing().when(playOrderRefundInfoService).add(eq(orderId), eq("customer-1"), eq("clerk-1"), anyString(),
|
||||
anyString(), any(BigDecimal.class), anyString(), anyString(), anyString(), anyString(), anyString());
|
||||
doNothing().when(wxCustomMpService).sendOrderCancelMessage(any(PlayOrderInfoEntity.class), anyString());
|
||||
|
||||
assertDoesNotThrow(() -> orderService.forceCancelOngoingOrder("2", "admin-1", orderId,
|
||||
BigDecimal.valueOf(80), "管理员取消测试", Collections.emptyList()));
|
||||
|
||||
verify(orderInfoMapper, times(1)).updateById(any(PlayOrderInfoEntity.class));
|
||||
verify(customUserInfoService, times(1)).updateAccountBalanceById(eq("customer-1"), any(BigDecimal.class),
|
||||
any(BigDecimal.class), anyString(), anyString(), eq(BigDecimal.valueOf(80)), eq(BigDecimal.ZERO),
|
||||
eq(orderId));
|
||||
verify(playOrderRefundInfoService, times(1)).add(eq(orderId), eq("customer-1"), eq("clerk-1"), anyString(),
|
||||
eq("0"), eq(BigDecimal.valueOf(80)), eq("管理员取消测试"), eq("2"), eq("admin-1"), eq("0"), eq("0"));
|
||||
verify(wxCustomMpService, times(1)).sendOrderCancelMessage(any(PlayOrderInfoEntity.class),
|
||||
eq("管理员取消测试"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("强制取消订单 - 非进行中状态抛出异常")
|
||||
void testForceCancelOngoingOrderInvalidStatus() {
|
||||
String orderId = "order_invalid_force_cancel";
|
||||
PlayOrderInfoEntity pendingOrder = new PlayOrderInfoEntity();
|
||||
pendingOrder.setId(orderId);
|
||||
pendingOrder.setOrderStatus(OrderConstant.ORDER_STATUS_0);
|
||||
pendingOrder.setAcceptBy("clerk-1");
|
||||
pendingOrder.setPurchaserBy("customer-1");
|
||||
pendingOrder.setFinalAmount(BigDecimal.valueOf(50));
|
||||
|
||||
when(orderInfoMapper.selectById(orderId)).thenReturn(pendingOrder);
|
||||
|
||||
assertThrows(CustomException.class, () -> orderService.forceCancelOngoingOrder("2", "admin-1", orderId,
|
||||
null, "原因", Collections.emptyList()));
|
||||
verify(orderInfoMapper, never()).updateById(any(PlayOrderInfoEntity.class));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user