From 3ff6604c75c887f4056ee03545d204bc9323286c Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 15 十月 2026 17:47:19 +0800
Subject: [PATCH] feat(mes): 新增报工设备快照功能并优化状态校验
---
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java | 363 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 343 insertions(+), 20 deletions(-)
diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
index 2f06f06..304cee5 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
@@ -1,18 +1,35 @@
package cn.iocoder.yudao.module.mes.service.pro.feedback;
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.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi;
+import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackApproveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackQuickCreateReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackQuickCreateRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSubmitReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
+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.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
+import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderParamRecordService;
+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.itemconsume.MesWmItemConsumeService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
@@ -23,6 +40,8 @@
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
@@ -32,7 +51,7 @@
/**
* {@link MesProFeedbackServiceImpl} 鐨勫崟鍏冩祴璇�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Import(MesProFeedbackServiceImpl.class)
public class MesProFeedbackServiceImplTest extends BaseDbUnitTest {
@@ -42,6 +61,9 @@
@Resource
private MesProFeedbackMapper feedbackMapper;
+
+ @MockitoBean
+ private MesProFeedbackEquipmentService equipmentService;
@MockitoBean
private MesProWorkOrderService workOrderService;
@@ -57,6 +79,33 @@
private MesWmProductProduceService productProduceService;
@MockitoBean
private MesWmProductProduceLineService produceLineService;
+ @MockitoBean
+ private MesProWorkOrderParamRecordService paramRecordService;
+ @MockitoBean
+ private MesProWorkOrderBomService workOrderBomService;
+ @MockitoBean
+ private MesProWorkOrderProcessService workOrderProcessService;
+ @MockitoBean
+ private MesProProcessService processService;
+ @MockitoBean
+ private MesProMpsApi mpsApi;
+ @MockitoBean
+ private MesMdAutoCodeRecordService autoCodeRecordService;
+ @MockitoBean
+ private MesMdmItemService mdmItemService;
+ @MockitoBean
+ private MdmItemBatchConfigApi itemBatchConfigApi;
+ @MockitoBean
+ private BpmProcessInstanceApi processInstanceApi;
+
+ @Test
+ public void testEquipmentSnapshotSurvivesStatusUpdates() {
+ MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, f -> f.setMachineryIds("10,20"));
+ feedbackMapper.insert(feedback);
+ feedbackMapper.updateById(new MesProFeedbackDO().setId(feedback.getId())
+ .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()));
+ assertEquals("10,20", feedbackMapper.selectById(feedback.getId()).getMachineryIds());
+ }
@Test
public void testUpdateProFeedbackWhenIpqcFinish_success_withUnqualified() {
@@ -109,12 +158,9 @@
assertEquals(0, materialScrapQty.compareTo(updatedFeedback.getMaterialScrapQuantity()));
assertEquals(0, otherScrapQty.compareTo(updatedFeedback.getOtherScrapQuantity()));
- // 鏂█ 4锛氭洿鏂颁簡浠诲姟鍜屽伐鍗曠殑宸茬敓浜ф暟閲�
- // 娉ㄦ剰锛氭暟閲忕粡杩� DB 瀛樺彇鍚� scale 鍙兘鍙樺寲锛岀敤 any() 鍖归厤
- verify(taskService).updateProducedQuantity(eq(taskId),
- any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class));
- verify(workOrderService).updateProducedQuantity(eq(workOrderId),
- any(BigDecimal.class));
+ // 浜ч噺宸茬粡鍦ㄦ姤宸ュ鎵规椂绱锛岃川妫�鍥炶皟涓嶈兘閲嶅绱銆�
+ verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any());
+ verify(workOrderService, never()).updateProducedQuantity(anyLong(), any());
}
@Test
@@ -226,6 +272,8 @@
when(productProduceService.generateProductProduce(any(), eq(false), any())).thenReturn(produce);
// mock: 浜у嚭琛岋紙鐢ㄤ簬 updateTaskAndWorkOrderByFeedback锛�
+ when(workOrderProcessService.getLastWorkOrderProcessByWorkOrderId(feedback.getWorkOrderId()))
+ .thenReturn(new MesProWorkOrderProcessDO().setProcessId(processId));
MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
.quantity(BigDecimal.valueOf(80))
.qualityStatus(MesWmQualityStatusEnum.PASS.getStatus()).build();
@@ -291,8 +339,8 @@
verify(productProduceService).generateProductProduce(any(), eq(true), any());
verify(productProduceService, never()).finishProductProduce(anyLong());
- // 鏂█ 4锛氭病鏈夋洿鏂颁换鍔�/宸ュ崟鏁伴噺锛堢瓑 IPQC 鍥炶皟锛�
- verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any());
+ // 浜ч噺鍦ㄥ鎵规椂绱锛屼骇鍑轰粛淇濇寔寰呮锛涢潪鏈亾涓嶆洿鏂板伐鍗曟�讳骇閲忋��
+ verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()), any(), any(), any());
verify(workOrderService, never()).updateProducedQuantity(anyLong(), any());
}
@@ -316,6 +364,8 @@
.keyFlag(false).checkFlag(false).build();
when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId))
.thenReturn(routeProcess);
+ MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class);
+ when(productProduceService.generateProductProduce(any(), eq(false), any())).thenReturn(produce);
// 璋冪敤
MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
@@ -329,9 +379,11 @@
MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId());
assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus());
- // 鏂█ 3锛氫笉鐢熸垚浜у嚭鍗曪紝涓嶆洿鏂颁换鍔�/宸ュ崟
- verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
- verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any());
+ // 闈炲叧閿伐搴忎篃鐢熸垚浜у嚭骞剁疮璁′换鍔¤繘搴︼紝浣嗕笉绱宸ュ崟鎬讳骇閲忋��
+ verify(productProduceService).generateProductProduce(any(), eq(false), any());
+ verify(productProduceService).finishProductProduce(produce.getId());
+ verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()), any(), any(), any());
+ verify(workOrderService, never()).updateProducedQuantity(anyLong(), any());
}
@Test
@@ -367,9 +419,9 @@
}
@Test
- public void testApproveFeedback_nonKeyCheck_directFinishAndCleanUncheck() {
+ public void testApproveFeedback_nonKeyCheck_enterUncheckAndCleanQuantity() {
// 鍑嗗鏁版嵁锛氶潪鍏抽敭 + 璐ㄦ宸ュ簭锛�!key+check锛夛紝uncheckQuantity > 0
- // 搴旀斁琛岋紙checkFlag=true 涓嶆嫤鎴� uncheckQuantity锛夛紝鐩存帴瀹岀粨骞舵竻闆� uncheckQuantity
+ // 搴旀斁琛屽苟杩涘叆寰呮楠岋紝瀹℃壒闃舵鍙疮璁′竴娆′换鍔′骇閲忋��
Long routeId = randomLongId();
Long processId = randomLongId();
MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> {
@@ -393,16 +445,287 @@
reqVO.setId(feedback.getId());
boolean result = feedbackService.approveFeedback(reqVO);
- // 鏂█ 1锛氳繑鍥� true锛堢洿鎺ュ畬鎴愶紝涓嶈蛋 UNCHECK锛�
- assertTrue(result);
+ assertFalse(result);
- // 鏂█ 2锛氱姸鎬佷负宸插畬鎴愶紝uncheckQuantity 琚竻闆�
+ // 璐ㄦ宸ュ簭鏃犺鏄惁鍏抽敭宸ュ簭锛岄兘杩涘叆寰呮楠屻��
MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId());
- assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus());
+ assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus());
assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity()));
- // 鏂█ 3锛氶潪鍏抽敭宸ュ簭涓嶇敓鎴愪骇鍑哄崟
- verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
+ verify(productProduceService).generateProductProduce(any(), eq(true), any());
+ verify(productProduceService, never()).finishProductProduce(anyLong());
+ verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()), any(), any(), any());
+ verify(workOrderService, never()).updateProducedQuantity(anyLong(), any());
+ }
+
+ // ==================== 椤哄簭鎶ュ伐锛堜笂涓�閬撳伐搴忓畬鎴愬悗鎵嶈兘鎶ヤ笅涓�閬擄級娴嬭瘯 ====================
+
+ /**
+ * 鏋勯��"涓婇亾宸ュ簭锛坧rev锛�+ 褰撳墠宸ュ簭锛坈ur锛�"鐨勫伐鍗曞伐搴忛摼锛堟晠鎰忎贡搴忎紶鍏ワ紝楠岃瘉鎸� sort 鎺掑簭鍚庡彇鍓嶉┍锛�
+ */
+ private List<MesProWorkOrderProcessDO> buildTwoProcessChain(Long workOrderId, Long prevProcessId,
+ Long curProcessId) {
+ return ListUtil.of(
+ MesProWorkOrderProcessDO.builder().workOrderId(workOrderId).processId(curProcessId).sort(2).build(),
+ MesProWorkOrderProcessDO.builder().workOrderId(workOrderId).processId(prevProcessId).sort(1).build());
+ }
+
+ @Test
+ public void testQuickCreateFeedback_blockedWhenPreviousProcessNotFinished() {
+ // 鍑嗗锛氬綋鍓嶄换鍔″湪绗� 2 閬撳伐搴忥紝涓婇亾宸ュ簭浠诲姟鍙仛浜� 60/100
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long prevProcessId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.validateTaskNotFinished(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(buildTwoProcessChain(workOrderId, prevProcessId, curProcessId));
+ MesProTaskDO prevTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.valueOf(60));
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.getTaskListByWorkOrderIds(Collections.singletonList(workOrderId)))
+ .thenReturn(List.of(prevTask));
+ when(processService.getProcess(prevProcessId)).thenReturn(
+ randomPojo(MesProProcessDO.class, o -> o.setName("CNC鍔犲伐")));
+
+ // 璋冪敤锛氬簲琚嫤鎴�
+ MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
+ req.setTaskId(curTaskId);
+ req.setFeedbackQuantity(BigDecimal.TEN);
+ ServiceException ex = assertThrows(ServiceException.class, () -> feedbackService.quickCreateFeedback(req));
+ assertTrue(ex.getMessage().contains("灏氭湭鎶ュ伐瀹屾垚"));
+ assertTrue(ex.getMessage().contains("CNC鍔犲伐"));
+ // 鏈湡姝g敓鎴愭姤宸ュ崟
+ verify(autoCodeRecordService, never()).generateAutoCode(anyString());
+ }
+
+ @Test
+ public void testQuickCreateFeedback_blockedWhenPreviousMultiTaskAnyNotFinished() {
+ // 鍑嗗锛氫笂閬撳伐搴忔湁 2 涓换鍔★紝涓�涓仛婊°�佷竴涓湭鍋氭弧锛屼粛搴旀嫤鎴�
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long prevProcessId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.validateTaskNotFinished(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(buildTwoProcessChain(workOrderId, prevProcessId, curProcessId));
+
+ MesProTaskDO finishedTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(50));
+ o.setProducedQuantity(BigDecimal.valueOf(50)); // 宸插仛婊�
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ MesProTaskDO partialTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(50));
+ o.setProducedQuantity(BigDecimal.valueOf(20)); // 鏈仛婊�
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.getTaskListByWorkOrderIds(Collections.singletonList(workOrderId)))
+ .thenReturn(ListUtil.of(finishedTask, partialTask));
+
+ MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
+ req.setTaskId(curTaskId);
+ req.setFeedbackQuantity(BigDecimal.TEN);
+ ServiceException ex = assertThrows(ServiceException.class, () -> feedbackService.quickCreateFeedback(req));
+ assertTrue(ex.getMessage().contains("灏氭湭鎶ュ伐瀹屾垚"));
+ }
+
+ @Test
+ public void testQuickCreateFeedback_allowedWhenPreviousProcessFinished() {
+ // 鍑嗗锛氫笂閬撳伐搴忎换鍔″凡鍋氭弧锛�100/100锛夛紝褰撳墠涓虹 2 閬撳伐搴忥紝搴旀斁琛�
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long prevProcessId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.validateTaskNotFinished(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(buildTwoProcessChain(workOrderId, prevProcessId, curProcessId));
+ MesProTaskDO prevTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.valueOf(100)); // 宸插仛婊�
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.getTaskListByWorkOrderIds(Collections.singletonList(workOrderId)))
+ .thenReturn(List.of(prevTask));
+
+ // 璧伴�氬悗缁�昏緫鐨勬々
+ when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, curProcessId))
+ .thenReturn(MesProRouteProcessDO.builder().routeId(routeId).processId(curProcessId)
+ .keyFlag(false).checkFlag(false).build());
+ when(autoCodeRecordService.generateAutoCode(anyString())).thenReturn("FB-ORDER-1");
+
+ // 璋冪敤锛氬簲鎴愬姛鐢熸垚鎶ュ伐鍗�
+ MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
+ req.setTaskId(curTaskId);
+ req.setFeedbackQuantity(BigDecimal.TEN);
+ MesProFeedbackQuickCreateRespVO resp = feedbackService.quickCreateFeedback(req);
+ assertNotNull(resp);
+ assertNotNull(resp.getFeedbackId());
+ verify(autoCodeRecordService).generateAutoCode(anyString());
+ }
+
+ @Test
+ public void testQuickCreateFeedback_allowedWhenPreviousProcessAllCancelled() {
+ // 鍑嗗锛氫笂閬撳伐搴忎换鍔″叏閮ㄥ彇娑堬紝瑙嗕负鏃犲墠缃姹傦紝褰撳墠绗� 2 閬撳伐搴忓簲鏀捐
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long prevProcessId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.validateTaskNotFinished(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(buildTwoProcessChain(workOrderId, prevProcessId, curProcessId));
+ MesProTaskDO cancelledTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.CANCELED.getStatus());
+ });
+ when(taskService.getTaskListByWorkOrderIds(Collections.singletonList(workOrderId)))
+ .thenReturn(List.of(cancelledTask));
+ when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, curProcessId))
+ .thenReturn(MesProRouteProcessDO.builder().routeId(routeId).processId(curProcessId)
+ .keyFlag(false).checkFlag(false).build());
+ when(autoCodeRecordService.generateAutoCode(anyString())).thenReturn("FB-ORDER-2");
+
+ MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
+ req.setTaskId(curTaskId);
+ req.setFeedbackQuantity(BigDecimal.TEN);
+ MesProFeedbackQuickCreateRespVO resp = feedbackService.quickCreateFeedback(req);
+ assertNotNull(resp);
+ assertNotNull(resp.getFeedbackId());
+ }
+
+ @Test
+ public void testQuickCreateFeedback_allowedWhenCurrentIsFirstProcess() {
+ // 鍑嗗锛氬綋鍓嶄换鍔″氨鏄 1 閬撳伐搴忥紙閾句腑鍙湁涓�閬撳伐搴忥級锛屾棤鍓嶇疆锛屽簲鏀捐
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.ZERO);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.validateTaskNotFinished(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(ListUtil.of(MesProWorkOrderProcessDO.builder()
+ .workOrderId(workOrderId).processId(curProcessId).sort(1).build()));
+ when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, curProcessId))
+ .thenReturn(MesProRouteProcessDO.builder().routeId(routeId).processId(curProcessId)
+ .keyFlag(false).checkFlag(false).build());
+ when(autoCodeRecordService.generateAutoCode(anyString())).thenReturn("FB-ORDER-3");
+
+ MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
+ req.setTaskId(curTaskId);
+ req.setFeedbackQuantity(BigDecimal.TEN);
+ MesProFeedbackQuickCreateRespVO resp = feedbackService.quickCreateFeedback(req);
+ assertNotNull(resp);
+ assertNotNull(resp.getFeedbackId());
+ }
+
+ @Test
+ public void testSubmitFeedback_blockedWhenPreviousProcessNotFinished() {
+ // 鍑嗗锛氬凡瀛樺湪鑽夌鎶ュ伐鍗曪紙绗� 2 閬撳伐搴忥級锛屼笂閬撳伐搴忔湭鍋氭弧锛屾彁浜ゅ簲琚嫤鎴�
+ Long workOrderId = randomLongId();
+ Long routeId = randomLongId();
+ Long prevProcessId = randomLongId();
+ Long curProcessId = randomLongId();
+ Long curTaskId = randomLongId();
+
+ MesProFeedbackDO feedback = randomPojo(MesProFeedbackDO.class, o -> {
+ o.setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus());
+ o.setTaskId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ });
+ feedbackMapper.insert(feedback);
+
+ MesProTaskDO curTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setId(curTaskId);
+ o.setWorkOrderId(workOrderId);
+ o.setRouteId(routeId);
+ o.setProcessId(curProcessId);
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.getTask(curTaskId)).thenReturn(curTask);
+ when(workOrderProcessService.getWorkOrderProcessListByWorkOrderId(workOrderId))
+ .thenReturn(buildTwoProcessChain(workOrderId, prevProcessId, curProcessId));
+ MesProTaskDO prevTask = randomPojo(MesProTaskDO.class, o -> {
+ o.setWorkOrderId(workOrderId);
+ o.setProcessId(prevProcessId);
+ o.setQuantity(BigDecimal.valueOf(100));
+ o.setProducedQuantity(BigDecimal.valueOf(30));
+ o.setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
+ });
+ when(taskService.getTaskListByWorkOrderIds(Collections.singletonList(workOrderId)))
+ .thenReturn(List.of(prevTask));
+
+ MesProFeedbackSubmitReqVO req = new MesProFeedbackSubmitReqVO();
+ req.setId(feedback.getId());
+ ServiceException ex = assertThrows(ServiceException.class, () -> feedbackService.submitFeedback(req));
+ assertTrue(ex.getMessage().contains("灏氭湭鎶ュ伐瀹屾垚"));
}
}
--
Gitblit v1.9.3