package cn.iocoder.yudao.module.wms.service.order.receipt; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailSaveReqVO; import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderSaveReqVO; import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO; import cn.iocoder.yudao.module.wms.dal.mysql.order.receipt.WmsReceiptOrderDetailMapper; import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.RECEIPT_ORDER_DETAIL_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @Import(WmsReceiptOrderDetailServiceImpl.class) public class WmsReceiptOrderDetailServiceImplTest extends BaseDbUnitTest { @Resource private WmsReceiptOrderDetailServiceImpl receiptOrderDetailService; @Resource private WmsReceiptOrderDetailMapper receiptOrderDetailMapper; @MockitoBean private WmsItemSkuService itemSkuService; @Test public void testCreateReceiptOrderDetailList_success() { // mock 数据 Long orderId = 10L; WmsReceiptOrderSaveReqVO reqVO = createReceiptOrderReqVO( createReceiptOrderDetailReqVO(null, 1001L, "1.00"), createReceiptOrderDetailReqVO(null, 1002L, "2.00")); // 调用 receiptOrderDetailService.createReceiptOrderDetailList(orderId, reqVO); // 断言 List details = receiptOrderDetailMapper.selectListByOrderId(orderId); assertEquals(2, details.size()); assertEquals(orderId, details.get(0).getOrderId()); assertEquals(orderId, details.get(1).getOrderId()); assertEquals(0, new BigDecimal("100.00").compareTo(details.get(0).getTotalPrice())); assertEquals(0, new BigDecimal("200.00").compareTo(details.get(1).getTotalPrice())); } @Test public void testCreateReceiptOrderDetailList_ignoreId() { // mock 数据 WmsReceiptOrderSaveReqVO reqVO = createReceiptOrderReqVO( createReceiptOrderDetailReqVO(999L, 1001L, "1.00")); // 调用 receiptOrderDetailService.createReceiptOrderDetailList(10L, reqVO); // 断言 List details = receiptOrderDetailMapper.selectListByOrderId(10L); assertEquals(1, details.size()); assertNotNull(details.get(0).getId()); assertEquals(1001L, details.get(0).getSkuId()); } @Test public void testUpdateReceiptOrderDetailList_diff() { // mock 数据 Long orderId = 10L; WmsReceiptOrderDetailDO detail01 = createReceiptOrderDetail(orderId, 1001L, "1.00"); WmsReceiptOrderDetailDO detail02 = createReceiptOrderDetail(orderId, 1002L, "2.00"); receiptOrderDetailMapper.insert(detail01); receiptOrderDetailMapper.insert(detail02); WmsReceiptOrderSaveReqVO reqVO = createReceiptOrderReqVO( createReceiptOrderDetailReqVO(detail01.getId(), 2001L, "11.00"), createReceiptOrderDetailReqVO(null, 2002L, "22.00")); // 调用 receiptOrderDetailService.updateReceiptOrderDetailList(orderId, reqVO); // 断言:修改 WmsReceiptOrderDetailDO dbUpdateDetail = receiptOrderDetailMapper.selectById(detail01.getId()); assertNotNull(dbUpdateDetail); assertEquals(orderId, dbUpdateDetail.getOrderId()); assertEquals(2001L, dbUpdateDetail.getSkuId()); assertEquals(0, new BigDecimal("11.00").compareTo(dbUpdateDetail.getQuantity())); assertEquals(0, new BigDecimal("1100.00").compareTo(dbUpdateDetail.getTotalPrice())); // 断言:新增 List details = receiptOrderDetailMapper.selectListByOrderId(orderId); assertEquals(2, details.size()); WmsReceiptOrderDetailDO dbCreateDetail = details.stream() .filter(detail -> Long.valueOf(2002L).equals(detail.getSkuId())) .findFirst().orElse(null); assertNotNull(dbCreateDetail); assertEquals(orderId, dbCreateDetail.getOrderId()); assertEquals(0, new BigDecimal("22.00").compareTo(dbCreateDetail.getQuantity())); assertEquals(0, new BigDecimal("2200.00").compareTo(dbCreateDetail.getTotalPrice())); // 断言:删除 assertNull(receiptOrderDetailMapper.selectById(detail02.getId())); } @Test public void testUpdateReceiptOrderDetailList_detailNotExists() { // mock 数据 WmsReceiptOrderSaveReqVO reqVO = createReceiptOrderReqVO( createReceiptOrderDetailReqVO(999L, 1001L, "1.00")); // 调用,并断言 assertServiceException(() -> receiptOrderDetailService.updateReceiptOrderDetailList(10L, reqVO), RECEIPT_ORDER_DETAIL_NOT_EXISTS); } private static WmsReceiptOrderSaveReqVO createReceiptOrderReqVO(WmsReceiptOrderDetailSaveReqVO... details) { WmsReceiptOrderSaveReqVO reqVO = new WmsReceiptOrderSaveReqVO(); reqVO.setOrderTime(LocalDateTime.of(2026, 5, 12, 0, 0)); reqVO.setWarehouseId(100L); reqVO.setDetails(Arrays.asList(details)); return reqVO; } private static WmsReceiptOrderDetailSaveReqVO createReceiptOrderDetailReqVO(Long id, Long skuId, String quantity) { WmsReceiptOrderDetailSaveReqVO reqVO = new WmsReceiptOrderDetailSaveReqVO(); reqVO.setId(id); reqVO.setSkuId(skuId); reqVO.setQuantity(new BigDecimal(quantity)); reqVO.setPrice(new BigDecimal("100.00")); reqVO.setTotalPrice(new BigDecimal(quantity).multiply(new BigDecimal("100.00"))); return reqVO; } private static WmsReceiptOrderDetailDO createReceiptOrderDetail(Long orderId, Long skuId, String quantity) { return WmsReceiptOrderDetailDO.builder() .orderId(orderId) .skuId(skuId) .warehouseId(100L) .quantity(new BigDecimal(quantity)) .price(new BigDecimal("100.00")) .totalPrice(new BigDecimal(quantity).multiply(new BigDecimal("100.00"))) .build(); } }