Browse Source

Merge remote-tracking branch 'origin/release-201845-hejq' into release-201845-hejq

shenjunjie 7 years ago
parent
commit
227f72f0dc

+ 70 - 0
db/ddl.sql

@@ -18,3 +18,73 @@
 -- 更新purc$vendors 字段todo_apchek_count长度
   alter table purc$vendors modify todo_apchek_count varchar(200);
 
+-- date: 2018-12-20 11:34
+-- author: hejq
+-- content: 对账明细增加单据来源时间
+  ALTER TABLE purc$apcheckitem ADD COLUMN pai_source_date DATETIME COMMENT '单据来源时间';
+
+-- date: 2018-12-20 11:53
+-- author: hejq
+-- content: 更新类型为采购验收单单据来源时间
+  update purc$apcheckitem
+  left join purc$acceptitem  on purc$apcheckitem.pai_sourcetable = 'purc$acceptitem' and purc$apcheckitem.pai_sourceid = purc$acceptitem.pai_id
+  left join `purc$accept`  on purc$acceptitem.pai_paid = purc$accept.pa_id
+  set purc$apcheckitem.pai_source_date = purc$accept.pa_date where purc$apcheckitem.pai_sourcetable is null;
+
+-- date: 2018-12-20 13:38
+-- author: hejq
+-- content: 更新类型为货款调账单据来源时间
+  update purc$apcheckitem
+  left join purc$apbilladjustment on pai_sourcetable = 'purc$apbilladjustment' and pai_sourceid = aa_id
+  set pai_source_date = aa_orderdate where pai_sourcetable = 'purc$apbilladjustment' and pai_source_date is null;
+
+-- date: 2018-12-20 13:46
+-- author: hejq
+-- content: 更新类型为采购验退单单据来源时间
+  update purc$apcheckitem
+  left join purc$returnitem on pai_sourcetable = 'purc$returnitem' and pai_sourceid = pri_id
+  left join `purc$return` on pri_prid = pr_id
+  set pai_source_date = pr_date where pai_sourcetable = 'purc$returnitem' and pai_source_date is null;
+
+-- date: 2018-12-20 13:49
+-- author: hejq
+-- content: 更新类型为不良品入库单单据来源时间
+  update purc$apcheckitem
+  left join purc$badinitem on pai_sourcetable = 'purc$badinitem' and pai_sourceid = pbi_id
+  left join `purc$badin` on pbi_pbid = pb_id
+  set pai_source_date = pb_date where pai_sourcetable = 'purc$badinitem' and pai_source_date is null;
+
+-- date: 2018-12-20 13:53
+-- author: hejq
+-- content: 更新类型为不良品出库单单据来源时间
+update purc$apcheckitem
+  left join purc$badoutitem on pai_sourcetable = 'purc$badoutitem' and pai_sourceid = poi_id
+  left join `purc$badout` on poi_poid = po_id
+set pai_source_date = po_date where pai_sourcetable = 'purc$badoutitem' and pai_source_date is null;
+
+-- date: 2018-12-20 13:57
+-- author: hejq
+-- content: 更新类型为委外验收单单据来源时间
+update purc$apcheckitem
+  left join make$acceptitem on pai_sourcetable = 'make$acceptitem' and pai_sourceid = mai_id
+  left join `make$accept` on mai_paid = ma_id
+set pai_source_date = ma_date where pai_sourcetable = 'make$acceptitem' and pai_source_date is null;
+
+-- date: 2018-12-20 13:58
+-- author: hejq
+-- content: 更新类型为委外验退单单据来源时间
+update purc$apcheckitem
+  left join make$returnitem on pai_sourcetable = 'make$returnitem' and pai_sourceid = mri_id
+  left join `make$return` on mri_paid = mr_id
+set pai_source_date = mr_date where pai_sourcetable = 'make$returnitem' and pai_source_date is null;
+
+-- date: 2018-12-20 15:18
+-- author: hejq
+-- content: 1、 优软商城采购对接人为空,插入记录,对接人为陈艳平;
+--          2、 优软商城采购对接人为18320952803(UU:2000012807)的更新为陈艳平
+insert into sale$distribute (pd_distribute, pd_istransfer, pd_useruu, pd_vdid)
+  select 1,0,1000004274,ve_id from `purc$vendors` where ve_myenuu = 10042875
+and not exists (select 1 from sale$distribute where ve_id = pd_vdid);
+
+update `sale$distribute` set pd_useruu = 1000004274 where pd_useruu = 2000012807 and
+pd_vdid in (select ve_id from `purc$vendors` where ve_myenuu = 10042875);

+ 1 - 1
src/main/java/com/uas/platform/b2b/controller/SaleApCheckController.java

@@ -211,7 +211,7 @@ public class SaleApCheckController {
      * @return 符合条件的客户信息
      */
     @RequestMapping(value = "/customer", method = RequestMethod.GET)
-    public SPage<Vendor> getCustomers(PageParams params, String keyword, String checkDate, String searchFilter) {
+    public SPage<Vendor> getCustomers(PageParams params, String keyword, String checkDate, String searchFilter) throws InterruptedException {
         logger.log("应收对账单", "获取客户信息", "获取所有符合条件的客户");
         SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
         return purchaseApCheckService.getCustomerInfo(params, keyword, checkDate, filter.getFromDate(), filter.getEndDate());

+ 1 - 1
src/main/java/com/uas/platform/b2b/controller/SaleArCheckController.java

@@ -46,7 +46,7 @@ public class SaleArCheckController {
      * @return 符合条件的供应商
      */
     @RequestMapping(value = "/vendor", method = RequestMethod.GET)
-    public SPage<Vendor> getVendors(PageParams params, String keyword, String checkDate, String searchFilter) {
+    public SPage<Vendor> getVendors(PageParams params, String keyword, String checkDate, String searchFilter) throws InterruptedException {
         logger.log("应付对账单", "获取供应商信息", "获取所有符合条件的供应商");
         SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
         return purchaseApBillService.getVendorInfo(params, keyword, checkDate, filter.getFromDate(), filter.getEndDate());

+ 18 - 0
src/main/java/com/uas/platform/b2b/core/util/BoundedExecutor.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2b.core.util;
 
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.Semaphore;
@@ -37,4 +39,20 @@ public class BoundedExecutor {
 			semaphore.release();
 		}
 	}
+
+
+    public void submitTasks(final List<Runnable> commands,  CountDownLatch threadsSignal)
+        throws InterruptedException {
+        semaphore.acquire();
+        commands.forEach(command -> {
+            executor.execute(() -> {
+                try {
+                    command.run();
+                } finally {
+                    semaphore.release();
+                    threadsSignal.countDown();
+                }
+            });
+        });
+    }
 }

+ 35 - 9
src/main/java/com/uas/platform/b2b/model/ErpProdIODetail.java

@@ -144,6 +144,11 @@ public class ErpProdIODetail implements Serializable {
      */
     private String sourcetable;
 
+    /**
+     * 单据来源时间
+     */
+    private Date sourceDate;
+
     /**
      * 企业UU
      */
@@ -209,22 +214,27 @@ public class ErpProdIODetail implements Serializable {
      */
     private Short haveChecked;
 
+    /**
+     * 对账主表id
+     */
+    private Long apCheckId;
+
     public ErpProdIODetail() {}
 
     /**
      * 将已对账数据转成前台展示数据
      *
-     * @param apCheck 对账单主表
-     * @param item 对账单名
+     * @param item 对账单明细
      */
-    public ErpProdIODetail(PurchaseApCheck apCheck, PurchaseApCheckItem item) {
+    public ErpProdIODetail(PurchaseApCheckItemInfo item) {
         this.haveChecked = Constant.YES;
-        this.apCheckDate = apCheck.getRecordDate();
-        this.custname = apCheck.getCustName();
-        this.custuu = apCheck.getCustUu();
-        this.currency = apCheck.getCurrency();
-        this.enuu = apCheck.getEnUu();
-        this.recorder = apCheck.getRecorder();
+        this.apCheckDate = item.getApCheck().getRecordDate();
+        this.custname = item.getApCheck().getCustName();
+        this.custuu = item.getApCheck().getCustUu();
+        this.currency = item.getApCheck().getCurrency();
+        this.enuu = item.getApCheck().getEnUu();
+        this.recorder = item.getApCheck().getRecorder();
+        this.apCheckId = item.getApCheck().getId();
         this.orderprice = item.getPrice();
         this.nowmoney = item.getAmount();
         this.custuseruu = item.getCustUserUU();
@@ -411,6 +421,14 @@ public class ErpProdIODetail implements Serializable {
         this.sourcetable = sourcetable;
     }
 
+    public Date getSourceDate() {
+        return sourceDate;
+    }
+
+    public void setSourceDate(Date sourceDate) {
+        this.sourceDate = sourceDate;
+    }
+
     public Long getEnuu() {
         return enuu;
     }
@@ -517,4 +535,12 @@ public class ErpProdIODetail implements Serializable {
     public void setHaveChecked(Short haveChecked) {
         this.haveChecked = haveChecked;
     }
+
+    public Long getApCheckId() {
+        return apCheckId;
+    }
+
+    public void setApCheckId(Long apCheckId) {
+        this.apCheckId = apCheckId;
+    }
 }

+ 0 - 2
src/main/java/com/uas/platform/b2b/model/PurchaseApCheckInfo.java

@@ -337,8 +337,6 @@ public class PurchaseApCheckInfo implements Serializable {
 		this.code = code;
 	}
 
-	@JsonIgnore
-	@JSONField(serialize = false)
 	public Set<PurchaseApCheckItemInfo> getItems() {
 		return items;
 	}

+ 16 - 1
src/main/java/com/uas/platform/b2b/model/PurchaseApCheckItem.java

@@ -15,6 +15,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 import java.io.*;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -169,6 +170,12 @@ public class PurchaseApCheckItem implements Serializable {
 	@Column(name = "pai_sourceid")
 	private Long sourceId;
 
+    /**
+     * 明细行数据来源对应时间
+     */
+    @Column(name = "pai_source_date")
+    private Date sourceDate;
+
 	/**
 	 * 此次转账之前的已对账数(用于删除应收对账单时)
 	 */
@@ -348,7 +355,15 @@ public class PurchaseApCheckItem implements Serializable {
 		this.sourceId = sourceId;
 	}
 
-	public Double getOldYCheckQty() {
+    public Date getSourceDate() {
+        return sourceDate;
+    }
+
+    public void setSourceDate(Date sourceDate) {
+        this.sourceDate = sourceDate;
+    }
+
+    public Double getOldYCheckQty() {
 		return oldYCheckQty;
 	}
 

+ 52 - 4
src/main/java/com/uas/platform/b2b/model/PurchaseApCheckItemInfo.java

@@ -1,9 +1,13 @@
 package com.uas.platform.b2b.model;
 
 
+import com.alibaba.fastjson.annotation.JSONField;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
 import javax.persistence.*;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -41,6 +45,12 @@ public class PurchaseApCheckItemInfo implements Serializable {
 	@Column(name = "pai_prid")
 	private Long prid;
 
+    /**
+     * 客户用户UU号
+     */
+    @Column(name = "pai_custuseruu")
+    private Long custUserUU;
+
 	/**
 	 * 客户订单单号
 	 */
@@ -89,7 +99,13 @@ public class PurchaseApCheckItemInfo implements Serializable {
 	@Column(name = "pai_prodspec")
 	private String prodSpec;
 
-	/**
+    /**
+     * 物料单位
+     */
+    @Column(name = "pai_produnit")
+    private String prodUnit;
+
+    /**
 	 * 单价
 	 */
 	@Column(name = "pai_price")
@@ -143,6 +159,12 @@ public class PurchaseApCheckItemInfo implements Serializable {
 	@Column(name = "pai_sourceid")
 	private Long sourceId;
 
+    /**
+     * 明细行数据来源对应时间
+     */
+    @Column(name = "pai_source_date")
+    private Date sourceDate;
+
 	/**
 	 * 此次转账之前的已对账数(用于删除应收对账单时)
 	 */
@@ -213,7 +235,15 @@ public class PurchaseApCheckItemInfo implements Serializable {
 		this.prid = prid;
 	}
 
-	public String getOrderCode() {
+    public Long getCustUserUU() {
+        return custUserUU;
+    }
+
+    public void setCustUserUU(Long custUserUU) {
+        this.custUserUU = custUserUU;
+    }
+
+    public String getOrderCode() {
 		return orderCode;
 	}
 
@@ -317,7 +347,15 @@ public class PurchaseApCheckItemInfo implements Serializable {
 		this.sourceId = sourceId;
 	}
 
-	public Double getOldYCheckQty() {
+    public Date getSourceDate() {
+        return sourceDate;
+    }
+
+    public void setSourceDate(Date sourceDate) {
+        this.sourceDate = sourceDate;
+    }
+
+    public Double getOldYCheckQty() {
 		return oldYCheckQty;
 	}
 
@@ -365,6 +403,8 @@ public class PurchaseApCheckItemInfo implements Serializable {
 		this.paid = paid;
 	}
 
+    @JsonIgnore
+    @JSONField(serialize = false)
 	public PurchaseApCheckInfo getApCheck() {
 		return apCheck;
 	}
@@ -389,7 +429,15 @@ public class PurchaseApCheckItemInfo implements Serializable {
 		this.prodSpec = prodSpec;
 	}
 
-	public String getSendcode() {
+    public String getProdUnit() {
+        return prodUnit;
+    }
+
+    public void setProdUnit(String prodUnit) {
+        this.prodUnit = prodUnit;
+    }
+
+    public String getSendcode() {
 		return sendcode;
 	}
 

+ 19 - 2
src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java

@@ -5,6 +5,7 @@ import com.uas.platform.b2b.model.DateFilter;
 import com.uas.platform.b2b.model.ErpProdIODetail;
 import com.uas.platform.b2b.model.ErpProdIo;
 import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.model.PurchaseApCheckItemInfo;
 
 import java.util.List;
 
@@ -25,6 +26,7 @@ public interface ErpProdIODetailService {
 	 * @param endDate 截止时间
      * @param checkDate 对账月份
 	 * @return 符合条件的数据
+     * @throws  InterruptedException 线程中的异常
 	 */
     ErpProdIo findXlsApChecks(List<Long> filter, ApcheckKeyWord keyWord, Long fromDate, Long endDate, String checkDate) throws InterruptedException;
 
@@ -46,14 +48,29 @@ public interface ErpProdIODetailService {
      * @param checkDate 对账月份
      * @param fromDate 起始时间
      * @param endDate 截止时间
+     * @param keyword 过滤条件
      * @return 处理后的对账单
      */
-    List<PurchaseApCheck> findApCheckList(Long vendUU, Long customerUU, String checkDate, Long fromDate, Long endDate);
+    List<PurchaseApCheckItemInfo> findApCheckList(Long vendUU, Long customerUU, String checkDate, Long fromDate, Long endDate, ApcheckKeyWord keyword);
 
     /**
      * 将PurchaseApCheck 转成 ErpProdIODetail
      * @param apCheckList 查询已对账数据
      * @return 转换成ErpProdIODetail的数据
      */
-    List<ErpProdIODetail> covertApCheckToErpIo(List<PurchaseApCheck> apCheckList);
+    List<ErpProdIODetail> covertApCheckToErpIo(List<PurchaseApCheckItemInfo> apCheckList);
+
+
+    /**
+     * 设置对账金额信息
+     *
+     * @param erpProdIo ERP出入库单
+     * @param vendorUU 供应商UU
+     * @param customerUU 客户UU
+     * @param checkDate 对账月份
+     * @param fromDate 对账起始时间
+     * @param endDate 对账截止时间
+     * @throws InterruptedException 线程中断异常
+     */
+    void setCheckAmount(ErpProdIo erpProdIo, Long vendorUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 }

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

@@ -107,7 +107,7 @@ public interface PurchaseApBillService {
      * @param endDate 截止时间
      * @return 符合条件的供应商
      */
-    SPage<Vendor> getVendorInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate);
+    SPage<Vendor> getVendorInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 
     /**
      * 通过日期筛选,筛选出超出默认日期的单据

+ 14 - 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;
 
 /**
  * 对账单
@@ -143,7 +144,7 @@ public interface PurchaseApCheckService {
      * @param endDate 截止时间
      * @return 搜索结果
      */
-    SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate,  Long fromDate, Long endDate);
+    SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate,  Long fromDate, Long endDate) throws InterruptedException;
 
     /**
      * 获取总的应收金额
@@ -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;
 
@@ -187,6 +189,7 @@ public interface PurchaseApCheckService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @return 统计结果
+     * @throws InterruptedException 中断异常
      */
     List<ApCheckAmount> getThisMonthDoneTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 
@@ -205,4 +208,14 @@ public interface PurchaseApCheckService {
      * @param vendorSPage 分页处理
      */
     void setVendorSPage(PageParams params, List<Vendor> vendors, SPage<Vendor> vendorSPage);
+
+    /**
+     * 统计对账数据
+     *
+     * @param customer 客户信息
+     * @param checkDate 对账月份
+     * @param fromDate 起始时间
+     * @param endDate 截止时间
+     */
+    void countApCheck(Vendor customer, String checkDate, Long fromDate, Long endDate) throws InterruptedException;
 }

+ 81 - 49
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -4,16 +4,19 @@ import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.core.util.BoundedExecutor;
 import com.uas.platform.b2b.core.util.DateFormatUtils;
 import com.uas.platform.b2b.core.util.DateUtils;
+import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.core.util.ThreadTask;
 import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDao;
+import com.uas.platform.b2b.dao.PurchaseApCheckItemInfoDao;
 import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.model.ApcheckKeyWord;
 import com.uas.platform.b2b.model.DateFilter;
 import com.uas.platform.b2b.model.ErpProdIODetail;
 import com.uas.platform.b2b.model.ErpProdIo;
 import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.model.PurchaseApCheckItemInfo;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.publicapi.model.ApCheckAmount;
 import com.uas.platform.b2b.service.ErpProdIODetailService;
@@ -62,13 +65,16 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
 
     private final BoundedExecutor executor;
 
+    private final PurchaseApCheckItemInfoDao apCheckItemInfoDao;
+
     @Autowired
     public ErpProdIODetailServiceImpl(CommonDao commonDao, PurchaseApCheckService apCheckService,
-                                      VendorDao vendorDao, PurchaseApCheckDao apCheckDao) {
+                                      VendorDao vendorDao, PurchaseApCheckDao apCheckDao, PurchaseApCheckItemInfoDao apCheckItemInfoDao) {
         this.commonDao = commonDao;
         this.apCheckService = apCheckService;
         this.vendorDao = vendorDao;
         this.apCheckDao = apCheckDao;
+        this.apCheckItemInfoDao = apCheckItemInfoDao;
         ExecutorService executorService = Executors.newCachedThreadPool();
         executor = new BoundedExecutor(executorService, 1600);
     }
@@ -137,48 +143,65 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
         threadsSignal.await();
         ErpProdIo erpProdIo = new ErpProdIo();
         erpProdIo.setDetails(details);
-        // 应收总额
-       if (null != keyword.getCustomerUU()) {
-           List<ApCheckAmount> totalTrades = apCheckService.getDueTrade(enUU, keyword.getCustomerUU());
-           if (!CollectionUtil.isEmpty(totalTrades)) {
-               List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(keyword.getCustomerUU(), enUU);
-               erpProdIo.setTotalCount(totalTrades);
-               if (!CollectionUtil.isEmpty(vendors)) {
-                   String tradeString = JSON.toJSONString(totalTrades);
-                   ThreadUtils.task(()
-                       -> commonDao.getJdbcTemplate().update(String.format(ApCheckTask.UPDATE_COUNT_SQL, tradeString, vendors.get(0).getId()))
-                   );
-               }
-           }
-           // 本月应收
-           List<ApCheckAmount> thisMonthTrades = apCheckService.getThisMonthTrade(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
-           erpProdIo.setThisMonthCount(thisMonthTrades);
-           if (!CollectionUtil.isEmpty(thisMonthTrades)) {
-               // 本月应收(未收)
-               List<ApCheckAmount> thisMonthTodoTrades = null;
-               try {
-                   thisMonthTodoTrades = apCheckService.getThisMonthTodoTrade(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
-               } catch (InterruptedException e) {
-                   e.printStackTrace();
-               }
-               erpProdIo.setThisMonthTodoCount(thisMonthTodoTrades);
-               // 本月应收(已收)
-               List<ApCheckAmount> thisMonthDoneTrades = null;
-               try {
-                   thisMonthDoneTrades = apCheckService.getThisMonthDoneTrade(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
-               } catch (InterruptedException e) {
-                   e.printStackTrace();
-               }
-               erpProdIo.setThisMonthDoneCount(thisMonthDoneTrades);
-           }
-       }
-       // 查询已生成的对账单(需进行转换)
-        List<PurchaseApCheck> apCheckList = findApCheckList(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
-        List<ErpProdIODetail> detailList = covertApCheckToErpIo(apCheckList);
-        erpProdIo.getDetails().addAll(detailList);
+        if (null != keyword.getCustomerUU()) {
+            // 设置对账金额信息
+            setCheckAmount(erpProdIo, enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
+            // 查询已生成的对账单(需进行转换)
+            List<PurchaseApCheckItemInfo> apCheckList = findApCheckList(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate, keyword);
+            List<ErpProdIODetail> detailList = covertApCheckToErpIo(apCheckList);
+            erpProdIo.getDetails().addAll(detailList);
+        }
 		return erpProdIo;
 	}
 
+    /**
+     * 设置对账金额信息
+     *
+     * @param erpProdIo ERP出入库单
+     * @param vendorUU 供应商UU
+     * @param customerUU 客户UU
+     * @param checkDate 对账月份
+     * @param fromDate 对账起始时间
+     * @param endDate 对账截止时间
+     * @throws InterruptedException 线程中断异常
+     */
+    @Override
+    public void setCheckAmount(ErpProdIo erpProdIo, Long vendorUU, Long customerUU, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
+        // 应收总额
+        List<ApCheckAmount> totalTrades = apCheckService.getDueTrade(vendorUU, customerUU);
+        if (!CollectionUtil.isEmpty(totalTrades)) {
+            List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(customerUU, vendorUU);
+            erpProdIo.setTotalCount(totalTrades);
+            if (!CollectionUtil.isEmpty(vendors)) {
+                String tradeString = JSON.toJSONString(totalTrades);
+                ThreadUtils.task(()
+                    -> commonDao.getJdbcTemplate().update(String.format(ApCheckTask.UPDATE_COUNT_SQL, tradeString, vendors.get(0).getId()))
+                );
+            }
+        }
+        // 本月应收
+        List<ApCheckAmount> thisMonthTrades = apCheckService.getThisMonthTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+        erpProdIo.setThisMonthCount(thisMonthTrades);
+        if (!CollectionUtil.isEmpty(thisMonthTrades)) {
+            // 本月应收(未收)
+            List<ApCheckAmount> thisMonthTodoTrades = null;
+            try {
+                thisMonthTodoTrades = apCheckService.getThisMonthTodoTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            erpProdIo.setThisMonthTodoCount(thisMonthTodoTrades);
+            // 本月应收(已收)
+            List<ApCheckAmount> thisMonthDoneTrades = null;
+            try {
+                thisMonthDoneTrades = apCheckService.getThisMonthDoneTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            erpProdIo.setThisMonthDoneCount(thisMonthDoneTrades);
+        }
+    }
+
     /**
      * 通过相关条件查询生成的对账单
      *
@@ -187,20 +210,30 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param checkDate 对账月份
      * @param fromDate 起始时间
      * @param endDate 截止时间
+     * @param keyword 过滤条件
      */
     @Override
-    public List<PurchaseApCheck> findApCheckList(Long vendUU, Long customerUU, String checkDate, Long fromDate, Long endDate) {
+    public List<PurchaseApCheckItemInfo> findApCheckList(Long vendUU, Long customerUU, String checkDate, Long fromDate, Long endDate, ApcheckKeyWord keyword) {
         PageInfo pageInfo = new PageInfo();
-        pageInfo.filter("enUu", vendUU);
-        pageInfo.filter("custUu", customerUU);
+        pageInfo.filter("apCheck.enUu", vendUU);
+        pageInfo.filter("apCheck.custUu", customerUU);
         DateFilter filter = initFilter(fromDate, endDate, checkDate);
         if (filter.getSqlEndDate() != null) {
-            pageInfo.expression(PredicateUtils.gte("recordDate", filter.getSqlFromDate(), false));
+            pageInfo.expression(PredicateUtils.gte("sourceDate", filter.getSqlFromDate(), false));
         }
         if (filter.getSqlEndDate() != null) {
-            pageInfo.expression(PredicateUtils.lt("recordDate", filter.getSqlEndDate(), false));
+            pageInfo.expression(PredicateUtils.lt("sourceDate", filter.getSqlEndDate(), false));
+        }
+        if (!StringUtils.isEmpty(keyword.getProdTitle())) {
+            pageInfo.expression(PredicateUtils.like("prodTitle", keyword.getProdTitle(), true));
+        }
+        if (!StringUtils.isEmpty(keyword.getProdSpec())) {
+            pageInfo.expression(PredicateUtils.like("prodSpec", keyword.getProdSpec(), true));
+        }
+        if (null != keyword.getTaxRate()) {
+            pageInfo.filter("taxrate", keyword.getTaxRate());
         }
-        return apCheckDao.findAll((Root<PurchaseApCheck> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
+        return apCheckItemInfoDao.findAll((Root<PurchaseApCheckItemInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
             query.where(pageInfo.getPredicates(root, query, builder)).getRestriction());
     }
 
@@ -211,11 +244,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @return 转换成ErpProdIODetail的数据
      */
     @Override
-    public List<ErpProdIODetail> covertApCheckToErpIo(List<PurchaseApCheck> apCheckList) {
+    public List<ErpProdIODetail> covertApCheckToErpIo(List<PurchaseApCheckItemInfo> apCheckList) {
         List<ErpProdIODetail> details = new ArrayList<>();
         apCheckList.forEach(
-            apCheck -> apCheck.getItems().forEach(
-                item -> details.add(new ErpProdIODetail(apCheck, item)))
+            apCheck -> details.add(new ErpProdIODetail(apCheck))
         );
         return details;
     }

+ 28 - 70
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;
@@ -17,6 +18,7 @@ import com.uas.platform.b2b.model.Product;
 import com.uas.platform.b2b.model.PurchaseApBill;
 import com.uas.platform.b2b.model.PurchaseApBillItem;
 import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.model.PurchaseApCheckItemInfo;
 import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.ps.ProductUtils;
@@ -53,6 +55,7 @@ import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 /**
  * 采购发票
@@ -238,48 +241,35 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
      * @return 符合条件的供应商
      */
     @Override
-    public SPage<Vendor> getVendorInfo(com.uas.platform.core.model.PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
+    public SPage<Vendor> getVendorInfo(com.uas.platform.core.model.PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
         List<Vendor> vendors = findVendorByPage(params, keyword);
-        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
         SPage<Vendor> vendorSPage = new SPage<>();
         if (!org.springframework.util.CollectionUtils.isEmpty(vendors)) {
-            vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
-                .forEach(customer -> {
-                    Long vendorUU = customer.getVendEnUU();
-                    if (!com.uas.ps.core.util.StringUtils.isEmpty(customer.getTotalCountString())) {
-                        List<ApCheckAmount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), ApCheckAmount.class);
-                        customer.setTotalCount(tradeCounts);
-                    }
-                    // 本月应付(总额)
-                    List<ApCheckAmount> thisMonthAllTrades = null;
+            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 {
-                        thisMonthAllTrades = purchaseApCheckService.getThisMonthTrade(vendorUU, enUU, checkDate, fromDate, endDate);
+                        executor.submitTask(() -> {
+                            try {
+                                purchaseApCheckService.countApCheck(customer, checkDate, fromDate, endDate);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            threadsSignal.countDown();
+                        });
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
-                    customer.setThisMonthCount(thisMonthAllTrades);
-                    // 本月应付存在再进行分类查询
-                    if (!CollectionUtil.isEmpty(thisMonthAllTrades)) {
-                        // 本月应付(未付)
-                        List<ApCheckAmount> thisMonthTodoTrades = null;
-                        try {
-                            thisMonthTodoTrades = purchaseApCheckService.getThisMonthTodoTrade(vendorUU, enUU, checkDate, fromDate, endDate);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
-                        customer.setThisMonthTodoCount(thisMonthTodoTrades);
-                        // 本月应付(已付)
-                        List<ApCheckAmount> thisMonthDoneTrades = null;
-                        try {
-                            thisMonthDoneTrades = purchaseApCheckService.getThisMonthDoneTrade(vendorUU, enUU, checkDate, fromDate, endDate);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
-                        customer.setThisMonthDoneCount(thisMonthDoneTrades);
-                    }
-
-                });
-            purchaseApCheckService.setVendorSPage(params, vendors, vendorSPage);
+                })
+            );
+            threadsSignal.await();
+            purchaseApCheckService.setVendorSPage(params, resultVendors, vendorSPage);
         }
         return vendorSPage;
     }
@@ -378,43 +368,11 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
         threadsSignal.await();
         ErpProdIo erpProdIo = new ErpProdIo();
         erpProdIo.setDetails(details);
-        // 应收总额
         if (null != searchKeyWord.getVendorUU()) {
-            List<ApCheckAmount> totalTrades = purchaseApCheckService.getDueTrade(searchKeyWord.getVendorUU(), enUU);
-            List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(enUU, searchKeyWord.getVendorUU());
-            erpProdIo.setVendorName(vendors.get(0).getVendorEnterprise().getEnName());
-            if (!CollectionUtil.isEmpty(totalTrades)) {
-                erpProdIo.setTotalCount(totalTrades);
-                if (!CollectionUtil.isEmpty(vendors)) {
-                    String tradeString = JSON.toJSONString(totalTrades);
-                    executor.submitTask(()
-                        -> commonDao.getJdbcTemplate().update(String.format(ApCheckTask.UPDATE_COUNT_SQL, tradeString, vendors.get(0).getId()))
-                    );
-                }
-            }
-            // 本月应付
-            List<ApCheckAmount> thisMonthTrades = purchaseApCheckService.getThisMonthTrade(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
-            erpProdIo.setThisMonthCount(thisMonthTrades);
-            if (!CollectionUtil.isEmpty(thisMonthTrades)) {
-                // 本月应收(未收)
-                List<ApCheckAmount> thisMonthTodoTrades = null;
-                try {
-                    thisMonthTodoTrades = purchaseApCheckService.getThisMonthTodoTrade(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                erpProdIo.setThisMonthTodoCount(thisMonthTodoTrades);
-                // 本月应收(已收)
-                List<ApCheckAmount> thisMonthDoneTrades = null;
-                try {
-                    thisMonthDoneTrades = purchaseApCheckService.getThisMonthDoneTrade(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-                erpProdIo.setThisMonthDoneCount(thisMonthDoneTrades);
-            }
+            // 设置对账金额信息
+            erpProdIODetailService.setCheckAmount(erpProdIo, searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
             // 查询已生成的对账单(需进行转换)
-            List<PurchaseApCheck> apCheckList = erpProdIODetailService.findApCheckList(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
+            List<PurchaseApCheckItemInfo> apCheckList = erpProdIODetailService.findApCheckList(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate, searchKeyWord);
             List<ErpProdIODetail> detailList = erpProdIODetailService.covertApCheckToErpIo(apCheckList);
             erpProdIo.getDetails().addAll(detailList);
         }

+ 101 - 49
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;
 
 /**
@@ -551,49 +555,88 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
      * @return 搜索结果
      */
     @Override
-    public SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
+    public SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) throws InterruptedException {
         List<Vendor> vendors = findCustomerByPage(params, keyword);
-        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
         SPage<Vendor> vendorSPage = new SPage<>();
         if (!CollectionUtils.isEmpty(vendors)) {
-            vendors.stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
-                .forEach(customer -> {
-                    Long customerUU = customer.getMyEnUU();
-                    if (!StringUtils.isEmpty(customer.getTotalCountString())) {
-                        List<ApCheckAmount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), ApCheckAmount.class);
-                        customer.setTotalCount(tradeCounts);
-                    }
-                    // 本月应收(总额)
-                    List<ApCheckAmount> thisMonthTrades = null;
+            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 {
-                        thisMonthTrades = getThisMonthTrade(enUU, customerUU, checkDate, fromDate, endDate);
+                        executor.submitTask(() -> {
+                            try {
+                                this.countApCheck(customer, checkDate, fromDate, endDate);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            threadsSignal.countDown();
+                        });
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
-                    customer.setThisMonthCount(thisMonthTrades);
-                    // 总额存在再进行其他查询
-                    if (!CollectionUtils.isEmpty(thisMonthTrades)) {
-                        // 本月应收(未收)
-                        List<ApCheckAmount> thisMonthTodoTrades = null;
-                        try {
-                            thisMonthTodoTrades = getThisMonthTodoTrade(enUU, customerUU, checkDate, fromDate, endDate);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
+                })
+            );
+            threadsSignal.await();
+            setVendorSPage(params, resultVendors, vendorSPage);
+        }
+        return vendorSPage;
+    }
+
+    /**
+     * 统计对账数据
+     *
+     * @param customer 客户信息
+     * @param checkDate 对账月份
+     * @param fromDate 起始时间
+     * @param endDate 截止时间
+     */
+    @Override
+    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())) {
+            List<ApCheckAmount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), ApCheckAmount.class);
+            customer.setTotalCount(tradeCounts);
+            // 本月应收(总额)
+            List<ApCheckAmount> thisMonthTrades = null;
+            try {
+                thisMonthTrades = getThisMonthTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            customer.setThisMonthCount(thisMonthTrades);
+            // 总额存在再进行其他查询
+            if (!CollectionUtils.isEmpty(thisMonthTrades)) {
+                CountDownLatch threadsSignal = new CountDownLatch(2);
+                // 本月应收(未收)
+                executor.submitTask(() -> {
+                    try {
+                        List<ApCheckAmount> thisMonthTodoTrades = getThisMonthTodoTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
                         customer.setThisMonthTodoCount(thisMonthTodoTrades);
-                        // 本月应收(已收)
-                        List<ApCheckAmount> thisMonthDoneTrades = null;
-                        try {
-                            thisMonthDoneTrades = getThisMonthDoneTrade(enUU, customerUU, checkDate, fromDate, endDate);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    threadsSignal.countDown();
+                });
+                // 本月应收(已收)
+                executor.submitTask(() -> {
+                    try {
+                        List<ApCheckAmount> thisMonthDoneTrades = getThisMonthDoneTrade(vendorUU, customerUU, checkDate, fromDate, endDate);
                         customer.setThisMonthDoneCount(thisMonthDoneTrades);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
                     }
+                    threadsSignal.countDown();
                 });
-            setVendorSPage(params, vendors, vendorSPage);
+                threadsSignal.await();
+            }
         }
-        return vendorSPage;
     }
 
     /**
@@ -606,16 +649,25 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
     public void setVendorSPage(PageParams params, List<Vendor> vendors, SPage<Vendor> vendorSPage) {
         List<Vendor> filterVendors = vendors.stream()
             .filter(vendor -> (null != vendor.getThisMonthCount() && !CollectionUtils.isEmpty(vendor.getThisMonthCount()))).collect(Collectors.toList());
-        int startIndex = (params.getPage() - 1) * params.getCount();
-        int endIndex = params.getPage() * params.getCount();
-        int totalCount = filterVendors.size();
-        int totalPage = (int) Math.ceil(totalCount / params.getCount());
-        vendorSPage.setTotalElement(filterVendors.size());
-        vendorSPage.setTotalPage(totalPage);
-        vendorSPage.setPage(params.getPage());
-        vendorSPage.setSize(params.getCount());
-        List<Vendor> vendorList = filterVendors.subList(startIndex, endIndex > totalCount ? totalCount : endIndex);
-        vendorSPage.setContent(vendorList);
+        if (!CollectionUtils.isEmpty(filterVendors)) {
+            // 起始序号
+            int startIndex = (params.getPage() - 1) * params.getCount();
+            // 截止序号
+            int endIndex = params.getPage() * params.getCount();
+            // 筛选后的总数
+            int totalCount = filterVendors.size();
+            // 筛选后的总页码
+            int totalPage = (int) Math.ceil((double) totalCount / params.getCount());
+            // 默认起始序号
+            int defaultIndex = totalPage * params.getCount();
+            vendorSPage.setTotalElement(filterVendors.size());
+            vendorSPage.setTotalPage(totalPage);
+            vendorSPage.setPage(params.getPage() > totalPage ? totalPage : params.getPage());
+            vendorSPage.setSize(params.getCount());
+            // 如果前端传入页码值过大,返回能取到的最大值页面及获取相关数据
+            List<Vendor> vendorList = filterVendors.subList(startIndex > totalCount ? defaultIndex : startIndex, endIndex > totalCount ? totalCount : endIndex);
+            vendorSPage.setContent(vendorList);
+        }
     }
 
     /**
@@ -671,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());
@@ -748,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);
     }
 

+ 7 - 1
src/main/java/com/uas/platform/b2b/service/impl/SaleSendAgentServiceImpl.java

@@ -60,7 +60,13 @@ public class SaleSendAgentServiceImpl implements SaleSendAgentService {
         ModelMap map = tokenService.getToken("salenotice", notice.getEnUU());
         String token = (String) map.get("token");
         send.setUuid(token);
-        if (!StringUtils.isEmpty(notice)) {
+        Integer count = saleSendDao.countByUuid(send.getUuid());
+        // 重复点击发货
+        if (count > 0) {
+            throw new IllegalOperatorException("请不要重复点击发货");
+        }
+        List<SaleSend> sends = saleSendDao.findByEnUUAndCode(send.getEnUU(), send.getCode());
+        if (!StringUtils.isEmpty(notice) && CollectionUtils.isEmpty(sends)) {
             PurchaseOrder order = notice.getOrderItem().getOrder();
             send.setCurrency(order.getCurrency());
             send.setBackStatus((short) Status.NOT_UPLOAD.value());

BIN
src/main/resources/jxls-tpl/fa/faApCheck.xls