package cn.iocoder.yudao.module.mes.service.wm.returnsales; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class MesWmReturnSalesStockTest { @InjectMocks private MesWmReturnSalesServiceImpl service; @Mock private MesWmReturnSalesMapper mapper; @Mock private MesWmReturnSalesLineService lineService; @Mock private MesWmReturnSalesDetailService detailService; @Mock private MesMdmItemService itemService; @Mock private MesWmTransactionService transactionService; private void setup(BigDecimal quantity) { when(mapper.selectById(1L)).thenReturn(MesWmReturnSalesDO.builder().id(1L).code("TEST") .status(MesWmReturnSalesStatusEnum.APPROVED.getStatus()).build()); when(lineService.getReturnSalesLineListByReturnId(1L)).thenReturn(List.of( MesWmReturnSalesLineDO.builder().id(2L).itemId(3L).quantity(BigDecimal.ONE).build())); when(detailService.getReturnSalesDetailListByReturnId(1L)).thenReturn(List.of( MesWmReturnSalesDetailDO.builder().lineId(2L).itemId(3L).quantity(quantity) .batchId(4L).batchCode("TEST-BATCH").warehouseId(5L).build())); } @Test void rejectsExcessStocking() { setup(BigDecimal.TWO); when(itemService.validateItemExistsAndEnable(3L)).thenReturn(MesMdmItemDO.builder().code("TEST").name("test").build()); assertThrows(ServiceException.class, () -> service.stockReturnSales(1L)); verifyNoInteractions(transactionService); } @Test void preservesBatchOnStockTransaction() { setup(BigDecimal.ONE); service.stockReturnSales(1L); ArgumentCaptor> captor = ArgumentCaptor.forClass(List.class); verify(transactionService).createTransactionList(captor.capture()); assertEquals(4L, captor.getValue().get(0).getBatchId()); assertEquals("TEST-BATCH", captor.getValue().get(0).getBatchCode()); assertEquals(BigDecimal.ONE, captor.getValue().get(0).getQuantity()); } }