liding
2026-04-15 3e28d83281050fb1f06b786a4a0c4839ba643a06
fix:发货分批发货
已修改3个文件
159 ■■■■ 文件已修改
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -8,8 +8,8 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductStructureDto;
@@ -44,7 +44,10 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -344,91 +347,93 @@
     */
    public void deleteProductionData(List<Long> productIds) {
        //批量查询productOrder
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                new LambdaQueryWrapper<ProductOrder>()
                        .in(ProductOrder::getSaleLedgerProductId, productIds)
        );
        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
            List<Long> orderIds = productOrders.stream()
                    .map(ProductOrder::getId)
                    .collect(Collectors.toList());
            // 批量查询processRouteItems
            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                    new LambdaQueryWrapper<ProductProcessRouteItem>()
                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
        if (productIds != null && !productIds.isEmpty()) {
            List<ProductOrder> productOrders = productOrderMapper.selectList(
                    new LambdaQueryWrapper<ProductOrder>()
                            .in(ProductOrder::getSaleLedgerProductId, productIds)
            );
            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) {
                // 获取要删除的工序项ID
                List<Long> routeItemIds = allRouteItems.stream()
                        .map(ProductProcessRouteItem::getId)
            if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
                List<Long> orderIds = productOrders.stream()
                        .map(ProductOrder::getId)
                        .collect(Collectors.toList());
                // 查询关联的工单ID
                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
                        new LambdaQueryWrapper<ProductWorkOrder>()
                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
                // 批量查询processRouteItems
                List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                        new LambdaQueryWrapper<ProductProcessRouteItem>()
                                .in(ProductProcessRouteItem::getProductOrderId, orderIds)
                );
                if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) {
                    List<Long> workOrderIds = workOrders.stream()
                            .map(ProductWorkOrder::getId)
                if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) {
                    // 获取要删除的工序项ID
                    List<Long> routeItemIds = allRouteItems.stream()
                            .map(ProductProcessRouteItem::getId)
                            .collect(Collectors.toList());
                    // 查询关联的生产主表ID
                    List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
                            new LambdaQueryWrapper<ProductionProductMain>()
                                    .in(ProductionProductMain::getWorkOrderId, workOrderIds)
                    // 查询关联的工单ID
                    List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
                            new LambdaQueryWrapper<ProductWorkOrder>()
                                    .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
                    );
                    List<Long> productMainIds = productMains.stream()
                            .map(ProductionProductMain::getId)
                            .collect(Collectors.toList());
                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) {
                        List<Long> workOrderIds = workOrders.stream()
                                .map(ProductWorkOrder::getId)
                                .collect(Collectors.toList());
                    // 删除产出表、投入表数据
                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                new LambdaQueryWrapper<QualityInspect>()
                                        .in(QualityInspect::getProductMainId, productMainIds)
                        // 查询关联的生产主表ID
                        List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
                                new LambdaQueryWrapper<ProductionProductMain>()
                                        .in(ProductionProductMain::getWorkOrderId, workOrderIds)
                        );
                        //删除出库记录
                        for (Long productMainId : productMainIds) {
                            //删除生产出库记录
                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                            //删除报废的入库记录
                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                        }
                        qualityInspects.forEach(qualityInspect -> {
                            //inspectState=1 已提交 不能删除
                            if (qualityInspect.getInspectState() == 1) {
                                throw new RuntimeException("已提交的检验单不能删除");
                        List<Long> productMainIds = productMains.stream()
                                .map(ProductionProductMain::getId)
                                .collect(Collectors.toList());
                        // 删除产出表、投入表数据
                        if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
                            productionProductOutputMapper.deleteByProductMainIds(productMainIds);
                            productionProductInputMapper.deleteByProductMainIds(productMainIds);
                            List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                    new LambdaQueryWrapper<QualityInspect>()
                                            .in(QualityInspect::getProductMainId, productMainIds)
                            );
                            //删除出库记录
                            for (Long productMainId : productMainIds) {
                                //删除生产出库记录
                                stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                                //删除报废的入库记录
                                stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                            }
                        });
                        qualityInspectMapper.deleteByProductMainIds(productMainIds);
                        salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
                                .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds));
                            qualityInspects.forEach(qualityInspect -> {
                                //inspectState=1 已提交 不能删除
                                if (qualityInspect.getInspectState() == 1) {
                                    throw new RuntimeException("已提交的检验单不能删除");
                                }
                            });
                            qualityInspectMapper.deleteByProductMainIds(productMainIds);
                            salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
                                    .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds));
                        }
                        // 删除生产主表数据
                        productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
                        // 删除工单数据
                        productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
                    }
                    // 删除生产主表数据
                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
                    // 删除工单数据
                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
                }
                // 批量删除processRouteItem
                productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
                        .in(ProductProcessRouteItem::getProductOrderId, orderIds));
                // 批量删除productProcessRoute
                productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
                        .in(ProductProcessRoute::getProductOrderId, orderIds));
                // 批量删除productOrder
                productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                        .in(ProductOrder::getSaleLedgerProductId, productIds));
            }
            // 批量删除processRouteItem
            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
                    .in(ProductProcessRouteItem::getProductOrderId, orderIds));
            // 批量删除productProcessRoute
            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
                    .in(ProductProcessRoute::getProductOrderId, orderIds));
            // 批量删除productOrder
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getSaleLedgerProductId, productIds));
        }
    }
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -67,7 +67,7 @@
        //扣减库存
        if(!"已发货".equals(byId.getStatus())){
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(),
            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), byId.getShippedQty(),
                    StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),salesLedgerProduct.getBatchNo(),salesLedgerProduct.getCustomer()
            );
        }
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -61,10 +61,10 @@
                and sl.customer_name like concat('%',#{c.customerName},'%')
            </if>
            <if test="c.productCategory != null and c.productCategory != ''">
                and slp.product_category like concat('%',#{c.productCategory},'%')
                and p.product_name like concat('%',#{c.productCategory},'%')
            </if>
            <if test="c.specificationModel != null and c.specificationModel != ''">
                and slp.specification_model like concat('%',#{c.specificationModel},'%')
                and pm.model like concat('%',#{c.specificationModel},'%')
            </if>
            <if test="c.startTime != null and c.endTime != null">
                and po.create_time between #{c.startTime} and #{c.endTime}