2026-06-30 24681c81c09022f584a57006f2534b5f74723414
yudao-module-wms/src/test/java/cn/iocoder/yudao/module/wms/service/inventory/WmsInventoryServiceImplTest.java
@@ -241,6 +241,46 @@
    }
    @Test
    public void testChangeInventory_multipleExistingInventoryKeys() {
        // mock 数据
        WmsItemDO item = createItem("ITEM-001", "红富士苹果");
        WmsItemSkuDO sku = createSku(item.getId(), "SKU-001", "10kg 箱装");
        inventoryMapper.insert(createInventory(sku.getId(), 200L, "7.00"));
        inventoryMapper.insert(createInventory(sku.getId(), 100L, "5.00"));
        WmsInventoryChangeReqDTO reqDTO = createChangeReq(sku.getId(), 100L, "2.00");
        List<WmsInventoryChangeReqDTO.Item> items = new ArrayList<>(reqDTO.getItems());
        items.add(new WmsInventoryChangeReqDTO.Item()
                .setSkuId(sku.getId())
                .setWarehouseId(200L)
                .setQuantity(new BigDecimal("3.00"))
                .setPrice(new BigDecimal("100.00"))
                .setTotalPrice(new BigDecimal("300.00"))
                .setRemark("测试入库 2"));
        reqDTO.setItems(items);
        // 调用
        inventoryService.changeInventory(reqDTO);
        // 断言:多条已存在库存余额分别更新
        WmsInventoryDO inventory1 = inventoryMapper.selectBySkuIdAndWarehouseId(sku.getId(), 100L);
        assertNotNull(inventory1);
        assertEquals(0, new BigDecimal("7.00").compareTo(inventory1.getQuantity()));
        WmsInventoryDO inventory2 = inventoryMapper.selectBySkuIdAndWarehouseId(sku.getId(), 200L);
        assertNotNull(inventory2);
        assertEquals(0, new BigDecimal("10.00").compareTo(inventory2.getQuantity()));
        // 断言:库存流水保持入参明细顺序
        List<WmsInventoryHistoryDO> histories = inventoryHistoryMapper.selectList();
        histories.sort(Comparator.comparing(WmsInventoryHistoryDO::getId));
        assertEquals(2, histories.size());
        assertEquals(100L, histories.get(0).getWarehouseId());
        assertEquals(0, new BigDecimal("5.00").compareTo(histories.get(0).getBeforeQuantity()));
        assertEquals(0, new BigDecimal("7.00").compareTo(histories.get(0).getAfterQuantity()));
        assertEquals(200L, histories.get(1).getWarehouseId());
        assertEquals(0, new BigDecimal("7.00").compareTo(histories.get(1).getBeforeQuantity()));
        assertEquals(0, new BigDecimal("10.00").compareTo(histories.get(1).getAfterQuantity()));
    }
    @Test
    public void testChangeInventory_concurrentCreateSameInventoryOnlyOneBalance() throws Exception {
        // mock 数据
        WmsItemDO item = createItem("ITEM-001", "红富士苹果");