Commit d1d43ca47bda866e9152b737420b20fc69b0c67f

Authored by YunaiV
1 parent 2f31721c

✨ feat(mes): 新增采购入库单及相关明细表结构和单元测试

yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java
@@ -167,8 +167,6 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ @@ -167,8 +167,6 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ
167 return line; 167 return line;
168 } 168 }
169 169
170 -  
171 -  
172 /** 170 /**
173 * 生成或获取批次 171 * 生成或获取批次
174 * 172 *
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  6 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper;
  7 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum;
  8 +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
  9 +import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
  10 +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
  11 +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.bean.override.mockito.MockitoBean;
  15 +
  16 +import jakarta.annotation.Resource;
  17 +
  18 +import java.math.BigDecimal;
  19 +import java.util.Arrays;
  20 +import java.util.Collections;
  21 +
  22 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  23 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  24 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  25 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  26 +import static org.junit.jupiter.api.Assertions.*;
  27 +import static org.mockito.ArgumentMatchers.anyList;
  28 +import static org.mockito.ArgumentMatchers.eq;
  29 +import static org.mockito.Mockito.*;
  30 +
  31 +/**
  32 + * {@link MesWmItemReceiptServiceImpl} 的单元测试
  33 + *
  34 + * @author 芋道源码
  35 + */
  36 +@Import(MesWmItemReceiptServiceImpl.class)
  37 +public class MesWmItemReceiptServiceImplTest extends BaseDbUnitTest {
  38 +
  39 + @Resource
  40 + private MesWmItemReceiptServiceImpl itemReceiptService;
  41 +
  42 + @Resource
  43 + private MesWmItemReceiptMapper itemReceiptMapper;
  44 +
  45 + @MockitoBean
  46 + private MesWmItemReceiptLineService itemReceiptLineService;
  47 + @MockitoBean
  48 + private MesWmItemReceiptDetailService itemReceiptDetailService;
  49 + @MockitoBean
  50 + private MesWmArrivalNoticeService arrivalNoticeService;
  51 + @MockitoBean
  52 + private MesMdVendorService vendorService;
  53 + @MockitoBean
  54 + private MesQcIqcService iqcService;
  55 + @MockitoBean
  56 + private MesWmTransactionService wmTransactionService;
  57 +
  58 + // ========== finishItemReceipt ==========
  59 +
  60 + @Test
  61 + public void testFinishItemReceipt_success_withNoticeId() {
  62 + // mock 数据:插入一条待入库状态的入库单(有关联到货通知单)
  63 + Long noticeId = randomLongId();
  64 + MesWmItemReceiptDO receipt = randomPojo(MesWmItemReceiptDO.class, o -> {
  65 + o.setStatus(MesWmItemReceiptStatusEnum.APPROVED.getStatus());
  66 + o.setNoticeId(noticeId);
  67 + });
  68 + itemReceiptMapper.insert(receipt);
  69 + Long receiptId = receipt.getId();
  70 +
  71 + // mock 明细列表
  72 + MesWmItemReceiptDetailDO detail1 = randomPojo(MesWmItemReceiptDetailDO.class, o -> {
  73 + o.setReceiptId(receiptId);
  74 + o.setQuantity(BigDecimal.valueOf(100));
  75 + });
  76 + MesWmItemReceiptDetailDO detail2 = randomPojo(MesWmItemReceiptDetailDO.class, o -> {
  77 + o.setReceiptId(receiptId);
  78 + o.setQuantity(BigDecimal.valueOf(50));
  79 + });
  80 + when(itemReceiptDetailService.getItemReceiptDetailListByReceiptId(eq(receiptId)))
  81 + .thenReturn(Arrays.asList(detail1, detail2));
  82 +
  83 + // 调用
  84 + itemReceiptService.finishItemReceipt(receiptId);
  85 +
  86 + // 断言 1:状态更新为已完成
  87 + MesWmItemReceiptDO updated = itemReceiptMapper.selectById(receiptId);
  88 + assertEquals(MesWmItemReceiptStatusEnum.FINISHED.getStatus(), updated.getStatus());
  89 + // 断言 2:库存事务被创建(2 条明细)
  90 + verify(wmTransactionService).createTransactionList(anyList());
  91 + // 断言 3:到货通知单被完成
  92 + verify(arrivalNoticeService).finishArrivalNotice(eq(noticeId));
  93 + }
  94 +
  95 + @Test
  96 + public void testFinishItemReceipt_success_withoutNoticeId() {
  97 + // mock 数据:插入一条待入库状态的入库单(无关联到货通知单)
  98 + MesWmItemReceiptDO receipt = randomPojo(MesWmItemReceiptDO.class, o -> {
  99 + o.setStatus(MesWmItemReceiptStatusEnum.APPROVED.getStatus());
  100 + o.setNoticeId(null); // 无到货通知单
  101 + });
  102 + itemReceiptMapper.insert(receipt);
  103 + Long receiptId = receipt.getId();
  104 +
  105 + // mock 空明细
  106 + when(itemReceiptDetailService.getItemReceiptDetailListByReceiptId(eq(receiptId)))
  107 + .thenReturn(Collections.emptyList());
  108 +
  109 + // 调用
  110 + itemReceiptService.finishItemReceipt(receiptId);
  111 +
  112 + // 断言 1:状态更新为已完成
  113 + MesWmItemReceiptDO updated = itemReceiptMapper.selectById(receiptId);
  114 + assertEquals(MesWmItemReceiptStatusEnum.FINISHED.getStatus(), updated.getStatus());
  115 + // 断言 2:库存事务仍被调用(空列表)
  116 + verify(wmTransactionService).createTransactionList(anyList());
  117 + // 断言 3:到货通知单完成方法不被调用
  118 + verify(arrivalNoticeService, never()).finishArrivalNotice(any());
  119 + }
  120 +
  121 + @Test
  122 + public void testFinishItemReceipt_notExists() {
  123 + // 准备参数
  124 + Long receiptId = randomLongId();
  125 +
  126 + // 调用,并断言异常
  127 + assertServiceException(
  128 + () -> itemReceiptService.finishItemReceipt(receiptId),
  129 + WM_ITEM_RECEIPT_NOT_EXISTS);
  130 + }
  131 +
  132 + @Test
  133 + public void testFinishItemReceipt_statusNotApproved() {
  134 + // mock 数据:插入一条草稿状态
  135 + MesWmItemReceiptDO receipt = randomPojo(MesWmItemReceiptDO.class, o -> {
  136 + o.setStatus(MesWmItemReceiptStatusEnum.PREPARE.getStatus());
  137 + });
  138 + itemReceiptMapper.insert(receipt);
  139 +
  140 + // 调用,并断言异常
  141 + assertServiceException(
  142 + () -> itemReceiptService.finishItemReceipt(receipt.getId()),
  143 + WM_ITEM_RECEIPT_STATUS_ERROR);
  144 + }
  145 +
  146 + @Test
  147 + public void testFinishItemReceipt_statusAlreadyFinished() {
  148 + // mock 数据:插入一条已完成状态
  149 + MesWmItemReceiptDO receipt = randomPojo(MesWmItemReceiptDO.class, o -> {
  150 + o.setStatus(MesWmItemReceiptStatusEnum.FINISHED.getStatus());
  151 + });
  152 + itemReceiptMapper.insert(receipt);
  153 +
  154 + // 调用,并断言异常
  155 + assertServiceException(
  156 + () -> itemReceiptService.finishItemReceipt(receipt.getId()),
  157 + WM_ITEM_RECEIPT_STATUS_ERROR);
  158 + }
  159 +
  160 +}
yudao-module-mes/src/test/resources/sql/clean.sql
@@ -9,3 +9,6 @@ DELETE FROM "mes_pro_feedback"; @@ -9,3 +9,6 @@ DELETE FROM "mes_pro_feedback";
9 DELETE FROM "mes_wm_product_produce"; 9 DELETE FROM "mes_wm_product_produce";
10 DELETE FROM "mes_wm_product_produce_line"; 10 DELETE FROM "mes_wm_product_produce_line";
11 DELETE FROM "mes_wm_product_produce_detail"; 11 DELETE FROM "mes_wm_product_produce_detail";
  12 +DELETE FROM "mes_wm_item_receipt";
  13 +DELETE FROM "mes_wm_item_receipt_line";
  14 +DELETE FROM "mes_wm_item_receipt_detail";
yudao-module-mes/src/test/resources/sql/create_tables.sql
@@ -449,3 +449,71 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_sales_line" ( @@ -449,3 +449,71 @@ CREATE TABLE IF NOT EXISTS "mes_wm_return_sales_line" (
449 PRIMARY KEY ("id") 449 PRIMARY KEY ("id")
450 ); 450 );
451 451
  452 +-- ----------------------------
  453 +-- MES 采购入库单
  454 +-- ----------------------------
  455 +CREATE TABLE IF NOT EXISTS "mes_wm_item_receipt" (
  456 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  457 + "code" varchar(64) NOT NULL,
  458 + "name" varchar(255) DEFAULT NULL,
  459 + "iqc_id" bigint DEFAULT NULL,
  460 + "notice_id" bigint DEFAULT NULL,
  461 + "vendor_id" bigint DEFAULT NULL,
  462 + "receipt_date" timestamp DEFAULT NULL,
  463 + "status" tinyint NOT NULL DEFAULT 0,
  464 + "remark" varchar(500) DEFAULT NULL,
  465 + "creator" varchar(64) DEFAULT '',
  466 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  467 + "updater" varchar(64) DEFAULT '',
  468 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  469 + "deleted" bit NOT NULL DEFAULT FALSE,
  470 + "tenant_id" bigint NOT NULL DEFAULT 0,
  471 + PRIMARY KEY ("id")
  472 +);
  473 +
  474 +-- ----------------------------
  475 +-- MES 采购入库单行
  476 +-- ----------------------------
  477 +CREATE TABLE IF NOT EXISTS "mes_wm_item_receipt_line" (
  478 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  479 + "receipt_id" bigint NOT NULL,
  480 + "arrival_notice_line_id" bigint DEFAULT NULL,
  481 + "item_id" bigint NOT NULL,
  482 + "received_quantity" decimal(14,2) DEFAULT NULL,
  483 + "batch_id" bigint DEFAULT NULL,
  484 + "batch_code" varchar(255) DEFAULT NULL,
  485 + "production_date" timestamp DEFAULT NULL,
  486 + "expire_date" timestamp DEFAULT NULL,
  487 + "lot_number" varchar(128) DEFAULT NULL,
  488 + "remark" varchar(500) DEFAULT NULL,
  489 + "creator" varchar(64) DEFAULT '',
  490 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  491 + "updater" varchar(64) DEFAULT '',
  492 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  493 + "deleted" bit NOT NULL DEFAULT FALSE,
  494 + "tenant_id" bigint NOT NULL DEFAULT 0,
  495 + PRIMARY KEY ("id")
  496 +);
  497 +
  498 +-- ----------------------------
  499 +-- MES 采购入库明细
  500 +-- ----------------------------
  501 +CREATE TABLE IF NOT EXISTS "mes_wm_item_receipt_detail" (
  502 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  503 + "line_id" bigint NOT NULL,
  504 + "receipt_id" bigint NOT NULL,
  505 + "item_id" bigint NOT NULL,
  506 + "quantity" decimal(14,2) DEFAULT NULL,
  507 + "batch_id" bigint DEFAULT NULL,
  508 + "warehouse_id" bigint DEFAULT NULL,
  509 + "location_id" bigint DEFAULT NULL,
  510 + "area_id" bigint DEFAULT NULL,
  511 + "remark" varchar(500) DEFAULT NULL,
  512 + "creator" varchar(64) DEFAULT '',
  513 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  514 + "updater" varchar(64) DEFAULT '',
  515 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  516 + "deleted" bit NOT NULL DEFAULT FALSE,
  517 + "tenant_id" bigint NOT NULL DEFAULT 0,
  518 + PRIMARY KEY ("id")
  519 +);