gaoluyang
3 天以前 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -95,6 +95,9 @@
    }
    private void createTransactionList(Long produceId, List<MesWmProductProduceLineDO> lines) {
        // 生产订单 ID 冗余到流水,便于出库台账按生产订单追溯
        MesWmProductProduceDO produce = productProduceMapper.selectById(produceId);
        Long workOrderId = produce != null ? produce.getWorkOrderId() : null;
        for (MesWmProductProduceLineDO line : lines) {
            if (MesWmQualityStatusEnum.FAIL.getStatus().equals(line.getQualityStatus())) {
                // 不合格产出保留记录,交由不合格品处理,不生成合格库存流水。
@@ -118,7 +121,7 @@
                        .setQuantity(detail.getQuantity())
                        .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())
                        .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId())
                        .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId)
                        .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId).setWorkOrderId(workOrderId)
                        .setBizCode("").setBizLineId(line.getId()));
            }
        }
@@ -128,8 +131,7 @@
    @Transactional(rollbackFor = Exception.class)
    public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag,
                                                         MesProFeedbackApproveReqVO approveReqVO) {
        if (!checkFlag) throw exception(WM_PRODUCT_PRODUCE_QUALITY_PENDING);
        // 0. 查询关联的工单(用于获取 clientId 等信息)
        // 0. 查询关联的工单(用于获取 clientId、产品等信息)
        MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId());
        // 1. 创建产出单头
@@ -169,11 +171,26 @@
        Long batchId = batch != null ? batch.getId() : null;
        String batchCode = batch != null ? batch.getCode() : null;
        // 新报工产出统一待检,历史不检验即入库分支已移除。
        // 半成品(报工物料 != 工单成品)按生产 BOM 直接自动入库,不等质检、不走审批;
        // 成品仍统一待检,质检合格后才生成入库流水。
        boolean semiFinished = workOrder != null && feedback.getItemId() != null
                && ObjUtil.notEqual(feedback.getItemId(), workOrder.getProductId());
        MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode,
                feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus(),
                feedback.getFeedbackQuantity(),
                semiFinished ? MesWmQualityStatusEnum.PASS.getStatus() : MesWmQualityStatusEnum.PENDING.getStatus(),
                workOrder != null ? workOrder.getReelNo() : null);
        productProduceLineService.createProductProduceLine(line);
        if (semiFinished) {
            WarehouseTarget target = resolveOutputTarget(feedback.getWorkOrderId(), feedback.getProcessId(),
                    feedback.getItemId());
            productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder()
                    .produceId(produce.getId()).lineId(line.getId())
                    .itemId(feedback.getItemId()).quantity(feedback.getFeedbackQuantity())
                    .batchId(batchId).batchCode(batchCode).reelNo(line.getReelNo())
                    .warehouseId(target.warehouseId()).locationId(target.locationId()).areaId(target.areaId())
                    .build());
            finishProductProduce(produce.getId());
        }
        return produce;
    }
@@ -218,6 +235,10 @@
        if (produce == null) {
            throw exception(WM_PRODUCT_PRODUCE_NOT_EXISTS);
        }
        // 半成品在报工审批时已自动入库(产出单已完成),质检完成时不再重复拆分入库
        if (ObjUtil.equal(produce.getStatus(), MesWmProductProduceStatusEnum.FINISHED.getStatus())) {
            return;
        }
        // 2. 通过 sourceLineId 直接定位待检验行
        MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId);
        if (!ObjUtil.equal(pendingLine.getProduceId(), produce.getId())