Просмотр исходного кода

Merge remote-tracking branch 'origin/release-201844-wangcz' into release-201844-wangcz

wangcz 7 лет назад
Родитель
Сommit
0a90ffb769
23 измененных файлов с 2603 добавлено и 216 удалено
  1. 3 0
      src/main/java/com/uas/platform/b2b/controller/SaleApBillController.java
  2. 1 0
      src/main/java/com/uas/platform/b2b/controller/SaleApCheckController.java
  3. 92 0
      src/main/java/com/uas/platform/b2b/controller/SaleArCheckController.java
  4. 4 4
      src/main/java/com/uas/platform/b2b/controller/SaleNoticeController.java
  5. 1 1
      src/main/java/com/uas/platform/b2b/dao/SaleSendDao.java
  6. 13 0
      src/main/java/com/uas/platform/b2b/model/ApcheckKeyWord.java
  7. 51 0
      src/main/java/com/uas/platform/b2b/model/DateFilter.java
  8. 13 0
      src/main/java/com/uas/platform/b2b/model/ErpProdIo.java
  9. 36 7
      src/main/java/com/uas/platform/b2b/model/Vendor.java
  10. 77 0
      src/main/java/com/uas/platform/b2b/model/VendorContactMan.java
  11. 11 0
      src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java
  12. 48 16
      src/main/java/com/uas/platform/b2b/service/PurchaseApBillService.java
  13. 71 55
      src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java
  14. 484 9
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApBillServiceImpl.java
  15. 1 1
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java
  16. 10 4
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseNoticeServiceImpl.java
  17. 10 7
      src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java
  18. BIN
      src/main/resources/jxls-tpl/fa/faApCheck.xls
  19. 776 2
      src/main/webapp/resources/js/index/app.js
  20. 10 1
      src/main/webapp/resources/js/index/services/Fa.js
  21. 2 2
      src/main/webapp/resources/tpl/index/fa/apCheck.html
  22. 635 107
      src/main/webapp/resources/tpl/index/fa/arCheck.html
  23. 254 0
      src/main/webapp/resources/tpl/index/fa/arCheck_old.html

+ 3 - 0
src/main/java/com/uas/platform/b2b/controller/SaleApBillController.java

@@ -2,8 +2,11 @@ package com.uas.platform.b2b.controller;
 
 import com.alibaba.dubbo.common.utils.CollectionUtils;
 import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.model.ApcheckKeyWord;
+import com.uas.platform.b2b.model.ErpProdIo;
 import com.uas.platform.b2b.model.PurchaseApBill;
 import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.PurchaseApBillService;
 import com.uas.platform.b2b.service.UserService;

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

@@ -571,6 +571,7 @@ public class SaleApCheckController {
 		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
 		modelAndView.addObject("dateFormat", dateFormat);
 		modelAndView.addObject("data", details);
+        modelAndView.addObject("title", "客户应收对账单");
 		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/faApCheck", "客户应收对账单"));
 		logger.log("客户应收对账单", "导出Excel列表", "导出全部Excel列表");
 		return modelAndView;

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

@@ -0,0 +1,92 @@
+package com.uas.platform.b2b.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.model.ApcheckKeyWord;
+import com.uas.platform.b2b.model.ErpProdIODetail;
+import com.uas.platform.b2b.model.ErpProdIo;
+import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.service.PurchaseApBillService;
+import com.uas.platform.b2b.support.JxlsExcelView;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+/**
+ * 应付对账单
+ *
+ * @author hejq
+ * @date 2018-12-14 16:39
+ */
+@RequestMapping("/sale/arCheck")
+@RestController
+public class SaleArCheckController {
+
+    private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    @Autowired
+    private PurchaseApBillService purchaseApBillService;
+
+    /**
+     * 应付对账单获取所有满足条件的供应商
+     *
+     * @param params 分页参数
+     * @param keyword 关键词
+     * @param checkDate 对账月份
+     * @param searchFilter 筛选条件
+     * @return 符合条件的供应商
+     */
+    @RequestMapping(value = "/vendor", method = RequestMethod.GET)
+    public SPage<Vendor> getVendors(PageParams params, String keyword, String checkDate, String searchFilter) {
+        logger.log("应付对账单", "获取供应商信息", "获取所有符合条件的供应商");
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        return purchaseApBillService.getVendorInfo(params, keyword, checkDate, filter.getFromDate(), filter.getEndDate());
+    }
+
+    /**
+     * 通过日期筛选,筛选出超出默认日期的单据
+     *
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param checkDate 对账月份
+     * @param searchKeyWord 搜索词
+     * @return List<ErpProdIo>
+     */
+    @RequestMapping(value = "/getAllByKeywords", method = RequestMethod.GET)
+    public ErpProdIo getAllApChecksByDate(Long fromDate, Long endDate, ApcheckKeyWord searchKeyWord, String checkDate) {
+        logger.log("应付对账单", "筛选对账数据", "筛选所有未对账数据");
+        return purchaseApBillService.findXlsApChecks(searchKeyWord, fromDate, endDate, checkDate);
+    }
+
+    /**
+     * 导出未对账单据列表
+     *
+     * @param keyword 关键字
+     *                @see    ApcheckKeyWord
+     * @param fromDate 开始日期
+     * @param endDate 截止日期
+     * @param checkDate 对账月份
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/xls", method = RequestMethod.GET)
+    public ModelAndView export(ApcheckKeyWord keyword, Long fromDate, Long endDate, String checkDate) {
+        List<ErpProdIODetail> details = getAllApChecksByDate(fromDate, endDate, keyword, checkDate).getDetails();
+        ModelAndView modelAndView = new ModelAndView();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", details);
+        modelAndView.addObject("title", "应付对账单");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/faApCheck", "应付对账单"));
+        logger.log("客户应收对账单", "导出Excel列表", "导出全部Excel列表");
+        return modelAndView;
+    }
+}

+ 4 - 4
src/main/java/com/uas/platform/b2b/controller/SaleNoticeController.java

@@ -254,12 +254,12 @@ public class SaleNoticeController {
 			send = purchaseNoticeService.send(noticeId, send);
 			tokenService.delete(token);
 		}
-		if (send != null) {
-			logger.log("客户送货提醒", "给单个客户送货提醒填写数量并确认发货", send.sendDescription(), null, noticeId);
+		if (null != send && null != send.getId()) {
+			logger.log("客户送货提醒", "给单个客户送货提醒填写数量并确认发货", send.sendDescription(), send.getCode(), noticeId);
 			map.put("id", send.getId());
-			return new ResponseEntity<ModelMap>(map, HttpStatus.OK);
+			return new ResponseEntity<>(map, HttpStatus.OK);
 		} else {
-			throw new IllegalOperatorException("程序错误");
+			throw new IllegalOperatorException("发货失败");
 		}
 	}
 

+ 1 - 1
src/main/java/com/uas/platform/b2b/dao/SaleSendDao.java

@@ -42,5 +42,5 @@ public interface SaleSendDao extends JpaSpecificationExecutor<SaleSend>, JpaRepo
 	 * @param uuid 唯一标识
 	 * @return
 	 */
-	List<SaleSend> findByUuid(String uuid);
+	Integer countByUuid(String uuid);
 }

+ 13 - 0
src/main/java/com/uas/platform/b2b/model/ApcheckKeyWord.java

@@ -15,6 +15,11 @@ public class ApcheckKeyWord {
      */
     private String receiveName;
 
+    /**
+     * 供应商UU
+     */
+    private Long vendorUU;
+
     /**
      * 客户名称
      */
@@ -53,6 +58,14 @@ public class ApcheckKeyWord {
         this.receiveName = receiveName;
     }
 
+    public Long getVendorUU() {
+        return vendorUU;
+    }
+
+    public void setVendorUU(Long vendorUU) {
+        this.vendorUU = vendorUU;
+    }
+
     public String getSuuorname() {
         return suuorname;
     }

+ 51 - 0
src/main/java/com/uas/platform/b2b/model/DateFilter.java

@@ -0,0 +1,51 @@
+package com.uas.platform.b2b.model;
+
+/**
+ * 时间过滤条件
+ *
+ * @author hejq
+ * @date 2018-12-14 15:58
+ */
+public class DateFilter {
+
+    /**
+     * 起始时间
+     */
+    private String fromDate;
+
+    /**
+     * 截止时间
+     */
+    private String endDate;
+
+    public DateFilter() {
+
+    }
+
+    /**
+     * 赋值时间
+     *
+     * @param sqlFromDate 开始时间
+     * @param sqlEndDate 截止时间
+     */
+    public DateFilter(String sqlFromDate, String sqlEndDate) {
+        this.fromDate = sqlFromDate;
+        this.endDate = sqlEndDate;
+    }
+
+    public String getFromDate() {
+        return fromDate;
+    }
+
+    public void setFromDate(String fromDate) {
+        this.fromDate = fromDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+}

+ 13 - 0
src/main/java/com/uas/platform/b2b/model/ErpProdIo.java

@@ -28,6 +28,11 @@ public class ErpProdIo {
      */
     private List<TradeCount> totalCount;
 
+    /**
+     * 供应商名称
+     */
+    private String vendorName;
+
     public List<ErpProdIODetail> getDetails() {
         return details;
     }
@@ -51,4 +56,12 @@ public class ErpProdIo {
     public void setTotalCount(List<TradeCount> totalCount) {
         this.totalCount = totalCount;
     }
+
+    public String getVendorName() {
+        return vendorName;
+    }
+
+    public void setVendorName(String vendorName) {
+        this.vendorName = vendorName;
+    }
 }

+ 36 - 7
src/main/java/com/uas/platform/b2b/model/Vendor.java

@@ -24,6 +24,7 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import java.io.*;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -194,13 +195,25 @@ public class Vendor implements Serializable {
      * (针对买家、客户)采购联系人
      */
 	@Transient
-    private Set<String> purchaseContacts = new HashSet<>();
+    private Set<VendorContactMan> buyerContacts = new HashSet<>();
+
+    /**
+     * (针对买家、客户)采购联系人
+     */
+    @Transient
+    private List<String> purchaseContacts = new ArrayList<>();
 
     /**
      * (针对卖家、供应商) 业务对接人
      */
-	@Transient
-    private Set<String> saleContacts = new HashSet<>();
+    @Transient
+    private Set<VendorContactMan> sellerContacts = new HashSet<>();
+
+    /**
+     * (针对卖家、供应商) 业务对接人
+     */
+    @Transient
+    private List<String> saleContacts = new ArrayList<>();
 
     /**
      * 本月应收(前端传入指定月份)
@@ -395,19 +408,35 @@ public class Vendor implements Serializable {
         this.uncheckedCount = uncheckedCount;
     }
 
-    public Set<String> getPurchaseContacts() {
+    public Set<VendorContactMan> getBuyerContacts() {
+        return buyerContacts;
+    }
+
+    public void setBuyerContacts(Set<VendorContactMan> buyerContacts) {
+        this.buyerContacts = buyerContacts;
+    }
+
+    public List<String> getPurchaseContacts() {
         return purchaseContacts;
     }
 
-    public void setPurchaseContacts(Set<String> purchaseContacts) {
+    public void setPurchaseContacts(List<String> purchaseContacts) {
         this.purchaseContacts = purchaseContacts;
     }
 
-    public Set<String> getSaleContacts() {
+    public Set<VendorContactMan> getSellerContacts() {
+        return sellerContacts;
+    }
+
+    public void setSellerContacts(Set<VendorContactMan> sellerContacts) {
+        this.sellerContacts = sellerContacts;
+    }
+
+    public List<String> getSaleContacts() {
         return saleContacts;
     }
 
-    public void setSaleContacts(Set<String> saleContacts) {
+    public void setSaleContacts(List<String> saleContacts) {
         this.saleContacts = saleContacts;
     }
 

+ 77 - 0
src/main/java/com/uas/platform/b2b/model/VendorContactMan.java

@@ -0,0 +1,77 @@
+package com.uas.platform.b2b.model;
+
+/**
+ * 业务联系人
+ *
+ * @author hejq
+ * @date 2018-12-14 15:07
+ */
+public class VendorContactMan {
+
+    /**
+     * 用户UU
+     */
+    private Long userUU;
+
+    /**
+     * 用户姓名
+     */
+    private String name;
+
+    /**
+     * 无参构造
+     */
+    public VendorContactMan() {
+    }
+
+    /**
+     * 通过UU和姓名生成联系人
+     *
+     * @param userUU 用户UU
+     * @param userName 姓名
+     */
+    public VendorContactMan(Long userUU, String userName) {
+        this.userUU = userUU;
+        this.name = userName;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        VendorContactMan that = (VendorContactMan) o;
+
+        if (userUU != null ? !userUU.equals(that.userUU) : that.userUU != null) {
+            return false;
+        }
+        return name != null ? name.equals(that.name) : that.name == null;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = userUU != null ? userUU.hashCode() : 0;
+        result = 31 * result + (name != null ? name.hashCode() : 0);
+        return result;
+    }
+}

+ 11 - 0
src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2b.service;
 
 import com.uas.platform.b2b.model.ApcheckKeyWord;
+import com.uas.platform.b2b.model.DateFilter;
 import com.uas.platform.b2b.model.ErpProdIo;
 
 import java.util.List;
@@ -24,5 +25,15 @@ public interface ErpProdIODetailService {
 	 * @return 符合条件的数据
 	 */
     ErpProdIo findXlsApChecks(List<Long> filter, ApcheckKeyWord keyWord, Long fromDate, Long endDate, String checkDate);
+
+    /**
+     * 初始化筛选时间
+     *
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param checkDate 筛选月份
+     * @return 过滤条件
+     */
+    DateFilter initFilter(Long fromDate, Long endDate, String checkDate);
 	
 }

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

@@ -1,57 +1,67 @@
 package com.uas.platform.b2b.service;
 
 import com.uas.platform.b2b.erp.model.ProdInOutRefreshPrice;
+import com.uas.platform.b2b.model.ApcheckKeyWord;
+import com.uas.platform.b2b.model.ErpProdIo;
 import com.uas.platform.b2b.model.PurchaseApBill;
 import com.uas.platform.b2b.model.PurchaseApBillItem;
 import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
 
+/**
+ * 应付对账单
+ *
+ * @author US50
+ */
 public interface PurchaseApBillService {
 
 	/**
 	 * 批量保存、修改客户应付票据单
 	 * 
-	 * @param changeItems
+	 * @param apBillItems
 	 * @return
 	 */
-	public void save(List<PurchaseApBillItem> apBillItems);
+    void save(List<PurchaseApBillItem> apBillItems);
 
 	/**
 	 * 获取需要上传(到卖方)的未上传应付票据
 	 * 
 	 * @return
 	 */
-	public List<PurchaseApBill> findNotUpload();
+    List<PurchaseApBill> findNotUpload();
 
 	/**
 	 * 上传好需要上传的客户不良品入库单后修改单据的上传状态
 	 * 
 	 * @param idArray
 	 */
-	public void onUploadSuccess(String[] idArray);
+    void onUploadSuccess(String[] idArray);
 	
 	/**
 	 * 批量反过账客户应付发票
 	 * 
-	 * @param changeItems
+	 * @param apBills
 	 * @return
 	 */
-	public void nonPosting(List<PurchaseApBill> apBills);
+    void nonPosting(List<PurchaseApBill> apBills);
 	
 	/**
 	 * 获取需要上传(到卖方)的已反过账的客户应发发票
 	 * @return
 	 */
-	public List<PurchaseApBill> getNonPosting();
+    List<PurchaseApBill> getNonPosting();
 
 	/**
 	 * 删除已上传(到卖方)的反过账客户应付发票
 	 * @param idArray
 	 */
-	public void onNonPostingUploadSuccess(String[] idArray);
+    void onNonPostingUploadSuccess(String[] idArray);
 
 	/**
 	 * 分页查找客户应付票据,包括明细
@@ -61,7 +71,7 @@ public interface PurchaseApBillService {
 	 *            查找关键字
 	 * @return
 	 */
-	public Page<PurchaseApBill> findAllByPageInfo(PageInfo pageInfo, String keyword, Long fromDate, Long endDate, SearchFilter filter);
+    Page<PurchaseApBill> findAllByPageInfo(PageInfo pageInfo, String keyword, Long fromDate, Long endDate, SearchFilter filter);
 
 	/**
 	 * 用不良品入库单ID查找客户应付票据
@@ -69,22 +79,44 @@ public interface PurchaseApBillService {
 	 * @param id
 	 * @return
 	 */
-	public PurchaseApBill findById(Long id);
+    PurchaseApBill findById(Long id);
 	
 	
 	/** 
-	 * @Description: 统计所有的应付发票记录 
+	 * 统计所有的应付发票记录
+     *
 	 * @date 2015年11月16日
 	 * @return Long
 	 */
-	public Long getAllCount();
-
-    Integer getApBillUnreadCount();
+    Long getAllCount();
 
 	/**
 	 * erp批量更新采购验收单的单价,平台需要批量更新关联的应付发票的单价
 	 *
-	 * @param acceptItems
+	 * @param prodInOuts
 	 */
-	public void refreshPrice(List<ProdInOutRefreshPrice> prodInOuts);
+    void refreshPrice(List<ProdInOutRefreshPrice> prodInOuts);
+
+    /**
+     * 应付对账单获取所有满足条件的供应商
+     *
+     * @param params 分页参数
+     * @param keyword 关键词
+     * @param checkDate 对账月份
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @return 符合条件的供应商
+     */
+    SPage<Vendor> getVendorInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate);
+
+    /**
+     * 通过日期筛选,筛选出超出默认日期的单据
+     *
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param checkDate 对账月份
+     * @param searchKeyWord 搜索词
+     * @return List<ErpProdIo>
+     */
+    ErpProdIo findXlsApChecks(ApcheckKeyWord searchKeyWord, Long fromDate, Long endDate, String checkDate);
 }

+ 71 - 55
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -7,8 +7,10 @@ import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 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.SearchFilter;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.publicapi.model.TradeCount;
 import com.uas.platform.b2b.service.ErpProdIODetailService;
@@ -47,35 +49,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
 
 	@Override
 	public ErpProdIo findXlsApChecks(List<Long> filter, ApcheckKeyWord keyword, Long fromDate, Long endDate, String checkDate) {
+        DateFilter dateFilter = initFilter(fromDate, endDate, checkDate);
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
         StringBuffer distributes = new StringBuffer();
-        String sqlFromDate;
-        String sqlEndDate;
-        /*
-         * 1、 如果前端指定开始截止时间,直接使用
-         * 2、 如果前端未指定,采用选择月份,使用月份处理
-         * 3、 截止时间筛为指定月份加1,即下月一号,采用小于这天,能取到当月所有数据
-         */
-        final Integer oneDayMilliseconds = 86400000;
-        boolean onlyCheckDate = (null == fromDate || null == endDate) && null != checkDate;
-        if (null != fromDate && null != endDate ) {
-            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(new Date(fromDate));
-            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(new Date(endDate + oneDayMilliseconds));
-        } else if (onlyCheckDate) {
-            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
-            Date date;
-            Date checkTime;
-            try {
-                date = DateUtils.dateAddMonth(format.parse(checkDate), 1);
-                checkTime = format.parse(checkDate);
-            } catch (ParseException e) {
-                throw new IllegalOperatorException("时间格式异常");
-            }
-            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(checkTime);
-            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(date);
-        } else {
-            throw new IllegalOperatorException("请选择对账时间");
-        }
         List<ErpProdIODetail> details = new ArrayList<>();
         if (null != filter) {
             filter.forEach(uu -> {
@@ -86,19 +62,19 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             });
         }
 		// 货款调账
-		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
 		// 采购验收单
-        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 采购验退单
-        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 客户不良品入库单
-        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 客户不良品出库单
-        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 委外验收单
-        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 委外验退单
-        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
+        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         details.addAll(adjustments);
         details.addAll(saleAccepts);
         details.addAll(saleReturns);
@@ -128,6 +104,46 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
 		return erpProdIo;
 	}
 
+    /**
+     * 初始化筛选时间
+     *
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param checkDate 筛选月份
+     * @return 过滤条件
+     */
+    @Override
+    public DateFilter initFilter(Long fromDate, Long endDate, String checkDate) {
+        String sqlFromDate;
+        String sqlEndDate;
+        /*
+         * 1、 如果前端指定开始截止时间,直接使用
+         * 2、 如果前端未指定,采用选择月份,使用月份处理
+         * 3、 截止时间筛为指定月份加1,即下月一号,采用小于这天,能取到当月所有数据
+         */
+        final Integer oneDayMilliseconds = 86400000;
+        boolean onlyCheckDate = (null == fromDate || null == endDate) && null != checkDate;
+        if (null != fromDate && null != endDate ) {
+            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(new Date(fromDate));
+            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(new Date(endDate + oneDayMilliseconds));
+        } else if (onlyCheckDate) {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+            Date date;
+            Date checkTime;
+            try {
+                date = DateUtils.dateAddMonth(format.parse(checkDate), 1);
+                checkTime = format.parse(checkDate);
+            } catch (ParseException e) {
+                throw new IllegalOperatorException("时间格式异常");
+            }
+            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(checkTime);
+            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(date);
+        } else {
+            throw new IllegalOperatorException("请选择对账时间");
+        }
+        return new DateFilter(sqlFromDate, sqlEndDate);
+    }
+
     /**
      * 获取待对账的委外验退单
      *
@@ -136,7 +152,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 委外验退单
      */
     private List<ErpProdIODetail> getMakeReturns(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
 	    StringBuffer sql = new StringBuffer("select  mr_code as inoutno, mr_date as pidate, mr_rate as rate, mr_receivecode as receivecode, " +
@@ -172,10 +188,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and mr_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(mr_date) >= '").append(fromDate).append("' ");
+            sql.append("and mr_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(mr_date) < '").append(endDate).append("' ");
+            sql.append("and mr_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -188,7 +204,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 委外验收单
      */
     private List<ErpProdIODetail> getMakeAccepts(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
 	    StringBuffer sql = new StringBuffer("select  make$accept.ma_code as inoutno, make$accept.ma_date as pidate, make$accept.ma_rate as rate, " +
@@ -224,10 +240,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and make$accept.ma_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(make$accept.ma_date) >= '").append(fromDate).append("' ");
+            sql.append("and make$accept.ma_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(make$accept.ma_date) < '").append(endDate).append("' ");
+            sql.append("and make$accept.ma_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -240,7 +256,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户不良品出库单
      */
     private List<ErpProdIODetail> getBadOuts(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
 	    StringBuffer sql = new StringBuffer("select  po_code as inoutno, po_date as pidate, po_rate as rate, po_receivecode as receivecode, " +
@@ -276,10 +292,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and po_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(po_date) >= '").append(fromDate).append("' ");
+            sql.append("and po_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(po_date) < '").append(endDate).append("' ");
+            sql.append("and po_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -292,7 +308,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户不良品入库单
      */
     private List<ErpProdIODetail> getBadIns(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
         StringBuffer sql = new StringBuffer("select pb_code as inoutno, pb_date as pidate, pb_rate as rate, pb_receivecode as receivecode, " +
@@ -328,10 +344,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pb_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pb_date) >= '").append(fromDate).append("' ");
+            sql.append("and pb_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pb_date) < '").append(endDate).append("' ");
+            sql.append("and pb_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -344,7 +360,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户采购验退单信息
      */
     private List<ErpProdIODetail> getSaleReturns(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
         StringBuffer sql = new StringBuffer("select purc$return.pr_code as inoutno, pr_date as pidate, pr_rate as rate, pr_receivecode as receivecode, " +
@@ -380,10 +396,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pr_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pr_date) >= '").append(fromDate).append("' ");
+            sql.append("and pr_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pr_date) < '").append(endDate).append("' ");
+            sql.append("and pr_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -396,7 +412,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户采购验收单信息
      */
     private List<ErpProdIODetail> getSaleAccepts(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
         StringBuffer sql = new StringBuffer("select pa_code as inoutno, pa_date as pidate, pa_rate as rate, pa_receivecode as receivcode, " +
@@ -432,10 +448,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pa_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pa_date) >= '").append(fromDate).append("' ");
+            sql.append("and pa_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pa_date) < '").append(endDate).append("' ");
+            sql.append("and pa_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
@@ -448,7 +464,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 货款调账信息
      */
     private List<ErpProdIODetail> getAdjustments(StringBuffer distributes, ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
         StringBuffer sql = new StringBuffer("select aa_inoutno inoutno, aa_orderdate pidate, aa_rate rate, aa_receivecode receivecode, " +
@@ -479,10 +495,10 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and aa_custuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(aa_date) >= '").append(fromDate).append("' ");
+            sql.append("and aa_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(aa_date) < '").append(endDate).append("' ");
+            sql.append("and aa_date < '").append(endDate).append("' ");
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }

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

@@ -1,25 +1,39 @@
 package com.uas.platform.b2b.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
-import com.uas.platform.b2b.dao.PagingReleaseCountDao;
 import com.uas.platform.b2b.dao.PurchaseApBillDao;
 import com.uas.platform.b2b.dao.PurchaseApBillItemDao;
+import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.erp.model.ProdInOutRefreshPrice;
 import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
+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.Product;
 import com.uas.platform.b2b.model.PurchaseApBill;
 import com.uas.platform.b2b.model.PurchaseApBillItem;
 import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.ps.ProductUtils;
+import com.uas.platform.b2b.publicapi.model.TradeCount;
 import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.ErpProdIODetailService;
 import com.uas.platform.b2b.service.PurchaseApBillService;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
+import com.uas.platform.b2b.support.CollectionUtil;
+import com.uas.platform.b2b.support.SPageUtils;
 import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.task.ApCheckTask;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.search.b2b.model.PageParams;
+import com.uas.search.b2b.model.SPage;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -55,10 +69,16 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
 	private SearchService searchService;
 
 	@Autowired
-	private PagingReleaseCountDao pagingReleaseCountDao;
+	private CommonDao commonDao;
 
 	@Autowired
-	private CommonDao commonDao;
+    private PurchaseApCheckService purchaseApCheckService;
+
+	@Autowired
+    private VendorDao vendorDao;
+	
+	@Autowired
+    private ErpProdIODetailService erpProdIODetailService;
 
 	private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
 
@@ -166,12 +186,6 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
 		return purchaseApBillDao.countByVendUU(SystemSession.getUser().getEnterprise().getUu());
 	}
 
-	@Override
-	public Integer getApBillUnreadCount() {
-		return pagingReleaseCountDao.getUnreadCount(SystemSession.getUser().getEnterprise().getUu(),
-				SystemSession.getUser().getUserUU(), "sale", "PURC$APBILL");
-	}
-
 	@Override
 	public void refreshPrice(List<ProdInOutRefreshPrice> prodInOuts) {
 		Long enuu = SystemSession.getUser().getEnterprise().getUu();
@@ -199,4 +213,465 @@ public class PurchaseApBillServiceImpl implements PurchaseApBillService {
 		}
 	}
 
+    /**
+     * 应付对账单获取所有满足条件的供应商
+     *
+     * @param params    分页参数
+     * @param keyword   关键词
+     * @param checkDate 对账月份
+     * @param fromDate  开始时间
+     * @param endDate   截止时间
+     * @return 符合条件的供应商
+     */
+    @Override
+    public SPage<Vendor> getVendorInfo(com.uas.platform.core.model.PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
+        SPage<Vendor> vendorSPage = findVendorByPage(params, keyword);
+        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        if (!org.springframework.util.CollectionUtils.isEmpty(vendorSPage.getContent())) {
+            vendorSPage.getContent().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<TradeCount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), TradeCount.class);
+                        customer.setTotalCount(tradeCounts);
+                    }
+                    // 本月应收
+                    List<TradeCount> thisMonthTrades = purchaseApCheckService.getThisMonthTrade(vendorUU, enUU, checkDate, fromDate, endDate);
+                    customer.setThisMonthCount(thisMonthTrades);
+                });
+        }
+        return vendorSPage;
+    }
+
+    /**
+     * 通过分页信息查询供应商信息
+     *
+     * @param params 分页参数
+     * @param keyword 搜索关键词
+     * @return 搜索结果
+     */
+    private SPage<Vendor> findVendorByPage(com.uas.platform.core.model.PageParams params, String keyword) {
+        PageInfo pageInfo = new PageInfo(params.getPage(), params.getCount());
+        org.springframework.data.domain.Sort sort = new org.springframework.data.domain.Sort( org.springframework.data.domain.Sort.Direction.DESC, "totalCountString");
+        pageInfo.setSort(sort);
+        /*
+         * 过滤条件
+         * 1、 当前企业为客户
+         * 2、 开启B2B对账
+         * 3、 需要对账价格不为空
+         */
+        pageInfo.filter("myEnUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("apcheck", Constant.YES);
+        pageInfo.expression(PredicateUtils.ne("totalCountString", " ", true));
+        if (!com.uas.ps.core.util.StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("vendorEnterprise.enName", keyword, true));
+        }
+        Page<Vendor> vendors = vendorDao.findAll((Root<Vendor> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
+            query.where(pageInfo.getPredicates(root, query, builder)).getRestriction(), pageInfo);
+        return SPageUtils.covertSPage(vendors);
+    }
+
+    /**
+     * 通过日期筛选,筛选出超出默认日期的单据
+     *
+     * @param searchKeyWord 搜索词
+     * @param fromDate      开始时间
+     * @param endDate       截止时间
+     * @param checkDate     对账月份
+     * @return List<ErpProdIo>
+     */
+    @Override
+    public ErpProdIo findXlsApChecks(ApcheckKeyWord searchKeyWord, Long fromDate, Long endDate, String checkDate) {
+        DateFilter dateFilter = erpProdIODetailService.initFilter(fromDate, endDate, checkDate);
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        // 货款调账
+        List<ErpProdIODetail> adjustments = getAdjustments(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 采购验收单
+        List<ErpProdIODetail> saleAccepts = getSaleAccepts(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 采购验退单
+        List<ErpProdIODetail> saleReturns = getSaleReturns(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 客户不良品入库单
+        List<ErpProdIODetail> badIns = getBadIns(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 客户不良品出库单
+        List<ErpProdIODetail> badOuts = getBadOuts(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 委外验收单
+        List<ErpProdIODetail> makeAccepts = getMakeAccepts(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        // 委外验退单
+        List<ErpProdIODetail> makeReturns = getMakeReturns(searchKeyWord, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
+        List<ErpProdIODetail> details = new ArrayList<>();
+        details.addAll(adjustments);
+        details.addAll(saleAccepts);
+        details.addAll(saleReturns);
+        details.addAll(badIns);
+        details.addAll(badOuts);
+        details.addAll(makeAccepts);
+        details.addAll(makeReturns);
+        ErpProdIo erpProdIo = new ErpProdIo();
+        erpProdIo.setDetails(details);
+        // 应收总额
+        if (null != searchKeyWord.getVendorUU()) {
+            List<TradeCount> 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);
+                    ThreadUtils.task(()
+                        -> commonDao.getJdbcTemplate().update(String.format(ApCheckTask.UPDATE_COUNT_SQL, tradeString, vendors.get(0).getId()))
+                    );
+                }
+            }
+            // 本月应收
+            List<TradeCount> thisMonthTrades = purchaseApCheckService.getThisMonthTrade(searchKeyWord.getVendorUU(), enUU, checkDate, fromDate, endDate);
+            erpProdIo.setThisMonthCount(thisMonthTrades);
+        }
+        return erpProdIo;
+    }
+
+    /**
+     * 获取待对账的委外验退单
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 委外验退单
+     */
+    private List<ErpProdIODetail> getMakeReturns(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select  mr_code as inoutno, mr_date as pidate, mr_rate as rate, mr_receivecode as receivecode, " +
+            "mr_receivename as receivename, '客户委外验退单' as piclass, 'make$returnitem' as sourcetable, ma_code as ordercode, 0 as orderdetno, " +
+            "mri_number as detno,  (-(1) *  mri_qty ) as qty, mri_orderpice as orderprice, mr_currency as currency, mri_taxrate as taxrate, " +
+            "mri_whname as whname, mri_ycheckqty as ycheckqty, make$orders.pr_code as prodcode, make$orders.pr_spec as prodspec, " +
+            "make$orders.pr_title as prodtitle, make$orders.pr_unit as produnit, " +
+            "((-(1) *  mri_qty ) - coalesce(mri_ycheckqty, 0)) as thischeckqty, mr_enuu as custuu, ma_useruu custuseruu, mr_venduu as enuu, mri_id as sourceid, " +
+            "mr_sendcode as sendcode, ma_factory as pd_factory, en_name custname from make$return  " +
+            "join make$returnitem on mr_id =  mri_paid " +
+            "join make$orders on mri_odid = ma_id  " +
+            "left join sec$enterprises on mr_enuu = en_uu " +
+            " where mri_qty > abs(coalesce(mri_ycheckqty, 0)) and mr_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and mr_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and ma_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and make$orders.pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and make$orders.pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and mri_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and DAYFORMDATE(mr_date) >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and DAYFORMDATE(mr_date) < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and mr_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的委外验收单
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 委外验收单
+     */
+    private List<ErpProdIODetail> getMakeAccepts(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select  make$accept.ma_code as inoutno, make$accept.ma_date as pidate, make$accept.ma_rate as rate, " +
+            "ma_receivecode as receivecode, ma_receivename as receivename, '客户委外验收单' as piclass, 'make$acceptitem' as sourcetable, " +
+            "make$orders.ma_code as ordercode, 0 as orderdetno, mai_number as detno, mai_qty as qty, mai_orderpice as orderprice, " +
+            "make$accept.ma_currency as currency, mai_taxrate as taxrate, mai_whname as whname, mai_ycheckqty as ycheckqty, " +
+            "make$orders.pr_code as prodcode, make$orders.pr_spec as prodspec, make$orders.pr_title as prodtitle, make$orders.pr_unit as produnit, " +
+            "(mai_qty - coalesce(mai_ycheckqty, 0)) as thischeckqty, make$accept.ma_enuu as custuu, make$orders.ma_useruu custuseruu, make$accept.ma_venduu as enuu, " +
+            "mai_id as sourceid, ma_sendcode as sendcode, ma_factory as factory, en_name custname from make$accept " +
+            "join make$acceptitem on make$accept.ma_id = mai_paid " +
+            "join make$orders on mai_odid = make$orders.ma_id " +
+            "left join sec$enterprises on make$accept.ma_enuu = en_uu " +
+            "where mai_qty > coalesce(mai_ycheckqty, 0) and make$accept.ma_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and ma_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and ma_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and make$orders.pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and make$orders.pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and mai_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and DAYFORMDATE(make$accept.ma_date) >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and DAYFORMDATE(make$accept.ma_date) < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and make$accept.ma_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户不良品出库单
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 客户不良品出库单
+     */
+    private List<ErpProdIODetail> getBadOuts(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select  po_code as inoutno, po_date as pidate, po_rate as rate, po_receivecode as receivecode, " +
+            "po_receivename as receivename, '客户不良品出库单' as piclass, 'purc$badoutitem' as sourcetable, pu_code as pd_ordercode, " +
+            "purc$orderitems.pd_number as orderdetno, poi_number as detno, (-(1) * poi_qty ) as qty, 0 as pd_orderprice, po_currency as currency, " +
+            "poi_taxrate as taxrate, poi_whname as whname, poi_ycheckqty as ycheckqty, pr_code as prodcode, pr_spec as prodspec, pr_title as prodtitle, pr_unit as produnit, " +
+            "((-(1) * poi_qty ) - coalesce( poi_ycheckqty, 0)) as thischeckqty, po_enuu as custuu, pu_useruu custuseruu, po_venduu as enuu, poi_id as sourceid, " +
+            "po_sendcode as sendcode, purc$orderitems.pd_factory as factory, en_name custname from purc$badout " +
+            "join purc$badoutitem on po_id = poi_poid  " +
+            "left join purc$orderitems on poi_pdid = pd_id " +
+            "left join purc$orders on pu_id = pd_puid " +
+            "left join sec$enterprises on po_enuu = en_uu " +
+            "where poi_qty > abs(coalesce( poi_ycheckqty, 0)) and po_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and po_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and pd_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and poi_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and DAYFORMDATE(po_date) >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and DAYFORMDATE(po_date) < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and po_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户不良品入库单
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 客户不良品入库单
+     */
+    private List<ErpProdIODetail> getBadIns(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select pb_code as inoutno, pb_date as pidate, pb_rate as rate, pb_receivecode as receivecode, " +
+            "pb_receivename as receivename, '客户不良品入库单' as piclass, 'purc$badinitem' as sourcetable, pu_code as ordercode, " +
+            "pd_number as orderdetno, pbi_number as detno, pbi_qty as qty, 0 as pd_orderprice, pb_currency as currency, pbi_taxrate as taxrate, " +
+            "pbi_whname as whname, pbi_ycheckqty as ycheckqty, pr_code as prodcode, pr_spec as prodspec, pr_title as prodtitle, pr_unit as produnit, " +
+            "(pbi_qty - coalesce(pbi_ycheckqty, 0)) as thischeckqty, pb_enuu as custuu, pu_useruu custuseruu, pb_venduu as enuu, pbi_id as sourceid, " +
+            "pb_sendcode as sendcode, pd_factory as factory, en_name custname from purc$badin " +
+            "join purc$badinitem on pb_id = pbi_pbid " +
+            "left join purc$orderitems on pbi_pdid = pd_id " +
+            "left join purc$orders on pu_id = pd_puid " +
+            "left join sec$enterprises on pb_enuu = en_uu " +
+            "where pbi_qty > abs(coalesce(pbi_ycheckqty, 0)) and pb_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and pb_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and pd_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and pbi_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and pb_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and pb_date < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and pb_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户采购验退单信息
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 客户采购验退单信息
+     */
+    private List<ErpProdIODetail> getSaleReturns(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select purc$return.pr_code as inoutno, pr_date as pidate, pr_rate as rate, pr_receivecode as receivecode, " +
+            "pr_receivename as receivename, '客户采购验退单' as piclass, 'purc$returnitem' as sourcetable, pu_code as ordercode, pd_number as orderdetno, " +
+            "pri_number as detno, (-(1) * pri_qty ) as qty, pri_orderprice as orderprice, pr_currency as currency, pri_taxrate as taxrate, " +
+            "pri_whname as whname, purc$returnitem.pr_code as prodcode, purc$returnitem.pr_spec as prodspec, purc$returnitem.pr_title as prodtitle, purc$returnitem.pr_unit as produnit, " +
+            "pri_ycheckqty as ycheckqty, ((-(1) * pri_qty ) - coalesce(pri_ycheckqty, 0)) as thischeckqty, pr_enuu as custuu, pu_useruu custuseruu, pr_venduu as enuu, " +
+            "pri_id as sourceid, pr_sendcode as sendcode, pd_factory as factory, en_name custname from purc$return " +
+            "join purc$returnitem on pr_id = pri_prid " +
+            "left join purc$orderitems on pri_pdid = pd_id " +
+            "left join purc$orders on pu_id = pd_puid " +
+            "left join sec$enterprises on pr_enuu = en_uu " +
+            "where pri_qty > abs(coalesce(pri_ycheckqty, 0)) and pr_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and pr_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and pd_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and purc$returnitem.pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and purc$returnitem.pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and pri_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and pr_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and pr_date < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and pr_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户采购验收单信息
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 客户采购验收单信息
+     */
+    private List<ErpProdIODetail> getSaleAccepts(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select pa_code as inoutno, pa_date as pidate, pa_rate as rate, pa_receivecode as receivcode, " +
+            "pa_receivename as receivename, '客户采购验收单' as piclass, 'purc$acceptitem' as sourcetable, pu_code as ordercode, " +
+            "pd_number as orderdetno, pai_number as detno, pai_qty as qty, pai_orderprice as orderprice, pa_currency as currency, " +
+            "pai_taxrate as taxrate,  pai_whname as whname, purc$acceptitem.pr_code as prodcode, purc$acceptitem.pr_spec as prodspec, purc$acceptitem.pr_unit as produnit, " +
+            "purc$acceptitem.pr_title as prodtitle, pai_ycheckqty as ycheckqty, (pai_qty - coalesce(pai_ycheckqty, 0)) as thischeckqty, " +
+            "pa_enuu as custuu, pu_useruu custuseruu, pa_venduu as enuu, pai_id as sourceid, pa_sendcode as sendcode, pd_factory as factory, en_name custname from purc$accept " +
+            "join purc$acceptitem on pai_paid = pa_id " +
+            "left join purc$orderitems on pai_pdid = pd_id " +
+            "left join purc$orders on purc$orders.pu_id = pd_puid " +
+            "left join sec$enterprises on pa_enuu = en_uu " +
+            "where pai_qty > coalesce(pai_ycheckqty, 0) and pa_enuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getReceiveName())) {
+            sql.append("and pa_receivename = '").append(keyword.getReceiveName()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and pd_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and purc$acceptitem.pr_spec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and purc$acceptitem.pr_title = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and pai_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getSuuorname())) {
+            sql.append("and en_name = '").append(keyword.getSuuorname()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and pa_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and pa_date < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and pa_venduu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的货款调账信息
+     *
+     * @param keyword 搜索关键词
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @param enUU 当前企业UU
+     * @return 货款调账信息
+     */
+    private List<ErpProdIODetail> getAdjustments(ApcheckKeyWord keyword, String fromDate, String endDate, Long enUU) {
+        StringBuffer sql = new StringBuffer("select aa_inoutno inoutno, aa_orderdate pidate, aa_rate rate, aa_receivecode receivecode, " +
+            "aa_receivename receivename, '货款调账' as piclass, 'purc$apbilladjustment' as sourcetable, aa_ordercode ordercode, " +
+            "aa_orderdetno orderdetno, aa_detno detno, aa_prid prid, aa_prodcode prodcode, aa_prodspec prodspec, aa_prodtitle prodtitle, aa_produnit as produnit, " +
+            "aa_qty qty, aa_orderprice orderprice, aa_currency currency, aa_taxrate taxrate, aa_whname whname, aa_ycheckqty ycheckqty, " +
+            "(aa_qty - coalesce(aa_ycheckqty, 0)) as thischeckqty, aa_custuu custuu, aa_custuseruu custuseruu, aa_enuu enuu, aa_id sourceid, aa_sendcode sendcode, " +
+            "aa_factory factory, aa_custname custname from purc$apbilladjustment where coalesce(aa_thischeckqty, 0) <> 0 and aa_custuu = ").append(enUU).append(" ");
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getFactory())) {
+            sql.append("and aa_factory = '").append(keyword.getFactory()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdSpec())) {
+            sql.append("and aa_prodspec = '").append(keyword.getProdSpec()).append("' ");
+        }
+        if (!org.apache.axis.utils.StringUtils.isEmpty(keyword.getProdTitle())) {
+            sql.append("and aa_prodtitle = '").append(keyword.getProdTitle()).append("' ");
+        }
+        if (null != keyword.getTaxRate()) {
+            sql.append("and aa_taxrate = '").append(keyword.getTaxRate()).append("' ");
+        }
+        if (fromDate != null) {
+            sql.append("and aa_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and aa_date < '").append(endDate).append("' ");
+        }
+        if (null != keyword.getVendorUU()) {
+            sql.append("and aa_enuu = ").append(keyword.getVendorUU());
+        }
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
 }

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

@@ -561,7 +561,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
          */
         pageInfo.filter("vendEnUU", SystemSession.getUser().getEnterprise().getUu());
         pageInfo.filter("apcheck", Constant.YES);
-        pageInfo.expression(PredicateUtils.ne("totalCountString", "", true));
+        pageInfo.expression(PredicateUtils.ne("totalCountString", " ", true));
         if (filter != null) {
             pageInfo.expression(PredicateUtils.in("myEnUU", filter.getDistribute(), true));
         }

+ 10 - 4
src/main/java/com/uas/platform/b2b/service/impl/PurchaseNoticeServiceImpl.java

@@ -340,8 +340,13 @@ public class PurchaseNoticeServiceImpl implements PurchaseNoticeService {
 
 	@Override
 	public SaleSend send(Long noticeId, SaleSend send) {
-		PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
-		List<SaleSend> sends = saleSendDao.findByUuid(send.getUuid());
+		Integer count = saleSendDao.countByUuid(send.getUuid());
+		// 重复点击发货
+        if (count > 0) {
+            throw new IllegalOperatorException("请不要重复点击发货");
+        }
+        PurchaseNotice notice = purchaseNoticeDao.findOne(noticeId);
+        List<SaleSend> sends = saleSendDao.findByEnUUAndCode(send.getEnUU(), send.getCode());
 		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单)
 		if (notice != null && CollectionUtils.isEmpty(sends)) {
 			if (notice.getEnd() != null && notice.getEnd() == Constant.YES) {
@@ -404,8 +409,9 @@ public class PurchaseNoticeServiceImpl implements PurchaseNoticeService {
 	@Override
 	public SaleSend send(SaleSend saleSend) {
 		//限制同一个供应商给同一个客户发货单号不可以重复,(避免一次发货产生多张单),存在时不做处理
-		List<SaleSend> sendList = saleSendDao.findByUuid(saleSend.getUuid());
-		if (saleSend != null && CollectionUtils.isEmpty(sendList)) {
+        Integer count = saleSendDao.countByUuid(saleSend.getUuid());
+		List<SaleSend> sendList = saleSendDao.findByEnUUAndCode(saleSend.getEnUU(), saleSend.getCode());
+		if (count == 0 && CollectionUtils.isEmpty(sendList)) {
 			saleSend.setBackStatus((short) Status.NOT_UPLOAD.value());
 			saleSend.setSendStatus((short) Status.NOT_UPLOAD.value());
 			saleSend.setEnUU(SystemSession.getUser().getEnterprise().getUu());

+ 10 - 7
src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java

@@ -21,6 +21,7 @@ import com.uas.platform.b2b.model.User;
 import com.uas.platform.b2b.model.UserBaseInfo;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.model.VendorContact;
+import com.uas.platform.b2b.model.VendorContactMan;
 import com.uas.platform.b2b.model.VendorDistribute;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.UserService;
@@ -31,7 +32,6 @@ import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
-import com.uas.ps.core.page.exception.IllegalOperatorException;
 import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
@@ -54,6 +54,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 供应商
@@ -448,17 +449,18 @@ public class VendorsServiceImpl implements VendorService {
         distributeListCopy.addAll(distributeList);
         if (!CollectionUtil.isEmpty(vendorList)) {
             vendorList.forEach(vendor -> {
-                Set<String> contacts = new HashSet<>();
+                Set<VendorContactMan> contacts = new HashSet<>();
                 // 使用后移除,减少后面循环次数
                 Iterator<Distribute> iterator = distributeListCopy.iterator();
                 while (iterator.hasNext()) {
                     Distribute distribute = iterator.next();
                     if (Objects.equals(vendor.getId(), distribute.getVendorId())) {
-                        contacts.add(distribute.getUser().getUserName());
+                        contacts.add(new VendorContactMan(distribute.getUserUU(), distribute.getUser().getUserName()));
                         iterator.remove();
                     }
                 }
-                vendor.setPurchaseContacts(contacts);
+                List<String> contactMans = contacts.stream().map(VendorContactMan::getName).collect(Collectors.toList());
+                vendor.setPurchaseContacts(contactMans);
             });
         }
     }
@@ -499,7 +501,7 @@ public class VendorsServiceImpl implements VendorService {
         distributeListCopy.addAll(distributeList);
         if (!CollectionUtil.isEmpty(vendorList)) {
             vendorList.forEach(vendor -> {
-                Set<String> contacts = new HashSet<>();
+                Set<VendorContactMan> contacts = new HashSet<>();
                 // 使用后移除,减少后面循环次数
                 Iterator<VendorDistribute> iterator = distributeListCopy.iterator();
                 while (iterator.hasNext()) {
@@ -507,11 +509,12 @@ public class VendorsServiceImpl implements VendorService {
                     boolean existContacts = Objects.equals(vendor.getId(), distribute.getVendorId())
                         && (1 == distribute.getIsTransfer() || 1 == distribute.getDistribute());
                     if (existContacts) {
-                        contacts.add(distribute.getUser().getUserName());
+                        contacts.add(new VendorContactMan(distribute.getUserUU(), distribute.getUser().getUserName()));
                         iterator.remove();
                     }
                 }
-                vendor.setSaleContacts(contacts);
+                List<String> contactMans = contacts.stream().map(VendorContactMan::getName).collect(Collectors.toList());
+                vendor.setSaleContacts(contactMans);
             });
         }
     }

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


+ 776 - 2
src/main/webapp/resources/js/index/app.js

@@ -9462,7 +9462,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
     /**
      * 应付对账单
      */
-    app.controller('SaleArCheckCtrl', ['$scope', '$filter', 'FaArCheck', 'ngTableParams', 'toaster', 'BaseService', 'Symbol', function ($scope, $filter, FaArCheck, ngTableParams, toaster, BaseService, Symbol) {
+    app.controller('oldSaleArCheckCtrl', ['$scope', '$filter', 'FaArCheck', 'ngTableParams', 'toaster', 'BaseService', 'Symbol', function ($scope, $filter, FaArCheck, ngTableParams, toaster, BaseService, Symbol) {
         BaseService.scrollBackToTop();
         $scope.active = 'all';
         $scope.dateZoneText = '不限';
@@ -9571,6 +9571,780 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         };
 
     }]);
+    app.controller('SaleArCheckCtrl', ['$scope', 'FaApCheck', 'BaseService', 'ngTableParams', 'toaster', 'ReportService', 'Symbol', 'CurrentRole', 'DecimalNumber', '$filter', '$state', function ($scope, FaApCheck, BaseService, ngTableParams, toaster, ReportService, Symbol, CurrentRole, DecimalNumber, $filter, $state) {
+        BaseService.scrollBackToTop();
+        // 获取当前用户是否为普通用户
+        CurrentRole.isUser({}, {}, function (data) {
+            $scope.isUser = data.isUser;
+        });
+        $scope.dateZoneText = '不限';
+        $scope.condition = {dateZone: 1};
+        $scope.currency = Symbol.currency;//将币别转化为对应的符号
+        $scope.active = 'all';
+        $scope.apCheckCondition = {
+            $open: false
+        }
+        /* 时间筛选初始化*/
+        var fromDate = new Date();
+        var toDate = new Date();
+        fromDate.setMonth(fromDate.getMonth() - 1);
+        fromDate.setHours(0, 0, 0, 0);
+        toDate.setHours(23, 59, 59, 999);
+        $scope.condition.dateFrom = fromDate;
+        $scope.condition.dateTo = toDate;
+
+        //打印  对账单
+        $scope.print = function (check) {
+            var newPage = window.open("about:blank");
+            FaApCheck.printPermission({}, function () {
+                FaApCheck.printCount({id: check.id}, {});//增加打印此次
+                ReportService.print(check.custUu, 'PURCCHECK', 'where purc$apcheck.pa_id =' + check.id, newPage);
+            }, function (response) {
+                newPage.close();
+                toaster.pop('error', '打印失败', response.data);
+            });
+        };
+
+        //状态
+        $scope.setActive = function (state) {
+            if ($scope.active != state) {
+                $scope.active = state;
+                if ($scope.tableParams.page() == 1)
+                    $scope.tableParams.reload();
+                else
+                    $scope.tableParams.page(1);
+                $scope.showNotCheck = false
+            }
+            $scope.condition.$open = false
+            $scope.apCheckCondition.$open = false
+            if (state != 'active') {
+                $scope.changeDateZone(1)
+            }
+        };
+        $scope.changeDateZone = function (zone) {
+            $scope.condition.dateZone = zone;
+            $scope.dateZoneText = zone == 1 ? '最近一个月' : (zone == 3 ? '最近三个月' : (zone == 6 ? '最近六个月' : '自定义'));
+            $scope.condition.$dateZoneOpen = false;
+            getDateCondition(zone, $scope.condition);
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+
+        //获取应收对账单全部
+        $scope.tableParams = new ngTableParams({
+            page: 1,
+            count: 20,
+            sorting: {
+                recordDate: 'desc'
+            }
+        }, {
+            total: 0,
+            counts: [5, 10, 25, 50],
+            getData: function ($defer, params) {
+                $scope.loading = true;
+                var pageParams = params.url();
+                pageParams.searchFilter = { // 筛选条件
+                    fromDate: getDateTime($scope.condition.dateFrom),
+                    endDate: getDateTime($scope.condition.dateTo),
+                    keyword: $scope.keyword
+                };
+                pageParams.keyword = $scope.keyword;
+                if ($scope.active === 'all') {
+                    pageParams.keyword = $scope.keyword
+                    var _fromDate =  $scope.thisMouthOut + '-01 00:00:00'
+                    var _d = new Date(_fromDate)
+                    _d.setDate(1)
+                    _d.setMonth(_d.getMonth() + 1)
+                    _d.setDate(_d.getDate() - 1)
+                    var _endDate = _d.getFullYear() + '-' + (_d.getMonth() + 1) + '-' + _d.getDate() + ' 00:00:00'
+                    _endDate = new Date(_endDate).getTime()
+                    _fromDate = new Date(_fromDate).getTime()
+                    pageParams.searchFilter.fromDate =  _fromDate
+                    pageParams.searchFilter.endDate = _endDate
+                    FaApCheck.vendor(BaseService.parseParams(pageParams), function (page) {
+                        $scope.loading = false;
+                        page.content && page.content.forEach(function(list) {
+                            var _l = []
+                            list.thisMonthCount && list.thisMonthCount.forEach(function(count) {
+                                if (count.amount > 0) {
+                                    _l.push(count)
+                                }
+                            })
+                            list.thisMonthCount = _l
+                            var _k = []
+                            list.totalCount && list.totalCount.forEach(function(count) {
+                                if (count.amount > 0) {
+                                    _k.push(count)
+                                }
+                            })
+                            list.totalCount = _k
+                        })
+                        if (page) {
+                            params.total(page.totalElement);
+                            $defer.resolve(page.content);
+                        }
+                        $scope.ALLList = page.content
+                        $scope.totalCount = page.totalElement;
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '数据加载失败', response.data);
+                    });
+                } else {
+                    FaApCheck[getState($scope.active)](BaseService.parseParams(pageParams), function (page) {
+                        $scope.loading = false;
+                        if (page) {
+                            params.total(page.totalElement);
+                            $scope.data = $defer.resolve(page.content);
+
+                            $scope.searchFilterXls = angular.copy(pageParams.searchFilter);//保存当前取值的条件
+                        }
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '数据加载失败', response.data);
+                    });
+                }
+            }
+        });
+
+        //获得各分类未阅读数量
+        var getUnreadCount = function () {
+            FaApCheck.getUnreadCount(null, function(data){
+                $scope.unread = data;
+            });
+        };
+        getUnreadCount();
+
+        //设置单据已读
+        $scope.setOrdersRead = function (id) {
+            // 如果单据本身已读,则不发送请求修改数据
+            if (!$scope.isUnread(id)){
+                return;
+            }
+            var sourceId = [];
+            sourceId.push(id);
+            FaApCheck.setRead({}, sourceId, function (message) {
+                getUnreadCount();
+            });
+        };
+
+        //获取未读单据id
+        var getUnreadIds = function (){
+            FaApCheck.getUnreadIds({}, "", function (message) {
+                $scope.unreadCode = message.content;
+            });
+        };
+        getUnreadIds();
+        //判断单据是否未读
+        $scope.isUnread = function (id){
+            for (var i in $scope.unreadCode) {
+                if (id == $scope.unreadCode[i]) {
+                    return true;
+                }
+            }
+        };
+
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+        };
+
+        $scope.openFilterDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+            if ($scope.condition.dateFrom && $scope.condition.dateTo && !item[openParam]) {
+                $scope.tableParams.reload();
+            }
+        };
+
+        // 计算单据的商品总数
+        $scope.getTotalProd = function (check) {
+            var total = 0;
+            if (check.items) {
+                angular.forEach(check.items, function (value) {
+                    total += value.checkQty;
+                });
+            }
+            return total;
+        };
+
+        // 搜索框回车
+        $scope.onSearch = function (keyword) {
+            $scope.keyword = keyword;
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+
+        // 选择查找日期
+        $scope.onDateCondition = function () {
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+
+        // 导出
+        $scope.exportXls = function () {
+            FaApCheck.exportXls({}, {}, function (data) {
+                if (data.success){
+                    window.location.href = 'sale/apCheck/xls/list?_state='+$scope.active+'&searchFilter='+encodeURIComponent(angular.toJson($scope.searchFilterXls));
+                }
+            }, function (response) {
+                toaster.pop('error', '数据加载失败', response.data);
+            });
+        }
+
+        $scope.data = [];// 列表数据
+
+        $scope.condition.$fromOpened = false
+
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+        }
+
+        // 客户联想词
+        $scope.getSimilarCustomers = function (value) {
+            if (value) {
+                return Vendor.getSimilarCustomers({keyword: value}).$promise.then(function (data) {
+                    return data.map(function (item) {
+                        return item;
+                    });
+                });
+            }
+        };
+
+        $scope.onAssociateCustomerClick = function (vendor) {
+            if (vendor.apcheck == 0) {
+                toaster.pop('info', '提示', '该客户暂未启用平台对账功能');
+                $scope.suuorname = '';
+            } else {
+                $scope.suuorname = vendor.custName;
+            }
+        }
+
+        //查找客户
+        $scope.searchCust = function (suuorname) {
+            var modalInstance = $modal.open({
+                animation: true,
+                templateUrl: 'static/tpl/index/fa/apcheck_customer.html',
+                controller: 'SearchCustInfoCtrl',
+                size: 'lg',
+                resolve: {
+                    suuorname: function () {
+                        return suuorname;
+                    }
+                }
+            });
+            modalInstance.result.then(function (customer) {
+                $scope.suuorname = customer.myEnterprise.enName;
+                $scope.customerUU = customer.myEnterprise.uu;
+            });
+
+        }
+
+        $scope.showNotCheck = false
+        $scope.goToMNs = function(item) {
+            $scope.chooseItem = item;
+            $scope.showNotCheck = true
+            $scope.vendorUU = item.vendorEnterprise.uu
+            this.searchOrder()
+        }
+
+        // 点击筛选根据条件选择数据
+        // 默认本月
+        $scope.sdateTo = new Date();
+        $scope.sdateFrom = new Date($scope.sdateTo.getFullYear(), $scope.sdateTo.getMonth(), 1);
+        $scope.thisMouth = $scope.sdateTo.getFullYear() +'-'+ ($scope.sdateTo.getMonth())
+        $scope.thisMouthOut = $scope.sdateTo.getFullYear() +'-'+ ($scope.sdateTo.getMonth())
+        $scope.condition.uuorname = '';
+        // $scope.condition.dateFrom = '';
+        // $scope.condition.dateTo = '';
+        $scope.condition.venduuorname = '';
+        $scope.condition.factory = '';
+        $scope.condition.prodtitle = '';
+        $scope.condition.prodspec = '';
+
+        $scope.searchOrder = function (check) {
+            $scope.data = [];
+            $scope.dataInfo = {
+                totalCount: [],
+                thisMonthCount: []
+            }
+            $scope.checkboxes.checked = false;
+            $scope.totalMoney = 0;
+            $scope.condition.uuorname = $scope.suuorname;
+            $scope.condition.factory = $scope.factory
+            $scope.condition.prodtitle = $scope.prodtitle;
+            $scope.condition.prodspec = $scope.prodspec;
+            // $scope.condition.dateFrom = ($scope.sdateFrom || 0);
+            $scope.thisdatato = ($scope.sdateTo || 0);
+            if ($scope.thisdatato != 0) {
+                $scope.condition.dateTo = (new Date($scope.thisdatato.valueOf()) || 0);
+            } else {
+                $scope.condition.dateTo = ($scope.sdateTo || 0);
+            }
+            $scope.condition.venduuorname = $scope.vuuorname;
+            if ($scope.condition.dateTo != null || $scope.keywordXls != null) {
+
+                // $scope.fromDate = $scope.condition.dateFrom ? $scope.condition.dateFrom.getTime() : null;
+                // $scope.endDate = $scope.condition.dateTo ? $scope.condition.dateTo.getTime() : null;
+                $scope.searchKeyWord = {
+                    receiveName: $scope.receiveName,
+                    factory: $scope.factory,
+                    prodTitle: $scope.prodTitle,
+                    prodSpec: $scope.prodSpec,
+                    taxRate: $scope.taxRate,
+                    vendorUU: $scope.vendorUU
+                }
+                $scope.exportKeywords = encodeURIComponent($scope.searchKeyWord);
+                $scope.fromDate = $scope.apCheckCondition.dateFrom ? $scope.apCheckCondition.dateFrom.getTime() : null;
+                $scope.endDate = $scope.apCheckCondition.dateTo ? $scope.apCheckCondition.dateTo.getTime() : null;
+                $scope.loading = true;
+                var _params = {}
+                if ($scope.apCheckCondition.$open) {
+                    _params = {
+                        fromDate: $scope.fromDate,
+                        endDate: $scope.endDate,
+                        receiveName: $scope.receiveName,
+                        factory: $scope.factory,
+                        prodTitle: $scope.prodTitle,
+                        prodSpec: $scope.prodSpec,
+                        taxRate: $scope.taxRate,
+                        checkDate: $scope.thisMouth,
+                        vendorUU: $scope.vendorUU
+                    }
+                } else {
+                    _params = {
+                        receiveName: $scope.receiveName,
+                        factory: $scope.factory,
+                        prodTitle: $scope.prodTitle,
+                        prodSpec: $scope.prodSpec,
+                        taxRate: $scope.taxRate,
+                        checkDate: $scope.thisMouth,
+                        vendorUU: $scope.vendorUU
+                    }
+                }
+                FaApCheck.getAllArCheckByKeywords(_params, function (data) {
+                    $scope.checkMain = data;
+                    if (data.details.length > 0) {
+                        angular.forEach(data.details, function (item) {
+                            item.$selected = true;
+                        });
+                        var _mouthArr = []
+                        data.thisMonthCount.forEach(function(item) {
+                            if (item.amount > 0) {
+                                _mouthArr.push(item)
+                            }
+                        })
+                        data.thisMonthCount = _mouthArr
+                        var _totalArr = []
+                        data.totalCount.forEach(function(item) {
+                            if (item.amount > 0) {
+                                _totalArr.push(item)
+                            }
+                        })
+                        data.totalCount = _totalArr
+                        $scope.dataInfo = data
+                        $scope.data = data.details;
+                        $scope.checkboxes.checked = true;
+                        // $scope.suuorname = data.vendorName
+                        $scope.getTotalMoney();
+                    } else {
+                        toaster.pop('info', '提示', '当前没有需要对账记录');
+                    }
+                    $scope.suuorname = data.vendorName
+                    $scope.loading = false;
+                }, function (response) {
+                    $scope.loading = false;
+                    toaster.pop('error', '提示', response.data);
+                });
+                // }
+            }
+
+        }
+
+        $scope.exportApcheckList = function() {
+            var url = 'sale/arCheck/xls?1=1';
+            if (null !== $scope.fromDate && null !== $scope.endDate) {
+                url = url + '&fromDate=' + $scope.fromDate + '&endDate=' + $scope.endDate;
+            }
+            if (angular.isDefined($scope.thisMouth)) {
+                url = url + '&checkDate=' + $scope.thisMouth;
+            }
+            if (angular.isDefined($scope.receiveName)) {
+                url = url + '&receiveName=' + $scope.receiveName;
+            }
+            if (angular.isDefined($scope.factory)) {
+                url = url + '&factory=' + $scope.factory;
+            }
+            if (angular.isDefined($scope.prodTitle)) {
+                url = url + '&prodTitle=' + $scope.prodTitle;
+            }
+            if (angular.isDefined($scope.prodSpec)) {
+                url = url + '&prodSpec=' + $scope.prodSpec;
+            }
+            if (angular.isDefined($scope.suuorname)) {
+                url = url + '&suuorname=' + $scope.suuorname;
+            }
+            if (angular.isDefined($scope.vendorUU)) {
+                url = url + '&vendorUU=' + $scope.vendorUU;
+            }
+            if (angular.isDefined($scope.taxRate)) {
+                url = url + '&taxRate=' + $scope.taxRate;
+            }
+            window.location.href = url;
+        }
+
+        /**
+         * 点击勾选框,选中要转应收对账单的订单
+         * */
+        $scope.totalMoney = 0;
+        $scope.checkboxes = {
+            checked: false
+        };
+
+        // 点击勾选全部的复选框
+        $scope.checkAll = function () {
+            $scope.totalMoney = 0;
+            $scope.filteredData = $filter('filter')($scope.data, $scope.condition.prodtitle || $scope.condition.uuorname || $scope.condition.venduuorname || $scope.condition.prodspec || $scope.condition.factory);
+            // var dateFrom = $scope.condition.dateFrom;
+            // var dateTo = $scope.condition.dateTo;
+            angular.forEach($scope.filteredData, function (item) {
+                // if ((item.pidate >= dateFrom || dateFrom == '') && (item.pidate < dateTo || dateTo == '')) {
+                item.$selected = $scope.checkboxes.checked;
+                // }
+            });
+            $scope.getTotalMoney();
+        };
+
+        //获取已选单据总金额
+        $scope.getTotalMoney = function () {
+            $scope.totalMoney = 0;
+            angular.forEach($scope.data, function (check) {
+                if (check.$selected) {
+                    var price = DecimalNumber.accMul((check.thischeckqty || 0), (check.orderprice || 0));
+                    $scope.totalMoney += Math.round(price * 100) / 100;
+                } else {
+                    $scope.totalMoney += 0;
+                }
+            });
+
+        }
+
+        // 点击其中一个明细的复选框
+        $scope.checkOne = function (check) {
+            check.$selected = !check.$selected
+            $scope.Checkall()
+        };
+        $scope.stopPrevent = function(e) {
+            e = e || window.event
+            e.stopPropagation();
+            $scope.Checkall()
+            // event.preventDefault();
+            return false;
+        }
+        $scope.Checkall = function() {
+            var result = true;
+            angular.forEach($scope.data, function (item) {
+                if (item.$selected != true) {
+                    result = false;
+                    return;
+                }
+            });
+            $scope.checkboxes.checked = result;
+        }
+
+        $scope.haveSelected = false;
+
+        //生成应收对账单
+        $scope.createApCheck = function () {
+            //保存应收对账单主记录字段
+            $scope.apCheck = {
+                custUu: '',
+                custName: '',
+                enUu: '',
+                apDate: '',
+                beginDate: '',
+                endDate: '',
+                checkStatus: '未对账',
+                checkAmount: 0,
+                currency: '',
+                rate: '',
+                items: [],
+                taxrate: ''
+            };
+            //保存来源单据相关信息
+            var sourceInfos = [];
+
+
+            //所允许的本次对账最大最小数量
+            $scope.data.maxThisCheckQty = 0;
+            $scope.data.minThisCheckQty = 0;
+
+            $scope.sameCust = true;
+            $scope.validQty = true;
+            $scope.loading = true;
+
+            angular.forEach($scope.data, function (check) {
+                //保存应收对账单明细行数据
+                $scope.item = {
+                    inoutno: '',
+                    inoutnodetno: '',
+                    orderCode: '',
+                    orderClass: '',
+                    orderDetno: '',
+                    price: '',
+                    checkQty: '',
+                    amount: '',
+                    sourceId: '',
+                    sourceTable: '',
+                    oldYCheckQty: '',
+                    status: 0,
+                    receiveCode: '',
+                    receiveName: '',
+                    prodCode: '',
+                    prodTitle: '',
+                    prodUnit: '',
+                    prodSpec: '',
+                    taxrate: '',
+                    sendcode: '',
+                    whname: '',
+                    custUserUU: ''
+                };
+
+                //应收对账单明细行来源表信息
+                $scope.sourceInfo = {
+                    sourceId: '',
+                    sourceTable: '',
+                    newYCheckQty: ''
+                };
+
+                //此次对账后新的已转数
+                $scope.newYCheckQty = 0;
+                if (check.$selected == true) {
+                    $scope.apCheck.custName = check.custname;
+                    $scope.apCheck.enUu = check.enuu;
+                    $scope.apCheck.checkAmount += (check.thischeckqty || 0) * (check.orderprice || 0);
+                    $scope.apCheck.apDate = check.pidate;
+                    $scope.apCheck.rate = check.rate;
+
+                    //必须是同一家客户才能生成对账单,否则提示错误
+                    if ($scope.apCheck.custUu == '') {
+                        $scope.apCheck.custUu = check.custuu;
+                    } else if ($scope.apCheck.custUu !== check.custuu) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择同一家客户');
+                    }
+
+                    //必须是相同币别才能生成对账单,否则提示错误
+                    if ($scope.apCheck.currency == '') {
+                        $scope.apCheck.currency = check.currency;
+                    } else if ($scope.apCheck.currency !== check.currency) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择同一种币别');
+                    }
+
+                    //必须是相同税率才能生成对账单,否则提示错误
+                    if (!angular.isNumber($scope.apCheck.taxrate)) {
+                        $scope.apCheck.taxrate = check.taxrate;
+                    } else if ($scope.apCheck.taxrate != check.taxrate) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择相同的税率');
+                    }
+
+                    //本次对账数量必须小于总对账数量
+                    if (check.qty > 0) {
+                        $scope.data.maxThisCheckQty = check.qty;
+                        $scope.data.minThisCheckQty = 0;
+                        if (check.qty - (check.ycheckqty || 0) < check.thischeckqty || check.thischeckqty < 0 || check.thischeckqty == 0) {
+                            $scope.validQty = false;
+                            $scope.loading = false;
+                            toaster.pop('error', '本次对账数量,填写有误!');
+                        }
+                    } else if (check.qty < 0) {
+                        $scope.data.maxThisCheckQty = 0;
+                        $scope.data.minThisCheckQty = check.qty;
+                        if (((-check.qty) - (-check.ycheckqty) < (-check.thischeckqty)) || check.thischeckqty > 0 || check.thischeckqty == 0) {
+                            $scope.validQty = false;
+                            $scope.loading = false;
+                            toaster.pop('error', '本次对账数量,填写有误!');
+                        }
+                    }
+
+                    //获取筛选时间的开始时间为对账的开始时间
+                    $scope.apCheck.beginDate = $scope.fromDate;
+
+                    //获取筛选的截止时间为对账的截止时间
+                    $scope.apCheck.endDate = $scope.endDate;
+
+                    //应收对账单明细行数据
+                    $scope.item.orderCode = check.ordercode;
+                    $scope.item.orderClass = check.piclass;
+                    $scope.item.orderDetno = check.orderdetno;
+                    $scope.item.price = check.orderprice;
+                    $scope.item.checkQty = check.thischeckqty;
+                    $scope.item.amount = (check.thischeckqty || 0) * (check.orderprice || 0);
+                    $scope.item.sourceId = check.sourceid;
+                    $scope.item.sourceTable = check.sourcetable;
+                    $scope.item.oldYCheckQty = check.ycheckqty;
+                    $scope.item.prodCode = check.prodcode;
+                    $scope.item.prodTitle = check.prodtitle;
+                    $scope.item.prodSpec = check.prodspec;
+                    $scope.item.prodUnit = check.produnit;
+                    $scope.item.inoutno = check.inoutno;
+                    $scope.item.inoutnodetno = check.detno;
+                    $scope.item.taxrate = check.taxrate;
+                    $scope.item.receiveCode = check.receivecode;
+                    $scope.item.receiveName = check.receivename;
+                    $scope.item.sendcode = check.sendcode;
+                    $scope.item.whname = check.whname;
+                    $scope.item.custUserUU = check.custuseruu;
+
+                    //来源表相关信息
+                    $scope.sourceInfo.sourceid = check.sourceid;
+                    $scope.sourceInfo.sourcetable = check.sourcetable;
+                    $scope.sourceInfo.newYCheckQty = ((check.ycheckqty || 0) + check.thischeckqty);
+
+                    sourceInfos.push($scope.sourceInfo);
+                    $scope.apCheck.items.push($scope.item);
+                    $scope.haveSelected = true;
+                }
+            });
+
+            //保存生成的应收对账单
+            $scope.saveApCheck = function () {
+                if ($scope.apCheck.items.length == 0) {
+                    $scope.loading = false;
+                    toaster.pop('error', '请先选择需要对账的数据');
+                } else {
+                    FaApCheck.saveApCheck({}, $scope.apCheck, function (data) {
+                        $scope.loading = false;
+                        toaster.pop('success', '成功', '生成应收对账成功');
+                        $state.go('fa.apCheck_detail', {id: data.id}, {reload: true});
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '生成对账单失败', response.data);
+                    })
+                }
+            };
+
+            //如果是同一家客户,生成对账单的同时,关闭模态框
+            if ($scope.sameCust && $scope.validQty) {
+                $scope.saveApCheck();
+            }
+
+
+        }
+        // 新增
+        $scope.MouthOutShow = true
+        $scope.MouthinShow = true
+        $scope.apCheckopenFilterDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+            if ($scope.apCheckCondition.dateFrom && $scope.apCheckCondition.dateTo && !item[openParam]) {
+                $scope.searchOrder()
+            }
+        };
+        $scope.addMouth = function(val) {
+            var _sp = new Date()
+            var _time = new Date($scope.thisMouth)
+            _time.setMonth(_time.getMonth() + val)
+            _time.setDate(1)
+            _time.setMonth(_time.getMonth() + 1)
+            _time.setDate(_time.getDate() - 1)
+            if (_time.getTime() >= _sp.getTime()) {
+                $scope.MouthinShow = false
+            } else {
+                $scope.MouthinShow = true
+            }
+            $scope.thisMouth = _time.getFullYear() + '-' + (_time.getMonth() + 1)
+            $scope.apCheckCondition.$open = false
+            $scope.searchOrder()
+        }
+
+        $scope.addMouthOut = function(val) {
+            var _sp = new Date()
+            var _time = new Date($scope.thisMouthOut)
+            _time.setMonth(_time.getMonth() + val)
+            _time.setDate(1)
+            _time.setMonth(_time.getMonth() + 1)
+            _time.setDate(_time.getDate() - 1)
+            if (_time.getTime() >= _sp.getTime()) {
+                $scope.MouthOutShow = false
+            } else {
+                $scope.MouthOutShow = true
+            }
+            $scope.thisMouthOut = _time.getFullYear() + '-' + (_time.getMonth() + 1)
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        }
+
+        $scope.hideshowNotCheck = function() {
+            $scope.showNotCheck = false
+        }
+
+        $scope.$watch('thisMouthOut', function(newVal, oldVal) {
+            var _fromDate = new Date()
+            var _d = new Date(_fromDate)
+            _d.setDate(1)
+            _d.setMonth(_d.getMonth() + 1)
+            _d.setDate(_d.getDate() - 1)
+
+            var _time2 = new Date(newVal)
+            if (_time2.getTime() > _d.getTime()) {
+                toaster.pop('error', '提示', '所选对账日期不能超过当前时间');
+                $scope.thisMouthOut = oldVal
+                return
+            }
+            if (newVal !== oldVal) {
+                var _d = new Date(newVal)
+                _d.setDate(1)
+                _d.setMonth(_d.getMonth() + 1)
+                _d.setDate(_d.getDate() - 1)
+
+                if (_d.getTime() >= _fromDate.getTime()) {
+                    $scope.MouthOutShow = false
+                } else {
+                    $scope.MouthOutShow = true
+                }
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            }
+        })
+        $scope.$watch('thisMouth', function(newVal, oldVal) {
+            var _fromDate = new Date()
+            var _d = new Date(_fromDate)
+            _d.setDate(1)
+            _d.setMonth(_d.getMonth() + 1)
+            _d.setDate(_d.getDate() - 1)
+
+            var _time2 = new Date(newVal)
+            if (_time2.getTime() > _d.getTime()) {
+                toaster.pop('error', '提示', '所选对账日期不能超过当前时间');
+                $scope.thisMouth = oldVal
+                return
+            }
+            if (newVal !== oldVal) {
+                var _d = new Date(newVal)
+                _d.setDate(1)
+                _d.setMonth(_d.getMonth() + 1)
+                _d.setDate(_d.getDate() - 1)
+
+                if (_d.getTime() >= _fromDate.getTime()) {
+                    $scope.MouthinShow = false
+                } else {
+                    $scope.MouthinShow = true
+                }
+                $scope.searchOrder()
+            }
+        })
+
+    }])
 
     // 应付对账单详情页
     app.controller('SaleArCheckDetailCtrl', ['$scope', '$stateParams', 'FaArCheck', 'toaster', '$state', 'BaseService', function ($scope, $stateParams, FaArCheck, toaster, $state, BaseService) {
@@ -10042,7 +10816,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                 url = url + '&suuorname=' + $scope.suuorname;
             }
             if (angular.isDefined($scope.taxRate)) {
-                url = url + '&receiveName=' + $scope.taxRate;
+                url = url + '&taxRate=' + $scope.taxRate;
             }
             window.location.href = url;
         }

+ 10 - 1
src/main/webapp/resources/js/index/services/Fa.js

@@ -26,7 +26,8 @@ define([ 'ngResource'], function() {
 			getAllByKeywords: {
 				url: 'sale/apBillOut/getAllByKeywords',
 				method: 'GET',
-			},getDoneApCheckByKeywords: {
+			},
+            getDoneApCheckByKeywords: {
 				url: 'sale/apBillOut/getDoneByKeywords',
 				method: 'GET',
 				isArray: true
@@ -119,6 +120,10 @@ define([ 'ngResource'], function() {
             customer: {
                 url: 'sale/apCheck/customer',
                 method: 'GET'
+            },
+			vendor: {
+			    url: 'sale/arCheck/vendor',
+                method: 'GET'
             },
 			getAllCustomers: {
 				url: 'sale/apCheck/getAllCustomers',
@@ -129,6 +134,10 @@ define([ 'ngResource'], function() {
 				url: 'sale/apCheck/getAllByKeywords',
 				method: 'GET',
 			},
+            getAllArCheckByKeywords: {
+                url: 'sale/arCheck/getAllByKeywords',
+                method: 'GET',
+            },
 			saveApCheck: {
 				url : 'sale/apCheck/operation/save',
 				method: 'POST'

+ 2 - 2
src/main/webapp/resources/tpl/index/fa/apCheck.html

@@ -468,7 +468,7 @@
 						</label>
 					</div>
 					<div style="text-align: left;margin-top: 20px">
-						<label>本期间应收:</label>
+						<label>本期间应收总额:</label>
 						<label style="text-align:left;vertical-align: top;">
 							<div ng-if="dataInfo.thisMonthCount.length > 0" ng-repeat="count in dataInfo.thisMonthCount">
 								<span>{{count.currency}}:{{count.amount | number:2}}</span>
@@ -705,7 +705,7 @@
 					</tr>
 				</table>
 			</div>
-			<div style="padding: 10px 20px">总合计:{{totalMoney | number:2 || 0}}</div>
+			<div style="padding: 10px 20px">本期间应收总额:{{totalMoney | number:2 || 0}}</div>
 		</div>
 	</div>
 </div>

+ 635 - 107
src/main/webapp/resources/tpl/index/fa/arCheck.html

@@ -28,7 +28,7 @@
 		line-height: 30px;
 		padding-top: 5px;
 		padding-bottom: 0px;
-		width: 150px;
+		width: 33%;
 		font-size: 14px;
 		color: #666;
 		padding-left: 15px;
@@ -36,7 +36,7 @@
 	}
 	.order-table td .static p:first-child{
 		border-left: none;
-		width: 180px;
+		/*width: 180px;*/
 		padding-left: 0;
 	}
 	.order-table td .static p:last-child{
@@ -114,8 +114,21 @@
 		margin-top: -17px;
 		margin-right: 14px;
 	}
+	.menu .new-dot{
+		width: 20px;
+		height: 20px;
+		line-height: 20px;
+		font-size: 12px;
+		color: #fff;
+		font-weight: inherit;
+		top: -2px;
+	}
+	.wui-date.small .wui-date-picker {
+		width: 260px
+	}
 </style>
 <link rel="stylesheet" href="static/css/public.css">
+<link rel="stylesheet" href="static/css/wui.min.css">
 <div class="block" id="public">
 	<div class="loading in" ng-class="{'in': loading}">
 		<!--<i></i>-->
@@ -126,129 +139,644 @@
 	<div class="pub-com_head">
 		<span>应付对账单</span>
 		<div class="p-right">
+			<!--<a class="text-simple append" ui-sref="fa.apCheckList" title="新增对账单" ng-hide="showNotCheck"><i class="fa fa-plus-square fa-fw"></i>新增对账单</a>&nbsp;&nbsp;&nbsp;-->
+			<a href="#" ng-click="exportXls()" ng-hide="active === 'all'"
+			   target="_self" title="导出Excel表格" class="blue f14"><i class="fa fa-file-text fa-fw"></i>导出</a>
 		</div>
 	</div>
-	<div class="condition block">
-		<div class="search-bg condition block" style="padding: 10px 15px;">
-			<div class="row">
-				<div id="topSearch" style="float: left">
-					<a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月" ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
-					<a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月" ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
-					<a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月" ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
-					<a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义" ng-class="{'active':condition.dateZone=='-1'}" >自定义</a>
-				</div>
-				<div class="col-xs-6" style="float: right;">
-					<div class="search">
-						<div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
-							 on-toggle="searchAdvance=open">
-							<input type="search" class="form-control input-sm" ng-model="keyword"
-								   ng-search="onSearch()" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%"/>
-							<a class="btn input-group-addon" ng-click="onSearch()">搜索</a>
-						</div>
+	<div class="menu condition block">
+		<div class="row">
+			<div class="col-xs-7">
+				<div class="btn-group btn-group-sm btn-group-justified">
+					<div class="btn-group btn-group-sm/fa/arCheck">
+						<button type="button" class="btn btn-default btn-line"
+								ng-class="{'btn-info':active=='all'}" ng-click="setActive('all')">未对账</button>
 					</div>
+					<!--<div class="btn-group btn-group-sm">-->
+					<!--<button type="button" class="btn btn-default btn-line"-->
+					<!--ng-class="{'btn-info':active=='todo'}"-->
+					<!--ng-click="setActive('todo')">待确认</button>-->
+					<!--</div>-->
+					<div class="btn-group btn-group-sm">
+						<button type="button" class="btn btn-default btn-line"
+								ng-class="{'btn-info':active=='done'}"
+								ng-click="setActive('done')">已对账
+							<!--<b class="new-dot" ng-if="unread.replied > 0">{{unread.replied>99?'99+':unread.replied}}</b>-->
+						</button>
+					</div>
+					<!--<div class="btn-group btn-group-sm">-->
+						<!--<button type="button" class="btn btn-default btn-line"-->
+								<!--ng-class="{'btn-info':active=='end'}" ng-click="setActive('end')">已作废-->
+							<!--<b class="new-dot" ng-if="unread.cancelled > 0">{{unread.cancelled > 99 ? '99+' : unread.cancelled}}</b>-->
+						<!--</button>-->
+					<!--</div>-->
 				</div>
 			</div>
-			<div class="more-list more" ng-class="{'open': condition.$open}">
-				<form class="form-inline">
-					<div class="form-group ">
-						<label>日期:</label>
-						<div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
-							<ul class="dropdown-menu">
-								<li><a ng-click="changeDateZone(1)">一个月内</a></li>
-								<li><a ng-click="changeDateZone(6)">半年内</a></li>
-								<li><a ng-click="changeDateZone()">半年前</a></li>
-							</ul>
-						</div>
-						<div class="form-group input-group input-group-xs input-trigger">
-							<input type="text" ng-model="condition.dateFrom"
-								   class="form-control" placeholder="从"
-								   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
-								   ng-required="true" max-date = "condition.dateTo"
-								   current-text="今天" clear-text="清除" close-text="关闭"
-								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
-								   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
-							<span class="input-group-btn">
-							<button type="button" class="btn btn-default"
-									ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
-								<i class="fa fa-calendar"></i>
-							</button>
+			<div class="col-xs-4 f12" style="text-align: right;height: 40px;line-height: 40px; margin-right: 20px; float: right;">
+				<div class="btn-group btn-group-sm"  style="float: right;font-size: 14px;cursor: pointer;" ng-hide="!showNotCheck" ng-click="hideshowNotCheck()">
+					<img src="static/img/vendor/images/backIcon.png" width="20"/>返回
+					<!--<b class="new-dot" ng-if="unread.cancelled > 0">{{unread.cancelled > 99 ? '99+' : unread.cancelled}}</b>-->
+
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div ng-hide="showNotCheck">
+		<div class="condition block"  ng-show="!showNotCheck">
+			<div class="search-bg condition block" style="padding: 10px 15px;">
+				<div class="row">
+					<div id="topSearch" ng-show="active !== 'all'" style="float: left">
+						<a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月" ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
+						<a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月" ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
+						<a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月" ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
+						<a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义" ng-class="{'active':condition.dateZone=='-1'}" >自定义</a>
+					</div>
+					<div  style="float: left" ng-show="active === 'all'" >
+						<label class="control-label">请选择月份:</label>
+						<span ng-click="addMouthOut(-1)" style="display: inline-block;
+							width: 32px;
+							height: 32px;
+							border: 1px solid #ddd;
+							text-align: center;
+							line-height: 32px;
+							cursor: pointer;
+							vertical-align: middle;">
+							<img src="static/img/vendor/images/arrow-left-d-l.png" width="24"/>
+						</span>
+						<span class="inputsIcon control-label" style="padding-right: 0px;display: inline-block;vertical-align: top;">
+						  <wui-date
+								  format="yyyy-mm"
+								  placeholder="请选择或输入日期"
+								  id="date3"
+								  btns="{'ok':'确定','now':'此刻'}"
+								  ng-model="thisMouthOut"
+						  >
+						  </wui-date>
 						</span>
+						<span ng-show="MouthOutShow"  ng-click="addMouthOut(1)" style="display: inline-block;
+							width: 32px;
+							height: 32px;
+							border: 1px solid #ddd;
+							text-align: center;
+							line-height: 32px;
+							cursor: pointer;
+							vertical-align: middle;"><img src="static/img/vendor/images/arrow-right-d-l.png" width="24"/></span>
+					</div>
+					<div class="col-xs-6" style="float: right;">
+						<div class="search">
+							<div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
+								 on-toggle="searchAdvance=open">
+								<input type="search" class="form-control input-sm" ng-model="keyword"
+									   ng-search="onSearch(keyword)" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%" ng-show="active !== 'all'"/>
+								<a class="btn input-group-addon" href="javascript:void(0)" ng-click="onSearch(keyword)" ng-show="active !== 'all'">搜索</a>
+
+								<input type="search" class="form-control input-sm" ng-model="keyword" ng-search="onSearch(keyword)" placeholder="供应商名称" style="width: 100%" ng-show="active === 'all' && !showNotCheck" />
+								<a class="btn input-group-addon" ng-click="onSearch(keyword)" ng-show="active === 'all' && !showNotCheck">搜索</a>
+							</div>
 						</div>
-						<div class="form-group input-group input-group-xs input-trigger">
-							<input type="text" ng-model="condition.dateTo"
-								   class="form-control" placeholder="到"
-								   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
-								   ng-required="true" min-date = "condition.dateFrom"
-								   current-text="今天" clear-text="清除" close-text="关闭"
-								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
-								   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
-							<span class="input-group-btn">
+					</div>
+				</div>
+				<div class="more-list more" ng-class="{'open': condition.$open}">
+					<form class="form-inline">
+						<div class="form-group ">
+							<label>日期:</label>
+							<div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
+								<ul class="dropdown-menu">
+									<li><a ng-click="changeDateZone(1)">一个月内</a></li>
+									<li><a ng-click="changeDateZone(6)">半年内</a></li>
+									<li><a ng-click="changeDateZone()">半年前</a></li>
+								</ul>
+							</div>
+							<div class="form-group input-group input-group-xs input-trigger">
+								<input type="text" ng-model="condition.dateFrom"
+									   class="form-control" placeholder="从"
+									   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
+									   ng-required="true" max-date = "condition.dateTo"
+									   current-text="今天" clear-text="清除" close-text="关闭"
+									   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+									   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
+								<span class="input-group-btn">
+								<button type="button" class="btn btn-default"
+										ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
+									<i class="fa fa-calendar"></i>
+								</button>
+							</span>
+							</div>
+							<div class="form-group input-group input-group-xs input-trigger">
+								<input type="text" ng-model="condition.dateTo"
+									   class="form-control" placeholder="到"
+									   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
+									   ng-required="true" min-date = "condition.dateFrom"
+									   current-text="今天" clear-text="清除" close-text="关闭"
+									   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+									   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
+								<span class="input-group-btn">
 							<button type="button" class="btn btn-default"
 									ng-click="openFilterDatePicker($event, condition, '$toOpened')">
 								<i class="fa fa-calendar"></i>
 							</button>
 						</span>
+							</div>
 						</div>
-					</div>
-				</form>
+					</form>
+				</div>
 			</div>
 		</div>
+		<div ng-show="active === 'all'">
+			<table class="order-table block order-table2" ng-table="tableParams" width="100%" style="table-layout:fixed">
+				<thead>
+				<tr class="header">
+					<th width="313">应付供应商</th>
+					<th width="250">本月应付</th>
+					<th width="250">应付总额</th>
+					<th width="160">操作</th>
+				</tr>
+				</thead>
+				<tbody ng-repeat="check in ALLList">
+				<tr >
+					<td style="color: #3f84f6">{{::check.vendorEnterprise.enName}}</td>
+					<td ng-if="check.thisMonthCount.length > 0">
+						<div ng-repeat="count in check.thisMonthCount">
+							<span>{{count.currency}}:{{count.amount | number:2}}</span>
+						</div>
+					</td>
+					<td ng-if="check.thisMonthCount.length === 0">-</td>
+					<td ng-if="check.totalCount.length > 0">
+						<div ng-repeat="count in check.totalCount">
+							<span ng-if="count.amount > 0">{{count.currency}}:{{count.amount | number:2}}</span>
+						</div>
+					</td>
+					<td ng-if="check.totalCount.length === 0">-</td>
+					<td style="color: #3f84f6;cursor: pointer" ng-click="goToMNs(check)">对账详情</td>
+				</tr>
+				</tbody>
+				<tbody ng-if="!ALLList || ALLList.length == 0">
+				<tr>
+					<td colspan="4">
+						<div id="empty">
+							<div class="left_img">
+								<a><img src="static/img/empty/uas_empty.png"></a>
+								<a>B2B 商务</a>
+							</div>
+							<div class="right_link">
+								<!--<p ng-if="active != 'all'">您还未生成对账单,请立即新增对账!</p>-->
+								<!--<a ng-if="active != 'all'" ui-sref="fa.apCheckList"><i class="fa fa-plus-square fa-fw"></i> 新增对账单</a>-->
+							</div>
+						</div>
+					</td>
+				</tr>
+				</tbody>
+			</table>
+		</div>
+		<div ng-show="active !== 'all'">
+			<table class="order-table block" ng-table="tableParams">
+				<thead>
+				<tr class="header">
+					<th width="150">对账期间</th>
+					<th width="180">对账总额</th>
+					<th width="180">对账人</th>
+					<!--<th width="180">商品总数</th>-->
+					<!--<th width="100">对账结果</th>-->
+					<!--<th width="100">操作</th>-->
+				</tr>
+				</thead>
+				<tbody ng-repeat="check in $data">
+				<tr>
+					<td class="first info" colspan="3">
+						<div class="">
+							<a href="javascript:void(0)" ng-if="!isUnread(check.id)">
+								<i class="fa fa-circle-thin"></i>
+							</a>
+							<a href="javascript:void(0)" ng-if="isUnread(check.id)">
+								<i class="fa fa-circle" style="color: #f40;"></i>
+							</a>&nbsp;&nbsp;
+							<span class="text-num" title="录单时间">{{::check.recordDate | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>&nbsp;&nbsp;&nbsp;
+							<span style="margin-left: 100px;width: 200px;display: inline-block;"><i class="fa fa-star" ng-class="{'text-default':check.status==201}"></i> {{::check.custName}}</span>
+							<span style="margin-left: 200px;">单据编号:</span>
+							<span class="text-num"><a ui-sref="fa.arCheck_detail({id:check.id})" title="点击查看详情" ng-click="setOrdersRead(check.id)" style="color: #5078cb">{{::check.code}}</a></span>
+						</div>
+						<div class="static">
+							<p><span class="f14 text-num">{{::check.beginDate | date:'yyyy/MM/dd'}} - {{::check.endDate | date:'yyyy/MM/dd'}}</span></p>
+							<p>
+								<strong class="text-num">{{::(isUser?'-':(check.checkAmount | number:2))}}</strong>
+								<span ng-if="!isUser" class="text-number">{{::check.currency}}</span>
+							</p>
+							<p style="text-align: center;margin-left: 0px">
+								对账人:{{::check.recorder}}
+							</p>
+							<!--<p>-->
+							<!--<strong class="text-num">{{::check.items.length}}</strong> 条<br>-->
+							<!--</p>-->
+							<!--<p>-->
+							<!--<strong class="text-num">{{getTotalProd(check) | number}}</strong> <i class="fa fa-cubes"></i>-->
+							<!--</p>-->
+						</div>
+					</td>
+
+					<!--<td class="status">-->
+						<!--&lt;!&ndash;<div ng-if="check.checkStatus == '未对账'" class="text-center text-muted f14"><br>未对账!</div>&ndash;&gt;-->
+						<!--<div></div>-->
+						<!--<div ng-if="check.checkStatus == '已确认'" class="text-center text-muted f14">-->
+							<!--<br> <i class="fa fa-check-square-o"></i> 已确认-->
+						<!--</div>-->
+						<!--<div ng-if="check.checkStatus == '不同意'" class="text-center text-muted f14">-->
+							<!--<br> <i class="fa fa-check-square-o"></i> 不同意-->
+						<!--</div>-->
+						<!--<div ng-if="check.checkStatus == '已作废'" class="text-center text-muted f14">-->
+							<!--<br> <i class="fa fa-check-square-o"></i> 已作废-->
+						<!--</div>-->
+					<!--</td>-->
+						<!--<td>-->
+							<!--<div ng-hide="check.status" class="block">-->
+								<!--<span class="text-trans error">未提交</span>-->
+							<!--</div>-->
+							<!--<div ng-show="check.status" class="block">-->
+								<!--<span class="text-trans success">已提交</span>-->
+							<!--</div>-->
+							<!--<div ng-if="check.checkStatus == '未对账'" class="text-center text-muted f14">-->
+								<!--<div class="" style="margin-top: 33px;margin-right: 20px;">-->
+									<!--<div class="pull-right" title="等待客户确认"><a>&nbsp;客户正在确认</a></div>-->
+								<!--</div>-->
+							<!--</div>-->
+							<!--<div ng-if="check.checkStatus == '不同意'" class="text-center text-muted f14">-->
+								<!--<div class="" style="margin-top: 33px;margin-right: 20px;">-->
+									<!--<div class="pull-right" title="客户不同意"><a>&nbsp;客户不同意</a></div>-->
+								<!--</div>-->
+							<!--</div>-->
+							<!--<div ng-if="check.checkStatus == '已确认'" class="text-center text-muted f14">-->
+								<!--<div class="" style="margin-top: 33px;margin-right: 20px;">-->
+									<!--<a ng-click="print(check)" class="pull-right" title="打印{{check.print? '(已打印)':'(未打印)'}}" ng-class="{'unPrinted' : !check.print, 'text-muted': check.print}"><i class="fa fa-print fa-lg"></i>&nbsp;打印</a>-->
+								<!--</div>-->
+							<!--</div>-->
+							<!--&lt;!&ndash; <a ui-sref="fa.apCheck_detail({id:check.id})" class="operate operate-undo text-center"-->
+								 <!--target="_blank">查看详情</a>	 &ndash;&gt;-->
+						<!--</td>-->
+				</tr>
+				</tbody>
+				<tbody ng-if="tableParams.total() == 0">
+				<tr>
+					<td colspan="3">
+						<div id="empty">
+							<div class="left_img">
+								<a><img src="static/img/empty/uas_empty.png"></a>
+								<a>B2B 商务</a>
+							</div>
+							<div class="right_link">
+								<!--<p ng-if="active != 'all'">您还未生成对账单,请立即新增对账!</p>-->
+								<!--<a ng-if="active != 'all'" ui-sref="fa.apCheckList"><i class="fa fa-plus-square fa-fw"></i> 新增对账单</a>-->
+							</div>
+						</div>
+					</td>
+				</tr>
+				</tbody>
+			</table>
+		</div>
 	</div>
-	<table class="order-table block" ng-table="tableParams">
-		<thead>
-		<tr class="header">
-			<th width="150">对账期间</th>
-			<th width="180">对账总额</th>
-			<th width="180">对账人</th>
-			<!--<th width="180">商品总数</th>-->
-			<th width="100">对账结果</th>
-		</tr>
-		</thead>
-		<tbody ng-if="$data.length === 0">
-		<tr>
-			<td colspan="4">
-				<div id="empty">
-					<div class="left_img">
-						<a><img src="static/img/empty/uas_empty.png"></a>
-						<a>B2B 商务</a>
+	<div ng-hide="!showNotCheck" class="infoms add-apCheckList"  >
+		<form class="form-horizontal"
+			  style="padding-top: 10px; padding-bottom: 20px;">
+			<div class="form-group form-group-sm form-group-inline">
+				<div  class="col-sm-6 control-label">
+					<div style="text-align: left">
+						<label>应付供应商:</label>
+						<label style="text-align:left">
+							{{suuorname}}
+						</label>
 					</div>
-					<div class="right_link">
-						<p>暂无对应的对账单信息</p>
+					<div style="text-align: left;margin-top: 20px">
+						<label>本期间应付总额:</label>
+						<label style="text-align:left;vertical-align: top;">
+							<div ng-if="dataInfo.thisMonthCount.length > 0" ng-repeat="count in dataInfo.thisMonthCount">
+								<span>{{count.currency}}:{{count.amount | number:2}}</span>
+							</div>
+							<div ng-if="dataInfo.thisMonthCount.length === 0">
+								0
+							</div>
+						</label>
+					</div>
+					<div style="text-align: left;margin-top: 20px">
+						<label>应付总额:</label>
+						<label style="text-align:left;vertical-align: top;">
+							<div ng-if="dataInfo.totalCount.length > 0" ng-repeat="count in dataInfo.totalCount">
+								<span>{{count.currency }}:{{count.amount | number:2}}</span>
+							</div>
+							<div ng-if="dataInfo.totalCount.length === 0">
+								0
+							</div>
+						</label>
 					</div>
 				</div>
-			</td>
-		</tr>
-		</tbody>
-		<tbody ng-repeat="check in $data">
-			<tr>
-				<td class="first info" colspan="2">
-					<div class="">
-						<span class="text-num" title="录单时间">{{::check.recordDate | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>&nbsp;&nbsp;&nbsp;
-						<span><i class="fa fa-star" ng-class="{'text-default':check.status==201}"></i> {{::check.vendorName}}</span>
-						<span>单据编号:</span>
-						<span class="text-num"><a ui-sref="fa.arCheck_detail({id:check.id})" title="点击查看详情" style="color: #5078cb">{{::check.code}}</a></span>
+				<div  class="col-sm-6 control-label condition">
+					<div>
+						<label class="control-label">请选择月份:</label>
+						<span ng-click="addMouth(-1)" style="display: inline-block;
+							width: 32px;
+							height: 32px;
+							border: 1px solid #ddd;
+							text-align: center;
+							line-height: 32px;
+							cursor: pointer;
+							vertical-align: middle;">
+							<img src="static/img/vendor/images/arrow-left-d-l.png" width="24"/>
+						</span>
+						<span class="control-label" style="padding-right: 5px;display: inline-block;vertical-align: middle;padding-top: 0;" ng-click="apCheckCondition.$open = false">
+							<wui-date
+									format="yyyy-mm"
+									placeholder="请选择或输入日期"
+									id="date4"
+									btns="{'ok':'确定','now':'此刻'}"
+									ng-model="thisMouth"
+							>
+						</wui-date>
+						</span><span ng-show="MouthinShow" ng-click="addMouth(1)" style="display: inline-block;
+							width: 32px;
+							height: 32px;
+							border: 1px solid #ddd;
+							text-align: center;
+							line-height: 32px;
+							cursor: pointer;
+							vertical-align: middle;">
+						<img src="static/img/vendor/images/arrow-right-d-l.png" width="24"/></span>
+						<label class="control-label com-check-radio" ng-click="apCheckCondition.$open = true" style="vertical-align: middle;padding-top: 0">
+							<input type="radio" name="psa" ng-checked="apCheckCondition.$open === true"  ng-model="apCheckCondition.$open" style="vertical-align: middle">自定义
+						</label>
 					</div>
-					<div class="static">
-						<p class="f14 text-num">{{::check.beginDate | date:'yyyy/MM/dd'}} - {{::check.endDate | date:'yyyy/MM/dd'}}</p>
-						<p>
-							<strong class="text-num">{{::check.checkAmount | number:6}}</strong>
-							<span class="text-number">{{::check.currency}}</span><br>
-						</p>
-						<!--<p>-->
-							<!--<strong class="text-num">{{::check.items.length}}</strong> 条<br>-->
-						<!--</p>-->
-						<!--<p>-->
-							<!--<strong class="text-num">{{getTotalProd(check) | number}}</strong> <i class="fa fa-cubes"></i><br>-->
-						<!--</p>-->
+					<div ng-hide="!apCheckCondition.$open" class="more open date fr apCheckCondition" style="margin-top: 14px;">
+						<div class="form-inline">
+							<div class="form-group">
+								<div class="form-group input-group input-group-xs input-trigger">
+									<input type="text" ng-model="apCheckCondition.dateFrom"
+										   class="form-control" placeholder="从"
+										   datepicker-popup="yyyy-MM-dd" is-open="apCheckCondition.$fromOpened"
+										   ng-required="true" max-date = "apCheckCondition.dateTo"
+										   current-text="今天" clear-text="清除" close-text="关闭"
+										   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+										   ng-focus="apCheckopenFilterDatePicker($event, apCheckCondition, '$fromOpened')"
+										   style="height: 26px">
+									<span class="input-group-btn">
+									<button type="button" class="btn btn-default"
+											ng-click="apCheckopenFilterDatePicker($event, apCheckCondition, '$fromOpened')">
+										<i class="fa fa-calendar"></i>
+									</button>
+									</span>
+								</div>
+								<em style="margin: 0 10px;display: inline-block">–</em>
+								<div class="form-group input-group input-group-xs input-trigger">
+									<input type="text" ng-model="apCheckCondition.dateTo"
+										   class="form-control" placeholder="到"
+										   datepicker-popup="yyyy-MM-dd" is-open="apCheckCondition.$toOpened"
+										   ng-required="true" min-date = "apCheckCondition.dateFrom"
+										   current-text="今天" clear-text="清除" close-text="关闭"
+										   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+										   ng-focus="apCheckopenFilterDatePicker($event, apCheckCondition, '$toOpened')" style="height: 26px">
+									<span class="input-group-btn">
+										<button type="button" class="btn btn-default"
+												ng-click="apCheckopenFilterDatePicker($event, apCheckCondition, '$toOpened')">
+											<i class="fa fa-calendar"></i>
+										</button>
+									</span>
+								</div>
+							</div>
+						</div>
+
+					</div>
+				</div>
+			</div>
+			<div class="form-group form-group-sm form-group-inline">
+				<div class="col-sm-12 text-right">
+					<a ng-click="condition.$open=!condition.$open" class="text-simple"><span
+							ng-bind="condition.$open ? '收起筛选条件' : '更多筛选条件'"></span><i
+							class="fa fa-fw"
+							ng-class="{'fa-angle-up': condition.$open, 'fa-angle-down': !condition.$open}"></i></a>
+					<div class="btn-group btn-group-sm">
+						<a class="btn btn-default" ng-click="searchOrder()" title="筛选"><i class="fa fa-search fa-fw btn-icon-left"></i>筛选</a>
+						<!--<a class="btn btn-default" ng-click="createApCheck(check.$selected)" ng-disabled="!data || data.length==0"><i class="fa fa-check-circle-o fa-fw btn-icon-left"></i>对账</a>-->
+						<!--<a class="btn btn-default" ng-click="exportApcheckList()" title="导出Excel" ng-disabled="!data || data.length==0"><i class="fa fa-file-text fa-fw btn-icon-left"></i>导出</a>-->
+					</div>
+				</div>
+			</div>
+			<div class="form-group form-group-sm form-group-inline"
+				 ng-show="condition.$open">
+				<!--<label class="col-sm-2 control-label">应付供应商:</label>-->
+				<!--<div class="col-sm-4">-->
+				<!--<div class="form-group form-group-sm has-feedback">-->
+				<!--<input type="search" class="form-control input-sm"-->
+				<!--ng-model="receiveName" placeholder="可用应付供应商名称筛选" /><span-->
+				<!--class="form-control-feedback text-simple"><i-->
+				<!--class="fa fa-search"></i></span>-->
+				<!--</div>-->
+				<!--</div>-->
+				<label class="col-sm-2 control-label">送货工厂:</label>
+				<div class="col-sm-4">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm"
+							   ng-model="factory" placeholder="请输入送货工厂名称" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
+					</div>
+				</div>
+				<label class="col-sm-2 control-label">税率:</label>
+				<div class="col-sm-4">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm"
+							   ng-model="taxRate" placeholder="请输入税率" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
 					</div>
-				</td>
-				<td style="text-align: center">
-					{{::check.recorder}}
-				</td>
-				<td class="status" colspan="1" style="vertical-align: middle">
-					<span ng-bind="::check.checkStatus"></span>
-				</td>
-			</tr>
-		</tbody>
-	</table>
-</div>
+				</div>
+			</div>
+			<div class="form-group form-group-sm form-group-inline"
+				 ng-show="condition.$open">
+				<label class="col-sm-2 control-label">物料名称:</label>
+				<div class="col-sm-4">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm"
+							   ng-model="prodTitle" placeholder="请输入物料名称" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
+					</div>
+				</div>
+				<label class="col-sm-2 control-label">规&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;格:</label>
+				<div class="col-sm-4">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm"
+							   ng-model="prodSpec" placeholder="请输入物料规格" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
+					</div>
+				</div>
+			</div>
+			<!--<div class="form-group form-group-sm form-group-inline"-->
+			<!--ng-show="condition.$open">-->
+
+			<!--</div>-->
+		</form>
+		<!-- 标签scroll-table用于表头滚动 -->
+		<div class="table-wrap" id="order-detail-list" scroll-table>
+			<div class="table-header-wrap">
+				<table class="table table-bordered">
+					<tr>
+						<!--<th width="36" style="vertical-align: middle;"><input type="checkbox" name="checkbox" ng-model="checkboxes.checked" ng-click="checkAll()"></th>-->
+						<!--<th width="70">客户<br>名称</th>-->
+						<th width="70">采购单</th>
+						<th width="70">物料名称</th>
+						<th width="70">规格型号</th>
+						<th width="60">发货单</th>
+						<th width="55">发货数量</th>
+						<th width="60">验收单</th>
+						<th width="100">验收数量</th>
+						<th width="40">单价</th>
+						<th width="40">税率</th>
+						<th width="70">小计</th>
+						<!--<th width="35">序号</th>-->
+						<!--<th width="60">类型</th>-->
+						<!--<th width="60">单据<br>日期</th>-->
+						<!--<th width="90">应付<br>供应商</th>-->
+						<!--<th width="65">客户<br>料号</th>-->
+						<!--<th width="65">送货<br>工厂</th>-->
+						<!--<th width="30">币别</th>-->
+						<!--<th width="60">金额</th>-->
+					</tr>
+				</table>
+			</div>
+			<div class="table-body-wrap">
+				<table class="table table-bordered">
+					<tr ng-repeat="check in data" ng-click="checkOne(check);getTotalMoney()" class="thAlign" style="height: 40px;">
+						<!--<td width="36" style="text-align: center;vertical-align: middle;">-->
+							<!--<input ng-model="check.$selected" name="checkbox" type="checkbox" ng-checked="check.$selected" ng-click="stopPrevent($event)"></td>-->
+						<td width="70">{{::check.ordercode}}</td>
+						<td width="70" title="{{check.prodtitle}}">
+							<div style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.prodtitle}}</div>
+						</td>
+						<td width="70" title="{{check.prodspec}}">
+							<div style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.prodspec}}</div></td>
+						<td width="60">{{::check.sendcode}}</td>
+						<td width="55">{{::check.qty}}</td>
+						<td width="60">{{::check.inoutno}}</td>
+						<td width="100">{{::check.thischeckqty}}</td>
+						<td width="40">{{::check.orderprice}}</td>
+						<td width="40" align="center">{{::check.taxrate}}</td>
+						<td width="70">{{::(check.orderprice || 0)*(check.thischeckqty || 0) | number:2}}</td>
+						<!--<td width="70" title="{{check.custname}}"><div-->
+						<!--style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.custname}}</div></td>-->
+						<!--<td width="35" align="center">{{::check.detno}}</td>-->
+						<!--<td width="60">{{::check.piclass}}</td>-->
+						<!--<td width="60">{{::check.pidate | date:'yyyy-MM-dd' }}</td>-->
+						<!--<td width="90" title="{{check.receivename}}">-->
+						<!--<div style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.receivename}}</div>-->
+						<!--</td>-->
+						<!--<td width="65">{{::check.prodcode}}</td>-->
+						<!--<td width="65">{{::check.factory}}</td>-->
+						<!--<td width="30">{{::check.currency}}</td>-->
+						<!--<td width="60">{{::(check.qty || 0)*(check.orderprice || 0) | number:2}}</td>-->
+
+					</tr>
+					<tr ng-if="!data || data.length==0">
+						<td colspan="10">
+							<div class="empty-block">
+								<i class="fa fa-exclamation-circle"></i>
+								<p class="text-muted">没有对账数据,请先筛选</p>
+							</div>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div style="padding: 10px 20px">本期间应付总额:{{totalMoney | number:2 || 0}}</div>
+		</div>
+	</div>
+</div>
+<style>
+	.order-table2 tbody td {
+		text-align: center;
+		padding: 20px 0
+	}
+</style>
+<style>
+	.wui-date-picker.left {
+		margin-right : 0 !important;
+		right: 0;
+		left: auto
+	}
+	.add-apCheckList {
+		background: #fff
+	}
+
+	.add-apCheckList input[type="checkbox"] {
+		/*width: 16px;
+        height: 16px*/
+	}
+
+	.add-apCheckList .table-wrap {
+		overflow: hidden
+	}
+
+	.add-apCheckList .table-header-wrap {
+		background: #f9f9f9;
+		overflow-x: hidden;
+		overflow-y: scroll;
+	}
+
+	.add-apCheckList .table-header-wrap table,.add-apCheckList .table-body-wrap table
+	{
+		width: 100%;
+		table-layout: fixed;
+		border-collapse: collapse;
+		border-spacing: 0;
+		margin-bottom: 0
+	}
+
+	.add-apCheckList .table-header-wrap th {
+		text-align: center;
+	}
+
+	.add-apCheckList .table-body-wrap {
+		max-height: 600px;
+		overflow-x: auto;
+		overflow-y: scroll;
+	}
+
+	.add-apCheckList td {
+		word-break: break-all;
+		text-align: center;
+	}
+
+	.add-apCheckList tbody {
+		overflow: auto;
+	}
+
+	#order-detail-list .input-sm {
+		border: #ccc 1px solid;
+	}
+
+	.infoms .has-feedback input[type="search"] {
+		padding-right: 0 !important;
+	}
+	.infoms .table>tbody>tr>td{
+		vertical-align: middle;
+	}
+	.infoms .form-horizontal .form-group-sm .control-label{
+		font-size: 14px;
+	}
+	.infoms .form-group .form-control{
+		font-size: 14px;
+	}
+	.wui-date.small .wui-date-picker {
+		width: 260px
+	}
+
+	.wui-input {
+		border: 1px solid #3f84f6;
+		font-size: 14px;
+		color: #3f84f6;
+		font-weight: bold;
+	}
+	.wui-date-editor .iconfont {
+		color: #3f84f6
+	}
+
+	.apCheckCondition ul {
+		left: auto !important;
+		right: 0;
+	}
+</style>

+ 254 - 0
src/main/webapp/resources/tpl/index/fa/arCheck_old.html

@@ -0,0 +1,254 @@
+<style>
+	body{
+		font-family: "Microsoft YaHei", "微软雅黑" !important;
+	}
+	.text-num{
+
+	}
+	.append{
+		color: #5078cb;font-size:12px; margin-left: 10px
+	}
+	.order-table td {
+		padding-top: 10px;
+		margin-bottom: 20px;
+		border-bottom: solid 1px #ccc;
+		border-top: solid 1px #e8e8e8;
+	}
+
+	.order-table td.first {
+		padding-left: 20px;
+	}
+
+	.order-table td.last {
+		padding-right: 20px;
+	}
+
+	.order-table td .static p {
+		display: inline-block;
+		line-height: 30px;
+		padding-top: 5px;
+		padding-bottom: 0px;
+		width: 150px;
+		font-size: 14px;
+		color: #666;
+		padding-left: 15px;
+		border-left: solid 1px #e8e8e8;
+	}
+	.order-table td .static p:first-child{
+		border-left: none;
+		width: 180px;
+		padding-left: 0;
+	}
+	.order-table td .static p:last-child{
+		margin-left: 22px;
+	}
+	.order-table td .static p:nth-of-type(3){
+		margin-left: 20px;
+	}
+	.order-table td .main {
+		margin-top: 5px;
+		margin-bottom: 20px;
+		color: #333;
+	}
+	.static{
+		margin: 12px 0;
+	}
+	.order-table td .main strong {
+		font-size: 14px;
+	}
+
+	.order-table td .static p strong {
+		font-size: 14px;
+		font-weight: bold;
+		color: #888;
+	}
+
+	.order-table td.status {
+		position: relative;
+		border-left: solid 1px #e8e8e8;
+		padding: 10px;
+		vertical-align: top;
+	}
+
+	.order-table td.status .operate {
+		position: absolute;
+		display: block;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		height: 0px;
+		color: #ffffff;
+		font-size: 14px;
+		font-weight: bold;
+		line-height: 40px;
+		opacity: 0.8;
+		transition: height ease-in-out 0.5s;
+		text-decoration: none;
+	}
+
+	.order-table td.status .operate-undo {
+		background: #428bca;
+	}
+
+	.order-table td.status .operate-done {
+		background: #cccccc;
+	}
+
+	.order-table td.status:hover  .operate {
+		height: 40px;
+	}
+
+	.unPrinted {
+		color: #56a022;
+	}
+	.order-table td .main strong{
+		font-weight: normal;
+	}
+	.order-table td{
+		font-size: 14px;
+	}
+	.order-table th{
+		text-align: center;
+	}
+	.order-table .text-trans{
+		margin-top: -17px;
+		margin-right: 14px;
+	}
+</style>
+<link rel="stylesheet" href="static/css/public.css">
+<div class="block" id="public">
+	<div class="loading in" ng-class="{'in': loading}">
+		<!--<i></i>-->
+		<div class="wrap">
+			<div class="outer"></div>
+		</div>
+	</div>
+	<div class="pub-com_head">
+		<span>应付对账单</span>
+		<div class="p-right">
+		</div>
+	</div>
+	<div class="condition block">
+		<div class="search-bg condition block" style="padding: 10px 15px;">
+			<div class="row">
+				<div id="topSearch" style="float: left">
+					<a ng-click="changeDateZone(1);condition.$open=false" title="最近一个月" ng-class="{'active':condition.dateZone=='1'}">最近一个月</a>
+					<a ng-click="changeDateZone(3);condition.$open=false" title="最近三个月" ng-class="{'active':condition.dateZone=='3'}">最近三个月</a>
+					<a ng-click="changeDateZone(6);condition.$open=false" title="最近六个月" ng-class="{'active':condition.dateZone=='6'}">最近六个月</a>
+					<a ng-click="condition.$open=!condition.$open;changeDateZone(-1)" title="自定义" ng-class="{'active':condition.dateZone=='-1'}" >自定义</a>
+				</div>
+				<div class="col-xs-6" style="float: right;">
+					<div class="search">
+						<div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick"
+							 on-toggle="searchAdvance=open">
+							<input type="search" class="form-control input-sm" ng-model="keyword"
+								   ng-search="onSearch()" placeholder="输入单据编号、客户名称、物料名称搜索" style="width: 100%"/>
+							<a class="btn input-group-addon" ng-click="onSearch()">搜索</a>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="more-list more" ng-class="{'open': condition.$open}">
+				<form class="form-inline">
+					<div class="form-group ">
+						<label>日期:</label>
+						<div class="btn-group btn-menu" dropdown is-open="condition.$dateZoneOpen">
+							<ul class="dropdown-menu">
+								<li><a ng-click="changeDateZone(1)">一个月内</a></li>
+								<li><a ng-click="changeDateZone(6)">半年内</a></li>
+								<li><a ng-click="changeDateZone()">半年前</a></li>
+							</ul>
+						</div>
+						<div class="form-group input-group input-group-xs input-trigger">
+							<input type="text" ng-model="condition.dateFrom"
+								   class="form-control" placeholder="从"
+								   datepicker-popup="yyyy-MM-dd" is-open="condition.$fromOpened"
+								   ng-required="true" max-date = "condition.dateTo"
+								   current-text="今天" clear-text="清除" close-text="关闭"
+								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+								   ng-focus="openFilterDatePicker($event, condition, '$fromOpened')">
+							<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+									ng-click="openFilterDatePicker($event, condition, '$fromOpened')">
+								<i class="fa fa-calendar"></i>
+							</button>
+						</span>
+						</div>
+						<div class="form-group input-group input-group-xs input-trigger">
+							<input type="text" ng-model="condition.dateTo"
+								   class="form-control" placeholder="到"
+								   datepicker-popup="yyyy-MM-dd" is-open="condition.$toOpened"
+								   ng-required="true" min-date = "condition.dateFrom"
+								   current-text="今天" clear-text="清除" close-text="关闭"
+								   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+								   ng-focus="openFilterDatePicker($event, condition, '$toOpened')">
+							<span class="input-group-btn">
+							<button type="button" class="btn btn-default"
+									ng-click="openFilterDatePicker($event, condition, '$toOpened')">
+								<i class="fa fa-calendar"></i>
+							</button>
+						</span>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+	<table class="order-table block" ng-table="tableParams">
+		<thead>
+		<tr class="header">
+			<th width="150">对账期间</th>
+			<th width="180">对账总额</th>
+			<th width="180">对账人</th>
+			<!--<th width="180">商品总数</th>-->
+			<th width="100">对账结果</th>
+		</tr>
+		</thead>
+		<tbody ng-if="$data.length === 0">
+		<tr>
+			<td colspan="4">
+				<div id="empty">
+					<div class="left_img">
+						<a><img src="static/img/empty/uas_empty.png"></a>
+						<a>B2B 商务</a>
+					</div>
+					<div class="right_link">
+						<p>暂无对应的对账单信息</p>
+					</div>
+				</div>
+			</td>
+		</tr>
+		</tbody>
+		<tbody ng-repeat="check in $data">
+		<tr>
+			<td class="first info" colspan="2">
+				<div class="">
+					<span class="text-num" title="录单时间">{{::check.recordDate | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>&nbsp;&nbsp;&nbsp;
+					<span><i class="fa fa-star" ng-class="{'text-default':check.status==201}"></i> {{::check.vendorName}}</span>
+					<span>单据编号:</span>
+					<span class="text-num"><a ui-sref="fa.arCheck_detail({id:check.id})" title="点击查看详情" style="color: #5078cb">{{::check.code}}</a></span>
+				</div>
+				<div class="static">
+					<p class="f14 text-num">{{::check.beginDate | date:'yyyy/MM/dd'}} - {{::check.endDate | date:'yyyy/MM/dd'}}</p>
+					<p>
+						<strong class="text-num">{{::check.checkAmount | number:6}}</strong>
+						<span class="text-number">{{::check.currency}}</span><br>
+					</p>
+					<!--<p>-->
+					<!--<strong class="text-num">{{::check.items.length}}</strong> 条<br>-->
+					<!--</p>-->
+					<!--<p>-->
+					<!--<strong class="text-num">{{getTotalProd(check) | number}}</strong> <i class="fa fa-cubes"></i><br>-->
+					<!--</p>-->
+				</div>
+			</td>
+			<td style="text-align: center">
+				{{::check.recorder}}
+			</td>
+			<td class="status" colspan="1" style="vertical-align: middle">
+				<span ng-bind="::check.checkStatus"></span>
+			</td>
+		</tr>
+		</tbody>
+	</table>
+</div>