maven
7 天以前 214f90a39cdf2d401f9eb50084d062dab878a249
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,8 +16,10 @@
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.controller.ProductWorkOrderController;
import com.ruoyi.production.dto.ProductStructureDto;
@@ -26,12 +29,10 @@
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityTestStandard;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -47,6 +48,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -54,6 +56,7 @@
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private ProcurementRecordMapper procurementRecordMapper;
    private ProductionProductMainMapper productionProductMainMapper;
    private ProductWorkOrderController productWorkOrderController;
@@ -67,6 +70,8 @@
    private ProcessRouteItemMapper processRouteItemMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProductModelMapper productModelMapper;
    private QualityInspectMapper qualityInspectMapper;
@@ -77,7 +82,8 @@
    private ProductMapper productMapper;
    private QualityTestStandardMapper qualityTestStandardMapper;
    private QualityTestStandardParamMapper qualityTestStandardParamMapper;
    private QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
    private QualityInspectParamMapper qualityInspectParamMapper;
@@ -158,6 +164,7 @@
        for (ProductStructureDto productStructureDto : productStructureDtos) {
            ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
            Product product = productMapper.selectById(productModel1.getProductId());
            // 查询产品库存
            BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
            if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存为0");
@@ -165,6 +172,11 @@
            if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存不足");
            }
            // 查询采购产品
            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                    .eq(SalesLedgerProduct::getProductModelId, productStructureDto.getProductModelId())
                    .eq(SalesLedgerProduct::getType, 2));
            ProductionProductInput productionProductInput = new ProductionProductInput();
            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
@@ -175,16 +187,49 @@
            LocalDate now = LocalDate.now();
            ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
            Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS" + dateFormat.format(now))[1]);
            ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                    .procurementRecordStorageId(0)
                    .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                    .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                    .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                    .inboundNum(productionProductInput.getQuantity())
                    .type(4)
                    .createBy(user.getNickName())
                    .productModelId(productModel1.getId());
            procurementRecordOutMapper.insert(procurementRecordOut.build());
            // 查询采购入库记录
            List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(new LambdaQueryWrapper<ProcurementRecordStorage>()
                    .in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream()
                            .map(SalesLedgerProduct::getId)
                            .collect(Collectors.toList()))
                    .orderByDesc(ProcurementRecordStorage::getInboundNum));
            if(CollectionUtils.isNotEmpty(procurementRecordStorages)) {
                // 生产扣除采购库存原料
                BigDecimal quantity = productionProductInput.getQuantity();
                int i = 0;
                while (quantity.compareTo(BigDecimal.ZERO) > 0){
                    ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                            .procurementRecordStorageId(procurementRecordStorages.get(i).getId())
                            .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                            .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                            .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                            .type(1)
                            .createBy(user.getNickName())
                            .productModelId(productModel1.getId());
                    if(quantity.compareTo(procurementRecordStorages.get(i).getInboundNum()) >= 0){
                        // 下料数量大于等于采购入库数量,则出库数量为采购入库数量,并继续出库下一条记录
                        procurementRecordOut.inboundNum(procurementRecordStorages.get(i).getInboundNum());
                        quantity = quantity.subtract(procurementRecordStorages.get(i).getInboundNum());
                    }else{
                        procurementRecordOut.inboundNum(quantity);
                        quantity = BigDecimal.ZERO;
                    }
                    procurementRecordOutMapper.insert(procurementRecordOut.build());
                    i++;
                }
            }else{
                ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                        .procurementRecordStorageId(0)
                        .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                        .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                        .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                        .inboundNum(productionProductInput.getQuantity())
                        .type(4)
                        .createBy(user.getNickName())
                        .productModelId(productModel1.getId());
                procurementRecordOutMapper.insert(procurementRecordOut.build());
            }
        }
        /*新增报工产出表*/
        ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -194,34 +239,37 @@
        productionProductOutputMapper.insert(productionProductOutput);
        //对应的过程检或者出厂检
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        int inspectType = 1;
        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
            //最后一道工序生成出厂检
            inspectType = 2;
            Product product = productMapper.selectById(productModel.getProductId());
            QualityInspect qualityInspect = new QualityInspect();
            qualityInspect.setProductId(product.getId());
            qualityInspect.setProductName(product.getProductName());
            qualityInspect.setModel(productModel.getModel());
            qualityInspect.setUnit(productModel.getUnit());
            qualityInspect.setQuantity(dto.getQuantity());
            qualityInspect.setProcess(productProcess.getName());
            qualityInspect.setInspectState(0);
            qualityInspect.setInspectType(2);  // 去掉自动进入过程检验逻辑
            qualityInspect.setProductMainId(productionProductMain.getId());
            qualityInspect.setProductModelId(productModel.getId());
            qualityInspectMapper.insert(qualityInspect);
            List<QualityTestStandardBinding> qualityTestStandardBindings = qualityTestStandardBindingMapper.selectList(
                    new LambdaQueryWrapper<QualityTestStandardBinding>()
                            .eq(QualityTestStandardBinding::getProductId, product.getId()));
            if (qualityTestStandardBindings.size()>0){
                qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
                                .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandardBindings.get(0).getTestStandardId()))
                        .forEach(qualityTestStandardParam -> {
                            QualityInspectParam param = new QualityInspectParam();
                            BeanUtils.copyProperties(qualityTestStandardParam, param);
                            param.setId(null);
                            param.setInspectId(qualityInspect.getId());
                            qualityInspectParamMapper.insert(param);
                        });
            }
        }
        Product product = productMapper.selectById(productModel.getProductId());
        QualityInspect qualityInspect = new QualityInspect();
        qualityInspect.setProductId(product.getId());
        qualityInspect.setProductName(product.getProductName());
        qualityInspect.setModel(productModel.getModel());
        qualityInspect.setUnit(productModel.getUnit());
        qualityInspect.setQuantity(dto.getQuantity());
        qualityInspect.setProcess(productProcess.getName());
        qualityInspect.setInspectState(0);
        qualityInspect.setInspectType(inspectType);
        qualityInspect.setProductMainId(productionProductMain.getId());
        qualityInspect.setProductModelId(productModel.getId());
        qualityInspectMapper.insert(qualityInspect);
        qualityTestStandardMapper.selectList(
                new LambdaQueryWrapper<QualityTestStandard>()
                        .eq(QualityTestStandard::getProductId, product.getId())
        ).forEach(standard -> {
            QualityInspectParam param = new QualityInspectParam();
            BeanUtils.copyProperties(standard, param);
            param.setId(null);
            param.setInspectId(qualityInspect.getId());
            qualityInspectParamMapper.insert(param);
        });
        /*更新工单和生产订单*/
        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(dto.getQuantity()));