云
2026-10-27 ffca46b39d25439a06a27cafda2ec523a3fb67cf
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
@@ -159,6 +159,7 @@
        assertEquals(0, otherScrapQty.compareTo(updatedFeedback.getOtherScrapQuantity()));
        // 产量已经在报工审批时累计,质检回调不能重复累计。
        verify(taskService).updateQualityQuantity(taskId, qualifiedQty, unqualifiedQty);
        verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any());
        verify(workOrderService, never()).updateProducedQuantity(anyLong(), any());
    }
@@ -267,35 +268,26 @@
        when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId))
                .thenReturn(routeProcess);
        // mock: 产品产出单
        MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class);
        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();
        when(produceLineService.getProductProduceLineListByFeedbackId(feedback.getId()))
                .thenReturn(ListUtil.of(qualifiedLine));
        // 调用
        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
        reqVO.setId(feedback.getId());
        boolean result = feedbackService.approveFeedback(reqVO);
        // 断言 1:返回 true(已完成)
        assertTrue(result);
        assertFalse(result);
        // 断言 2:状态为已完成,uncheckQuantity 清零
        // 未经检验的报工不允许直接入库。
        MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId());
        assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus());
        assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity()));
        assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus());
        assertEquals(0, feedback.getFeedbackQuantity().compareTo(updated.getUncheckQuantity()));
        assertEquals(0, BigDecimal.ZERO.compareTo(updated.getQualifiedQuantity()));
        // 断言 3:调用了产出单生成 + 入库 + 任务/工单更新
        verify(productProduceService).generateProductProduce(any(), eq(false), any());
        verify(productProduceService).finishProductProduce(produce.getId());
        verify(productProduceService).generateProductProduce(any(), eq(true), any());
        verify(productProduceService, never()).finishProductProduce(anyLong());
        verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()),
                any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class));
        verify(workOrderService).updateProducedQuantity(eq(feedback.getWorkOrderId()),
@@ -364,24 +356,21 @@
                .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();
        reqVO.setId(feedback.getId());
        boolean result = feedbackService.approveFeedback(reqVO);
        // 断言 1:返回 true(已完成)
        assertTrue(result);
        assertFalse(result);
        // 断言 2:状态为已完成
        MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId());
        assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus());
        assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus());
        // 非关键工序也生成产出并累计任务进度,但不累计工单总产量。
        verify(productProduceService).generateProductProduce(any(), eq(false), any());
        verify(productProduceService).finishProductProduce(produce.getId());
        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());
    }
@@ -407,15 +396,12 @@
        when(routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId))
                .thenReturn(routeProcess);
        // 调用,应该抛异常
        // 待检数量不再阻止非检验标识工序报工。
        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
        reqVO.setId(feedback.getId());
        assertThrows(Exception.class, () ->
                feedbackService.approveFeedback(reqVO));
        // 断言:不应该执行任何后续操作
        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
        verify(itemConsumeService, never()).generateItemConsume(any());
        assertFalse(feedbackService.approveFeedback(reqVO));
        verify(productProduceService).generateProductProduce(any(), eq(true), any());
        verify(productProduceService, never()).finishProductProduce(anyLong());
    }
    @Test
@@ -450,7 +436,7 @@
        // 质检工序无论是否关键工序,都进入待检验。
        MesProFeedbackDO updated = feedbackMapper.selectById(feedback.getId());
        assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus());
        assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity()));
        assertEquals(0, feedback.getFeedbackQuantity().compareTo(updated.getUncheckQuantity()));
        verify(productProduceService).generateProductProduce(any(), eq(true), any());
        verify(productProduceService, never()).finishProductProduce(anyLong());
@@ -601,9 +587,11 @@
        MesProFeedbackQuickCreateReqVO req = new MesProFeedbackQuickCreateReqVO();
        req.setTaskId(curTaskId);
        req.setFeedbackQuantity(BigDecimal.TEN);
        req.setFeedbackTime(java.time.LocalDateTime.of(2026, 10, 20, 9, 30));
        MesProFeedbackQuickCreateRespVO resp = feedbackService.quickCreateFeedback(req);
        assertNotNull(resp);
        assertNotNull(resp.getFeedbackId());
        assertEquals(req.getFeedbackTime(), feedbackMapper.selectById(resp.getFeedbackId()).getFeedbackTime());
        verify(autoCodeRecordService).generateAutoCode(anyString());
    }