From ac2e2b5af3726ee64dc37c3ebf26989a0346f22a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 07 十一月 2026 19:16:05 +0800
Subject: [PATCH] feat(feedback): 优化报工审批流程并增加报工人校验
---
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java | 52 +++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 41 insertions(+), 11 deletions(-)
diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
index a5d44f0..d4bfc85 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
@@ -3,17 +3,25 @@
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductProduceStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
+import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -51,7 +59,19 @@
@MockitoBean
private MesWmProductProduceDetailService productProduceDetailService;
@MockitoBean
+ private MesWmProductProduceLineMapper produceLineMapper;
+ @MockitoBean
private MesProWorkOrderService workOrderService;
+ @MockitoBean
+ private MesProWorkOrderProcessService workOrderProcessService;
+ @MockitoBean
+ private MesProRouteProductService routeProductService;
+ @MockitoBean
+ private MesProRouteProcessService routeProcessService;
+ @MockitoBean
+ private MesWmProductReceiptService productReceiptService;
+ @MockitoBean
+ private MesMdItemService itemService;
@MockitoBean
private MesWmBatchService batchService;
@MockitoBean
@@ -86,6 +106,11 @@
when(warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE)).thenReturn(wh);
when(locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION)).thenReturn(loc);
when(areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA)).thenReturn(area);
+ mockNotLastProcess();
+ MesMdItemDO item = new MesMdItemDO();
+ item.setId(itemId);
+ item.setMdmItemId(itemId);
+ when(itemService.validateItemExists(any())).thenReturn(item);
// mock: 閫氳繃 sourceLineId 鐩存帴瀹氫綅 PENDING 浜у嚭琛�
MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder()
@@ -94,8 +119,7 @@
.batchId(batchId).batchCode(batchCode)
.qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
.build();
- when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
- .thenReturn(pendingLine);
+ when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(pendingLine);
// mock: finishProductProduce 鍐呴儴鏌ヨ鍜屾槑缁嗭紙鐢ㄤ簬鍒涘缓搴撳瓨浜嬪姟锛�
MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
@@ -113,9 +137,9 @@
// mock: finishProductProduce 涓寜琛屾煡鏄庣粏
MesWmProductProduceDetailDO qualifiedDetail = MesWmProductProduceDetailDO.builder()
- .lineId(100L).quantity(BigDecimal.valueOf(80)).build();
+ .lineId(100L).quantity(BigDecimal.valueOf(80)).warehouseId(whId).build();
MesWmProductProduceDetailDO unqualifiedDetail = MesWmProductProduceDetailDO.builder()
- .lineId(101L).quantity(BigDecimal.valueOf(20)).build();
+ .lineId(101L).quantity(BigDecimal.valueOf(20)).warehouseId(whId).build();
when(productProduceDetailService.getProductProduceDetailListByLineId(100L))
.thenReturn(ListUtil.of(qualifiedDetail));
when(productProduceDetailService.getProductProduceDetailListByLineId(101L))
@@ -147,8 +171,8 @@
MesWmProductProduceDO updatedProduce = productProduceMapper.selectById(produce.getId());
assertEquals(MesWmProductProduceStatusEnum.FINISHED.getStatus(), updatedProduce.getStatus());
- // 鏂█ 5锛氬垱寤轰簡搴撳瓨浜嬪姟
- verify(wmTransactionService, times(2)).createTransaction(any());
+ // 鏂█ 5锛氬彧涓哄悎鏍煎搧琛屽垱寤哄簱瀛樹簨鍔★紙涓嶅悎鏍煎搧涓嶈鍏ュ彲鐢ㄥ簱瀛橈級
+ verify(wmTransactionService, times(1)).createTransaction(any());
}
@Test
@@ -172,6 +196,7 @@
when(warehouseService.getWarehouseByCode(any())).thenReturn(wh);
when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc);
when(areaService.getWarehouseAreaByCode(any())).thenReturn(area);
+ mockNotLastProcess();
// mock: 閫氳繃 sourceLineId 鐩存帴瀹氫綅 PENDING 浜у嚭琛�
MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder()
@@ -179,8 +204,7 @@
.itemId(itemId).quantity(BigDecimal.valueOf(50))
.qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
.build();
- when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
- .thenReturn(pendingLine);
+ when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(pendingLine);
// mock: finishProductProduce 鏌ヨ鍜屾槑缁�
MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
@@ -245,9 +269,8 @@
when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc);
when(areaService.getWarehouseAreaByCode(any())).thenReturn(area);
- // mock: validateProductProduceLineExists 鎶涘紓甯�
- when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
- .thenThrow(new ServiceException(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS));
+ // mock: 浜у嚭琛屼笉瀛樺湪
+ when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(null);
// 璋冪敤锛屽簲璇ユ姏寮傚父
ServiceException ex = assertThrows(ServiceException.class, () ->
@@ -256,4 +279,11 @@
assertEquals(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS.getCode(), ex.getCode());
}
+ /** 鏈亾宸ュ簭杩斿洖闈炲綋鍓嶅伐搴忥紝閬垮厤娴嬭瘯璧板埌纭垏鏈亾宸ュ簭鐨勪粨搴撴牎楠屽垎鏀� */
+ private void mockNotLastProcess() {
+ MesProWorkOrderProcessDO lastProcess = new MesProWorkOrderProcessDO();
+ lastProcess.setProcessId(-1L);
+ when(workOrderProcessService.getLastWorkOrderProcessByWorkOrderId(any())).thenReturn(lastProcess);
+ }
+
}
--
Gitblit v1.9.3