云
23 小时以前 704265308b1227dbada5a36b2027b588c062ded2
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package cn.iocoder.yudao.module.mes.service.pro.bagcode;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.mes.controller.admin.pro.pallet.vo.MesProPalletBindBatchReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper;
import cn.iocoder.yudao.module.mes.dal.redis.MesCodeRedisDAO;
import cn.iocoder.yudao.module.mes.service.pro.pallet.MesProPalletServiceImpl;
import org.junit.jupiter.api.*;
import org.mockito.ArgumentCaptor;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
 
class PalletItemBindingTest {
    final MesProPalletServiceImpl service=new MesProPalletServiceImpl();
    final MesProPalletMapper pallets=mock(MesProPalletMapper.class);
    final MesProBatchMapper batches=mock(MesProBatchMapper.class);
    final MesProBagCodeMapper bags=mock(MesProBagCodeMapper.class);
    final MesCodeRedisDAO codes=mock(MesCodeRedisDAO.class);
    MesProBatchDO batch;
    MesProPalletBindBatchReqVO req;
    @BeforeEach void setup(){
        ReflectionTestUtils.setField(service,"palletMapper",pallets);ReflectionTestUtils.setField(service,"batchMapper",batches);
        ReflectionTestUtils.setField(service,"bagCodeMapper",bags);ReflectionTestUtils.setField(service,"codeRedisDao",codes);
        ReflectionTestUtils.setField(service,"integrityService",mock(cn.iocoder.yudao.module.mes.service.trace.integrity.MesTraceIntegrityService.class));
        batch=new MesProBatchDO().setId(8L).setCode("BATCH").setStatus(20);
        when(batches.selectByIdForUpdate(8L)).thenReturn(batch);when(codes.generate()).thenReturn("1234567890123456");
        req=new MesProPalletBindBatchReqVO();req.setBatchId(8L);req.setIds(List.of(1L,2L));
        when(pallets.selectByIdForUpdate(1L)).thenReturn(new MesProPalletDO().setId(1L).setItemId(5L).setStatus(10));
        when(pallets.selectByIdForUpdate(2L)).thenReturn(new MesProPalletDO().setId(2L).setItemId(5L).setStatus(10));
    }
    @Test void sameVarietyFillsBatchAndPallets(){
        assertEquals(2,service.bindBatch(req));
        var saved=ArgumentCaptor.forClass(MesProBatchDO.class);verify(batches).updateById(saved.capture());assertEquals(5L,saved.getValue().getItemId());
        var savedPallet=ArgumentCaptor.forClass(MesProPalletDO.class);verify(pallets,times(2)).updateById(savedPallet.capture());
        assertTrue(savedPallet.getAllValues().stream().allMatch(p->Long.valueOf(5).equals(p.getItemId())));
    }
    @Test void mixedPalletVarietiesRejectBeforeAnyWrite(){
        when(pallets.selectByIdForUpdate(2L)).thenReturn(new MesProPalletDO().setId(2L).setItemId(6L));assertRejected();
    }
    @Test void existingBatchVarietyCannotBeOverwritten(){batch.setItemId(6L);assertRejected();}
    @Test void existingBatchBagsAlsoConstrainVariety(){when(bags.selectDistinctItemIdsByBatchId(8L)).thenReturn(List.of(6L));assertRejected();}
    @Test void palletMetadataCannotHideMixedBagVarieties(){
        when(bags.selectListByPalletId(1L)).thenReturn(List.of(new MesProBagCodeDO().setItemId(6L).setStatus(10)));assertRejected();
    }
    @Test void missingVarietyCannotBeBound(){when(pallets.selectByIdForUpdate(2L)).thenReturn(new MesProPalletDO().setId(2L));assertRejected();}
    @Test void historicalPalletInfersVarietyFromBags(){
        when(pallets.selectByIdForUpdate(1L)).thenReturn(new MesProPalletDO().setId(1L));
        when(bags.selectListByPalletId(1L)).thenReturn(List.of(new MesProBagCodeDO().setItemId(5L).setStatus(10),new MesProBagCodeDO().setItemId(6L).setStatus(30)));
        assertEquals(2,service.bindBatch(req));
    }
    @Test void batchCreateCannotForgeVarietyDifferentFromSelectedPallet(){
        var batchService=new cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchServiceImpl();
        ReflectionTestUtils.setField(batchService,"palletMapper",pallets);ReflectionTestUtils.setField(batchService,"bagCodeMapper",bags);
        ReflectionTestUtils.setField(batchService,"adminUserApi",mock(cn.iocoder.yudao.module.system.api.user.AdminUserApi.class));
        var lines=mock(cn.iocoder.yudao.module.mes.service.pro.line.MesProLineService.class);
        ReflectionTestUtils.setField(batchService,"lineService",lines);
        when(lines.validateLineExistsAndEnable(1L)).thenReturn(new cn.iocoder.yudao.module.mes.dal.dataobject.pro.line.MesProLineDO().setId(1L));
        var request=new cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO();
        request.setLineId(1L);request.setItemId(99L);request.setPalletIds(List.of(1L));request.setWorkers(List.of());
        assertThrows(ServiceException.class,()->batchService.createBatch(request));
    }
    @Test void editingBatchCannotChangeItsExistingVariety(){
        var batchService=new cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchServiceImpl();
        ReflectionTestUtils.setField(batchService,"batchMapper",batches);ReflectionTestUtils.setField(batchService,"palletMapper",pallets);
        ReflectionTestUtils.setField(batchService,"bagCodeMapper",bags);
        ReflectionTestUtils.setField(batchService,"adminUserApi",mock(cn.iocoder.yudao.module.system.api.user.AdminUserApi.class));
        batch.setItemId(5L);
        var request=new cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO();
        request.setId(8L);request.setItemId(99L);request.setWorkers(List.of());
        assertThrows(ServiceException.class,()->batchService.updateBatch(request));verify(batches,never()).updateById(any(MesProBatchDO.class));
    }
    void assertRejected(){assertThrows(ServiceException.class,()->service.bindBatch(req));verify(pallets,never()).updateById(any(MesProPalletDO.class));verify(batches,never()).updateById(any(MesProBatchDO.class));verifyNoInteractions(codes);}
}