| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; |
| | | |
| | | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; |
| | | import org.junit.jupiter.api.Test; |
| | | import org.springframework.context.annotation.Import; |
| | | import org.springframework.test.context.bean.override.mockito.MockitoBean; |
| | |
| | | import jakarta.annotation.Resource; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | |
| | |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | import static org.junit.jupiter.api.Assertions.*; |
| | | import static org.mockito.ArgumentMatchers.anyList; |
| | | import static org.mockito.ArgumentMatchers.anyLong; |
| | | import static org.mockito.ArgumentMatchers.eq; |
| | | import static org.mockito.Mockito.*; |
| | | |
| | | /** |
| | | * {@link MesWmItemReceiptServiceImpl} 的单元测试 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Import(MesWmItemReceiptServiceImpl.class) |
| | | public class MesWmItemReceiptServiceImplTest extends BaseDbUnitTest { |
| | |
| | | private MesQcIqcService iqcService; |
| | | @MockitoBean |
| | | private MesWmTransactionService wmTransactionService; |
| | | @MockitoBean |
| | | private MesWmArrivalNoticeLineService arrivalNoticeLineService; |
| | | @MockitoBean |
| | | private SrmSupplierApi srmSupplierApi; |
| | | @MockitoBean |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | @MockitoBean |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | @MockitoBean |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | // ========== createItemReceipt:供应商 / 到货通知单支持手工填写 ========== |
| | | |
| | | @Test |
| | | public void testCreateItemReceipt_success_withManualVendorNameAndNoticeCode() { |
| | | // 准备参数:只手工填写供应商名称与到货通知单号,不选供应商主数据、不选到货通知单 |
| | | MesWmItemReceiptSaveReqVO reqVO = new MesWmItemReceiptSaveReqVO(); |
| | | reqVO.setCode("IR-MANUAL-" + randomLongId()); |
| | | reqVO.setName("手工供应商入库单"); |
| | | reqVO.setVendorId(null); |
| | | reqVO.setVendorName("某某贸易有限公司"); |
| | | reqVO.setNoticeId(null); |
| | | reqVO.setNoticeCode("AN2026020001"); |
| | | reqVO.setReceiptDate(LocalDateTime.now()); |
| | | |
| | | // 调用 |
| | | Long id = itemReceiptService.createItemReceipt(reqVO); |
| | | |
| | | // 断言 1:保存成功,手工填写的内容落库 |
| | | MesWmItemReceiptDO saved = itemReceiptMapper.selectById(id); |
| | | assertNotNull(saved); |
| | | assertNull(saved.getVendorId()); |
| | | assertEquals("某某贸易有限公司", saved.getVendorName()); |
| | | assertNull(saved.getNoticeId()); |
| | | assertEquals("AN2026020001", saved.getNoticeCode()); |
| | | // 断言 2:未选择供应商主数据时不校验供应商 |
| | | verify(srmSupplierApi, never()).getSupplier(anyLong()); |
| | | } |
| | | |
| | | @Test |
| | | public void testCreateItemReceipt_success_withNoticeIdButManualVendor() { |
| | | // 准备参数:关联了到货通知单(兼容历史单据),但供应商是手工填写 |
| | | Long noticeId = randomLongId(); |
| | | when(arrivalNoticeService.validateArrivalNoticeReadyForReceipt(eq(noticeId))) |
| | | .thenReturn(randomPojo(MesWmArrivalNoticeDO.class, o -> o.setVendorId(randomLongId()))); |
| | | |
| | | MesWmItemReceiptSaveReqVO reqVO = new MesWmItemReceiptSaveReqVO(); |
| | | reqVO.setCode("IR-MANUAL-" + randomLongId()); |
| | | reqVO.setName("手工供应商入库单"); |
| | | reqVO.setNoticeId(noticeId); |
| | | reqVO.setVendorId(null); |
| | | reqVO.setVendorName("某某贸易有限公司"); |
| | | reqVO.setReceiptDate(LocalDateTime.now()); |
| | | |
| | | // 调用:不应因「供应商与到货通知单不一致」而报错 |
| | | Long id = itemReceiptService.createItemReceipt(reqVO); |
| | | |
| | | // 断言:保存成功 |
| | | assertNotNull(itemReceiptMapper.selectById(id)); |
| | | } |
| | | |
| | | @Test |
| | | public void testCreateItemReceipt_success_withVendorId() { |
| | | // 准备参数:仍可选择供应商主数据 |
| | | Long vendorId = randomLongId(); |
| | | MesWmItemReceiptSaveReqVO reqVO = new MesWmItemReceiptSaveReqVO(); |
| | | reqVO.setCode("IR-MANUAL-" + randomLongId()); |
| | | reqVO.setName("选择供应商入库单"); |
| | | reqVO.setVendorId(vendorId); |
| | | reqVO.setReceiptDate(LocalDateTime.now()); |
| | | |
| | | // 调用 |
| | | Long id = itemReceiptService.createItemReceipt(reqVO); |
| | | |
| | | // 断言 1:保存成功 |
| | | assertNotNull(itemReceiptMapper.selectById(id)); |
| | | // 断言 2:选择了供应商主数据时仍会校验供应商存在 |
| | | verify(srmSupplierApi).getSupplier(eq(vendorId)); |
| | | } |
| | | |
| | | // ========== finishItemReceipt ========== |
| | | |