package cn.iocoder.yudao.module.mes.service.wm.returnsales; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper; import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class ReturnSalesManualBatchReelTest { @Test void manualBatchRequiresMatchingReelAndCompletedShipment() { var service = new MesWmReturnSalesLineServiceImpl(); var returns = mock(MesWmReturnSalesService.class); var items = mock(MesMdmItemService.class); var batches = mock(MesWmBatchService.class); var orders = mock(ErpSaleOrderApi.class); var shipments = mock(MesWmProductSalesDetailMapper.class); ReflectionTestUtils.setField(service, "returnSalesService", returns); ReflectionTestUtils.setField(service, "mdmItemService", items); ReflectionTestUtils.setField(service, "batchService", batches); ReflectionTestUtils.setField(service, "saleOrderApi", orders); ReflectionTestUtils.setField(service, "productSalesDetailMapper", shipments); var order = new MesWmReturnSalesDO().setSaleOrderId(5L).setClientId(9L).setSalesOrderCode("SO"); when(returns.validateReturnSalesExistsAndPrepare(1L)).thenReturn(order); when(items.validateItemExistsAndEnable(2L)).thenReturn(new MesMdmItemDO()); var batch = MesWmBatchDO.builder().id(3L).itemId(2L).code("B").reelNo("PHCS").build(); when(batches.validateBatchExists(3L, 2L)).thenReturn(batch); var item = new ErpSaleOrderItemRespDTO().setProductId(2L).setReelNo("PHCS"); when(orders.getSaleOrderItemList(5L)).thenReturn(CommonResult.success(List.of(item))); var req = new MesWmReturnSalesLineSaveReqVO().setReturnId(1L).setItemId(2L).setBatchId(3L); assertThrows(RuntimeException.class, () -> ReflectionTestUtils.invokeMethod(service, "validateLineSaveData", req)); when(shipments.countFinishedSaleBatch(eq(5L), eq(2L), eq(3L), anyInt())).thenReturn(1L); assertDoesNotThrow(() -> ReflectionTestUtils.invokeMethod(service, "validateLineSaveData", req)); assertEquals("B", req.getBatchCode()); batch.setReelNo("OTHER"); assertThrows(RuntimeException.class, () -> ReflectionTestUtils.invokeMethod(service, "validateLineSaveData", req)); } }