package cn.iocoder.yudao.module.mdm.service.item; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper; import cn.iocoder.yudao.module.mes.api.item.MesMdItemTypeApi; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MdmItemImportParsingTest { @Mock private MdmItemMapper itemMapper; @Mock private MdmUnitMeasureMapper unitMeasureMapper; @Mock private MesMdItemTypeApi mesMdItemTypeApi; @InjectMocks private MdmItemServiceImpl service; @Test void emptyCodeOrNameFails() { MdmItemRowResolution resolution = service.resolveImportRow( MdmItemImportExcelVO.builder().name("物料A").build(), emptyContext()); assertFalse(resolution.isSuccess()); assertEquals("物料编码和物料名称不能为空", resolution.failureMessage()); } @Test void missingCategoryFails() { MdmItemRowResolution resolution = service.resolveImportRow( MdmItemImportExcelVO.builder().code("A1").name("物料A").categoryCode("NOPE").build(), emptyContext()); assertFalse(resolution.isSuccess()); assertEquals("物料分类编码不存在:NOPE", resolution.failureMessage()); } @Test void missingUnitFails() { MdmItemRowResolution resolution = service.resolveImportRow( MdmItemImportExcelVO.builder().code("A1").name("物料A").unitMeasureCode("NOPE").build(), emptyContext()); assertFalse(resolution.isSuccess()); assertEquals("计量单位编码不存在:NOPE", resolution.failureMessage()); } @Test void successBuildsSaveReqVO() { MdmItemImportContext context = new MdmItemImportContext( Map.of("RAW", 11L), Map.of("RAW", "原料"), Map.of("PCS", 22L), Map.of("PCS", "个")); MdmItemRowResolution resolution = service.resolveImportRow( MdmItemImportExcelVO.builder().code("A1").name("物料A") .categoryCode("RAW").unitMeasureCode("PCS").build(), context); assertTrue(resolution.isSuccess()); MdmItemSaveReqVO reqVO = resolution.saveReqVO(); assertEquals("A1", reqVO.getCode()); assertEquals(11L, reqVO.getCategoryId()); assertEquals(22L, reqVO.getUnitMeasureId()); assertEquals(1, reqVO.getItemType()); assertFalse(reqVO.getSyncMes()); } @Test void existingCodeStillReportsSameMessage() { when(unitMeasureMapper.selectList()).thenReturn(List.of()); when(itemMapper.selectByCode("A1")).thenReturn(new MdmItemDO()); MdmItemImportRespVO respVO = service.importItemList(List.of( MdmItemImportExcelVO.builder().code("A1").name("物料A").build()), false); assertEquals(Map.of("A1 物料A", "物料编码已存在"), respVO.getFailureList()); assertTrue(respVO.getCreateList().isEmpty()); } private static MdmItemImportContext emptyContext() { return new MdmItemImportContext(Map.of(), Map.of(), Map.of(), Map.of()); } }