Browse Source

feat: 应收应付对账返回方法调整优化

hejq 7 years ago
parent
commit
909dc886ac

+ 3 - 1
src/main/java/com/uas/platform/b2b/service/PurchaseApCheckService.java

@@ -15,6 +15,7 @@ import org.springframework.data.domain.Page;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 
 /**
  * 对账单
@@ -175,6 +176,7 @@ public interface PurchaseApCheckService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @return 统计结果
+     * @throws InterruptedException 中断异常
      */
     List<ApCheckAmount> getThisMonthTodoTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 
@@ -215,5 +217,5 @@ public interface PurchaseApCheckService {
      * @param fromDate 起始时间
      * @param endDate 截止时间
      */
-    void countApCheck(Vendor customer, String checkDate, Long fromDate, Long endDate);
+    void countApCheck(Vendor customer, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 }

+ 24 - 9
src/main/java/com/uas/platform/b2b/service/impl/PurchaseApBillServiceImpl.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2b.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.constant.StringConstant;
 import com.uas.platform.b2b.core.util.BoundedExecutor;
+import com.uas.platform.b2b.core.util.SplitArray;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.PurchaseApBillDao;
 import com.uas.platform.b2b.dao.PurchaseApBillItemDao;
@@ -244,17 +245,31 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
         List<Vendor> vendors = findVendorByPage(params, keyword);
         SPage<Vendor> vendorSPage = new SPage<>();
         if (!org.springframework.util.CollectionUtils.isEmpty(vendors)) {
-            vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1).collect(Collectors.toList());
-            final CountDownLatch threadsSignal = new CountDownLatch(1);
-            List<Runnable> runnableList = new ArrayList<>();
-            vendors.forEach(customer ->
-                runnableList.add(() ->
-                    purchaseApCheckService.countApCheck(customer, checkDate, fromDate, endDate)
-                )
+            List<Vendor> resultVendors = vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1).collect(Collectors.toList());
+            // 最大线程数
+            int maxRunSize = 10;
+            // 每组分发的List数量
+            int groupSize = (int) Math.ceil((double) resultVendors.size() / maxRunSize);
+            List<List<Vendor>> vendorsGroupList = SplitArray.splitAry(resultVendors, groupSize);
+            CountDownLatch threadsSignal = new CountDownLatch(vendorsGroupList.size());
+            vendorsGroupList.forEach(vendorList ->
+                vendorList.forEach(customer -> {
+                    try {
+                        executor.submitTask(() -> {
+                            try {
+                                purchaseApCheckService.countApCheck(customer, checkDate, fromDate, endDate);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            threadsSignal.countDown();
+                        });
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                })
             );
-            executor.submitTasks(runnableList, threadsSignal);
             threadsSignal.await();
-            purchaseApCheckService.setVendorSPage(params, vendors, vendorSPage);
+            purchaseApCheckService.setVendorSPage(params, resultVendors, vendorSPage);
         }
         return vendorSPage;
     }

+ 60 - 36
src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.constant.StringConstant;
 import com.uas.platform.b2b.core.util.BoundedExecutor;
 import com.uas.platform.b2b.core.util.ContextUtils;
+import com.uas.platform.b2b.core.util.SplitArray;
+import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDao;
@@ -63,6 +65,8 @@ import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 /**
@@ -555,17 +559,31 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
         List<Vendor> vendors = findCustomerByPage(params, keyword);
         SPage<Vendor> vendorSPage = new SPage<>();
         if (!CollectionUtils.isEmpty(vendors)) {
-            vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1).collect(Collectors.toList());
-            final CountDownLatch threadsSignal = new CountDownLatch(1);
-            List<Runnable> runnableList = new ArrayList<>();
-            vendors.forEach(customer ->
-                runnableList.add(() ->
-                    this.countApCheck(customer, checkDate, fromDate, endDate)
-                )
+            List<Vendor> resultVendors = vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1).collect(Collectors.toList());
+            // 最大线程数
+            int maxRunSize = 10;
+            // 每组分发的List数量
+            int groupSize = (int) Math.ceil((double) resultVendors.size() / maxRunSize);
+            List<List<Vendor>> vendorsGroupList = SplitArray.splitAry(resultVendors, groupSize);
+            CountDownLatch threadsSignal = new CountDownLatch(vendorsGroupList.size());
+            vendorsGroupList.forEach(vendorList ->
+                vendorList.forEach(customer -> {
+                    try {
+                        executor.submitTask(() -> {
+                            try {
+                                this.countApCheck(customer, checkDate, fromDate, endDate);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            threadsSignal.countDown();
+                        });
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                })
             );
-            executor.submitTasks(runnableList, threadsSignal);
             threadsSignal.await();
-            setVendorSPage(params, vendors, vendorSPage);
+            setVendorSPage(params, resultVendors, vendorSPage);
         }
         return vendorSPage;
     }
@@ -579,7 +597,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
      * @param endDate 截止时间
      */
     @Override
-    public void countApCheck(Vendor customer, String checkDate, Long fromDate, Long endDate) {
+    public void countApCheck(Vendor customer, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
         final Long customerUU = customer.getMyEnUU();
         final Long vendorUU = customer.getVendEnUU();
         if (!StringUtils.isEmpty(customer.getTotalCountString())) {
@@ -595,22 +613,28 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
             customer.setThisMonthCount(thisMonthTrades);
             // 总额存在再进行其他查询
             if (!CollectionUtils.isEmpty(thisMonthTrades)) {
+                CountDownLatch threadsSignal = new CountDownLatch(2);
                 // 本月应收(未收)
-                List<ApCheckAmount> thisMonthTodoTrades = null;
-                try {
-                    thisMonthTodoTrades = getThisMonthTodoTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                customer.setThisMonthTodoCount(thisMonthTodoTrades);
+                executor.submitTask(() -> {
+                    try {
+                        List<ApCheckAmount> thisMonthTodoTrades = getThisMonthTodoTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+                        customer.setThisMonthTodoCount(thisMonthTodoTrades);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    threadsSignal.countDown();
+                });
                 // 本月应收(已收)
-                List<ApCheckAmount> thisMonthDoneTrades = null;
-                try {
-                    thisMonthDoneTrades = getThisMonthDoneTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                customer.setThisMonthDoneCount(thisMonthDoneTrades);
+                executor.submitTask(() -> {
+                    try {
+                        List<ApCheckAmount> thisMonthDoneTrades = getThisMonthDoneTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+                        customer.setThisMonthDoneCount(thisMonthDoneTrades);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    threadsSignal.countDown();
+                });
+                threadsSignal.await();
             }
         }
     }
@@ -623,9 +647,9 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
      */
     @Override
     public void setVendorSPage(PageParams params, List<Vendor> vendors, SPage<Vendor> vendorSPage) {
-        if (!CollectionUtils.isEmpty(vendors)) {
-            List<Vendor> filterVendors = vendors.stream()
-                .filter(vendor -> (null != vendor.getThisMonthCount() && !CollectionUtils.isEmpty(vendor.getThisMonthCount()))).collect(Collectors.toList());
+        List<Vendor> filterVendors = vendors.stream()
+            .filter(vendor -> (null != vendor.getThisMonthCount() && !CollectionUtils.isEmpty(vendor.getThisMonthCount()))).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(filterVendors)) {
             // 起始序号
             int startIndex = (params.getPage() - 1) * params.getCount();
             // 截止序号
@@ -633,7 +657,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
             // 筛选后的总数
             int totalCount = filterVendors.size();
             // 筛选后的总页码
-            int totalPage = (int) Math.ceil(totalCount / params.getCount());
+            int totalPage = (int) Math.ceil((double) totalCount / params.getCount());
             // 默认起始序号
             int defaultIndex = totalPage * params.getCount();
             vendorSPage.setTotalElement(filterVendors.size());
@@ -699,7 +723,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
     public List<ApCheckAmount> getThisMonthTodoTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
         DateFilter filter = erpProdIODetailService.initFilter(fromDate, endDate, checkDate);
         List<ApCheckAmount> totalTrades = new ArrayList<>();
-        final CountDownLatch threadsSignal = new CountDownLatch(5);
+        CountDownLatch threadsSignal = new CountDownLatch(5);
         // 货款调账
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeTodoCountSqls.THISMONTH_ADJUSTMENT_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
@@ -776,38 +800,38 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
     public List<ApCheckAmount> getThisMonthDoneTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
         DateFilter filter = erpProdIODetailService.initFilter(fromDate, endDate, checkDate);
         List<ApCheckAmount> totalTrades = new ArrayList<>();
-        final CountDownLatch threadsSignal = new CountDownLatch(5);
         // 货款调账
+        CountDownLatch finalThreadsSignal = new CountDownLatch(5);
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeDoneCountSqls.THISMONTH_ADJUSTMENT_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
                 totalTrades.addAll(trades);
-                threadsSignal.countDown();
+                finalThreadsSignal.countDown();
             });
         // 采购验收
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeDoneCountSqls.THISMONTH_SALE_ACCEPT_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
                 totalTrades.addAll(trades);
-                threadsSignal.countDown();
+                finalThreadsSignal.countDown();
             });
         // 采购验退
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeDoneCountSqls.THISMONTH_SALE_RETURN_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
                 totalTrades.addAll(trades);
-                threadsSignal.countDown();
+                finalThreadsSignal.countDown();
             });
         // 委外验收
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeDoneCountSqls.THISMONTH_MAKE_ACCEPT_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
                 totalTrades.addAll(trades);
-                threadsSignal.countDown();
+                finalThreadsSignal.countDown();
             });
         // 委外验退
         executor.submitTask(() -> {
                 List<ApCheckAmount> trades = commonDao.query(ApCheckeDoneCountSqls.THISMONTH_MAKE_RETURN_COUNT_SQL, ApCheckAmount.class, enUU, customerUU, filter.getFromDate(), filter.getEndDate());
                 totalTrades.addAll(trades);
-                threadsSignal.countDown();
+                finalThreadsSignal.countDown();
             });
-        threadsSignal.await();
+        finalThreadsSignal.await();
         return groupCountByCurrency(totalTrades);
     }