2026-04-16 6ad5c2cdc193cf7bb02884961b7434cd7f607a0d
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,6 +6,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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;
@@ -62,6 +66,10 @@
    private SalesLedgerMapper salesLedgerMapper;
    private PurchaseLedgerMapper purchaseLedgerMapper;
    private ProductMapper productMapper;
    private ProductModelMapper productModelMapper;
    private ProductOrderMapper productOrderMapper;
@@ -263,74 +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());
        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) {
                    // 查询今日已存在的最大工单号
                    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);
        }
        // 取消默认的工艺路线
//        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);
//        }
    }
    /**
@@ -491,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("请先设置工艺路线");
        }