fix: 更新出库金额计算逻辑,确保按销售明细的含税总额折算,避免因小数位数导致的应收差异
已修改1个文件
49 ■■■■■ 文件已修改
src/main/resources/mapper/basic/CustomerMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/CustomerMapper.xml
@@ -119,6 +119,15 @@
           因此单条台账的应收金额按分计算,分以下的尾差不计入。
      注意 必须先按台账算好应收、再按客户汇总(与 customewTransactionsDetails 口径一致)。
           若先按客户汇总再取整,各家台账的尾差会累加,出现「主表 0.01、明细全是 0」的对不上问题。
      注意 ★ 出库金额按「销售明细的含税总额」折算,不能直接用「出库数量 × 含税单价」:
              出库金额 = Σ ROUND( 该明细含税总额 × LEAST(1, 该明细已出库量 / 该明细销售数量), 2 )
            原因:销售数量可能带 3 位小数(如 47.328),而出库数量按手册 §5.6 只保留 2 位(47.33)。
            直接相乘得 47.33 × 172 = 8140.76,而开票金额是 47.328 × 172 = 8140.42,
            凭空多出 0.34 的应收 —— 实测黑龙江北盛壶关分公司 13370.02 已全额回款,
            页面上却仍显示欠 0.34。
            · LEAST(1, ...) 用来封顶:出库量 ≥ 销售数量时最多算整条明细的开票金额,超发不增加应收;
              出库量 < 销售数量(部分发货)时按比例计。
            · 每条明细单独 ROUND 到分,避免 0.095 这类分以下零头累积成应收。
      注意 出库金额按台账 (sales_ledger.id) 聚合,同一发货单多批号出库时不会重复计数。
    -->
    <select id="customewTransactions" resultType="com.ruoyi.sales.vo.CustomerTransactionsVo">
@@ -158,14 +167,18 @@
            left join (
                SELECT
                    sl.id,
                    sum(sor.stock_out_num * slp.tax_inclusive_unit_price) as outboundAmount
                FROM stock_out_record sor
                    left join shipping_info s on sor.record_id = s.id
                    LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
                    LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
                WHERE sor.record_type='13'
                    and sor.approval_status=1
                    and slp.type = 1
                    sum(ROUND(slp.tax_inclusive_total_price
                              * LEAST(1, ship.out_qty / NULLIF(slp.quantity, 0)), 2)) as outboundAmount
                FROM (
                    SELECT sor.record_id AS shipping_id, SUM(sor.stock_out_num) AS out_qty
                    FROM stock_out_record sor
                    WHERE sor.record_type='13' AND sor.approval_status=1
                    GROUP BY sor.record_id
                ) ship
                JOIN shipping_info s ON s.id = ship.shipping_id
                LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
                LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
                WHERE slp.type = 1
                group by sl.id
            ) T3 on T3.id = sl.id
            left join (
@@ -227,14 +240,18 @@
        left join (
            SELECT
                sl.id,
                sum(sor.stock_out_num * slp.tax_inclusive_unit_price) as outboundAmount
            FROM stock_out_record sor
                     left join shipping_info s on sor.record_id = s.id
                     LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
                     LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
            WHERE sor.record_type='13'
              and sor.approval_status=1
              and slp.type = 1
                sum(ROUND(slp.tax_inclusive_total_price
                          * LEAST(1, ship.out_qty / NULLIF(slp.quantity, 0)), 2)) as outboundAmount
            FROM (
                SELECT sor.record_id AS shipping_id, SUM(sor.stock_out_num) AS out_qty
                FROM stock_out_record sor
                WHERE sor.record_type='13' AND sor.approval_status=1
                GROUP BY sor.record_id
            ) ship
            JOIN shipping_info s ON s.id = ship.shipping_id
            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
            LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
            WHERE slp.type = 1
            group by  sl.id
        )T2 on T2.id = sl.id
        left join (