zhang_nuo
16 小时以前 852cc8afa71b117f83759b0e1e97176800752c9a
fix(sales): 修正发货率统计逻辑

- 修正 SalesLedgerMapper 中发货率计算方式,改为关联 shipping_info 表
通过判断发货记录是否存在来统计已发货订单数,确保统计口径准确
- 简化 MetricStatisticsServiceImpl 中发货订单数统计逻辑,移除冗余的
产品关联映射和状态过滤,直接基于销售台账 ID 去重统计
已修改2个文件
16 ■■■■■ 文件已修改
src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -67,11 +67,12 @@
            "COUNT(DISTINCT sl.id) AS order_count, " +  // 总订单数
            "SUM(slp.tax_inclusive_total_price) AS sales_amount, " +  // 销售额
            "SUM(IFNULL(slp.quantity, 0)) AS product_quantity, " +  // 产品销售数量
            // 发货率 = 发货订单数 * 100 / 总订单数(保留2位小数,避免除0报错)
            // 发货率 = 有发货记录的订单数 / 总订单数 * 100(保留2位小数,避免除0报错)
            "ROUND(IF(COUNT(DISTINCT sl.id) = 0, 0, " +
            "SUM(CASE WHEN slp.approve_status = 2 THEN 1 ELSE 0 END) / COUNT(DISTINCT sl.id) * 100), 2) AS ship_rate " +
            "COUNT(DISTINCT CASE WHEN si.id IS NOT NULL THEN sl.id END) / COUNT(DISTINCT sl.id) * 100), 2) AS ship_rate " +
            "FROM sales_ledger sl " +
            "LEFT JOIN sales_ledger_product slp ON sl.id = slp.sales_ledger_id " +
            "LEFT JOIN shipping_info si ON sl.id = si.sales_ledger_id " +
            "WHERE sl.entry_date >= DATE_FORMAT(#{statisticsTableDto.entryDateStart}, '%Y-%m-01') " +
            "AND sl.entry_date <= LAST_DAY(#{statisticsTableDto.entryDateEnd}) " +
            // 产品大类筛选
src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -69,17 +69,10 @@
                .filter(p -> p.getId() != null && p.getSalesLedgerId() != null)
                .collect(Collectors.toMap(SalesLedgerProduct::getId, SalesLedgerProduct::getSalesLedgerId, (k1, k2) -> k1));
        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                .eq(ShippingInfo::getStatus, "审核通过"));
        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(null);
        long shippedOrderCount = shippingInfos.stream()
                .filter(info -> productIdToLedgerIdMap.containsKey(info.getSalesLedgerProductId()))
                .map(info -> {
                    if (info.getSalesLedgerId() != null) {
                        return info.getSalesLedgerId();
                    }
                    return productIdToLedgerIdMap.get(info.getSalesLedgerProductId());
                })
                .map(ShippingInfo::getSalesLedgerId)
                .filter(Objects::nonNull)
                .distinct()
                .count();