From ae46d524bb2675179e2c0ae4dd0e61d9d824ebca Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 29 九月 2026 09:14:53 +0800
Subject: [PATCH] refactor(database): 优化客户数据查询的SQL性能

---
 src/main/resources/mapper/basic/CustomerMapper.xml |  174 +++++++++++++++++++++++++++++++--------------------------
 1 files changed, 95 insertions(+), 79 deletions(-)

diff --git a/src/main/resources/mapper/basic/CustomerMapper.xml b/src/main/resources/mapper/basic/CustomerMapper.xml
index 93c7612..f39b43e 100644
--- a/src/main/resources/mapper/basic/CustomerMapper.xml
+++ b/src/main/resources/mapper/basic/CustomerMapper.xml
@@ -139,15 +139,16 @@
         from (select IFNULL(project_id, -1) as project_id, sum(contract_amount) as contractAmounts from sales_ledger group by IFNULL(project_id, -1)) T1
         left join project_management_info p on T1.project_id = p.id
         left join (
-            select
-                IFNULL(sl.project_id, -1) as project_id,
-                sum(ascc.collection_amount) as receiptPaymentAmount
-            from account_sales_collection ascc
-            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
-            WHERE sor.record_type='13' and sor.approval_status=1
-            group by IFNULL(sl.project_id, -1)
+            select x.project_id, sum(x.collection_amount) as receiptPaymentAmount
+            from (
+                select distinct ascc.id, ascc.collection_amount, IFNULL(sl.project_id, -1) as project_id
+                from account_sales_collection ascc
+                join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                join shipping_info s on sor.record_id = s.id
+                join sales_ledger sl on s.sales_ledger_id = sl.id
+                where sor.record_type='13' and sor.approval_status=1
+            ) x
+            group by x.project_id
         ) T2 on T1.project_id = T2.project_id
         left join (
             select
@@ -160,16 +161,17 @@
             group by IFNULL(sl.project_id, -1)
         ) T4 on T4.project_id = T1.project_id
         left join (
-            select 
-                IFNULL(sl.project_id, -1) as project_id,
-                sum(asi.tax_inclusive_price) as invoiceAmount
-            from account_sales_invoice asi
-            left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
-            left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            left join sales_ledger sl on s.sales_ledger_id = sl.id
-            where asi.status=0
-            group by IFNULL(sl.project_id, -1)
+            select x.project_id, sum(x.tax_inclusive_price) as invoiceAmount
+            from (
+                select distinct asi.id, asi.tax_inclusive_price, IFNULL(sl.project_id, -1) as project_id
+                from account_sales_invoice asi
+                left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
+                left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
+                left join shipping_info s on sor.record_id = s.id
+                left join sales_ledger sl on s.sales_ledger_id = sl.id
+                where asi.status=0
+            ) x
+            group by x.project_id
         ) T5 on T5.project_id = T1.project_id
         left join (
             select IFNULL(sl.project_id, -1) as project_id,
@@ -178,13 +180,16 @@
                    sum(case when DATEDIFF(NOW(), sl.execution_date) > 30 and IFNULL(T1_rcpt.receiptPaymentAmount, 0) &lt; sl.contract_amount then 1 else 0 end) as overdueCount
             from sales_ledger sl
             left join (
-                select sl_in.id, sum(ascc.collection_amount) as receiptPaymentAmount
-                from account_sales_collection ascc
-                left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-                left join shipping_info s on sor.record_id = s.id
-                LEFT JOIN sales_ledger sl_in ON s.sales_ledger_id = sl_in.id
-                WHERE sor.record_type='13' and sor.approval_status=1
-                group by sl_in.id
+                select x.ledger_id as id, sum(x.collection_amount) as receiptPaymentAmount
+                from (
+                    select distinct ascc.id, ascc.collection_amount, sl_in.id as ledger_id
+                    from account_sales_collection ascc
+                    join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                    join shipping_info s on sor.record_id = s.id
+                    join sales_ledger sl_in on s.sales_ledger_id = sl_in.id
+                    where sor.record_type='13' and sor.approval_status=1
+                ) x
+                group by x.ledger_id
             ) T1_rcpt on T1_rcpt.id = sl.id
             group by IFNULL(sl.project_id, -1)
         ) T6 on T6.project_id = T1.project_id
@@ -232,15 +237,17 @@
             group by customer_id, IFNULL(project_id, -1)
         ) T1
         left join (
-            select
-                sl.customer_id, IFNULL(sl.project_id, -1) as project_id,
-                sum(ascc.collection_amount) as receiptPaymentAmount
-            from account_sales_collection ascc
-            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
-            WHERE sor.record_type='13' and sor.approval_status=1
-            group by sl.customer_id, IFNULL(sl.project_id, -1)
+            select x.customer_id, x.project_id, sum(x.collection_amount) as receiptPaymentAmount
+            from (
+                select distinct ascc.id, ascc.collection_amount,
+                       sl.customer_id, IFNULL(sl.project_id, -1) as project_id
+                from account_sales_collection ascc
+                join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                join shipping_info s on sor.record_id = s.id
+                join sales_ledger sl on s.sales_ledger_id = sl.id
+                where sor.record_type='13' and sor.approval_status=1
+            ) x
+            group by x.customer_id, x.project_id
         ) T2 on T1.customer_id = T2.customer_id and T1.project_id = T2.project_id
         left join (
             select
@@ -253,16 +260,18 @@
             group by sl.customer_id, IFNULL(sl.project_id, -1)
         ) T4 on T4.customer_id = T1.customer_id and T4.project_id = T1.project_id
         left join (
-            select 
-                sl.customer_id, IFNULL(sl.project_id, -1) as project_id,
-                sum(asi.tax_inclusive_price) as invoiceAmount
-            from account_sales_invoice asi
-            left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
-            left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            left join sales_ledger sl on s.sales_ledger_id = sl.id
-            where asi.status=0
-            group by sl.customer_id, IFNULL(sl.project_id, -1)
+            select x.customer_id, x.project_id, sum(x.tax_inclusive_price) as invoiceAmount
+            from (
+                select distinct asi.id, asi.tax_inclusive_price,
+                       sl.customer_id, IFNULL(sl.project_id, -1) as project_id
+                from account_sales_invoice asi
+                left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
+                left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
+                left join shipping_info s on sor.record_id = s.id
+                left join sales_ledger sl on s.sales_ledger_id = sl.id
+                where asi.status=0
+            ) x
+            group by x.customer_id, x.project_id
         ) T5 on T5.customer_id = T1.customer_id and T5.project_id = T1.project_id
         left join (
             select sl.customer_id, IFNULL(sl.project_id, -1) as project_id,
@@ -270,13 +279,16 @@
                    sum(case when DATEDIFF(NOW(), sl.execution_date) > 30 and IFNULL(T1_rcpt.receiptPaymentAmount, 0) &lt; sl.contract_amount then 1 else 0 end) as overdueCount
             from sales_ledger sl
             left join (
-                select sl_in.id, sum(ascc.collection_amount) as receiptPaymentAmount
-                from account_sales_collection ascc
-                left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-                left join shipping_info s on sor.record_id = s.id
-                LEFT JOIN sales_ledger sl_in ON s.sales_ledger_id = sl_in.id
-                WHERE sor.record_type='13' and sor.approval_status=1
-                group by sl_in.id
+                select x.ledger_id as id, sum(x.collection_amount) as receiptPaymentAmount
+                from (
+                    select distinct ascc.id, ascc.collection_amount, sl_in.id as ledger_id
+                    from account_sales_collection ascc
+                    join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                    join shipping_info s on sor.record_id = s.id
+                    join sales_ledger sl_in on s.sales_ledger_id = sl_in.id
+                    where sor.record_type='13' and sor.approval_status=1
+                ) x
+                group by x.ledger_id
             ) T1_rcpt on T1_rcpt.id = sl.id
             group by sl.customer_id, IFNULL(sl.project_id, -1)
         ) T6 on T6.customer_id = T1.customer_id and T6.project_id = T1.project_id
@@ -312,16 +324,16 @@
                END AS isPaymentTimeout
         from sales_ledger sl
         left join (
-            select
-                sl.id,
-                sum(ascc.collection_amount) as receiptPaymentAmount
-            from account_sales_collection ascc
-            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
-            WHERE sor.record_type='13'
-              and sor.approval_status=1
-            group by sl.id
+            select x.ledger_id as id, sum(x.collection_amount) as receiptPaymentAmount
+            from (
+                select distinct ascc.id, ascc.collection_amount, sl.id as ledger_id
+                from account_sales_collection ascc
+                join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                join shipping_info s on sor.record_id = s.id
+                join sales_ledger sl on s.sales_ledger_id = sl.id
+                where sor.record_type='13' and sor.approval_status=1
+            ) x
+            group by x.ledger_id
         )T1 on T1.id = sl.id
         left join (
             select sl.id,
@@ -333,16 +345,17 @@
             group by sl.id
         )T3 on T3.id = sl.id
         left join (
-            select 
-                sl.id,
-                sum(asi.tax_inclusive_price) as invoiceAmount
-            from account_sales_invoice asi
-            left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
-            left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            left join sales_ledger sl on s.sales_ledger_id = sl.id
-            where asi.status=0
-            group by sl.id
+            select x.ledger_id as id, sum(x.tax_inclusive_price) as invoiceAmount
+            from (
+                select distinct asi.id, asi.tax_inclusive_price, sl.id as ledger_id
+                from account_sales_invoice asi
+                left join account_invoice_application aia on asi.account_invoice_application_id = aia.id
+                left join stock_out_record sor on FIND_IN_SET(sor.id, aia.stock_out_record_ids) > 0
+                left join shipping_info s on sor.record_id = s.id
+                left join sales_ledger sl on s.sales_ledger_id = sl.id
+                where asi.status=0
+            ) x
+            group by x.ledger_id
         ) T5 on T5.id = sl.id
         where sl.customer_id = #{customerId}
         <if test="projectId!=null">
@@ -362,13 +375,16 @@
                IFNULL(sum(case when DATEDIFF(NOW(), sl.execution_date) > 30 and IFNULL(rcpt.receiptPaymentAmount, 0) &lt; sl.contract_amount then 1 else 0 end), 0) as totalOverdueCount
         from sales_ledger sl
         left join (
-            select sl_in.id, sum(ascc.collection_amount) as receiptPaymentAmount
-            from account_sales_collection ascc
-            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            LEFT JOIN sales_ledger sl_in ON s.sales_ledger_id = sl_in.id
-            WHERE sor.record_type='13' and sor.approval_status=1
-            group by sl_in.id
+            select x.ledger_id as id, sum(x.collection_amount) as receiptPaymentAmount
+            from (
+                select distinct ascc.id, ascc.collection_amount, sl_in.id as ledger_id
+                from account_sales_collection ascc
+                join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
+                join shipping_info s on sor.record_id = s.id
+                join sales_ledger sl_in on s.sales_ledger_id = sl_in.id
+                where sor.record_type='13' and sor.approval_status=1
+            ) x
+            group by x.ledger_id
         ) rcpt on rcpt.id = sl.id
     </select>
 </mapper>

--
Gitblit v1.9.3