yuan
5 天以前 ccc9d4533bc7b696f6d539720a6052abc44ff7a5
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
@@ -6,12 +6,12 @@
    <select id="invoiceLedgerPage" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
            T1.id                ,
            T1.sales_ledger_id   ,
            T1.sales_contract_no ,
            T1.customer_id       ,
            T5.sales_ledger_id   AS sales_ledger_id,
            T3.sales_contract_no AS sales_contract_no,
            T3.customer_id       AS customer_id,
            T1.invoice_no        ,
            T1.invoice_amount    ,
            T1.tax_rate          ,
            T1.invoice_total     AS invoice_amount,
            T5.tax_rate          AS tax_rate,
            T1.invoice_person    ,
            T1.invoice_date      ,
            T1.create_time       ,
@@ -19,9 +19,23 @@
            T1.update_time       ,
            T1.update_user       ,
            T1.tenant_id         ,
            T2.customer_name
            T2.customer_name,
            T3.customer_contract_no,
            T3.salesman,
            T4.invoiceFileName
        FROM invoice_ledger T1
        LEFT JOIN customer T2 ON T1.customer_id = T2.id
        <!-- 2026-10-12 修复:invoice_ledger 表里没有 sales_ledger_id / sales_contract_no / customer_id /
             invoice_amount / tax_rate 这 5 列(它们在 invoice_registration_product 上),
             原来的 T1.xxx 必然抛 ER_BAD_FIELD_ERROR。改为按真实结构关联。 -->
        LEFT JOIN invoice_registration_product T5 ON T5.id = T1.invoice_registration_product_id
        LEFT JOIN sales_ledger T3 ON T3.id = T5.sales_ledger_id
        LEFT JOIN customer T2 ON T2.id = T3.customer_id
        LEFT JOIN (
           SELECT
               invoice_ledger_id,
               GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
           FROM invoice_ledger_file GROUP BY invoice_ledger_id
        ) T4 ON T4.invoice_ledger_id = T1.id
        <where>
            <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''">
                AND (
@@ -37,23 +51,35 @@
    <select id="invoiceLedgerList" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
        T1.id                ,
        T1.sales_ledger_id   ,
        T1.sales_contract_no ,
        T1.customer_id       ,
        T1.invoice_no        ,
        T1.invoice_amount    ,
        T1.tax_rate          ,
        T1.invoice_person    ,
        T1.invoice_date      ,
        T1.create_time       ,
        T1.create_user       ,
        T1.update_time       ,
        T1.update_user       ,
        T1.tenant_id         ,
        T2.customer_name
            T1.id                ,
            T5.sales_ledger_id   AS sales_ledger_id,
            T3.sales_contract_no AS sales_contract_no,
            T3.customer_id       AS customer_id,
            T1.invoice_no        ,
            T1.invoice_total     AS invoice_amount,
            T5.tax_rate          AS tax_rate,
            T1.invoice_person    ,
            T1.invoice_date      ,
            T1.create_time       ,
            T1.create_user       ,
            T1.update_time       ,
            T1.update_user       ,
            T1.tenant_id         ,
            T2.customer_name,
            T3.salesman,
            T3.customer_contract_no,
            T4.invoiceFileName
        FROM invoice_ledger T1
        LEFT JOIN customer T2 ON T1.customer_id = T2.id
        <!-- 2026-10-12 修复:同 invoiceLedgerPage,改为按真实表结构关联 -->
        LEFT JOIN invoice_registration_product T5 ON T5.id = T1.invoice_registration_product_id
        LEFT JOIN sales_ledger T3 ON T3.id = T5.sales_ledger_id
        LEFT JOIN customer T2 ON T2.id = T3.customer_id
        LEFT JOIN (
        SELECT
        invoice_ledger_id,
        GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
        FROM invoice_ledger_file GROUP BY invoice_ledger_id
        ) T4 ON T4.invoice_ledger_id = T1.id
        <where>
            <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''">
                AND (
@@ -66,4 +92,109 @@
            </if>
        </where>
    </select>
    <select id="invoiceLedgerInfo" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
        T1.id                ,
        T5.sales_ledger_id   AS sales_ledger_id,
        T3.sales_contract_no AS sales_contract_no,
        T3.customer_id       AS customer_id,
        T1.invoice_no        ,
        T1.invoice_total     AS invoice_amount,
        T5.tax_rate          AS tax_rate,
        T1.invoice_person    ,
        T1.invoice_date      ,
        T1.create_time       ,
        T1.create_user       ,
        T1.update_time       ,
        T1.update_user       ,
        T1.tenant_id         ,
        T2.customer_name
        FROM invoice_ledger T1
        <!-- 2026-10-12 修复:同 invoiceLedgerPage,改为按真实表结构关联 -->
        LEFT JOIN invoice_registration_product T5 ON T5.id = T1.invoice_registration_product_id
        LEFT JOIN sales_ledger T3 ON T3.id = T5.sales_ledger_id
        LEFT JOIN customer T2 ON T2.id = T3.customer_id
        WHERE T1.id = #{id}
    </select>
    <select id="invoiceLedgerSalesAccount" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
            T1.customer_id as id,
            T1.customer_name,
            IFNULL(SUM(T1.contract_amount), 0) AS invoice_total,
            IFNULL(SUM(T2.paid), 0)            AS receipt_payment_amount,
            IFNULL(SUM(T1.contract_amount), 0) - IFNULL(SUM(T2.paid), 0) AS unReceipt_payment_amount
        FROM sales_ledger T1
        <!-- 2026-10-13 修复:原来直接 LEFT JOIN receipt_payment 再 SUM(contract_amount),
             一笔台账有几笔回款,合同额就被重复累加几次(客户往来页的「合同金额/应收金额」因此虚高,
             例如客户 1108 实际合同 15.37 万被算成 78.35 万)。改成先按台账汇总回款再 JOIN。 -->
        LEFT JOIN (
            SELECT sales_ledger_id, SUM(receipt_payment_amount) AS paid
            FROM receipt_payment WHERE sales_ledger_id IS NOT NULL GROUP BY sales_ledger_id
        ) T2 ON T2.sales_ledger_id = T1.id
        <where>
            <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != '' ">
                T1.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%')
            </if>
        </where>
        GROUP BY T1.customer_id, T1.customer_name
    </select>
    <select id="invoiceLedgerProductInfo" resultType="com.ruoyi.sales.dto.InvoiceRegistrationProductDto">
        SELECT
            T1.id   ,
            T1.sales_ledger_id           ,
            T1.sales_ledger_product_id   ,
            T1.invoice_registration_id   ,
            T1.product_category          ,
            T1.specification_model       ,
            T1.unit                      ,
            T1.quantity                  ,
            T1.tax_rate                  ,
            T1.tax_inclusive_unit_price  ,
            T1.tax_inclusive_total_price ,
            T1.tax_exclusive_total_price ,
            T1.invoice_type              ,
            T1.invoice_num               ,
            T1.invoice_amount            ,
            T1.no_invoice_num            ,
            T1.no_invoice_amount         ,
            T1.create_time               ,
            T1.create_user               ,
            T1.update_time               ,
            T1.update_user               ,
            T1.tenant_id,
            T2.sales_contract_no,
            T2.customer_contract_no,
            T2.customer_name,
            T3.invoice_no,
            T3.invoice_total,
            T3.invoice_person,
            T3.invoice_date,
            T3.id AS invoice_ledger_id
        FROM invoice_registration_product T1
                 LEFT JOIN sales_ledger T2 ON T1.sales_ledger_id = T2.id
                 LEFT JOIN invoice_ledger T3 ON T1.id = T3.invoice_registration_product_id
        WHERE T1.id = #{id}
    </select>
    <select id="invoicedTotal" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
            IFNULL(SUM(T1.invoice_total),0) AS invoice_total,
            T2.sales_ledger_id
        FROM
            invoice_ledger T1
                LEFT JOIN invoice_registration_product T2 ON T1.invoice_registration_product_id = T2.id
        <where>
            AND T2.sales_ledger_id IN
            <foreach collection="salesLedgerIds" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </where>
        GROUP BY
            T2.sales_ledger_id
    </select>
</mapper>