云
3 天以前 ac2e2b5af3726ee64dc37c3ebf26989a0346f22a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package cn.iocoder.yudao.module.mes.service.wm.itemconsume;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemconsume.MesWmItemConsumeLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ITEM_CONSUME_STOCK_INSUFFICIENT;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
 
class MesWmItemConsumeAllocationTest {
    @Test
    void repeatedMaterialLinesShareBatchAllocationAndRejectShortage() {
        var service = new MesWmItemConsumeServiceImpl();
        var items = mock(MesMdItemService.class);
        ReflectionTestUtils.setField(service, "mesMdItemService", items);
        when(items.validateItemExists(10L)).thenReturn(MesMdItemDO.builder().id(10L).mdmItemId(20L).name("铜线").build());
        var warehouse = new MesWmWarehouseDO().setId(1L);
        var location = new MesWmWarehouseLocationDO().setId(2L);
        var area = new MesWmWarehouseAreaDO().setId(3L);
        var stock = MesWmMaterialStockDO.builder().id(7L).itemId(20L).warehouseId(1L).locationId(2L)
                .areaId(3L).quantity(new BigDecimal("10")).frozenQuantity(new BigDecimal("1"))
                .reservedQuantity(new BigDecimal("1")).build();
        var details = new ArrayList<MesWmItemConsumeDetailDO>();
        var allocations = new HashMap<Long, BigDecimal>();
        var first = MesWmItemConsumeLineDO.builder().id(100L).itemId(10L).quantity(new BigDecimal("5")).build();
        var second = MesWmItemConsumeLineDO.builder().id(101L).itemId(10L).quantity(new BigDecimal("3")).build();
        ReflectionTestUtils.invokeMethod(service, "generateDetailForLine", first, 1L, warehouse, location, area,
                details, allocations, List.of(stock));
        ReflectionTestUtils.invokeMethod(service, "generateDetailForLine", second, 1L, warehouse, location, area,
                details, allocations, List.of(stock));
        assertEquals(2, details.size());
        assertEquals(0, details.get(0).getQuantity().compareTo(new BigDecimal("5")));
        assertEquals(0, details.get(1).getQuantity().compareTo(new BigDecimal("3")));
        var third = MesWmItemConsumeLineDO.builder().id(102L).itemId(10L).quantity(BigDecimal.ONE).build();
        ServiceException error = assertThrows(ServiceException.class, () -> ReflectionTestUtils.invokeMethod(service,
                "generateDetailForLine", third, 1L, warehouse, location, area, details, allocations, List.of(stock)));
        assertEquals(WM_ITEM_CONSUME_STOCK_INSUFFICIENT.getCode(), error.getCode());
        assertEquals(2, details.size());
    }
}