fix: 优化销售管理数据删除逻辑,按类型区分销售和采购产品,避免误删数据
已修改2个文件
56 ■■■■■ 文件已修改
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -38,7 +38,10 @@
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
@@ -133,11 +136,13 @@
            shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
        }
        // 可能属于多个主表
        Set<Long> mainIds = deletedProducts.stream()
                .map(SalesLedgerProduct::getSalesLedgerId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        // 可能属于多个主表,按 type 分组(销售/采购产品子表共用且主表 id 可能相同)
        Map<Integer, Set<Long>> mainIdsByType = new HashMap<>();
        deletedProducts.stream()
                .filter(product -> product.getSalesLedgerId() != null)
                .forEach(product -> mainIdsByType
                        .computeIfAbsent(product.getType() == null ? 1 : product.getType(), key -> new HashSet<>())
                        .add(product.getSalesLedgerId()));
        // 2. 执行删除操作
        int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids));
@@ -145,20 +150,33 @@
        deleteProductionData(Arrays.asList(ids));
        // 3. 对每个主表ID进行金额更新
        for (Long salesLedgerId : mainIds) {
            LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId);
            List<SalesLedgerProduct> remainingProducts = salesLedgerProductMapper.selectList(wrapper);
        mainIdsByType.forEach((type, mainIds) -> {
            for (Long salesLedgerId : mainIds) {
                LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>();
                wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)
                        .eq(SalesLedgerProduct::getType, type);
                List<SalesLedgerProduct> remainingProducts = salesLedgerProductMapper.selectList(wrapper);
            // 调用通用方法更新主表金额
            updateMainContractAmount(
                    salesLedgerId,
                    remainingProducts,
                    SalesLedgerProduct::getTaxInclusiveTotalPrice,
                    salesLedgerMapper,
                    SalesLedger.class
            );
        }
                // 调用通用方法更新主表金额
                if (type == 1) {
                    updateMainContractAmount(
                            salesLedgerId,
                            remainingProducts,
                            SalesLedgerProduct::getTaxInclusiveTotalPrice,
                            salesLedgerMapper,
                            SalesLedger.class
                    );
                } else {
                    updateMainContractAmount(
                            salesLedgerId,
                            remainingProducts,
                            SalesLedgerProduct::getTaxInclusiveTotalPrice,
                            purchaseLedgerMapper,
                            PurchaseLedger.class
                    );
                }
            }
        });
        return result;
    }
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -687,8 +687,10 @@
            return 0;
        }
        // 删除销售管理数据
        // 产品子表销售/采购共用,且主表 id 可能相同,必须按 type 区分,否则会误删采购台账的产品数据
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList)
                .eq(SalesLedgerProduct::getType, 1)
                .select(SalesLedgerProduct::getId);
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(queryWrapper);