2026-04-16 6ad5c2cdc193cf7bb02884961b7434cd7f607a0d
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,17 +5,19 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl;
import com.ruoyi.production.service.impl.ProductOrderServiceImpl;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.quality.mapper.QualityInspectMapper;
@@ -26,7 +28,6 @@
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
@@ -66,6 +67,10 @@
    private PurchaseLedgerMapper purchaseLedgerMapper;
    private ProductMapper productMapper;
    private ProductModelMapper productModelMapper;
    private ProductOrderMapper productOrderMapper;
    private ProcessRouteItemMapper processRouteItemMapper;
@@ -94,7 +99,7 @@
    @Autowired
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private SalesLedgerProductionAccountingServiceImpl salesLedgerProductionAccountingServiceImpl;
    private ProductOrderServiceImpl productOrderServiceImpl;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -266,79 +271,103 @@
    }
    /**
     * 通过产品大类,规格型号查询productModelId
     */
    public Long getProductModelId(String productCategory, String productSpecification) {
        Product product = productMapper.selectOne(new QueryWrapper<Product>()
                .lambda()
                .eq(Product::getProductName, productCategory)
                .orderByDesc(Product::getId)
                .last("LIMIT 1"));
        if(product == null){
            throw new RuntimeException("请先添加产品");
        }
        ProductModel productModel = productModelMapper.selectOne(new QueryWrapper<ProductModel>()
                .lambda()
                .eq(ProductModel::getProductId, product.getId())
                .eq(ProductModel::getModel, productSpecification)
                .orderByDesc(ProductModel::getId)
                .last("LIMIT 1"));
        return productModel == null ? null : productModel.getId();
    }
    /**
     * 新增生产数据
     */
    public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
        ProductOrder productOrder = new ProductOrder();
        productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
        productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
        if(salesLedgerProduct.getProductModelId() == null){
            Long productModelId = getProductModelId(salesLedgerProduct.getProductCategory(), salesLedgerProduct.getSpecificationModel());
            productOrder.setProductModelId(productModelId);
        }else{
            productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
        }
        productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
        productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
        String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
        productOrder.setNpsNo(string);
        productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量
        productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量
        productOrderMapper.insert(productOrder);
        List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
                .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
                .orderByDesc(ProcessRoute::getCreateTime));
        if (processRoutes.size()>0){
            ProcessRoute processRoute = processRoutes.get(0);
            //新增生产订单工艺路线主表
            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
            productProcessRoute.setProductModelId(processRoute.getProductModelId());
            productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
            productProcessRoute.setProductOrderId(productOrder.getId());
            productProcessRoute.setBomId(processRoute.getBomId());
            productProcessRouteMapper.insert(productProcessRoute);
            //新增生产订单工艺路线子表
            List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
            // 生成当前日期的前缀:年月日
            String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            for (ProcessRouteItem processRouteItem : processRouteItems) {
                ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                productProcessRouteItem.setProductOrderId(productOrder.getId());
                productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
                int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                if (insert > 0) {
                    // 查询今日已存在的最大工单号
                    QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
                    queryWrapper.likeRight("work_order_no", datePrefix)
                            .orderByDesc("work_order_no")
                            .last("LIMIT 1");
                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
                    int sequenceNumber = 1; // 默认序号
                    if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                        String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                        if (lastNo.startsWith(datePrefix)) {
                            String seqStr = lastNo.substring(datePrefix.length());
                            try {
                                sequenceNumber = Integer.parseInt(seqStr) + 1;
                            } catch (NumberFormatException e) {
                                sequenceNumber = 1;
                            }
                        }
                    }
                    // 生成完整的工单号
                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                    productWorkOrder.setProductOrderId(productOrder.getId());
                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
                    productWorkOrder.setStatus(1);
                    productWorkOrderMapper.insert(productWorkOrder);
                }
            }
            productOrder.setRouteId(processRoute.getId());
            productOrderMapper.updateById(productOrder);
        }
        // 取消默认的工艺路线
//        List<ProcessRoute> processRoutes = processRouteMapper.selectList(
//                new QueryWrapper<ProcessRoute>()
//                        .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
//                                .or()
//                                .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
//                        .orderByDesc("create_time"));
//        if (processRoutes.size()>0){
//            ProcessRoute processRoute = processRoutes.get(0);
//            //新增生产订单工艺路线主表
//            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
//            productProcessRoute.setProductModelId(salesLedgerProduct.getProductModelId());
//            productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
//            productProcessRoute.setProductOrderId(productOrder.getId());
//            productProcessRoute.setBomId(processRoute.getBomId());
//            productProcessRouteMapper.insert(productProcessRoute);
//            //新增生产订单工艺路线子表
//            List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
//            // 生成当前日期的前缀:年月日
//            String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//            for (ProcessRouteItem processRouteItem : processRouteItems) {
//                ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
//                productProcessRouteItem.setProductModelId(salesLedgerProduct.getProductModelId());
//                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
//                productProcessRouteItem.setProductOrderId(productOrder.getId());
//                productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
//                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
//                int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
//                if (insert > 0) {
//                    // 查询今日已存在的最大工单号
//                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
//                    int sequenceNumber = 1; // 默认序号
//                    if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
//                        String lastNo = lastWorkOrder.getWorkOrderNo().toString();
//                        if (lastNo.startsWith(datePrefix)) {
//                            String seqStr = lastNo.substring(datePrefix.length());
//                            try {
//                                sequenceNumber = Integer.parseInt(seqStr) + 1;
//                            } catch (NumberFormatException e) {
//                                sequenceNumber = 1;
//                            }
//                        }
//                    }
//                    // 生成完整的工单号
//                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
//                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
//                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
//                    productWorkOrder.setProductOrderId(productOrder.getId());
//                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
//                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
//                    productWorkOrder.setStatus(1);
//
//                    productWorkOrderMapper.insert(productWorkOrder);
//                }
//
//            }
//            productOrder.setRouteId(processRoute.getId());
//            productOrderMapper.updateById(productOrder);
//        }
    }
    /**
@@ -397,9 +426,9 @@
                        //删除出库记录
                        for (Long productMainId : productMainIds) {
                            //删除生产出库记录
                            stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                            //删除报废的入库记录
                            stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                        }
                        qualityInspects.forEach(qualityInspect -> {
                            //inspectState=1 已提交 不能删除
@@ -499,7 +528,13 @@
    @Override
    public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
        //获取产品最新的工艺路线
        ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()).orderByDesc(ProcessRoute::getCreateTime).last("LIMIT 1"));
        ProcessRoute processRoute = processRouteMapper.selectOne(
                new QueryWrapper<ProcessRoute>()
                        .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
                                .or()
                                .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
                        .orderByDesc("create_time")
                        .last("LIMIT 1"));
        if (processRoute == null) {
            return R.fail("请先设置工艺路线");
        }