|
|
@@ -0,0 +1,116 @@
|
|
|
+package com.ruoyi.app.order;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.ruoyi.common.exception.ServiceException;
|
|
|
+import com.ruoyi.common.utils.MessageUtils;
|
|
|
+import com.ruoyi.system.domain.PosOrder;
|
|
|
+import com.ruoyi.system.domain.PosStore;
|
|
|
+import com.ruoyi.system.service.IPosOrderService;
|
|
|
+import com.ruoyi.system.service.IPosStoreService;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
+
|
|
|
+class MerchantOrderPrintServiceTest {
|
|
|
+ private final IPosOrderService orders = mock(IPosOrderService.class);
|
|
|
+ private final IPosStoreService stores = mock(IPosStoreService.class);
|
|
|
+ private final MerchantOrderPrintService service = new MerchantOrderPrintService(orders, stores);
|
|
|
+
|
|
|
+ private PosOrder order() {
|
|
|
+ PosOrder order = new PosOrder();
|
|
|
+ order.setId(123L); order.setDdId("ORDER-123"); order.setMdId(7L);
|
|
|
+ order.setPosName("下单时店名"); order.setType(0L);
|
|
|
+ order.setFood("[{\"id\":9129,\"name\":\"薑蔥焗三鮮\",\"price\":40,\"otherPrice\":5,\"number\":2,\"ask\":[\"小\",\"中辣\"],\"beizhu\":\"少盐\"}]");
|
|
|
+ order.setFoodAmount(90); order.setAmount(100); order.setFreight(40.0);
|
|
|
+ order.setShAddress("{\"name\":\"顾客\",\"phone\":\"0900000000\",\"address\":\"台北\",\"addressDetail\":\"二楼\",\"userId\":999}");
|
|
|
+ when(orders.getById(123L)).thenReturn(order);
|
|
|
+ PosStore store = new PosStore(); store.setPosName("新店名"); store.setAddress("门店地址"); store.setTelephone("0200000000");
|
|
|
+ when(stores.getById(7L)).thenReturn(store);
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void freezesProductSpecsAndNotesForBothOrdinaryAndMultiStoreChildOrders() throws Exception {
|
|
|
+ PosOrder order = order();
|
|
|
+ for (String parent : List.of("ORDER-123", "BATCH-123")) {
|
|
|
+ order.setParentDdId(parent);
|
|
|
+ var view = service.getOrderPrintInfo(123L);
|
|
|
+ assertEquals("下单时店名", view.getStoreName());
|
|
|
+ assertEquals("门店地址", view.getStoreAddress());
|
|
|
+ assertEquals("ORDER-123", view.getOrderNo());
|
|
|
+ assertEquals(List.of("小", "中辣"), view.getItems().getFirst().specifications());
|
|
|
+ assertEquals("少盐", view.getItems().getFirst().remarks());
|
|
|
+ assertEquals(2, view.getItems().getFirst().quantity());
|
|
|
+ assertEquals(new BigDecimal("5"), view.getItems().getFirst().otherPrice());
|
|
|
+ assertEquals("二楼", view.getRecipient().addressDetail());
|
|
|
+ var json = new ObjectMapper().valueToTree(view);
|
|
|
+ assertTrue(json.get("items").isArray());
|
|
|
+ assertFalse(json.get("recipient").has("userId"));
|
|
|
+ assertFalse(json.has("shAddress"));
|
|
|
+ }
|
|
|
+ verify(stores, times(2)).getById(7L);
|
|
|
+ verifyNoMoreInteractions(stores);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void keepsAmountAndSeparatesCustomerFreightFromMerchantSubsidyAndGoodsDiscounts() {
|
|
|
+ PosOrder order = order();
|
|
|
+ order.setCustomerDeliveryFee(new BigDecimal("8"));
|
|
|
+ order.setMerchantDeliverySubsidy(new BigDecimal("32"));
|
|
|
+ order.setDiscountAmount(1); order.setMdDiscountAmount(2);
|
|
|
+ order.setSalesReduction(3); order.setMdSalesReduction(4); order.setPointsReduction(5);
|
|
|
+ var view = service.getOrderPrintInfo(123L);
|
|
|
+ assertEquals(100, view.getAmount());
|
|
|
+ assertEquals(90, view.getFoodAmount());
|
|
|
+ assertEquals(0, view.getFreight().compareTo(new BigDecimal("40")));
|
|
|
+ assertEquals(new BigDecimal("8"), view.getCustomerDeliveryFee());
|
|
|
+ assertEquals(new BigDecimal("32"), view.getMerchantDeliverySubsidy());
|
|
|
+ assertEquals(new BigDecimal("15"), view.getDiscounts().totalAmount());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void pickupAndDineInMayHaveNoRecipientAndLegacyFreightAndEmptySpecsArePreserved() {
|
|
|
+ PosOrder order = order();
|
|
|
+ order.setFood("[{\"name\":\"旧商品\",\"price\":40,\"number\":1}]");
|
|
|
+ order.setShAddress(null); order.setPickUpNum(8L); order.setTableNo("A3");
|
|
|
+ order.setReservePhone("0900000000"); order.setPickUpTime("18:30");
|
|
|
+ for (Long type : List.of(1L, 2L)) {
|
|
|
+ order.setType(type);
|
|
|
+ var view = service.getOrderPrintInfo(123L);
|
|
|
+ assertNull(view.getRecipient());
|
|
|
+ assertEquals(8L, view.getPickUpNum());
|
|
|
+ assertEquals("A3", view.getTableNo());
|
|
|
+ assertEquals("18:30", view.getPickUpTime());
|
|
|
+ assertEquals(view.getFreight(), view.getCustomerDeliveryFee());
|
|
|
+ assertEquals(BigDecimal.ZERO, view.getMerchantDeliverySubsidy());
|
|
|
+ assertEquals(BigDecimal.ZERO, view.getDiscounts().totalAmount());
|
|
|
+ assertTrue(view.getItems().getFirst().specifications().isEmpty());
|
|
|
+ }
|
|
|
+ order.setShAddress("null");
|
|
|
+ assertNull(service.getOrderPrintInfo(123L).getRecipient());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void missingStoreUsesStoredNameAndMissingOrderOrCorruptSnapshotFailsExplicitly() {
|
|
|
+ PosOrder order = order();
|
|
|
+ when(stores.getById(7L)).thenReturn(null);
|
|
|
+ assertEquals("下单时店名", service.getOrderPrintInfo(123L).getStoreName());
|
|
|
+ assertNull(service.getOrderPrintInfo(123L).getStoreAddress());
|
|
|
+ try (var messages = mockStatic(MessageUtils.class, call -> call.getArgument(0))) {
|
|
|
+ assertEquals("merchant.order.not.found", assertThrows(ServiceException.class,
|
|
|
+ () -> service.getOrderPrintInfo(999L)).getMessage());
|
|
|
+ for (String data : List.of("bad-json", "[]", "[null]", "[{\"name\":\"商品\",\"number\":0}]")) {
|
|
|
+ order.setFood(data);
|
|
|
+ assertEquals("merchant.order.print.invalidSnapshot", assertThrows(ServiceException.class,
|
|
|
+ () -> service.getOrderPrintInfo(123L)).getMessage());
|
|
|
+ }
|
|
|
+ order.setFood("[{\"name\":\"商品\",\"number\":1}]"); order.setShAddress("bad-address");
|
|
|
+ assertEquals("merchant.order.print.invalidSnapshot", assertThrows(ServiceException.class,
|
|
|
+ () -> service.getOrderPrintInfo(123L)).getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|