Ver código fonte

Merge branch 'master' of ssh://10.10.100.21/source/platform-b2b into hotfix-thread-1217

yuj 7 anos atrás
pai
commit
2ca26fb466
100 arquivos alterados com 6677 adições e 1364 exclusões
  1. 16 0
      db/ddl.sql
  2. 7 18
      pom.xml
  3. 15 0
      src/main/java/com/uas/platform/b2b/constant/StringConstant.java
  4. 24 52
      src/main/java/com/uas/platform/b2b/controller/PurchaseARCheckController.java
  5. 3 0
      src/main/java/com/uas/platform/b2b/controller/SaleApBillController.java
  6. 46 36
      src/main/java/com/uas/platform/b2b/controller/SaleApCheckController.java
  7. 92 0
      src/main/java/com/uas/platform/b2b/controller/SaleArCheckController.java
  8. 4 4
      src/main/java/com/uas/platform/b2b/controller/SaleNoticeController.java
  9. 5 5
      src/main/java/com/uas/platform/b2b/controller/SaleOrderController.java
  10. 36 51
      src/main/java/com/uas/platform/b2b/controller/UserController.java
  11. 4 58
      src/main/java/com/uas/platform/b2b/controller/VendorController.java
  12. 91 0
      src/main/java/com/uas/platform/b2b/controller/VendorDistributeController.java
  13. 2 0
      src/main/java/com/uas/platform/b2b/core/util/DateFormatUtils.java
  14. 118 1
      src/main/java/com/uas/platform/b2b/core/util/DateUtils.java
  15. 51 10
      src/main/java/com/uas/platform/b2b/dao/DistributeDao.java
  16. 9 0
      src/main/java/com/uas/platform/b2b/dao/EnterpriseDao.java
  17. 10 0
      src/main/java/com/uas/platform/b2b/dao/PurchaseApCheckDao.java
  18. 0 11
      src/main/java/com/uas/platform/b2b/dao/PurchaseOrderAllDao.java
  19. 2 2
      src/main/java/com/uas/platform/b2b/dao/RoleDao.java
  20. 1 1
      src/main/java/com/uas/platform/b2b/dao/SaleSendDao.java
  21. 71 6
      src/main/java/com/uas/platform/b2b/dao/UserBaseInfoDao.java
  22. 63 0
      src/main/java/com/uas/platform/b2b/dao/VendorDistributeDao.java
  23. 5 5
      src/main/java/com/uas/platform/b2b/erp/controller/PurchaseAPBillController.java
  24. 10 0
      src/main/java/com/uas/platform/b2b/erp/exception/NotFoundUtils.java
  25. 38 0
      src/main/java/com/uas/platform/b2b/erp/listen/controller/ListenController.java
  26. 16 0
      src/main/java/com/uas/platform/b2b/erp/listen/dao/ListenDao.java
  27. 82 0
      src/main/java/com/uas/platform/b2b/erp/listen/model/Listen.java
  28. 17 0
      src/main/java/com/uas/platform/b2b/erp/listen/service/ListenService.java
  29. 56 0
      src/main/java/com/uas/platform/b2b/erp/listen/service/impl/ListenServiceImpl.java
  30. 7 4
      src/main/java/com/uas/platform/b2b/erp/model/PurchaseAPBill.java
  31. 33 0
      src/main/java/com/uas/platform/b2b/erp/model/PurchaseDetail.java
  32. 33 0
      src/main/java/com/uas/platform/b2b/erp/model/SaleDownDetail.java
  33. 8 7
      src/main/java/com/uas/platform/b2b/erp/model/SaleOut.java
  34. 12 0
      src/main/java/com/uas/platform/b2b/erp/model/VendorInfo.java
  35. 23 8
      src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseAPBillServiceImpl.java
  36. 7 2
      src/main/java/com/uas/platform/b2b/erp/service/impl/VendorServiceImpl.java
  37. 7 10
      src/main/java/com/uas/platform/b2b/filter/SSOInterceptor.java
  38. 3 3
      src/main/java/com/uas/platform/b2b/listener/GlobalExceptionHandler.java
  39. 17 29
      src/main/java/com/uas/platform/b2b/mobile/controller/SaleController.java
  40. 26 0
      src/main/java/com/uas/platform/b2b/model/ApcheckKeyWord.java
  41. 39 0
      src/main/java/com/uas/platform/b2b/model/BusinessContacts.java
  42. 51 0
      src/main/java/com/uas/platform/b2b/model/DateFilter.java
  43. 2 1
      src/main/java/com/uas/platform/b2b/model/Distribute.java
  44. 67 0
      src/main/java/com/uas/platform/b2b/model/ErpProdIo.java
  45. 44 0
      src/main/java/com/uas/platform/b2b/model/OrderRedDotDone.java
  46. 42 0
      src/main/java/com/uas/platform/b2b/model/PurcOrderInfoItem.java
  47. 29 4
      src/main/java/com/uas/platform/b2b/model/PurchaseApCheck.java
  48. 43 1
      src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java
  49. 11 1
      src/main/java/com/uas/platform/b2b/model/Role.java
  50. 6 7
      src/main/java/com/uas/platform/b2b/model/User.java
  51. 52 3
      src/main/java/com/uas/platform/b2b/model/UserBaseInfo.java
  52. 474 339
      src/main/java/com/uas/platform/b2b/model/Vendor.java
  53. 77 0
      src/main/java/com/uas/platform/b2b/model/VendorContactMan.java
  54. 150 0
      src/main/java/com/uas/platform/b2b/model/VendorDistribute.java
  55. 88 0
      src/main/java/com/uas/platform/b2b/model/util/UnCheckedCountSqls.java
  56. 145 0
      src/main/java/com/uas/platform/b2b/openapi/controller/UsoftController.java
  57. 39 0
      src/main/java/com/uas/platform/b2b/openapi/dao/UsoftWhitelistDao.java
  58. 49 0
      src/main/java/com/uas/platform/b2b/openapi/model/Product.java
  59. 112 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftAccept.java
  60. 110 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftAcceptItem.java
  61. 204 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftHistoryTradingData.java
  62. 47 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftInterval.java
  63. 57 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftIntervalItem.java
  64. 102 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftOrder.java
  65. 91 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftOrderItem.java
  66. 99 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftRunningEfficient.java
  67. 122 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftTrading.java
  68. 167 0
      src/main/java/com/uas/platform/b2b/openapi/model/UsoftWhitelist.java
  69. 8 0
      src/main/java/com/uas/platform/b2b/openapi/service/TradingDataService.java
  70. 102 0
      src/main/java/com/uas/platform/b2b/openapi/service/UsoftService.java
  71. 207 205
      src/main/java/com/uas/platform/b2b/openapi/service/impl/TradingDataServiceImpl.java
  72. 641 0
      src/main/java/com/uas/platform/b2b/openapi/service/impl/UsoftServiceImpl.java
  73. 7 1
      src/main/java/com/uas/platform/b2b/openapi/support/NumFormat.java
  74. 9 9
      src/main/java/com/uas/platform/b2b/ps/ProductUtils.java
  75. 16 0
      src/main/java/com/uas/platform/b2b/publicapi/controller/ApCheckApiController.java
  76. 65 0
      src/main/java/com/uas/platform/b2b/publicapi/model/ApCheckAmount.java
  77. 15 0
      src/main/java/com/uas/platform/b2b/publicapi/model/TradeCount.java
  78. 40 11
      src/main/java/com/uas/platform/b2b/result/ResultMap.java
  79. 1 1
      src/main/java/com/uas/platform/b2b/search/RestTempSearchServiceImpl.java
  80. 68 1
      src/main/java/com/uas/platform/b2b/search/SearchService.java
  81. 130 5
      src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java
  82. 36 0
      src/main/java/com/uas/platform/b2b/service/ApBillAdjustmentService.java
  83. 0 38
      src/main/java/com/uas/platform/b2b/service/ApbillAdjustmentService.java
  84. 15 3
      src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java
  85. 48 16
      src/main/java/com/uas/platform/b2b/service/PurchaseApBillService.java
  86. 39 2
      src/main/java/com/uas/platform/b2b/service/PurchaseApCheckService.java
  87. 11 8
      src/main/java/com/uas/platform/b2b/service/SaleARCheckService.java
  88. 10 20
      src/main/java/com/uas/platform/b2b/service/UserService.java
  89. 85 0
      src/main/java/com/uas/platform/b2b/service/VendorService.java
  90. 67 0
      src/main/java/com/uas/platform/b2b/service/impl/ApBillAdjustmentServiceImpl.java
  91. 0 167
      src/main/java/com/uas/platform/b2b/service/impl/ApbillAdjustmentServiceImpl.java
  92. 127 51
      src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java
  93. 17 15
      src/main/java/com/uas/platform/b2b/service/impl/OrderRedDotServiceImpl.java
  94. 468 9
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApBillServiceImpl.java
  95. 304 7
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java
  96. 10 4
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseNoticeServiceImpl.java
  97. 7 22
      src/main/java/com/uas/platform/b2b/service/impl/RoleServiceImpl.java
  98. 38 15
      src/main/java/com/uas/platform/b2b/service/impl/SaleARCheckServiceImpl.java
  99. 125 64
      src/main/java/com/uas/platform/b2b/service/impl/UserServiceImpl.java
  100. 372 11
      src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java

+ 16 - 0
db/ddl.sql

@@ -0,0 +1,16 @@
+-- 项目ddl SQL语句统一放在这里记录,包括表结构、关联关系、索引、函数、存储过程等
+
+-- 每段sql语句必须要按规范注释,注释规范如下:
+-- date: 2018-12-11
+-- author: suntg
+-- content: 内容备注xxx
+
+-- date: 2018-12-12 17:51
+-- author: hejq
+-- content: 供应商关系表增加字段,需要对账金额,次更新时间,
+-- 采用字符串是因为需要分币别统计处理
+  alter table `purc$vendors`
+  add column todo_apchek_count VARCHAR(100) default '' comment '需要对账金额',
+  add column update_time datetime comment '上一次更新时间';
+
+

+ 7 - 18
pom.xml

@@ -12,7 +12,10 @@
     </parent>
     <profiles>
         <profile>
-
+            <!-- 默认 -->
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
             <!-- 开发环境 -->
             <id>dev</id>
             <properties>
@@ -21,21 +24,11 @@
                 <static-path>static</static-path>
             </properties>
         </profile>
-        <profile>
-            <!-- 测试环境 -->
-            <id>test</id>
-            <properties>
-                <profile>test</profile>
-                <!-- static plugin -->
-                <static-path>static</static-path>
-            </properties>
-
-        </profile>
         <profile>
             <!-- 生产环境 -->
-            <id>prod</id>
+            <id>ptest</id>
             <properties>
-                <profile>prod</profile>
+                <profile>ptest</profile>
                 <!-- static plugin -->
                 <static-path>static</static-path>
             </properties>
@@ -50,10 +43,6 @@
             </properties>
         </profile>
         <profile>
-            <!-- 默认 -->
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
             <!-- 预部署环境 -->
             <id>pre</id>
             <properties>
@@ -585,4 +574,4 @@
             </plugins>
         </pluginManagement>
     </build>
-</project>
+</project>

+ 15 - 0
src/main/java/com/uas/platform/b2b/constant/StringConstant.java

@@ -0,0 +1,15 @@
+package com.uas.platform.b2b.constant;
+
+/**
+ * 字符串常用值
+ *
+ * @author hejq
+ * @date 2018-12-14 22:06
+ */
+public class StringConstant {
+
+    /**
+     * 空字符串
+     */
+    public static final String BLANK = " ";
+}

+ 24 - 52
src/main/java/com/uas/platform/b2b/controller/PurchaseARCheckController.java

@@ -1,16 +1,17 @@
 package com.uas.platform.b2b.controller;
 
-import com.alibaba.dubbo.common.utils.CollectionUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2b.core.util.DateFormatUtils;
+import com.uas.platform.b2b.model.PurchaseApCheck;
 import com.uas.platform.b2b.model.SaleARCheck;
 import com.uas.platform.b2b.model.SaleARCheckItem;
 import com.uas.platform.b2b.model.SaleARCheckReply;
 import com.uas.platform.b2b.model.SearchFilter;
+import com.uas.platform.b2b.result.ResultMap;
 import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
 import com.uas.platform.b2b.service.SaleARCheckService;
-import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.support.JxlsExcelView;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.UsageBufferedLogger;
@@ -18,7 +19,6 @@ import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
-import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort.Type;
@@ -26,9 +26,12 @@ import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort.Direction;
-import org.springframework.stereotype.Controller;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+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.util.ArrayList;
@@ -42,7 +45,7 @@ import java.util.List;
  * 
  */
 @SuppressWarnings("deprecation")
-@Controller
+@RestController
 @RequestMapping("/purchase/arCheck")
 public class PurchaseARCheckController {
 
@@ -53,47 +56,22 @@ public class PurchaseARCheckController {
 	private SearchService searchService;
 
 	@Autowired
-	private UserService userService;
+    private PurchaseApCheckService apCheckService;
 
 	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
-	/**
-	 *  作为买家,获取应付对账单(全部)
-	 *
-	 * @param params 分页参数
-	 * @param searchFilter 过滤条件
-	 * @return
-	 */
-	@RequestMapping(method = RequestMethod.GET)
-	@ResponseBody
-	public SPage<SaleARCheck> getReceivedPurchaseApBills(PageParams params, String searchFilter) {
-		logger.log("应付对账单", "获取全部应付对账单");
-		JSONObject jsonObject = JSON.parseObject(searchFilter);
-		String keyword = null;
-		if(jsonObject != null) {
-			keyword = jsonObject.getString("keyword");
-		}
-		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
-		// 当前登录企业作为买家
-		pageParams.getFilters().put("sac_enuu", SystemSession.getUser().getEnterprise().getUu());
-		// TODO 其他过滤条件
-		SearchFilter filter = userService.distribute();
-		if (filter != null && filter.getDistribute() == null) {
-			return null;
-		}
-		if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
-			List<Object> list = new ArrayList<>();
-			for (Object object : filter.getDistribute()) {
-				list.add(object);
-			}
-			pageParams.getFilters().put("sac_venduu", new MultiValue(list, true));
-		}
-		// 排序条件
-		List<Sort> sortList = new ArrayList<>();
-		sortList.add(new Sort("sac_id", false, Type.INT, new Long(1)));
-		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
-		return searchService.searchSaleARCheckIds(keyword, pageParams);
-	}
+    /**
+     *  作为买家,获取应付对账单(全部)
+     *
+     * @param params 分页参数
+     * @param searchFilter 过滤条件
+     * @return 搜索结果
+     */
+    @RequestMapping(method = RequestMethod.GET)
+    public SPage<PurchaseApCheck> getApCheck(PageParams params, String searchFilter) {
+        logger.log("应付对账单", "获取全部应付对账单");
+        return saleARCheckService.getApCheck(params, searchFilter);
+    }
 
 	/**
 	 * 作为买家,根据ID查找应付对账单(含明细)
@@ -102,10 +80,9 @@ public class PurchaseARCheckController {
 	 * @return
 	 */
 	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
-	@ResponseBody
-	public SaleARCheck getReceivedPurchaseApBillById(@PathVariable("id") Long id) {
+	public ResultMap getReceivedPurchaseApBillById(@PathVariable("id") Long id) {
 		logger.log("应付对账单", "获取单个应付对账单,id:" + id);
-		return saleARCheckService.findById(id);
+		return ResultMap.success(apCheckService.findById(id));
 	}
 
 	/**
@@ -114,7 +91,6 @@ public class PurchaseARCheckController {
 	 * @return SaleARCheck
 	 */
 	@RequestMapping(value = "/page/done", method = RequestMethod.GET)
-	@ResponseBody
 	public Page<SaleARCheck> getAllDoneCheck(PageParams params, String keyword, String searchFilter) {
 		logger.log("应付对账单", "获取全部已确认应付对账单");
 		PageInfo info = new PageInfo(params);
@@ -134,7 +110,6 @@ public class PurchaseARCheckController {
 	 * @return SaleARCheck
 	 */
 	@RequestMapping(value = "/page/todo", method = RequestMethod.GET)
-	@ResponseBody
 	public Page<SaleARCheck> getAllTodoCheck(PageParams params, String keyword, String searchFilter) {
 		logger.log("应付对账单", "获取全部已确认应付对账单");
 		PageInfo info = new PageInfo(params);
@@ -155,7 +130,6 @@ public class PurchaseARCheckController {
 	 * @param itemId
 	 */
 	@RequestMapping(value = "/items/{itemId}/reply", method = RequestMethod.POST, params = "agreed=true")
-	@ResponseBody
 	public void agreeCheckItem(@RequestBody String json, @PathVariable("itemId") Long itemId) {
 		SaleARCheckReply reply = FlexJsonUtils.fromJson(json, SaleARCheckReply.class);
 		SaleARCheckItem item = new SaleARCheckItem();
@@ -173,7 +147,6 @@ public class PurchaseARCheckController {
 	 * @param itemId
 	 */
 	@RequestMapping(value = "/items/{itemId}/reply", method = RequestMethod.POST, params = "agreed=false")
-	@ResponseBody
 	public void disAgreeCheckItem(@RequestBody String json, @PathVariable("itemId") Long itemId) {
 		SaleARCheckReply reply = FlexJsonUtils.fromJson(json, SaleARCheckReply.class);
 		SaleARCheckItem item = new SaleARCheckItem();
@@ -191,7 +164,6 @@ public class PurchaseARCheckController {
 	 * @param itemId
 	 */
 	@RequestMapping(value = "/items/{itemId}/reply", method = RequestMethod.GET)
-	@ResponseBody
 	public List<SaleARCheckReply> getReplies(@PathVariable("itemId") Long itemId) {
 		List<SaleARCheckReply> replies = saleARCheckService.getReplies(itemId);
 		return replies;

+ 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;

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

@@ -3,6 +3,7 @@ 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.OrderType;
 import com.uas.platform.b2b.model.PurchaseApCheck;
 import com.uas.platform.b2b.model.PurchaseApCheckItem;
@@ -182,10 +183,10 @@ public class SaleApCheckController {
 	 * 
 	 * @param fromDate 开始时间
 	 * @param endDate 截止时间
-	 * @return List<ErpProdIODetail>
+	 * @return List<ErpProdIo>
 	 */
 	@RequestMapping(value = "/getAllByKeywords", method = RequestMethod.GET)
-	public List<ErpProdIODetail> getAllApchecksByDate(Long fromDate, Long endDate, ApcheckKeyWord searchKeyWord) {
+	public ErpProdIo getAllApchecksByDate(Long fromDate, Long endDate, ApcheckKeyWord searchKeyWord, String checkDate) {
 		List<Long> distributes = null;
 		// 判断当前用户是否被客户分配
 		if (!SystemSession.getUser().isSys()) {
@@ -199,9 +200,23 @@ public class SaleApCheckController {
 				return null;
 			}
 		}
-		return erpProdIODetailService.findXlsApChecks(distributes, searchKeyWord, fromDate, endDate);
+		return erpProdIODetailService.findXlsApChecks(distributes, searchKeyWord, fromDate, endDate, checkDate);
 	}
 
+    /**
+     * 获取客户
+     * @param keyword 关键字
+     * @param params 分页参数
+     * @param checkDate 筛选月份
+     * @return 符合条件的客户信息
+     */
+    @RequestMapping(value = "/customer", method = RequestMethod.GET)
+    public SPage<Vendor> getCustomers(PageParams params, String keyword, String checkDate, String searchFilter) {
+        logger.log("应收对账单", "获取客户信息", "获取所有符合条件的客户");
+        SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
+        return purchaseApCheckService.getCustomerInfo(params, keyword, checkDate, filter.getFromDate(), filter.getEndDate());
+    }
+
 	/**
 	 * 保存生成的应收对账单主记录
      *
@@ -352,12 +367,11 @@ public class SaleApCheckController {
 	 */
 	@RequestMapping(value = "/info/search", params = RequestState.DONE, method = RequestMethod.GET)
 	public SPage<PurchaseApCheck> getDoneApChecks(PageParams params, String searchFilter) {
-		logger.log("应收对账单", "获取已确认应收对账单");
+		logger.log("应收对账单", "获取已对账应收对账单");
         SearchFilter filter = JSONObject.parseObject(searchFilter, SearchFilter.class);
         if (StringUtils.isEmpty(filter.getKeyword())) {
             PageInfo pageInfo = new PageInfo(params);
             pageInfo.filter("enUu", SystemSession.getUser().getEnterprise().getUu());
-            pageInfo.filter("checkStatus", "已确认");
             SearchFilter distribute = userService.distribute();
             if (distribute != null && distribute.getDistribute() == null) {
                 return null;
@@ -365,10 +379,18 @@ public class SaleApCheckController {
             if (distribute != null && !CollectionUtils.isEmpty(distribute.getDistribute())) {
                 filter.setDistribute(distribute.getDistribute());
             }
+            SimpleExpression agreed = new SimpleExpression("checkStatus", "已确认", CriterionExpression.Operator.EQ, true);
+            SimpleExpression haveDone = new SimpleExpression("checkStatus", "未对账", CriterionExpression.Operator.EQ, true);
+            SimpleExpression[] expressions = new SimpleExpression[]{agreed, haveDone};
+            LogicalExpression logical = new LogicalExpression(expressions, CriterionExpression.Operator.OR);
+            pageInfo.orExpression(logical);
             return SPageUtils.covertSPage(purchaseApCheckService.findAllByPageInfo(pageInfo, null, filter));
         }
 		com.uas.search.b2b.model.PageParams pageParams = distribute(params, searchFilter);
-		pageParams.getFilters().put("pa_checkstatus", "已确认");
+        List<Object> objectList = new ArrayList<>();
+        objectList.add("已确认");
+        objectList.add("未对账");
+		pageParams.getFilters().put("pa_checkstatus", new MultiValue(objectList, true));
 		return searchService.searchPurchaseApCheckIds(filter.getKeyword(), pageParams);
 	}
 
@@ -475,10 +497,10 @@ public class SaleApCheckController {
 		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
 		ModelAndView modelAndView = new ModelAndView();
 		modelAndView.addObject("dateFormat", dateFormat);
-		modelAndView.addObject("state", "已确认");
+		modelAndView.addObject("state", "已对账");
 		modelAndView.addObject("data", getDoneApChecks(params, searchFilter).getContent());
-		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/saleApCheck", "应收对账单列表_已确认"));
-		logger.log("应收对账单", "导出Excel列表", "导出已确认Excel列表");
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/saleApCheck", "应收对账单列表_已对账"));
+		logger.log("应收对账单", "导出Excel列表", "导出已对账Excel列表");
 		return modelAndView;
 	}
 
@@ -496,7 +518,7 @@ public class SaleApCheckController {
 		ModelAndView modelAndView = new ModelAndView();
 		modelAndView.addObject("dateFormat", dateFormat);
 		modelAndView.addObject("state", "未对账");
-		modelAndView.addObject("data", getTodoApChecks(params, searchFilter).getContent());
+		modelAndView.addObject("data", getDoneApChecks(params, searchFilter).getContent());
 		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/saleApCheck", "应收对账单列表_未对账"));
 		logger.log("应收对账单", "导出Excel列表", "导出未对账Excel列表");
 		return modelAndView;
@@ -515,9 +537,9 @@ public class SaleApCheckController {
 		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
 		ModelAndView modelAndView = new ModelAndView();
 		modelAndView.addObject("dateFormat", dateFormat);
-		modelAndView.addObject("state", "已做废");
+		modelAndView.addObject("state", "已作废");
 		modelAndView.addObject("data", getEndApChecks(params, searchFilter).getContent());
-		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/saleApCheck", "应收对账单列表_已做废"));
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/saleApCheck", "应收对账单列表_已作废"));
 		logger.log("应收对账单", "导出Excel列表", "导出已做废Excel列表");
 		return modelAndView;
 	}
@@ -539,27 +561,17 @@ public class SaleApCheckController {
      *                @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) {
-		List<Long> distributes = null;
-		// 判断当前用户是否被客户分配
-		if (!SystemSession.getUser().isSys()) {
-			List<Vendor> vendors = userService.findChooseVendor(SystemSession.getUser().getUserUU());
-			distributes = new ArrayList<>();
-			if (!CollectionUtils.isEmpty(vendors)) {
-				for (Vendor v : vendors) {
-					distributes.add(v.getMyEnUU());
-				}
-			} else {
-				return null;
-			}
-		}
+	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", erpProdIODetailService.findXlsApChecks(distributes, keyword, fromDate, endDate));
+		modelAndView.addObject("data", details);
+        modelAndView.addObject("title", "客户应收对账单");
 		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/faApCheck", "客户应收对账单"));
 		logger.log("客户应收对账单", "导出Excel列表", "导出全部Excel列表");
 		return modelAndView;
@@ -598,20 +610,18 @@ public class SaleApCheckController {
 	@ResponseStatus(value = HttpStatus.OK)
 	public ModelMap getOrderUnreadCount() {
 		final ModelMap modelMap = new ModelMap();
-		List<Object[]> list = redDotService.getApCheckCount(Role.BUYER);
+		List<Object[]> idList = redDotService.getApCheckCount(Role.SELLER);
 		int all = 0;
-		String key;
-		int value;
-		for(Object[] objects : list){
-			key = objects[1].toString();
-			value = Integer.valueOf(objects[0].toString());
-			if("已作废".equals(key)){
+		for (Object[] objects : idList) {
+            String key = objects[1].toString();
+			int value = Integer.valueOf(objects[0].toString());
+			if ("已作废".equals(key)) {
 				key = "cancelled";
 				all = all + value;
-			} else if ("已确认".equals(key)){
+			} else if ("已确认".equals(key)) {
 				key = "replied";
 				all = all + value;
-			} else if ("未对账".equals(key)){
+			} else if ("未对账".equals(key)) {
 				key = "notReply";
 			}
 			modelMap.put(key, value);

+ 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("发货失败");
 		}
 	}
 

+ 5 - 5
src/main/java/com/uas/platform/b2b/controller/SaleOrderController.java

@@ -954,8 +954,6 @@ public class SaleOrderController {
 	@ResponseBody
 	public SPage<PurchaseOrderAll> getAllPurcOrders(PageParams params, String searchFilter) {
 		logger.log("采购单", "查看采购订单列表(包括采购明细)(全部)");
-		purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-				SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 		purchaseOrderWaitingDao.updateStatusForSale(SystemSession.getUser().getEnterprise().getUu());
 		PageInfo pageInfo = new PageInfo(params);
 		pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
@@ -1152,9 +1150,11 @@ public class SaleOrderController {
 		// 建索引时,将不处于已结案状态,但是货物全部交接完毕的单,end值设为了2
 		list.add((short) 2);
 		ModelMap map = new ModelMap();
-		map.put("pu_end", new MultiValue(list, true));
-		map.put("pu_status", (short) Status.UNAUDIT.value());
-		pageParams.setNotEqualFilters(map);
+        map.put("pu_end", new MultiValue(list, true));
+        map.put("pu_status", (short) Status.UNAUDIT.value());
+        pageParams.setNotEqualFilters(map);
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        pageParams.getFilters().put("pu_enuu", SystemSession.getUser().getEnterprise().getUu());
 		return searchService.searchPurchaseWaitingOrderIds(keyword, pageParams);
 	}
 

+ 36 - 51
src/main/java/com/uas/platform/b2b/controller/UserController.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2b.controller;
 
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.User;
+import com.uas.platform.b2b.model.UserBaseInfo;
 import com.uas.platform.b2b.model.UserInfo;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.service.UserService;
@@ -88,16 +89,16 @@ public class UserController {
 	}
 
 	/**
-	 * 通过客户UU查询分配的用户
+	 * 通过客户分配id查询分配的用户
 	 *
-	 * @param custUu 客户UU
+	 * @param id 客户UU
 	 * @return
 	 */
-	@RequestMapping(value = "/customer/{uu}", method = RequestMethod.POST)
+	@RequestMapping(value = "/customer/{id}", method = RequestMethod.GET)
 	@ResponseBody
-	public List<User> getUsersAndDistribute(@PathVariable("uu") Long custUu) {
-        LOGGER.log("用户信息", "查询[" + custUu +"]客户分配信息");
-		return userService.findUserInfoDistribute(custUu);
+	public SPage<UserBaseInfo> getUsersAndDistribute(@PathVariable("id") Long id, PageParams params, String keyword) {
+        LOGGER.log("用户信息", "查询[" + id +"]客户分配信息");
+		return userService.findUserInfoDistribute(id, params, keyword);
 	}
 
 	/**
@@ -148,7 +149,7 @@ public class UserController {
 		ModelMap map = new ModelMap();
 		map.put("uu", SystemSession.getUser().getUserUU());
 		map.put("username", SystemSession.getUser().getUserName());
-		return new ResponseEntity<ModelMap>(map, headers, HttpStatus.OK);
+		return new ResponseEntity<>(map, headers, HttpStatus.OK);
 	}
 
 	/**
@@ -225,7 +226,7 @@ public class UserController {
 				request.getSession().setAttribute("user", user);
 			}
 		}
-		return new ResponseEntity<String>(HttpStatus.OK);
+		return new ResponseEntity<>(HttpStatus.OK);
 	}
 
 	/**
@@ -244,7 +245,7 @@ public class UserController {
                 request.getSession().setAttribute("user", user);
             }
 		}
-		return new ResponseEntity<String>(HttpStatus.OK);
+		return new ResponseEntity<>(HttpStatus.OK);
 	}
 
 	/**
@@ -257,7 +258,7 @@ public class UserController {
 	public ResponseEntity<String> removeUser(@PathVariable("uu") Long uu) {
 		userService.removeUser(uu);
         LOGGER.log("用户信息", "删除用户,UU:" + uu);
-		return new ResponseEntity<String>(HttpStatus.OK);
+		return new ResponseEntity<>(HttpStatus.OK);
 	}
 
 	/**
@@ -312,8 +313,8 @@ public class UserController {
 	@RequestMapping(value = "/addVendor/{uu}", method = RequestMethod.POST)
 	@ResponseBody
 	public ResponseEntity<String> bindVendor(@PathVariable("uu") Long userUU, @RequestBody String json) {
-		List<Vendor> ids = FlexJsonUtils.fromJsonArray(json, Vendor.class);
-		boolean result = userService.addVendorToUser(userUU, ids);
+		List<Vendor> vendors = FlexJsonUtils.fromJsonArray(json, Vendor.class);
+		boolean result = userService.addCustomerToUser(userUU, vendors);
 		String resultInfo = result ? "成功" : "失败";
         LOGGER.log("客户权限", "分配客户权限", "userUU: " + userUU + "结果: 分配" + resultInfo);
 		if (result) {
@@ -324,43 +325,36 @@ public class UserController {
 	}
 
 	/**
-	 * 将用户绑定到供应商
-	 * @param custUU
-	 * @param json
-	 * @return
+	 * 客户权限转移
+     *
+	 * @param id 客户关系id
+	 * @param json 用户信息
+	 * @return 转移结果
 	 */
-	@RequestMapping(value = "/bindUserToVendor/{uu}", method = RequestMethod.POST)
+	@RequestMapping(value = "/bindUserToVendor/{id}", method = RequestMethod.POST)
 	@ResponseBody
-	public ResponseEntity<String> bindUserToVendor(@PathVariable("uu") Long custUU, @RequestBody String json) {
-		List<User> users = FlexJsonUtils.fromJsonArray(json, User.class);
-		boolean result = userService.addUserToVendor(custUU, users);
+	public ResponseEntity<String> bindUserToVendor(@PathVariable("id") Long id, @RequestBody String json) {
+		List<UserBaseInfo> users = FlexJsonUtils.fromJsonArray(json, UserBaseInfo.class);
+		boolean result = userService.addUserToVendor(id, users);
         String resultInfo = result ? "成功" : "失败";
-        LOGGER.log("客户分配", "绑定用户到指定客户", "客户UU: " + custUU + "结果: 绑定" + resultInfo);
-		if (result) {
-			return new ResponseEntity<>(HttpStatus.OK);
-		} else {
-			return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-		}
+        LOGGER.log("客户分配", "绑定用户到指定客户", "客户UU: " + id + "结果: 绑定" + resultInfo);
+        return new ResponseEntity<>(result ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 
 	/**
 	 * 将客户权限转移给用户(管理员操作)
-	 * @param custUU
+	 * @param id
 	 * @param json
 	 * @return
 	 */
-	@RequestMapping(value = "/transferUserToVendor/{uu}", method = RequestMethod.POST)
+	@RequestMapping(value = "/transferUserToVendor/{id}", method = RequestMethod.POST)
 	@ResponseBody
-	public ResponseEntity<String> transferUserToVendor(@PathVariable("uu") Long custUU, @RequestBody String json) {
-		List<User> users = FlexJsonUtils.fromJsonArray(json, User.class);
-		boolean result = userService.transferUserToVendor(custUU, users);
+	public ResponseEntity<String> transferUserToVendor(@PathVariable("id") Long id, @RequestBody String json) {
+		List<UserBaseInfo> users = FlexJsonUtils.fromJsonArray(json, UserBaseInfo.class);
+		boolean result = userService.transferUserToVendor(id, users);
         String resultInfo = result ? "成功" : "失败";
-        LOGGER.log("客户分配", "将客户权限转移给用户", "客户UU: " + custUU + "结果: 绑定" + resultInfo);
-		if (result) {
-			return new ResponseEntity<>(HttpStatus.OK);
-		} else {
-			return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-		}
+        LOGGER.log("客户分配", "将客户权限转移给用户", "客户UU: " + id + "结果: 绑定" + resultInfo);
+        return new ResponseEntity<>(result ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 
 	/**
@@ -375,11 +369,7 @@ public class UserController {
 		boolean result = userService.transferMyDistribute(custUU, userUU);
         String resultInfo = result ? "成功" : "失败";
         LOGGER.log("客户分配", "将客户权限转移给用户", "客户UU: " + custUU + "结果: 绑定" + resultInfo);
-		if (result) {
-			return new ResponseEntity<String>(HttpStatus.OK);
-		} else {
-			return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
-		}
+        return new ResponseEntity<>(result ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 
 	/**
@@ -396,11 +386,7 @@ public class UserController {
 		boolean result = userService.removeChooseVendor(userUU, ids);
         String resultInfo = result ? "成功" : "失败";
         LOGGER.log("客户分配", "删除被选中客户", "用户UU: " + userUU + "结果: " + resultInfo);
-		if (result) {
-			return new ResponseEntity<>(HttpStatus.OK);
-		} else {
-			return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-		}
+        return new ResponseEntity<>(result ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 
 	/**
@@ -427,7 +413,6 @@ public class UserController {
 		return userService.findDistribute();
 	}
 
-
 	/**
 	 * 查询当前登录用户是否被转移权限
 	 *
@@ -447,10 +432,10 @@ public class UserController {
      *
      * @return
      */
-    @RequestMapping(value = "/getDistribute/{custUU}", method = RequestMethod.GET)
+    @RequestMapping(value = "/getDistribute/{id}", method = RequestMethod.GET)
     @ResponseBody
-    public ModelMap getDistribute(@PathVariable("custUU") Long custUU) {
-        Boolean result = userService.getDistribute(custUU);
+    public ModelMap getDistribute(@PathVariable("id") Long id) {
+        Boolean result = userService.getDistribute(id);
 		ModelMap modelMap = new ModelMap();
 		modelMap.put("result", result);
 		return  modelMap;

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

@@ -4,19 +4,16 @@ import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.model.Distribute;
 import com.uas.platform.b2b.model.OrderType;
 import com.uas.platform.b2b.model.Role;
-import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.User;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.model.VendorContact;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.OrderRedDotService;
-import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.service.VendorService;
 import com.uas.platform.b2b.support.JxlsExcelView;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageParams;
-import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort.Type;
@@ -24,12 +21,10 @@ import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
@@ -56,9 +51,6 @@ public class VendorController {
 	@Autowired
 	private SearchService searchService;
 
-	@Autowired
-	private UserService userService;
-
 	@Autowired
     private OrderRedDotService redDotService;
 
@@ -66,22 +58,14 @@ public class VendorController {
 	 * 获取供应商
 	 */
 	@RequestMapping(value= "/info/search", method = RequestMethod.GET)
-	@ResponseBody
 	public SPage<Vendor> getVendors(PageParams params, String keyword) {
-		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
-		pageParams.getFilters().put("ve_myenuu", SystemSession.getUser().getEnterprise().getUu());
-		pageParams.getFilters().put("ve_vendswitch", Constant.YES);
-		List<Sort> sortList = new ArrayList<>();
-		sortList.add(new Sort("ve_id", false, Type.INT, new Long(1)));
-		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
-		return searchService.searchVendorCheckIds(keyword, pageParams);
+		return vendorService.searchVendorCheckIds(keyword, params);
 	}
 
 	/**
 	 * 获取服务商
 	 */
 	@RequestMapping(value= "/servicer", method = RequestMethod.GET)
-	@ResponseBody
 	public SPage<Vendor> getServicers(PageParams params, String keyword) {
 		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
 		pageParams.getFilters().put("ve_myenuu", SystemSession.getUser().getEnterprise().getUu());
@@ -99,7 +83,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/{id}/info", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor getVendorDetail(@PathVariable Long id) {
 		return vendorService.findById(id);
 	}
@@ -108,36 +91,14 @@ public class VendorController {
 	 * 获取客户
 	 */
 	@RequestMapping(value = "/customer/info/search", method = RequestMethod.GET)
-	@ResponseBody
 	public SPage<Vendor> getCustomers(PageParams params, String keyword) {
-		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
-		List<Object> vendInfo = new ArrayList<>();
-        vendInfo.add(SystemSession.getUser().getEnterprise().getUu());
-        vendInfo.add(SystemSession.getUser().getEnterprise().getEnBussinessCode());
-		pageParams.getFilters().put("ve_vendenuu", new MultiValue(vendInfo, false));
-		pageParams.getFilters().put("ve_custswitch", Constant.YES);
-		List<Sort> sortList = new ArrayList<>();
-		SearchFilter filter = userService.distribute();
-		if (filter != null && filter.getDistribute() == null) {
-			return null;
-		}
-		if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
-			List<Object> list = new ArrayList<>();
-			for (Object object : filter.getDistribute()) {
-				list.add(object);
-			}
-			pageParams.getFilters().put("ve_myenuu", new MultiValue(list, true));
-		}
-		sortList.add(new Sort("ve_id", false, Type.INT, new Long(1)));
-		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
-		return searchService.searchCustCheckIds(keyword, pageParams);
+		return vendorService.getCustomerInfo(params, keyword);
 	}
 
 	/**
 	 * 获取客户在供应商对应的用户
 	 */
 	@RequestMapping(value = "/userInfo/{uu}", method = RequestMethod.GET)
-	@ResponseBody
 	public List<Distribute> getUserInfo(@PathVariable("uu") Long custUu){
 		return vendorService.findUserInfo(custUu);
 	}
@@ -146,7 +107,6 @@ public class VendorController {
 	 * 获取当前用户
 	 */
 	@RequestMapping(value = "/user", method = RequestMethod.GET)
-	@ResponseBody
 	public User getUser(){
 		return SystemSession.getUser();
 	}
@@ -158,7 +118,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/customer/{id}/info", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor getCustomerDetail(@PathVariable Long id) {
 		return vendorService.findById(id);
 	}
@@ -172,6 +131,7 @@ public class VendorController {
 	public ModelMap exportVendorsPermission() {
 		return new ModelMap("success", true);
 	}
+
 	/**
 	 * 导出
 	 * 
@@ -182,22 +142,17 @@ public class VendorController {
 	public ModelAndView exportVendors(PageParams params, String keyword) {
 		params.setCount(SearchConstants.TOP_NUM);
 		params.setPage(1);
-		Map<String, Object> map = new HashMap<String, Object>();
-//		PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
-//		pageInfo.sorting("myEnUU", Direction.ASC);
-//		pageInfo.filter("vendEnUU", SystemSession.getUser().getEnterprise().getUu());
+		Map<String, Object> map = new HashMap<>();
 		map.put("data", getCustomers(params, keyword).getContent());
 		return new ModelAndView(new JxlsExcelView("classpath:jxls-tpl/Customer", "客户列表"), map);
 	}
 	
-	
 	/**
 	 * 供应商个数和客户个数
 	 * 
 	 * @return
 	 */
 	@RequestMapping(value = "/count", method = RequestMethod.GET, headers = "Accept=application/json")
-	@ResponseBody
 	@ResponseStatus(value = HttpStatus.OK)
 	public ModelMap getTodo() {
 		ModelMap modelMap = new ModelMap();
@@ -213,7 +168,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/savecontact", method = RequestMethod.POST)
-	@ResponseBody
 	private VendorContact savecontact(@RequestBody String contact) {
 		VendorContact vendor = JSON.parseObject(contact, VendorContact.class);
 		return vendorService.saveContact(vendor);
@@ -225,7 +179,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/contacts/{venduu}", method = RequestMethod.GET)
-	@ResponseBody
 	private List<VendorContact> getContacts(@PathVariable Long venduu) {
 		return vendorService.getContacts(venduu);
 	}
@@ -236,7 +189,6 @@ public class VendorController {
 	 * @param id
 	 */
 	@RequestMapping(value = "/deleteContact/{id}", method = RequestMethod.DELETE)
-	@ResponseBody
 	private void deleteContact(@PathVariable Long id) {
 		vendorService.deleteContact(id);
 	}
@@ -248,7 +200,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/saveCustomerContact", method = RequestMethod.POST)
-	@ResponseBody
 	private VendorContact saveCustomerContact(@RequestBody String contact) {
 		VendorContact vendor = JSON.parseObject(contact, VendorContact.class);
 		return vendorService.saveCustContact(vendor);
@@ -260,7 +211,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/custContacts/{enuu}", method = RequestMethod.GET)
-	@ResponseBody
 	private List<VendorContact> getCustContacts(@PathVariable Long enuu) {
 		return vendorService.getCustContacts(enuu);
 	}
@@ -272,7 +222,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/vendorInfo", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor findByBusinessCode(String businessCode) {
 		return vendorService.findByBusinessCode(businessCode);
 	}
@@ -282,7 +231,6 @@ public class VendorController {
 	 * @author wangmh
 	 */
 	@RequestMapping(value = "/customer/setRead", method = RequestMethod.POST)
-	@ResponseBody
 	public void setReadByIds() {
         redDotService.setReadByState(OrderType.vendors.name(), Role.SELLER);
 	}
@@ -292,7 +240,6 @@ public class VendorController {
 	 * @author wangmh
 	 */
 	@RequestMapping(value = "/vendor/setRead", method = RequestMethod.POST)
-	@ResponseBody
 	public void setVendorReadByIds() {
 		redDotService.setReadByState(OrderType.vendors.name(), Role.BUYER);
 	}
@@ -301,7 +248,6 @@ public class VendorController {
 	 * 将供应商关系同步到管理平台的合作伙伴关系表
 	 */
 	@RequestMapping(value = "/synchronize/partnerShipRecord", method = RequestMethod.GET)
-	@ResponseBody
 	public void synchronizeToPartnerShipRecord() {
 		// 后台同步功能,使用get直接URL访问,暂时设置成手机号码过滤防止被误访问
 		if (SystemSession.getUser().getUserTel().equals("15671616315") || SystemSession.getUser().getUserTel().equals("18328587849")) {

+ 91 - 0
src/main/java/com/uas/platform/b2b/controller/VendorDistributeController.java

@@ -0,0 +1,91 @@
+package com.uas.platform.b2b.controller;
+
+import com.uas.platform.b2b.model.UserBaseInfo;
+import com.uas.platform.b2b.result.ResultCode;
+import com.uas.platform.b2b.result.ResultMap;
+import com.uas.platform.b2b.service.VendorService;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.uas.search.b2b.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 供应商分配
+ *
+ * @author hejq
+ * @date 2018-12-05 15:54
+ */
+@RequestMapping(value = "/vendorDistribute")
+@RestController
+public class VendorDistributeController {
+
+    @Autowired
+    private VendorService vendorService;
+
+    private final static UsageBufferedLogger LOGGER = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    /**
+     * 为用户分配客户权限,保存绑定(管理员才能操作)
+     *
+     * @param id 供应商关系id
+     * @param json 前端数据
+     * @return 绑定结果
+     */
+    @RequestMapping(value = "/bindVendor/{id}", method = RequestMethod.POST)
+    public ResultMap bindVendor(@PathVariable("id") Long id, @RequestBody String json) {
+        List<UserBaseInfo> users = FlexJsonUtils.fromJsonArray(json, UserBaseInfo.class);
+        boolean result = vendorService.bindVendorToUser(id, users);
+        String resultInfo = result ? "成功" : "失败";
+        LOGGER.log("供应商权限", "分配供应商", "结果: 分配" + resultInfo, "", id);
+        return new ResultMap(result ? ResultCode.OK.code() : ResultCode.ERROR.code());
+    }
+
+    /**
+     * 供应商权限转移
+     *
+     * @param id 供应商关系id
+     * @param json 前端json数据
+     * @return 绑定结果
+     */
+    @RequestMapping(value = "/bindUserToVendor/{id}", method = RequestMethod.POST)
+    public ResultMap bindUserToVendor(@PathVariable("id") Long id, @RequestBody String json) throws IllegalAccessException {
+        List<UserBaseInfo> users = FlexJsonUtils.fromJsonArray(json, UserBaseInfo.class);
+        boolean result = vendorService.transferVendorToUser(id, users);
+        String resultInfo = result ? "成功" : "失败";
+        LOGGER.log("供应商权限", "转移权限", "结果: 绑定" + resultInfo, "", id);
+        return new ResultMap(result ? ResultCode.OK.code() : ResultCode.ERROR.code());
+    }
+
+    /**
+     * 通过供应商UU查询分配的用户
+     *
+     * @param id 供应商客户关系id
+     * @return 符合条件的数据
+     */
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    public SPage<UserBaseInfo> getUsersAndDistribute(@PathVariable("id") Long id, PageParams params, String keyword) throws IllegalAccessException {
+        LOGGER.log("用户信息", "查询[" + id +"]供应商分配信息");
+        return vendorService.findUserInfoVendDistribute(id, params, keyword);
+    }
+
+    /**
+     * 通过分页参数和关键词查询用户信息
+     *
+     * @param params 分页参数
+     * @param keyword 搜索关键词
+     * @return 符合条件的数据
+     */
+    @RequestMapping(value = "/user", method = RequestMethod.GET)
+    public SPage<UserBaseInfo> findByPageInfo(PageParams params, String keyword) {
+        return vendorService.findUserInfoByPage(params, keyword);
+    }
+}

+ 2 - 0
src/main/java/com/uas/platform/b2b/core/util/DateFormatUtils.java

@@ -19,6 +19,8 @@ public class DateFormatUtils {
      */
 	public static final FastDateFormat DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd");
 
+
+
     /**
      * 导出数据日期格式 yyyy年MM月dd日
      */

+ 118 - 1
src/main/java/com/uas/platform/b2b/core/util/DateUtils.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2b.core.util;
 
+import org.apache.commons.lang3.time.FastDateFormat;
+
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -13,15 +15,71 @@ import java.util.GregorianCalendar;
  */
 public class DateUtils {
 
+    /**
+     * 时间比较,默认
+     */
 	public static final int COMPARE_NONE = 0;
+
+    /**
+     * 时间比较,精确到秒
+     */
 	public static final int COMPARE_SECOND = 1;
+
+    /**
+     * 时间比较,精确到分钟
+     */
 	public static final int COMPARE_MINUTE = 2;
+
+    /**
+     * 时间比较,精确到小时
+     */
 	public static final int COMPARE_HOUR = 3;
+
+    /**
+     * 时间比较,精确到天
+     */
 	public static final int COMPARE_DAY = 4;
+
+    /**
+     * 时间比较,精确到月份
+     */
+    public static final int COMPARE_MONTH = 5;
+
+    /**
+     * 时间比较,精确到年份
+     */
+    public static final int COMPARE_YEAR = 6;
 	static final SimpleDateFormat ym = new SimpleDateFormat("yyyyMM");
 	static final SimpleDateFormat YM = new SimpleDateFormat("yyyy-MM");
-	static final SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd");
+    public static final SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd");
 	static final SimpleDateFormat YMD_HMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    static final FastDateFormat MM = FastDateFormat.getInstance("MM");
+    static final FastDateFormat YYYY = FastDateFormat.getInstance("yyyy");
+    static final FastDateFormat DD = FastDateFormat.getInstance("dd");
+    static final SimpleDateFormat COMPARE_HOUR_PATTERN = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
+    static final SimpleDateFormat COMPARE_MINUTE_PATTERN = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
+    static final SimpleDateFormat COMPARE_SECOND_PATTERN = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 获取月份
+     */
+    public static Integer getMonth(Date date) {
+        return Integer.valueOf(MM.format(date));
+    }
+
+    /**
+     * 获取年份
+     */
+    public static Integer getYear(Date date) {
+        return Integer.valueOf(YYYY.format(date));
+    }
+
+    /**
+     * 获取天数
+     */
+    public static Integer getDay(Date date) {
+        return Integer.valueOf(DD.format(date));
+    }
 
 	/**
 	 * 获取月份起始日期
@@ -226,4 +284,63 @@ public class DateUtils {
         calendar.add(Calendar.DATE, increase);
         return calendar.getTime();
     }
+
+    /**
+     * 月份加减
+     *
+     * @param date 传入日期
+     * @param increase 加减天数,负数表示减
+     * @return 处理后的日期
+     */
+    public static Date dateAddMonth(Date date, int increase) {
+        if (date == null) {
+            date = new Date();
+        }
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH, increase);
+        return calendar.getTime();
+    }
+
+    /**
+     * 比较日期大小
+     *
+     * @param firstDate 时间1
+     * @param secondDate 时间2
+     * @param compareType 比较类型
+     *            精确位(天、小时、分钟、秒)
+     * @return 1:firstDate > secondDate; 0: firstDate = secondDate; -1: firstDate < secondDate;
+     */
+    public static int dateCompare(Date firstDate, Date secondDate, int compareType) {
+        String firstDateParam;
+        String secondDateParam;
+        if (COMPARE_NONE == compareType) {
+            return firstDate.compareTo(secondDate);
+        } else if (COMPARE_SECOND == compareType) {
+            firstDateParam = COMPARE_SECOND_PATTERN.format(firstDate);
+            secondDateParam = COMPARE_SECOND_PATTERN.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        } else if (COMPARE_MINUTE == compareType) {
+            firstDateParam = COMPARE_MINUTE_PATTERN.format(firstDate);
+            secondDateParam = COMPARE_MINUTE_PATTERN.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        } else if (COMPARE_HOUR == compareType) {
+            firstDateParam = COMPARE_HOUR_PATTERN.format(firstDate);
+            secondDateParam = COMPARE_HOUR_PATTERN.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        } else if (COMPARE_DAY == compareType) {
+            firstDateParam = YMD.format(firstDate);
+            secondDateParam = YMD.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        } else if (COMPARE_MONTH == compareType) {
+            firstDateParam = YM.format(firstDate);
+            secondDateParam = YM.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        } else if (COMPARE_YEAR == compareType) {
+            firstDateParam = YYYY.format(firstDate);
+            secondDateParam = YYYY.format(secondDate);
+            return firstDateParam.compareTo(secondDateParam);
+        }
+        return 0;
+    }
 }

+ 51 - 10
src/main/java/com/uas/platform/b2b/dao/DistributeDao.java

@@ -3,27 +3,36 @@ package com.uas.platform.b2b.dao;
 import com.uas.platform.b2b.model.Distribute;
 import com.uas.platform.core.data.repository.GenericRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
+/**
+ * 客户分配信息
+ *
+ * @author hejq
+ * @date 2018-12-12 9:26
+ */
 @Repository
 public interface DistributeDao extends JpaSpecificationExecutor<Distribute>, GenericRepository<Distribute, Long> {
 	
 	/**
 	 * 根据用户UU查询客户分配表 
 	 * @param userUU
-	 * @return
+	 * @return 分配记录
 	 */
 	List<Distribute> findByUserUU(Long userUU);
 	
 	/**
-	 * 根据用户UU和vendor ID
-	 * @param userUU
-	 * @param vendorId
-	 * @return
+	 * 根据用户UU和vendor ID 查询客户分配表
+	 * @param userUU 用户UU
+	 * @param vendorId vendor ID
+	 * @return 分配记录
 	 */
-	List<Distribute> findByUserUUAndVendorId(Long userUU,Long vendorId);
+	List<Distribute> findByUserUUAndVendorId(Long userUU, Long vendorId);
 
 	/**
 	 * 通过供应商表id查询客户分配
@@ -31,16 +40,48 @@ public interface DistributeDao extends JpaSpecificationExecutor<Distribute>, Gen
 	 * @param vendorIds 供应商客户关系表id
 	 * @return List<Distribute>
 	 */
-	List<Distribute> findByVendorId(List<Long> vendorIds);
+	@Query("select d from Distribute d where d.vendorId in (:vendorIds)")
+	List<Distribute> findByVendorId(@Param("vendorIds") List<Long> vendorIds);
 
+    /**
+     * 通过供应商客户关系表ID查询客户分配信息
+     *
+     * @param vendorId 供应商客户关系表ID
+     * @return 客户分配
+     */
 	List<Distribute> findByVendorId(Long vendorId);
 
 	/**
 	 * 查找被当前用户绑定当前客户权限的记录
-	 * @param id
-	 * @param userUU
-	 * @return
+	 * @param id 供应商关系表id
+	 * @param userUU 转移人UU
+	 * @return 客户分配
 	 */
 	List<Distribute> findByVendorIdAndLeaderUU(Long id, Long userUU);
 
+	/**
+	 * 根据leaderUU 查询客户绑定记录
+	 * @param userUU 用户UU
+	 * @return 分配记录
+	 */
+    List<Distribute> findByLeaderUU(Long userUU);
+
+    /**
+     * 通过用户UU和供应商UU查询分配的客户信息
+     *
+     * @param UserUU 用户UU
+     * @param vendorUU 供应商UU
+     * @return 分配记录
+     */
+    @Query("select d from Distribute d where d.userUU = :userUU and d.vendor.vendEnUU = :vendorUU")
+    List<Distribute> findByUserUUAndVendorUU(@Param("userUU") Long UserUU, @Param("vendorUU") Long vendorUU);
+
+    /**
+     * 通过用户UU和供应商关系id查询客户分配信息
+     *
+     * @param userUUList 用户UUlist
+     * @param vendorId 供应商表Id
+     * @return 符合条件的客户分配关系
+     */
+    List<Distribute> findByVendorIdAndUserUUIn(Long vendorId, List<Long> userUUList);
 }

+ 9 - 0
src/main/java/com/uas/platform/b2b/dao/EnterpriseDao.java

@@ -11,6 +11,7 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import javax.persistence.QueryHint;
+import java.sql.Date;
 import java.util.List;
 
 /**
@@ -116,4 +117,12 @@ public interface EnterpriseDao extends JpaSpecificationExecutor<Enterprise>,JpaR
 	 */
 	@Query("from Enterprise e where e.enName = :name")
 	List<Enterprise> findByName(@Param("name") String name);
+
+	/**
+	 * 查找符合条件的企业uu
+	 * @param date
+	 * @return
+	 */
+	@Query(value = "select distinct e.uu from Enterprise e where e.enDate <= :date")
+	List<Long> findEnuu(@Param("date") Date date);
 }

+ 10 - 0
src/main/java/com/uas/platform/b2b/dao/PurchaseApCheckDao.java

@@ -37,4 +37,14 @@ public interface PurchaseApCheckDao extends JpaSpecificationExecutor<PurchaseApC
 	 */
 	@Query("select count(p), p.checkStatus from PurchaseApCheck p where p.id in :ids group by p.checkStatus")
 	List<Object[]> getUnreadCountEveryStatus(@Param("ids") List<Long> ids);
+
+    /**
+     * 根据客户UU和供应商UU获取最后一次对账金额
+     *
+     * @param myEnUU 客户UU
+     * @param enUU 供应商UU
+     * @return 最后一次对账信息
+     */
+	@Query(value = "select p.* from purc$apcheck p where p.pa_custuu = :myEnUU and p.pa_enuu = :enUU order by p.pa_recorddate desc limit 1", nativeQuery = true)
+    PurchaseApCheck findByCustomerUUAndEnUU(@Param("myEnUU") Long myEnUU, @Param("enUU") Long enUU);
 }

+ 0 - 11
src/main/java/com/uas/platform/b2b/dao/PurchaseOrderAllDao.java

@@ -4,7 +4,6 @@ import com.uas.platform.b2b.model.PurchaseOrderAll;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
@@ -68,15 +67,5 @@ public interface PurchaseOrderAllDao extends JpaSpecificationExecutor<PurchaseOr
 	@Query("select count(o) from PurchaseOrderAll o where o.enUU = :enUU and o.userUU = :userUU and o.status = :status")
 	public int getTodoCountByEnUUAndUserUUAndStatus(@Param("enUU") Long enUU, @Param("userUU") Long userUU,
 			@Param("status") Short status);
-	
-	/**
-	 * 查询订单之前先设置状态,将未读的订单放在最上面
-	 * 
-	 * @param useruu
-	 * @param enuu
-	 * @param orderkind
-	 */
-	@Procedure(procedureName = "orders_set_status_beforeread")
-	public void setDisplayStatus(Long useruu, Long enuu, String orderkind);
 
 }

+ 2 - 2
src/main/java/com/uas/platform/b2b/dao/RoleDao.java

@@ -39,7 +39,7 @@ public interface RoleDao extends JpaRepository<Role, Long> {
     List<Role> findByEnUUAndIssys(Long enUU, short yes);
 
 	/**
-	 * 查询当前用户在当前企业的角色是否是管理员或者销售经理<br>
+	 * 通过角色名称查询在当前企业的角色<br>
 	 *
 	 * 分配客户需要
 	 *
@@ -49,7 +49,7 @@ public interface RoleDao extends JpaRepository<Role, Long> {
 	 * @return
 	 */
 	@Query(value = "select count(1) from sec$roles r left join sec$userrole u on r.role_id = u.role_id where r.role_enuu = :enUU and u.user_uu = :userUU and r.role_name IN (:roles)", nativeQuery = true)
-	Double findByEnUUAndUserUU(@Param("enUU") Long enUU, @Param("userUU") Long userUU, @Param("roles") List<String> roles);
+	Integer countByEnUUAndUserUU(@Param("enUU") Long enUU, @Param("userUU") Long userUU, @Param("roles") List<String> roles);
 
 	/**
 	 * 根据角色名称查找默认角色的默认值

+ 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);
 }

+ 71 - 6
src/main/java/com/uas/platform/b2b/dao/UserBaseInfoDao.java

@@ -2,28 +2,93 @@ package com.uas.platform.b2b.dao;
 
 import java.util.List;
 
+import com.uas.platform.b2b.model.User;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.uas.platform.b2b.model.UserBaseInfo;
 
+/**
+ * 用户基本信息Dao层
+ * @author US50
+ */
 @Repository
 public interface UserBaseInfoDao extends JpaSpecificationExecutor<UserBaseInfo>, JpaRepository<UserBaseInfo, Long> {
 
 	/**
 	 * 通过uu号查询基本用户信息
 	 * 
-	 * @param userUU
-	 * @return
+	 * @param userUU 用户UU
+	 * @return 查询结果
 	 */
-	public UserBaseInfo findByUserUU(Long userUU);
+    UserBaseInfo findByUserUU(Long userUU);
 
 	/**
 	 * 通过电话号码查询用户信息
 	 * 
-	 * @param userTel
-	 * @return
+	 * @param userTel 电话
+	 * @return 查询结果
 	 */
-	public List<UserBaseInfo> findByUserTel(String userTel);
+    List<UserBaseInfo> findByUserTel(String userTel);
+
+    /**
+     * 按企业ID和查找个人
+     *
+     * @param enUU 企业UU
+     * @return List<User>
+     */
+    @Query(value = "select u.* from sec$users u inner join sec$userenterprise as e on u.user_uu = e.user_uu where e.en_uu = :enUU", nativeQuery = true)
+    List<UserBaseInfo> findByEnUU(@Param("enUU") long enUU);
+
+    /**
+     * 通过企业UU过滤和搜索词分页搜索用户基本信息
+     *
+     * @param enUU 企业UU
+     * @param keyword 关键词
+     * @param pageNumber 页码
+     * @param pageSize 分页大小
+     * @return 搜索结果
+     */
+    @Query(value = "select u.* from sec$users u inner join sec$userenterprise as e on e.user_uu = u.user_uu " +
+        "where e.en_uu = :enUU and (u.user_name like %:keyword% or u.user_tel like %:keyword%) limit :pageNumber, :pageSize", nativeQuery = true)
+    List<UserBaseInfo> findByEnUUAndKeyword(@Param("enUU") long enUU, @Param("keyword") String keyword,
+                                            @Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize);
+
+    /**
+     * 通过企业UU过滤用户基本信息
+     *
+     * @param enUU 企业UU
+     * @param pageNumber 页码
+     * @param pageSize 分页大小
+     * @return 搜索结果
+     */
+    @Query(value = "select u.* from sec$users u inner join sec$userenterprise as e on e.user_uu = u.user_uu " +
+        "where e.en_uu = :enUU limit :pageNumber, :pageSize", nativeQuery = true)
+    List<UserBaseInfo> findByEnUU(@Param("enUU") long enUU, @Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize);
+
+    /**
+     * 通过企业UU过滤和搜索词统计总数
+     *
+     * @param enUU 企业UU
+     * @param keyword 关键词
+     * @return 数量
+     */
+    @Query(value = "select count(1) from sec$users u inner join sec$userenterprise as e on e.user_uu = u.user_uu " +
+        "where e.en_uu = :enUU and (u.user_name like %:keyword% or u.user_tel like %:keyword%)", nativeQuery = true)
+    Integer countByEnUUAndKeyword(@Param("enUU") long enUU, @Param("keyword") String keyword);
+
+    /**
+     * 通过企业UU统计总数
+     *
+     * @param enUU 企业UU
+     * @return 数量
+     */
+    @Query(value = "select count(1) from sec$users u inner join sec$userenterprise as e on e.user_uu = u.user_uu " +
+        "where e.en_uu = :enUU", nativeQuery = true)
+    Integer countByEnUU(@Param("enUU") long enUU);
 }

+ 63 - 0
src/main/java/com/uas/platform/b2b/dao/VendorDistributeDao.java

@@ -0,0 +1,63 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.VendorDistribute;
+import com.uas.platform.core.data.repository.GenericRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 供应商分配表
+ *
+ * @author hejq
+ * @date 2018-12-04 19:06
+ */
+@Repository
+public interface VendorDistributeDao extends JpaSpecificationExecutor<VendorDistribute>, GenericRepository<VendorDistribute, Long> {
+
+	/**
+	 * 通过供应商表id查询客户分配
+	 *
+	 * @param vendorIds 供应商客户关系表id
+	 * @return List<Distribute>
+	 */
+	@Query("select d from VendorDistribute d where d.vendorId in (:vendorIds)")
+	List<VendorDistribute> findByVendorIdList(@Param("vendorIds") List<Long> vendorIds);
+
+    /**
+     * 通过供应商表id查询客户分配
+     *
+     * @param veId 供应商关系表id
+     * @return 查询分配结果
+     */
+    List<VendorDistribute> findByVendorId(Long veId);
+
+    /**
+     * 通过用户UU和客户供应商关系查询分配是否存在
+     *
+     * @param userUU 用户UU
+     * @param id 供应商客户关系id
+     * @return 供应商分配关系
+     */
+    List<VendorDistribute> findByUserUUAndVendorId(Long userUU, Long id);
+
+    /**
+     * 查找被当前用户绑定当前供应商权限的记录
+     * @param vendorId 供应商客户关系表id
+     * @param userUU 用户UU
+     * @return 权限转移结果
+     */
+    List<VendorDistribute> findByVendorIdAndLeaderUU(Long vendorId, Long userUU);
+
+    /**
+     * 通过供应商客户id和转移状态查询供应商分配结果
+     *
+     * @param vendorId 供应商客户关系id
+     * @param status 转移状态
+     * @return 分配结果
+     */
+    List<VendorDistribute> findByVendorIdAndIsTransfer(Long vendorId, Short status);
+}

+ 5 - 5
src/main/java/com/uas/platform/b2b/erp/controller/PurchaseAPBillController.java

@@ -4,7 +4,7 @@ import com.uas.platform.b2b.erp.model.PurchaseAPBill;
 import com.uas.platform.b2b.erp.service.PurchaseAPBillService;
 import com.uas.platform.b2b.erp.support.ErpBufferedLogger;
 import com.uas.platform.b2b.model.ApbillAdjustment;
-import com.uas.platform.b2b.service.ApbillAdjustmentService;
+import com.uas.platform.b2b.service.ApBillAdjustmentService;
 import com.uas.platform.b2b.service.PurchaseApBillService;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
@@ -15,8 +15,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
+import java.io.*;
+import java.net.*;
 import java.util.List;
 
 /**
@@ -37,7 +37,7 @@ public class PurchaseAPBillController {
 	private PurchaseAPBillService purchaseAPBillService;
 
 	@Autowired
-	private ApbillAdjustmentService apbillAdjustmentService;
+	private ApBillAdjustmentService apbillAdjustmentService;
 
 	private final static ErpBufferedLogger logger = BufferedLoggerManager.getLogger(ErpBufferedLogger.class);
 
@@ -103,6 +103,6 @@ public class PurchaseAPBillController {
 	public void nonPostAdjustment(@RequestParam("data") String data) throws UnsupportedEncodingException {
 		String jsonStr = URLDecoder.decode(data, "UTF-8");
 		List<PurchaseAPBill> apBills = FlexJsonUtils.fromJsonArray(jsonStr, PurchaseAPBill.class);
-		apbillAdjustmentService.nonPosting(apbillAdjustmentService.convertnonPostAdjustment(apBills));
+		apbillAdjustmentService.nonPosting(apbillAdjustmentService.convertNonPostAdjustment(apBills));
 	}
 }

+ 10 - 0
src/main/java/com/uas/platform/b2b/erp/exception/NotFoundUtils.java

@@ -31,4 +31,14 @@ public class NotFoundUtils {
     public static void OrderNotFound(String paramString, String sign) {
         throw new NotFoundException(String.format("%s未找到", new Object[]{paramString}), new Throwable(sign));
     }
+
+    /**
+     * 单据未找到
+     *
+     * @param source 异常来源
+     * @param enUU 企业UU
+     */
+    public static void EnterpriseNotFound(String source, Long enUU) {
+        throw new NotFoundException(String.format("%s, %d对应企业未找到", new Object[]{source, enUU}), new Throwable());
+    }
 }

+ 38 - 0
src/main/java/com/uas/platform/b2b/erp/listen/controller/ListenController.java

@@ -0,0 +1,38 @@
+package com.uas.platform.b2b.erp.listen.controller;
+
+import com.uas.platform.b2b.erp.listen.dao.ListenDao;
+import com.uas.platform.b2b.erp.listen.model.Listen;
+import com.uas.platform.b2b.erp.listen.service.ListenService;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+
+/**
+ * @Author: huj
+ * @Date: Created in 16:04 2018/11/27.
+ */
+@RestController
+@RequestMapping("/erp/listen")
+public class ListenController {
+
+    @Autowired
+    ListenService listenService;
+
+    /**
+     * 更新erp轮询状态
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    public void save(@RequestParam("data") String data) throws UnsupportedEncodingException {
+        String jsonStr = URLDecoder.decode(data, "UTF-8");
+        List<Listen> listens = FlexJsonUtils.fromJsonArray(jsonStr, Listen.class);
+        listenService.save(listens);
+    }
+}

+ 16 - 0
src/main/java/com/uas/platform/b2b/erp/listen/dao/ListenDao.java

@@ -0,0 +1,16 @@
+package com.uas.platform.b2b.erp.listen.dao;
+
+import com.uas.platform.b2b.erp.listen.model.Listen;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: huj
+ * @Date: Created in 16:28 2018/11/27.
+ */
+@Repository
+public interface ListenDao extends JpaRepository<Listen, Long>, JpaSpecificationExecutor<Listen> {
+
+    Listen findByMacAddress(String macAddress);
+}

+ 82 - 0
src/main/java/com/uas/platform/b2b/erp/listen/model/Listen.java

@@ -0,0 +1,82 @@
+package com.uas.platform.b2b.erp.listen.model;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @Author: huj
+ * @Date: Created in 16:04 2018/11/27.
+ */
+@Table(name = "listen$erp", indexes = {@Index(name = "unique_mac_address",
+        columnList = "mac_address", unique = true)})
+@Entity
+public class Listen {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "mac_address")
+    private String macAddress;
+
+    @Column(name = "name", length = 2000)
+    private String name;
+
+    @Column(name = "date")
+    private Date date;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "status")
+    private String status;
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getMacAddress() {
+        return macAddress;
+    }
+
+    public void setMacAddress(String macAddress) {
+        this.macAddress = macAddress;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}

+ 17 - 0
src/main/java/com/uas/platform/b2b/erp/listen/service/ListenService.java

@@ -0,0 +1,17 @@
+package com.uas.platform.b2b.erp.listen.service;
+
+import com.uas.platform.b2b.erp.listen.model.Listen;
+
+import java.util.List;
+
+/**
+ * @Author: huj
+ * @Date: Created in 16:30 2018/11/27.
+ */
+public interface ListenService {
+
+    /**
+     * 保存操作
+     */
+    void save(List<Listen> listen);
+}

+ 56 - 0
src/main/java/com/uas/platform/b2b/erp/listen/service/impl/ListenServiceImpl.java

@@ -0,0 +1,56 @@
+package com.uas.platform.b2b.erp.listen.service.impl;
+
+import com.uas.platform.b2b.erp.listen.dao.ListenDao;
+import com.uas.platform.b2b.erp.listen.model.Listen;
+import com.uas.platform.b2b.erp.listen.service.ListenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: huj
+ * @Date: Created in 16:31 2018/11/27.
+ */
+@Service
+public class ListenServiceImpl implements ListenService {
+
+    @Autowired
+    ListenDao listenDao;
+
+    /**
+     * 保存操作
+     */
+    @Override
+    public void save(List<Listen> listens) {
+        if (!CollectionUtils.isEmpty(listens)) {
+            listens.forEach(listen -> {
+                Listen exitListen = listenDao.findByMacAddress(listen.getMacAddress());
+                if (!StringUtils.isEmpty(exitListen)) {
+                    if (!StringUtils.isEmpty(listen.getName())) {
+                        exitListen.setName(listen.getName());
+                    }
+                    exitListen.setDate(new Date());
+                    exitListen.setDescription(listen.getDescription());
+                    if (StringUtils.isEmpty(listen.getDescription()) || "所有账套都未启用轮询".equals(listen.getDescription())) {
+                        exitListen.setStatus("正常");
+                    } else {
+                        exitListen.setStatus("异常");
+                    }
+                    listenDao.save(exitListen);
+                } else {
+                    listen.setDate(new Date());
+                    if (StringUtils.isEmpty(listen.getDescription()) || "所有账套都未启用轮询".equals(listen.getDescription())) {
+                        listen.setStatus("正常");
+                    } else {
+                        listen.setStatus("异常");
+                    }
+                    listenDao.save(listen);
+                }
+            });
+        }
+    }
+}

+ 7 - 4
src/main/java/com/uas/platform/b2b/erp/model/PurchaseAPBill.java

@@ -7,7 +7,11 @@ import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Status;
 import org.springframework.util.CollectionUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 采购方角度ERP应付票据单
@@ -274,9 +278,8 @@ public class PurchaseAPBill extends KeyEntity {
 	public List<String> getProductCode() {
 	    List<String> codeStr = new ArrayList<>();
 		if (!CollectionUtils.isEmpty(details)) {
-            details.forEach(detail -> {
-                codeStr.add(detail.getAbd_prodcode());
-            });
+            details.stream().filter(detail -> null != detail.getAbd_prodcode())
+                .forEach(detail -> codeStr.add(detail.getAbd_prodcode()));
 		}
 		return codeStr;
 	}

+ 33 - 0
src/main/java/com/uas/platform/b2b/erp/model/PurchaseDetail.java

@@ -50,8 +50,38 @@ public class PurchaseDetail {
 	private Float pd_purctaxrate;
 	//终端币别
 	private String pd_purccurrency;
+	//税收分类编码
+	private String pd_taxcode;
+	//开票名称
+	private String pd_billname;
+	//开票型号
+	private String pd_orispeccode;
 	private List<Attach> attaches;
 
+	public String getPd_taxcode() {
+		return pd_taxcode;
+	}
+
+	public void setPd_taxcode(String pd_taxcode) {
+		this.pd_taxcode = pd_taxcode;
+	}
+
+	public String getPd_billname() {
+		return pd_billname;
+	}
+
+	public void setPd_billname(String pd_billname) {
+		this.pd_billname = pd_billname;
+	}
+
+	public String getPd_orispeccode() {
+		return pd_orispeccode;
+	}
+
+	public void setPd_orispeccode(String pd_orispeccode) {
+		this.pd_orispeccode = pd_orispeccode;
+	}
+
 	public Float getPd_purcprice() {
 		return pd_purcprice;
 	}
@@ -265,6 +295,9 @@ public class PurchaseDetail {
 		item.setPurcCurrency(this.pd_purccurrency);
 		item.setPurcPrice(this.pd_purcprice);
 		item.setPurcTaxRate(this.pd_purctaxrate);
+		item.setTaxCode(this.pd_taxcode);
+		item.setBillName(this.pd_billname);
+		item.setOriSpecCode(this.pd_orispeccode);
 		if (!CollectionUtils.isEmpty(this.attaches)) {
 			Set<com.uas.platform.b2b.model.Attach> b2bAttaches = new HashSet<com.uas.platform.b2b.model.Attach>();
 			for(Attach attach : this.attaches) {

+ 33 - 0
src/main/java/com/uas/platform/b2b/erp/model/SaleDownDetail.java

@@ -42,6 +42,36 @@ public class SaleDownDetail {
 	private Float sd_SpecTaxRate;
 	//终端币别
 	private String sd_SpecCurrency;
+	//客户物料税收分类编码
+	private String sd_prodtaxcode;
+	//客户物料开票名称
+	private String sd_prodbillname;
+	//客户物料开票型号
+	private String sd_prodorispeccode;
+
+	public String getSd_prodtaxcode() {
+		return sd_prodtaxcode;
+	}
+
+	public void setSd_prodtaxcode(String sd_prodtaxcode) {
+		this.sd_prodtaxcode = sd_prodtaxcode;
+	}
+
+	public String getSd_prodbillname() {
+		return sd_prodbillname;
+	}
+
+	public void setSd_prodbillname(String sd_prodbillname) {
+		this.sd_prodbillname = sd_prodbillname;
+	}
+
+	public String getSd_prodorispeccode() {
+		return sd_prodorispeccode;
+	}
+
+	public void setSd_prodorispeccode(String sd_prodorispeccode) {
+		this.sd_prodorispeccode = sd_prodorispeccode;
+	}
 
 	public Float getSd_SpecPrice() {
 		return sd_SpecPrice;
@@ -296,6 +326,9 @@ public class SaleDownDetail {
 		this.sd_SpecPrice = orderItem.getPurcPrice();
 		this.sd_SpecCurrency = orderItem.getPurcCurrency();
 		this.sd_SpecTaxRate = orderItem.getPurcTaxRate();
+		this.sd_prodtaxcode = orderItem.getTaxCode();
+		this.sd_prodbillname = orderItem.getBillName();
+		this.sd_prodorispeccode = orderItem.getOriSpecCode();
 	}
 
 	/**

+ 8 - 7
src/main/java/com/uas/platform/b2b/erp/model/SaleOut.java

@@ -1,16 +1,16 @@
 package com.uas.platform.b2b.erp.model;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.collections.CollectionUtils;
-
+import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.model.SaleSend;
 import com.uas.platform.b2b.model.SaleSendItem;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.Status;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * 卖家ERP系统的发货单
@@ -163,6 +163,7 @@ public class SaleOut {
 			}
 		}
 		send.setSendItems(items);
+		send.setUuid(StringUtil.uuid());
 		return send;
 	}
 

+ 12 - 0
src/main/java/com/uas/platform/b2b/erp/model/VendorInfo.java

@@ -26,6 +26,11 @@ public class VendorInfo {
 	 */
 	private Short apcheck;
 
+    /**
+     * 供应商关系表id
+     */
+	private Long id;
+
 	public Long getVenduu() {
 		return venduu;
 	}
@@ -50,4 +55,11 @@ public class VendorInfo {
 		this.apcheck = apcheck;
 	}
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
 }

+ 23 - 8
src/main/java/com/uas/platform/b2b/erp/service/impl/PurchaseAPBillServiceImpl.java

@@ -2,10 +2,15 @@ package com.uas.platform.b2b.erp.service.impl;
 
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.PurchaseApBillDao;
+import com.uas.platform.b2b.erp.exception.NotFoundUtils;
 import com.uas.platform.b2b.erp.model.PurchaseAPBill;
 import com.uas.platform.b2b.erp.model.PurchaseAPBillDetail;
 import com.uas.platform.b2b.erp.service.PurchaseAPBillService;
-import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.model.ApbillAdjustment;
+import com.uas.platform.b2b.model.Enterprise;
+import com.uas.platform.b2b.model.ProductInfo;
+import com.uas.platform.b2b.model.PurchaseApBill;
+import com.uas.platform.b2b.model.PurchaseApBillItem;
 import com.uas.platform.b2b.ps.ProductUtils;
 import com.uas.platform.b2b.support.CollectionUtil;
 import com.uas.platform.b2b.support.SystemSession;
@@ -13,7 +18,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 应付发票
@@ -63,7 +74,7 @@ public class PurchaseAPBillServiceImpl implements PurchaseAPBillService {
 
 	@Override
 	public List<PurchaseApBill> convertNonPostingApBills(List<PurchaseAPBill> apBills) {
-		List<PurchaseApBill> purchaseApBills = new ArrayList<PurchaseApBill>();
+		List<PurchaseApBill> purchaseApBills = new ArrayList<>();
 		if (!CollectionUtils.isEmpty(apBills)) {
 			Long enUU = SystemSession.getUser().getEnterprise().getUu();
 			for (PurchaseAPBill apBill : apBills) {
@@ -78,12 +89,12 @@ public class PurchaseAPBillServiceImpl implements PurchaseAPBillService {
 
 	@Override
 	public List<ApbillAdjustment> convertApbillAdjustment(List<PurchaseAPBill> apBills) throws Exception {
-		List<ApbillAdjustment> adjusts = new ArrayList<ApbillAdjustment>();
+		List<ApbillAdjustment> adjusts = new ArrayList<>();
 		if (!CollectionUtils.isEmpty(apBills)) {
 			Long enUU = SystemSession.getUser().getEnterprise().getUu();
 			// 获取物料编号集合
 			Set<String> productCodes = CollectionUtil.getProductCodeCollection(apBills);
-            Map<String, ProductInfo> products = null;
+            Map<String, ProductInfo> products = new HashMap<>(2);
             if (!CollectionUtils.isEmpty(productCodes)) {
                 products = ProductUtils.findByEnUUAndCodes(enUU, productCodes);
             }
@@ -91,9 +102,13 @@ public class PurchaseAPBillServiceImpl implements PurchaseAPBillService {
 				if (!CollectionUtils.isEmpty(apBill.getDetails())) {
 					for (PurchaseAPBillDetail detail : apBill.getDetails()) {
 						ApbillAdjustment adjust = new ApbillAdjustment(apBill, detail);
-						Enterprise enterprise = enterpriseDao.findEnterpriseByUu(adjust.getEnuu());
-						adjust.setReceivename(enterprise.getEnName());
-						if (!CollectionUtils.isEmpty(products)) {
+						Enterprise enterprise = enterpriseDao.findOne(adjust.getEnuu());
+						if (null != enterprise) {
+                            adjust.setReceivename(enterprise.getEnName());
+                        } else {
+                            NotFoundUtils.EnterpriseNotFound("货款调账:[" + adjust.getInoutno() + "], 序号[" + adjust.getDetno() + "]", adjust.getEnuu());
+                        }
+						if (!products.isEmpty()) {
                             ProductInfo product = products.get(adjust.getProdcode());
                             if (null != product) {
                                 adjust.setPrid(product.getId());

+ 7 - 2
src/main/java/com/uas/platform/b2b/erp/service/impl/VendorServiceImpl.java

@@ -27,7 +27,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 供应商资料
@@ -125,7 +129,8 @@ public class VendorServiceImpl implements VendorService {
                             addNewRecord(record.getVendusertel(), record.getVenduseremail(), sdf.format(new Date()), record.getVendname());
                         }
                         // 同步一个数据到账户中心(不是必须,不判断状态)
-                        if (record.getId() == null) {// 新增时候才进行同步
+                        // 新增时候才进行同步
+                        if (record.getId() == null) {
                             try {
                                 record.setUser(null);
                                 record.setId(null);

+ 7 - 10
src/main/java/com/uas/platform/b2b/filter/SSOInterceptor.java

@@ -84,9 +84,6 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	@Autowired
     private UserDao userDao;
 
-	@Autowired
-    private com.uas.platform.b2b.v2.service.EnterpriseService v2EnterpriseService;
-
 	@Autowired
     private RoleDao roleDao;
 
@@ -136,7 +133,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 				// 企业资料在client系统自己的唯一标识,比如en_uu
 				if (tokenUser.getSpaceUU() != null) {
                     authorizedUser.setCurrentEnterprise(tokenUser.getSpaceUU());
-				} else if (StringUtils.isEmpty(tokenUser.getBusinessCode())) {
+				} else if (!StringUtils.isEmpty(tokenUser.getBusinessCode())) {
 					for (Enterprise enterprise : authorizedUser.getEnterprises()) {
 						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
 						if (tokenUser.getBusinessCode().equals(enterprise.getEnBussinessCode())) {
@@ -178,7 +175,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
             // 登录之前判断在当前企业的角色信息
             if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
                 Enterprise enterprise = user.getEnterprise();
-                user = setUserRole(user, enterprise);
+                user = checkRoleAndReturnUserInfo(user, enterprise);
                 user.setCurrentEnterprise(enterprise.getUu());
             }
 			SystemSession.setUser(user);
@@ -210,13 +207,13 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
     }
 
     /**
-     * 登陆后角色校验
+     * 校验角色信息,返回用户信息
      *
      * @param user 用户
      * @param enterprise 当前企业
      * @return User
      */
-    private User setUserRole(User user, Enterprise enterprise) {
+    private User checkRoleAndReturnUserInfo(User user, Enterprise enterprise) {
         // 设置为本企业管理员
         List<Role> adminList = roleDao.findByEnUUAndDesc(enterprise.getUu(), "管理员");
         Set<Role> existRoles = user.getRoles();
@@ -227,13 +224,13 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
                     exist[0] = true;
                 }
             });
-            // 角色不存在设置角色,如果存储出现异常直接从数据库取出用户信息
             if (!exist[0]) {
                 user.getRoles().add(adminList.get(0));
                 try {
                     user = userDao.save(user);
                 } catch (Exception e) {
-                    user = userService.findUserByUserUU(user.getUserUU());
+                    // 这里存储异常情况通常是角色存在,因为上面已经添加角色信息,这里直接返回user,不做处理
+                   logger.info("存储异常" + e.getMessage());
                 }
             }
         }
@@ -321,7 +318,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
             // 登录之前判断在当前企业的角色信息
             if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
                 Enterprise enterprise = user.getEnterprise();
-                user = setUserRole(user, enterprise);
+                user = checkRoleAndReturnUserInfo(user, enterprise);
                 user.setCurrentEnterprise(enterprise.getUu());
             }
 			SystemSession.setUser(user);

+ 3 - 3
src/main/java/com/uas/platform/b2b/listener/GlobalExceptionHandler.java

@@ -24,8 +24,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
+import java.io.*;
+import java.net.*;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -99,6 +99,6 @@ public class GlobalExceptionHandler {
         }
         HttpHeaders headers = new HttpHeaders();
         headers.add("Content-Type", "application/text; charset=utf-8");
-        return new ResponseEntity(e.getMessage(), headers, HttpStatus.INTERNAL_SERVER_ERROR);
+        return new ResponseEntity<>(e.getMessage(), headers, HttpStatus.INTERNAL_SERVER_ERROR);
     }
 }

+ 17 - 29
src/main/java/com/uas/platform/b2b/mobile/controller/SaleController.java

@@ -8,7 +8,15 @@ import com.uas.platform.b2b.dao.PurchaseOrderWaitingDao;
 import com.uas.platform.b2b.mobile.model.OrderReply;
 import com.uas.platform.b2b.mobile.model.Purchase;
 import com.uas.platform.b2b.mobile.service.PurchaseService;
-import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderDone;
+import com.uas.platform.b2b.model.PurchaseOrderEnd;
+import com.uas.platform.b2b.model.PurchaseOrderItem;
+import com.uas.platform.b2b.model.PurchaseOrderReceived;
+import com.uas.platform.b2b.model.PurchaseOrderReply;
+import com.uas.platform.b2b.model.PurchaseOrderTodo;
+import com.uas.platform.b2b.model.PurchaseOrderWaiting;
+import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.PurchaseOrderService;
 import com.uas.platform.b2b.service.UserService;
@@ -32,10 +40,14 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.io.*;
+import java.net.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -170,8 +182,6 @@ public class SaleController {
 			return searchService.searchPurchaseOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "app查看收到的客户采购订单列表(包括采购明细)(全部)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
 			org.springframework.data.domain.Sort.Order statusOrder = new org.springframework.data.domain.Sort.Order(org.springframework.data.domain.Sort.Direction.ASC, "status");
@@ -225,8 +235,6 @@ public class SaleController {
 			return searchService.searchPurchaseTodoOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购单列表(待回复)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			purchaseOrderTodoDao.updateStatusForSale(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
@@ -279,8 +287,6 @@ public class SaleController {
 			return searchService.searchPurchaseDoneOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购单列表(已回复)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			purchaseOrderDoneDao.updateStatusForSaleDone(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
@@ -331,8 +337,6 @@ public class SaleController {
 			return searchService.searchPurchaseOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购单列表(已结案)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
 			pageInfo.filter("status", Status.WAITSELLERCOMFIRM.value());
@@ -384,8 +388,6 @@ public class SaleController {
 			return searchService.searchPurchaseEndOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购单列表(已结案)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
 			SearchFilter filter = new SearchFilter();
@@ -432,8 +434,6 @@ public class SaleController {
 			return searchService.searchPurchaseReceivedOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购订单列表(包括采购明细)(待交货)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			purchaseOrderWaitingDao.updateStatusForSale(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
@@ -487,8 +487,6 @@ public class SaleController {
 			return searchService.searchPurchaseWaitingOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("客户采购单", "App查看收到的客户采购订单列表(包括采购明细)(待交货)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.sale.name());
 			purchaseOrderWaitingDao.updateStatusForSale(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("vendUU", SystemSession.getUser().getEnterprise().getUu());
@@ -567,8 +565,6 @@ public class SaleController {
 			return searchService.searchPurchaseOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("采购单", "app查看采购订单列表(包括采购明细)(全部)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 			purchaseOrderWaitingDao.updateStatusForSale(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
@@ -599,8 +595,6 @@ public class SaleController {
 			return searchService.searchPurchaseTodoOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("采购单", "app查看采购订单列表(包括采购明细)(待回复)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 			purchaseOrderTodoDao.updateStatusForPurc(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
@@ -632,8 +626,6 @@ public class SaleController {
 			return searchService.searchPurchaseDoneOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("采购单", "app查看采购订单列表(包括采购明细)(已回复)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 			purchaseOrderDoneDao.updateStatusForPurcDone(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
@@ -664,8 +656,6 @@ public class SaleController {
 			return searchService.searchPurchaseEndOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("采购单", "app查看采购订单列表(包括采购明细)(已结案)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
 			pageInfo.filter("end", Constant.YES);
@@ -698,8 +688,6 @@ public class SaleController {
 			return searchService.searchPurchaseWaitingOrderIdsForApp(keyword, pageParams);
 		} else {
 			logger.log("采购单", "app查看采购订单列表(包括采购明细)(待交货)");
-			purchaseOrderAllDao.setDisplayStatus(SystemSession.getUser().getUserUU(),
-					SystemSession.getUser().getEnterprise().getUu(), OrderType.purc.getPhrase());
 			purchaseOrderWaitingDao.updateStatusForPurc(SystemSession.getUser().getEnterprise().getUu());
 			PageInfo pageInfo = new PageInfo(page, size);
 			pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());

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

@@ -15,11 +15,21 @@ public class ApcheckKeyWord {
      */
     private String receiveName;
 
+    /**
+     * 供应商UU
+     */
+    private Long vendorUU;
+
     /**
      * 客户名称
      */
     private String suuorname;
 
+    /**
+     * 客户UU
+     */
+    private Long customerUU;
+
     /**
      * 送货工厂
      */
@@ -48,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;
     }
@@ -56,6 +74,14 @@ public class ApcheckKeyWord {
         this.suuorname = suuorname;
     }
 
+    public Long getCustomerUU() {
+        return customerUU;
+    }
+
+    public void setCustomerUU(Long customerUU) {
+        this.customerUU = customerUU;
+    }
+
     public String getFactory() {
         return factory;
     }

+ 39 - 0
src/main/java/com/uas/platform/b2b/model/BusinessContacts.java

@@ -0,0 +1,39 @@
+package com.uas.platform.b2b.model;
+
+/**
+ * 业务联系人
+ * <pre>
+ *     采购方、客户: 采购联系人
+ *     供应商、销售方: 业务对接人
+ * </pre>
+ * @author hejq
+ * @date 2018-12-04 17:41
+ */
+public class BusinessContacts {
+
+    /**
+     * 客户-供应商关系表id
+     */
+    private Long veId;
+
+    /**
+     * 业务联系人
+     */
+    private String userName;
+
+    public Long getVeId() {
+        return veId;
+    }
+
+    public void setVeId(Long veId) {
+        this.veId = veId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 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;
+    }
+}

+ 2 - 1
src/main/java/com/uas/platform/b2b/model/Distribute.java

@@ -13,7 +13,8 @@ import java.io.Serializable;
 @Entity
 @Table(name = "purc$distribute", indexes =
         {@Index(name = "purc$distribute_vdid_IDX", columnList = "pd_vdid"),
-                @Index(name = "purc$distribute_useruu_IDX", columnList = "pd_useruu")
+                @Index(name = "purc$distribute_useruu_IDX", columnList = "pd_useruu"),
+                @Index(name = "purc$distribute_leaderuu_IDX", columnList = "pd_leaderuu")
 })
 public class Distribute implements Serializable {
 	

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

@@ -0,0 +1,67 @@
+package com.uas.platform.b2b.model;
+
+import com.uas.platform.b2b.publicapi.model.TradeCount;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ERP出入库单
+ *
+ * @author hejq
+ * @date 2018-12-11 18:32
+ */
+public class ErpProdIo {
+
+    /**
+     * 应收对账单数据
+     */
+    private List<ErpProdIODetail> details = new ArrayList<>();
+
+    /**
+     * 本月应收(前端传入指定月份)
+     */
+    private List<TradeCount> thisMonthCount;
+
+    /**
+     * 应收总额
+     */
+    private List<TradeCount> totalCount;
+
+    /**
+     * 供应商名称
+     */
+    private String vendorName;
+
+    public List<ErpProdIODetail> getDetails() {
+        return details;
+    }
+
+    public void setDetails(List<ErpProdIODetail> details) {
+        this.details = details;
+    }
+
+    public List<TradeCount> getThisMonthCount() {
+        return thisMonthCount;
+    }
+
+    public void setThisMonthCount(List<TradeCount> thisMonthCount) {
+        this.thisMonthCount = thisMonthCount;
+    }
+
+    public List<TradeCount> getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(List<TradeCount> totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public String getVendorName() {
+        return vendorName;
+    }
+
+    public void setVendorName(String vendorName) {
+        this.vendorName = vendorName;
+    }
+}

+ 44 - 0
src/main/java/com/uas/platform/b2b/model/OrderRedDotDone.java

@@ -151,4 +151,48 @@ public class OrderRedDotDone implements Serializable {
         this.orderId = redDotAll.getOrderId();
         this.orderType = redDotAll.getOrderType();
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        OrderRedDotDone that = (OrderRedDotDone) o;
+
+        if (id != null ? !id.equals(that.id) : that.id != null) {
+            return false;
+        }
+        if (redId != null ? !redId.equals(that.redId) : that.redId != null) {
+            return false;
+        }
+        if (enUU != null ? !enUU.equals(that.enUU) : that.enUU != null) {
+            return false;
+        }
+        if (userUU != null ? !userUU.equals(that.userUU) : that.userUU != null) {
+            return false;
+        }
+        if (orderId != null ? !orderId.equals(that.orderId) : that.orderId != null) {
+            return false;
+        }
+        if (orderType != null ? !orderType.equals(that.orderType) : that.orderType != null) {
+            return false;
+        }
+        return date != null ? date.equals(that.date) : that.date == null;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = id != null ? id.hashCode() : 0;
+        result = 31 * result + (redId != null ? redId.hashCode() : 0);
+        result = 31 * result + (enUU != null ? enUU.hashCode() : 0);
+        result = 31 * result + (userUU != null ? userUU.hashCode() : 0);
+        result = 31 * result + (orderId != null ? orderId.hashCode() : 0);
+        result = 31 * result + (orderType != null ? orderType.hashCode() : 0);
+        result = 31 * result + (date != null ? date.hashCode() : 0);
+        return result;
+    }
 }

+ 42 - 0
src/main/java/com/uas/platform/b2b/model/PurcOrderInfoItem.java

@@ -244,6 +244,48 @@ public class PurcOrderInfoItem extends AbstractRedDotKey {
 	@Column(name = "pd_erpdate")
 	private Date erpDate;
 
+	/**
+	 * 税收分类编码
+	 */
+	@Column(name = "pd_taxcode")
+	private String taxCode;
+
+	/**
+	 * 开票名称
+	 */
+	@Column(name = "pd_billname")
+	private String billName;
+
+	/**
+	 * 开票型号
+	 */
+	@Column(name = "pd_orispeccode")
+	private String oriSpecCode;
+
+	public String getTaxCode() {
+		return taxCode;
+	}
+
+	public void setTaxCode(String taxCode) {
+		this.taxCode = taxCode;
+	}
+
+	public String getBillName() {
+		return billName;
+	}
+
+	public void setBillName(String billName) {
+		this.billName = billName;
+	}
+
+	public String getOriSpecCode() {
+		return oriSpecCode;
+	}
+
+	public void setOriSpecCode(String oriSpecCode) {
+		this.oriSpecCode = oriSpecCode;
+	}
+
 	public Long getId() {
 		return id;
 	}

+ 29 - 4
src/main/java/com/uas/platform/b2b/model/PurchaseApCheck.java

@@ -1,7 +1,18 @@
 package com.uas.platform.b2b.model;
 
-import javax.persistence.*;
-import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import java.io.*;
 import java.util.Date;
 import java.util.Set;
 
@@ -144,11 +155,17 @@ public class PurchaseApCheck implements Serializable {
 	private String custName;
 
 	/**
-	 * 本企业UU
+	 * 供应商UU
 	 */
 	@Column(name = "pa_enuu")
 	private Long enUu;
 
+    /**
+     * 供应商名称
+     */
+	@Transient
+    private String vendorName;
+
 	/**
 	 * 单据编号
 	 */
@@ -341,7 +358,15 @@ public class PurchaseApCheck implements Serializable {
 		this.enUu = enUu;
 	}
 
-	public String getCode() {
+    public String getVendorName() {
+        return vendorName;
+    }
+
+    public void setVendorName(String vendorName) {
+        this.vendorName = vendorName;
+    }
+
+    public String getCode() {
 		return code;
 	}
 

+ 43 - 1
src/main/java/com/uas/platform/b2b/model/PurchaseOrderAllItem.java

@@ -247,6 +247,24 @@ public class PurchaseOrderAllItem extends AbstractRedDotKey {
 	@Column(name = "pd_purccurrency")
 	private String purcCurrency;
 
+	/**
+	 * 税收分类编码
+	 */
+	@Column(name = "pd_taxcode")
+	private String taxCode;
+
+	/**
+	 * 开票名称
+	 */
+	@Column(name = "pd_billname")
+	private String billName;
+
+	/**
+	 * 开票型号
+	 */
+	@Column(name = "pd_orispeccode")
+	private String oriSpecCode;
+
 	/**
 	 * 是否在变更中
 	 */
@@ -259,7 +277,31 @@ public class PurchaseOrderAllItem extends AbstractRedDotKey {
 	@Transient
 	private Double latestReplyQty;
 
-    public Long getId() {
+	public String getTaxCode() {
+		return taxCode;
+	}
+
+	public void setTaxCode(String taxCode) {
+		this.taxCode = taxCode;
+	}
+
+	public String getBillName() {
+		return billName;
+	}
+
+	public void setBillName(String billName) {
+		this.billName = billName;
+	}
+
+	public String getOriSpecCode() {
+		return oriSpecCode;
+	}
+
+	public void setOriSpecCode(String oriSpecCode) {
+		this.oriSpecCode = oriSpecCode;
+	}
+
+	public Long getId() {
 		return id;
 	}
 

+ 11 - 1
src/main/java/com/uas/platform/b2b/model/Role.java

@@ -44,10 +44,20 @@ public class Role implements Serializable {
      */
     public static final String BUYER = "BUYER";
 
+    /**
+     * 销售经理
+     */
+    public static final String ROLE_SALEMANAGER = "ROLE_SALEMANAGER";
+
+    /**
+     * 普通用户
+     */
+    public static final String ROLE_USER = "ROLE_USER";
+
     /**
      * 管理员
      */
-    public static final String ADMIN = "管理员";
+    public static final String ROLE_ADMIN = "ROLE_ADMIN";
 
 	/**
 	 * 

+ 6 - 7
src/main/java/com/uas/platform/b2b/model/User.java

@@ -29,6 +29,11 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
+/**
+ * B2B用户信息
+ *
+ * @author US50
+ */
 @Entity
 @Table(name = "sec$users")
 @Cacheable
@@ -462,13 +467,7 @@ public class User implements Serializable {
     public void setCurrentEnterpriseRoles(Long enUU) {
         if (null != enUU) {
             if (!CollectionUtils.isEmpty(this.roles)) {
-                Iterator<Role> iterator = this.roles.iterator();
-                while (iterator.hasNext()) {
-                    Role role = iterator.next();
-                    if (!role.getEnUU().equals(enUU)) {
-                        iterator.remove();
-                    }
-                }
+                this.roles.removeIf(role -> !role.getEnUU().equals(enUU));
             }
         } else {
             this.roles = null;

+ 52 - 3
src/main/java/com/uas/platform/b2b/model/UserBaseInfo.java

@@ -7,6 +7,7 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
@@ -23,32 +24,65 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 public class UserBaseInfo implements Serializable {
 
 	/**
-	 * 
+	 * serialVersionUID
 	 */
 	private static final long serialVersionUID = 1L;
 
+    /**
+     * 用户UU
+     */
 	@Id
 	@Column(name = "user_uu")
 	private Long userUU;
 
+    /**
+     * 用户姓名
+     */
 	@Column(name = "user_name")
 	private String userName;
-	
+
+    /**
+     * 密码
+     */
 	@Column(name = "user_pwd")
 	private String userPwd;
 
+    /**
+     * 邮箱
+     */
 	@Column(name = "user_email")
 	private String userEmail;
 
+    /**
+     * 电话
+     */
 	@Column(name = "user_tel")
 	private String userTel;
 
+    /**
+     * 性别
+     */
 	@Column(name = "user_sex")
 	private String userSex;
-	
+
+    /**
+     * imid
+     */
 	@Column(name = "user_imid")
 	private Long userIMId;
 
+    /**
+     * 判断是否被分配
+     */
+    @Transient
+    private boolean distribute;
+
+    /**
+     * 判断是否被转移权限
+     */
+    @Transient
+    private boolean transfer;
+
 	public Long getUserUU() {
 		return userUU;
 	}
@@ -105,4 +139,19 @@ public class UserBaseInfo implements Serializable {
 		this.userIMId = userIMId;
 	}
 
+    public boolean isDistribute() {
+        return distribute;
+    }
+
+    public void setDistribute(boolean distribute) {
+        this.distribute = distribute;
+    }
+
+    public boolean isTransfer() {
+        return transfer;
+    }
+
+    public void setTransfer(boolean transfer) {
+        this.transfer = transfer;
+    }
 }

+ 474 - 339
src/main/java/com/uas/platform/b2b/model/Vendor.java

@@ -1,339 +1,474 @@
-package com.uas.platform.b2b.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import com.uas.platform.b2b.erp.model.InquiryVendorInfo;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import com.uas.platform.core.persistence.Logger;
-import com.uas.platform.core.persistence.OtherUserUU;
-import com.uas.platform.core.persistence.StatusColumn;
-import com.uas.platform.core.persistence.UserUU;
-
-@Entity
-@Table(name = "purc$vendors", indexes = {@Index(name = "index_vendor_status", columnList = "ve_status"), @Index(name = "index_vendor_myen_venden", columnList = "ve_myenuu, ve_vendenuu", unique = true)})
-@Logger(enUU = "ve_myenuu", userUU = "ve_myuseruu")
-@Cacheable
-@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2b.model.Vendor")
-public class Vendor implements Serializable {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name = "ve_id")
-	private Long id;
-
-	/**
-	 * 状态
-	 */
-	@Column(name = "ve_status")
-	@StatusColumn
-	private Integer status;
-
-	/**
-     * 我的企业UU
-     */
-    @Column(name = "ve_myenuu")
-    private Long myEnUU;
-	
-	/**
-	 * 我的企业
-	 */
-	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
-	@JoinColumn(name = "ve_myenuu", insertable = false, updatable = false, nullable = false)
-	private Enterprise myEnterprise;
-
-	/**
-	 * 我的UU
-	 */
-	@Column(name = "ve_myuseruu")
-	@UserUU
-	private Long myUserUU;
-	
-	/**
-	 * 我方联系人UU
-	 */
-	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
-	@JoinColumn(name = "ve_myuseruu", insertable = false, updatable = false)
-	private UserBaseInfo myUser;
-
-	@Column(name = "ve_vendenuu")
-	private Long vendEnUU;
-
-	/**
-	 * 供应商的企业UU
-	 */
-	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
-	@JoinColumn(name = "ve_vendenuu", insertable = false, updatable = false, nullable = false)
-	private Enterprise vendorEnterprise;
-
-	@Column(name = "ve_venduseruu")
-	private Long vendUserUU;
-
-	/**
-	 * 供应商联系人UU
-	 */
-	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
-	@JoinColumn(name = "ve_venduseruu", insertable = false, updatable = false)
-	@OtherUserUU
-	private UserBaseInfo vendorUser;
-	
-	/**
-	 * 客户费率
-	 */
-	@Column(name = "ve_rate")
-	private Double rate;
-
-	/**
-	 * 判断是否被分配
-	 */
-	@Transient
-	private boolean distribute;
-
-	/**
-	 * 是否启用b2b对账功能<br>
-	 * 1. 是 <br>
-	 * 0. 否
-	 */
-	@Column(name = "ve_apcheck")
-	private Short apcheck;
-
-	/**
-	 * 供应商开关,客户操作,因为是相对的,如果一个条件不能构成约束<br>
-	 * 1. 启用<br>
-	 * 0. 禁用
-	 */
-	@Column(name = "ve_vendswitch")
-	private Short vendswitch;
-
-	/**
-	 * 服务商开关,供应商操作,因为是相对的,如果一个条件不能构成约束<br>
-	 * 1. 启用<br>
-	 * 0. 禁用
-	 */
-	@Column(name = "ve_servicerswitch")
-	private Short servicerswitch;
-
-	/**
-	 * 客户开关,供应商操作,因为是相对的,如果一个条件不能构成约束<br>
-	 * 1. 启用<br>
-	 * 0. 禁用
-	 */
-	@Column(name = "ve_custswitch")
-	private Short custswitch;
-
-	/**
-	 * 付款方式(保存最新的,方便下次载入)
-	 */
-	@Column(name = "ve_paymethod")
-	private String paymethod;
-
-	/**
-	 * 同步状态(是否同步到账户中心,1为已同步,0为未同步)
-	 */
-	@Column(name = "ve_synchstatus")
-	private Short synchStatus;
-
-	/**
-	 * 同步到erp的状态
-	 * <pre>
-	 *     主要是针对erp邀请注册后自动添加供应商,并且同步erp的供应商uu
-	 * </pre>
-	 */
-	@Column(name = "ve_erpstatus")
-	private Integer erpstatus;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Integer getStatus() {
-		return status;
-	}
-
-	public void setStatus(Integer status) {
-		this.status = status;
-	}
-
-	@JsonIgnore
-	@JSONField(serialize = false)
-	public Long getMyEnUU() {
-		return myEnUU;
-	}
-
-	public void setMyEnUU(Long myEnUU) {
-		this.myEnUU = myEnUU;
-	}
-
-	@JsonIgnore
-	@JSONField(serialize = false)
-	public Long getMyUserUU() {
-		return myUserUU;
-	}
-
-	public void setMyUserUU(Long myUserUU) {
-		this.myUserUU = myUserUU;
-	}
-
-	public Enterprise getVendorEnterprise() {
-		return vendorEnterprise;
-	}
-
-	public void setVendorEnterprise(Enterprise vendorEnterprise) {
-		this.vendorEnterprise = vendorEnterprise;
-	}
-
-	public UserBaseInfo getVendorUser() {
-		return vendorUser;
-	}
-
-	public void setVendorUser(UserBaseInfo vendorUser) {
-		this.vendorUser = vendorUser;
-	}
-
-	@JsonIgnore
-	@JSONField(serialize = false)
-	public Long getVendEnUU() {
-		return vendEnUU;
-	}
-
-	public void setVendEnUU(Long vendEnUU) {
-		this.vendEnUU = vendEnUU;
-	}
-
-	@JsonIgnore
-	@JSONField(serialize = false)
-	public Long getVendUserUU() {
-		return vendUserUU;
-	}
-
-	public void setVendUserUU(Long vendUserUU) {
-		this.vendUserUU = vendUserUU;
-	}
-
-	public Enterprise getMyEnterprise() {
-		return myEnterprise;
-	}
-
-	public void setMyEnterprise(Enterprise myEnterprise) {
-		this.myEnterprise = myEnterprise;
-	}
-
-	public UserBaseInfo getMyUser() {
-		return myUser;
-	}
-
-	public void setMyUser(UserBaseInfo myUser) {
-		this.myUser = myUser;
-	}
-
-	public Double getRate() {
-		return rate;
-	}
-
-	public void setRate(Double rate) {
-		this.rate = rate;
-	}
-
-	public boolean getDistribute() {
-		return distribute;
-	}
-
-	public void setDistribute(boolean distribute) {
-		this.distribute = distribute;
-	}
-
-	public Short getApcheck() {
-		return apcheck;
-	}
-
-	public void setApcheck(Short apcheck) {
-		this.apcheck = apcheck;
-	}
-
-	public Short getVendswitch() {
-		return vendswitch;
-	}
-
-	public void setVendswitch(Short vendswitch) {
-		this.vendswitch = vendswitch;
-	}
-
-	public Short getServicerswitch() {
-		return servicerswitch;
-	}
-
-	public void setServicerswitch(Short servicerswitch) {
-		this.servicerswitch = servicerswitch;
-	}
-
-	public Short getCustswitch() {
-		return custswitch;
-	}
-
-	public void setCustswitch(Short custswitch) {
-		this.custswitch = custswitch;
-	}
-
-	public String getPaymethod() {
-		return paymethod;
-	}
-
-	public void setPaymethod(String paymethod) {
-		this.paymethod = paymethod;
-	}
-
-	public Short getSynchStatus() {
-		return synchStatus;
-	}
-
-	public void setSynchStatus(Short synchStatus) {
-		this.synchStatus = synchStatus;
-	}
-
-	@Override
-	public String toString() {
-		return this.vendorEnterprise.getEnName();
-	}
-
-	public Integer getErpstatus() {
-		return erpstatus;
-	}
-
-	public void setErpstatus(Integer erpstatus) {
-		this.erpstatus = erpstatus;
-	}
-
-
-	public InquiryVendorInfo covert() {
-		InquiryVendorInfo info = new InquiryVendorInfo();
-		info.setB2b_id(this.id);
-		info.setVe_uu(String.valueOf(this.vendEnUU));
-		info.setVe_webserver(this.vendorEnterprise.getEnBussinessCode());
-		return info;
-	}
-}
+package com.uas.platform.b2b.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.b2b.erp.model.InquiryVendorInfo;
+import com.uas.platform.b2b.publicapi.model.TradeCount;
+import com.uas.platform.core.persistence.Logger;
+import com.uas.platform.core.persistence.OtherUserUU;
+import com.uas.platform.core.persistence.StatusColumn;
+import com.uas.platform.core.persistence.UserUU;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.Cacheable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+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;
+import java.util.Set;
+
+/**
+ * 客户供应商关系表
+ *
+ * @author hejq
+ * @date 2018-12-04 18:50
+ */
+@Entity
+@Table(name = "purc$vendors", indexes = {@Index(name = "index_vendor_status", columnList = "ve_status"), @Index(name = "index_vendor_myen_venden", columnList = "ve_myenuu, ve_vendenuu", unique = true)})
+@Logger(enUU = "ve_myenuu", userUU = "ve_myuseruu")
+@Cacheable
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2b.model.Vendor")
+public class Vendor implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	@Column(name = "ve_id")
+	private Long id;
+
+	/**
+	 * 状态
+	 */
+	@Column(name = "ve_status")
+	@StatusColumn
+	private Integer status;
+
+	/**
+     * 我的企业UU
+     */
+    @Column(name = "ve_myenuu")
+    private Long myEnUU;
+	
+	/**
+	 * 我的企业
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
+	@JoinColumn(name = "ve_myenuu", insertable = false, updatable = false, nullable = false)
+	private Enterprise myEnterprise;
+
+	/**
+	 * 我的UU
+	 */
+	@Column(name = "ve_myuseruu")
+	@UserUU
+	private Long myUserUU;
+	
+	/**
+	 * 我方联系人UU
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
+	@JoinColumn(name = "ve_myuseruu", insertable = false, updatable = false)
+	private UserBaseInfo myUser;
+
+	@Column(name = "ve_vendenuu")
+	private Long vendEnUU;
+
+	/**
+	 * 供应商的企业UU
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
+	@JoinColumn(name = "ve_vendenuu", insertable = false, updatable = false, nullable = false)
+	private Enterprise vendorEnterprise;
+
+	@Column(name = "ve_venduseruu")
+	private Long vendUserUU;
+
+	/**
+	 * 供应商联系人UU
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
+	@JoinColumn(name = "ve_venduseruu", insertable = false, updatable = false)
+	@OtherUserUU
+	private UserBaseInfo vendorUser;
+	
+	/**
+	 * 客户费率
+	 */
+	@Column(name = "ve_rate")
+	private Double rate;
+
+	/**
+	 * 判断是否被分配
+	 */
+	@Transient
+	private boolean distribute;
+
+	/**
+	 * 是否启用b2b对账功能<br>
+	 * 1. 是 <br>
+	 * 0. 否
+	 */
+	@Column(name = "ve_apcheck")
+	private Short apcheck;
+
+	/**
+	 * 供应商开关,客户操作,因为是相对的,如果一个条件不能构成约束<br>
+	 * 1. 启用<br>
+	 * 0. 禁用
+	 */
+	@Column(name = "ve_vendswitch")
+	private Short vendswitch;
+
+	/**
+	 * 服务商开关,供应商操作,因为是相对的,如果一个条件不能构成约束<br>
+	 * 1. 启用<br>
+	 * 0. 禁用
+	 */
+	@Column(name = "ve_servicerswitch")
+	private Short servicerswitch;
+
+	/**
+	 * 客户开关,供应商操作,因为是相对的,如果一个条件不能构成约束<br>
+	 * 1. 启用<br>
+	 * 0. 禁用
+	 */
+	@Column(name = "ve_custswitch")
+	private Short custswitch;
+
+	/**
+	 * 付款方式(保存最新的,方便下次载入)
+	 */
+	@Column(name = "ve_paymethod")
+	private String paymethod;
+
+	/**
+	 * 同步状态(是否同步到账户中心,1为已同步,0为未同步)
+	 */
+	@Column(name = "ve_synchstatus")
+	private Short synchStatus;
+
+	/**
+	 * 同步到erp的状态
+	 * <pre>
+	 *     主要是针对erp邀请注册后自动添加供应商,并且同步erp的供应商uu
+	 * </pre>
+	 */
+	@Column(name = "ve_erpstatus")
+	private Integer erpstatus;
+
+    /**
+     * 应收金额数据
+     */
+	@Column(name = "todo_apchek_count")
+    private String totalCountString;
+
+    /**
+     * 最近一次对账时间
+     */
+	@Transient
+    private Date lastCheckDate;
+
+    /**
+     * 最近一次对账金额
+     */
+	@Transient
+    private Double uncheckedCount;
+
+    /**
+     * (针对买家、客户)采购联系人
+     */
+	@Transient
+    private Set<VendorContactMan> buyerContacts = new HashSet<>();
+
+    /**
+     * (针对买家、客户)采购联系人
+     */
+    @Transient
+    private List<String> purchaseContacts = new ArrayList<>();
+
+    /**
+     * (针对卖家、供应商) 业务对接人
+     */
+    @Transient
+    private Set<VendorContactMan> sellerContacts = new HashSet<>();
+
+    /**
+     * (针对卖家、供应商) 业务对接人
+     */
+    @Transient
+    private List<String> saleContacts = new ArrayList<>();
+
+    /**
+     * 本月应收(前端传入指定月份)
+     */
+	@Transient
+    private List<TradeCount> thisMonthCount;
+
+    /**
+     * 应收总额
+     */
+	@Transient
+    private List<TradeCount> totalCount;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Long getMyEnUU() {
+		return myEnUU;
+	}
+
+	public void setMyEnUU(Long myEnUU) {
+		this.myEnUU = myEnUU;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Long getMyUserUU() {
+		return myUserUU;
+	}
+
+	public void setMyUserUU(Long myUserUU) {
+		this.myUserUU = myUserUU;
+	}
+
+	public Enterprise getVendorEnterprise() {
+		return vendorEnterprise;
+	}
+
+	public void setVendorEnterprise(Enterprise vendorEnterprise) {
+		this.vendorEnterprise = vendorEnterprise;
+	}
+
+	public UserBaseInfo getVendorUser() {
+		return vendorUser;
+	}
+
+	public void setVendorUser(UserBaseInfo vendorUser) {
+		this.vendorUser = vendorUser;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Long getVendEnUU() {
+		return vendEnUU;
+	}
+
+	public void setVendEnUU(Long vendEnUU) {
+		this.vendEnUU = vendEnUU;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Long getVendUserUU() {
+		return vendUserUU;
+	}
+
+	public void setVendUserUU(Long vendUserUU) {
+		this.vendUserUU = vendUserUU;
+	}
+
+	public Enterprise getMyEnterprise() {
+		return myEnterprise;
+	}
+
+	public void setMyEnterprise(Enterprise myEnterprise) {
+		this.myEnterprise = myEnterprise;
+	}
+
+	public UserBaseInfo getMyUser() {
+		return myUser;
+	}
+
+	public void setMyUser(UserBaseInfo myUser) {
+		this.myUser = myUser;
+	}
+
+	public Double getRate() {
+		return rate;
+	}
+
+	public void setRate(Double rate) {
+		this.rate = rate;
+	}
+
+	public boolean getDistribute() {
+		return distribute;
+	}
+
+	public void setDistribute(boolean distribute) {
+		this.distribute = distribute;
+	}
+
+	public Short getApcheck() {
+		return apcheck;
+	}
+
+	public void setApcheck(Short apcheck) {
+		this.apcheck = apcheck;
+	}
+
+	public Short getVendswitch() {
+		return vendswitch;
+	}
+
+	public void setVendswitch(Short vendswitch) {
+		this.vendswitch = vendswitch;
+	}
+
+	public Short getServicerswitch() {
+		return servicerswitch;
+	}
+
+	public void setServicerswitch(Short servicerswitch) {
+		this.servicerswitch = servicerswitch;
+	}
+
+	public Short getCustswitch() {
+		return custswitch;
+	}
+
+	public void setCustswitch(Short custswitch) {
+		this.custswitch = custswitch;
+	}
+
+	public String getPaymethod() {
+		return paymethod;
+	}
+
+	public void setPaymethod(String paymethod) {
+		this.paymethod = paymethod;
+	}
+
+	public Short getSynchStatus() {
+		return synchStatus;
+	}
+
+	public void setSynchStatus(Short synchStatus) {
+		this.synchStatus = synchStatus;
+	}
+
+	@Override
+	public String toString() {
+		return this.vendorEnterprise.getEnName();
+	}
+
+	public Integer getErpstatus() {
+		return erpstatus;
+	}
+
+	public void setErpstatus(Integer erpstatus) {
+		this.erpstatus = erpstatus;
+	}
+
+    public Date getLastCheckDate() {
+        return lastCheckDate;
+    }
+
+    public void setLastCheckDate(Date lastCheckDate) {
+        this.lastCheckDate = lastCheckDate;
+    }
+
+    public Double getUncheckedCount() {
+        return uncheckedCount;
+    }
+
+    public void setUncheckedCount(Double uncheckedCount) {
+        this.uncheckedCount = uncheckedCount;
+    }
+
+    public Set<VendorContactMan> getBuyerContacts() {
+        return buyerContacts;
+    }
+
+    public void setBuyerContacts(Set<VendorContactMan> buyerContacts) {
+        this.buyerContacts = buyerContacts;
+    }
+
+    public List<String> getPurchaseContacts() {
+        return purchaseContacts;
+    }
+
+    public void setPurchaseContacts(List<String> purchaseContacts) {
+        this.purchaseContacts = purchaseContacts;
+    }
+
+    public Set<VendorContactMan> getSellerContacts() {
+        return sellerContacts;
+    }
+
+    public void setSellerContacts(Set<VendorContactMan> sellerContacts) {
+        this.sellerContacts = sellerContacts;
+    }
+
+    public List<String> getSaleContacts() {
+        return saleContacts;
+    }
+
+    public void setSaleContacts(List<String> saleContacts) {
+        this.saleContacts = saleContacts;
+    }
+
+    public List<TradeCount> getThisMonthCount() {
+        return thisMonthCount;
+    }
+
+    public void setThisMonthCount(List<TradeCount> thisMonthCount) {
+        this.thisMonthCount = thisMonthCount;
+    }
+
+    public List<TradeCount> getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(List<TradeCount> totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public String getTotalCountString() {
+        return totalCountString;
+    }
+
+    public void setTotalCountString(String totalCountString) {
+        this.totalCountString = totalCountString;
+    }
+
+    public InquiryVendorInfo covert() {
+		InquiryVendorInfo info = new InquiryVendorInfo();
+		info.setB2b_id(this.id);
+		info.setVe_uu(String.valueOf(this.vendEnUU));
+		info.setVe_webserver(this.vendorEnterprise.getEnBussinessCode());
+		return info;
+	}
+}

+ 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;
+    }
+}

+ 150 - 0
src/main/java/com/uas/platform/b2b/model/VendorDistribute.java

@@ -0,0 +1,150 @@
+package com.uas.platform.b2b.model;
+
+import com.uas.platform.core.model.Constant;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import java.io.*;
+
+
+/**
+ * 供应商分配表
+ *
+ * @author hejq
+ * @date 2018-12-04 18:54
+ *
+ */
+@Entity
+@Table(name = "sale$distribute", indexes =
+        {@Index(name = "sale$distribute_vdid_IDX", columnList = "pd_vdid"),
+                @Index(name = "sale$distribute_useruu_IDX", columnList = "pd_useruu"),
+                @Index(name = "sale$distribute_leaderuu_IDX", columnList = "pd_leaderuu")
+})
+public class VendorDistribute implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	@Column(name = "pd_id")
+	private Long id;
+	
+	/**
+	 * 供应商客户关系表id
+	 */
+	@Column(name = "pd_vdid")
+	private Long vendorId;
+	
+	/**
+	 * 供应商客户关系表
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH,CascadeType.MERGE })
+	@JoinColumn(name = "pd_vdid", insertable = false, updatable = false)
+	private Vendor vendor;
+	
+	/**
+	 * 个人UU
+	 */
+	@Column(name = "pd_useruu")
+	private Long userUU;
+	
+	/**
+	 * 关联user
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH,CascadeType.MERGE })
+	@JoinColumn(name = "pd_useruu", insertable = false, updatable = false)
+	private User user;
+
+	/**
+	 * 是否被转移权限 (是1可以继续绑定其他人,或转移权限,为0则只能转移自己权限,无法再绑定他人)
+	 */
+	@Column(name = "pd_istransfer")
+	private Short isTransfer = Constant.NO;
+
+    /**
+     * 供应商分配
+     */
+    @Column(name = "pd_distribute")
+    private Short distribute = Constant.NO;
+
+	/**
+	 * 分配此权限的人的uu号
+	 */
+	@Column(name = "pd_leaderuu")
+	private Long leaderUU;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getVendorId() {
+		return vendorId;
+	}
+
+	public void setVendorId(Long vendorId) {
+		this.vendorId = vendorId;
+	}
+
+	public Vendor getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(Vendor vendor) {
+		this.vendor = vendor;
+	}
+
+	public Long getUserUU() {
+		return userUU;
+	}
+
+	public void setUserUU(Long userUU) {
+		this.userUU = userUU;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public Short getIsTransfer() {
+		return isTransfer;
+	}
+
+	public void setIsTransfer(Short isTransfer) {
+		this.isTransfer = isTransfer;
+	}
+
+	public Long getLeaderUU() {
+		return leaderUU;
+	}
+
+	public void setLeaderUU(Long leaderUU) {
+		this.leaderUU = leaderUU;
+	}
+
+    public Short getDistribute() {
+        return distribute;
+    }
+
+    public void setDistribute(Short distribute) {
+        this.distribute = distribute;
+    }
+}

+ 88 - 0
src/main/java/com/uas/platform/b2b/model/util/UnCheckedCountSqls.java

@@ -0,0 +1,88 @@
+package com.uas.platform.b2b.model.util;
+
+
+/**
+ * 未对账总额sql查询语句
+ *
+ * @author hejq
+ * @date 2018-12-04 9:48
+ */
+public class UnCheckedCountSqls {
+
+    /**
+     * 货款调账未对账金额查询语句
+     */
+    public static final String ADJUSTMENT_COUNT_SQL = "select coalesce(sum((aa_qty - coalesce(aa_ycheckqty, 0)) * aa_orderprice), 0) as amount, aa_currency as currency \n" +
+        "from purc$apbilladjustment where coalesce(aa_thischeckqty, 0) <> 0 and aa_enuu = ? and aa_custuu = ? " +
+        "group by aa_currency";
+
+    /**
+     * 当月货款调账未对账金额查询语句
+     */
+    public static final String THISMONTH_ADJUSTMENT_COUNT_SQL = "select coalesce(sum((aa_qty - coalesce(aa_ycheckqty, 0)) * aa_orderprice), 0) as amount, aa_currency as currency \n" +
+        "from purc$apbilladjustment where coalesce(aa_thischeckqty, 0) <> 0 and aa_enuu = ? and aa_custuu = ? and aa_date between ? and ?" +
+        "group by aa_currency";
+
+    /**
+     * 客户采购验收单未对账金额查询语句
+     */
+    public static final String SALE_ACCEPT_COUNT_SQL = "select coalesce(sum((pai_qty - coalesce(pai_ycheckqty, 0)) * pai_orderprice), 0) as amount, pa_currency as currency \n" +
+        "from purc$accept left join `purc$acceptitem` on pai_paid = pa_id " +
+        "where pa_venduu = ? and pa_enuu = ? and pai_qty > coalesce(pai_ycheckqty, 0) and pai_orderprice <> 0 " +
+        "group by pa_currency";
+
+    /**
+     * 客户采购验收单未对账金额查询语句
+     */
+    public static final String THISMONTH_SALE_ACCEPT_COUNT_SQL = "select coalesce(sum((pai_qty - coalesce(pai_ycheckqty, 0)) * pai_orderprice), 0) as amount, pa_currency as currency \n" +
+        "from purc$accept left join `purc$acceptitem` on pai_paid = pa_id " +
+        "where pa_venduu = ? and pa_enuu = ? and pai_qty > coalesce(pai_ycheckqty, 0) and pai_orderprice <> 0 and pa_date between ? and ?" +
+        "group by pa_currency";
+
+    /**
+     * 客户采购验退单未对账金额查询语句
+     */
+    public static final String SALE_RETURN_COUNT_SQL = "select coalesce(sum(((-(1) * pri_qty ) - coalesce(pri_ycheckqty, 0)) *  pri_orderprice), 0) as amount, pr_currency as currency \n" +
+        "from `purc$return` left join `purc$returnitem` on pr_id = pri_prid " +
+        "where pri_qty > abs(coalesce(pri_ycheckqty, 0)) and pr_venduu = ? and pr_enuu = ? group by pr_currency";
+
+    /**
+     * 客户采购验退单未对账金额查询语句
+     */
+    public static final String THISMONTH_SALE_RETURN_COUNT_SQL = "select sum(((-(1) * pri_qty ) - coalesce(pri_ycheckqty, 0)) *  pri_orderprice) as amount, pr_currency as currency \n" +
+        "from `purc$return` left join `purc$returnitem` on pr_id = pri_prid " +
+        "where pri_qty > abs(coalesce(pri_ycheckqty, 0)) and pr_venduu = ? and pr_enuu = ? and pr_date between ? and ? group by pr_currency";
+
+    /**
+     * 客户委外验收单未对账金额查询语句
+     */
+    public static final String MAKE_ACCEPT_COUNT_SQL = "select coalesce(sum((mai_qty - coalesce(mai_ycheckqty, 0)) * mai_orderpice), 0) as amount, ma_currency as currency " +
+        " from make$accept " +
+        "join make$acceptitem on ma_id = mai_paid " +
+        "where mai_qty > coalesce(mai_ycheckqty, 0) and ma_venduu = ? and ma_enuu = ? and mai_orderpice > 0 group by ma_currency";
+
+    /**
+     * 客户委外验收单未对账金额查询语句
+     */
+    public static final String THISMONTH_MAKE_ACCEPT_COUNT_SQL = "select coalesce(sum((mai_qty - coalesce(mai_ycheckqty, 0)) * mai_orderpice), 0) as amount,ma_currency as currency " +
+        " from make$accept " +
+        "join make$acceptitem on ma_id = mai_paid " +
+        "where mai_qty > coalesce(mai_ycheckqty, 0) and ma_venduu = ? and ma_enuu = ? and mai_orderpice > 0 and ma_date between ? and ? group by ma_currency";
+
+    /**
+     * 客户委外验退单未对账金额查询语句
+     */
+    public static final String MAKE_RETURN_COUNT_SQL = "select coalesce(sum(((-(1) *  mri_qty ) - coalesce(mri_ycheckqty, 0)) * mri_orderpice), 0) as amount,mr_currency as currency " +
+        " from make$return " +
+        "join make$returnitem on mr_id =  mri_paid " +
+        "where mri_qty > abs(coalesce(mri_ycheckqty, 0)) and mr_venduu = ? and mr_enuu = ? and mri_orderpice > 0 group by mr_currency";
+
+    /**
+     * 客户委外验退单未对账金额查询语句
+     */
+    public static final String THISMONTH_MAKE_RETURN_COUNT_SQL = "select coalesce(sum(((-(1) *  mri_qty ) - coalesce(mri_ycheckqty, 0)) * mri_orderpice), 0) as amount, mr_currency as currency " +
+        " from make$return " +
+        "join make$returnitem on mr_id =  mri_paid " +
+        "where mri_qty > abs(coalesce(mri_ycheckqty, 0)) and mr_venduu = ? and mr_enuu = ? and mri_orderpice > 0 and mr_date between ? and ? " +
+        "group by mr_currency";
+}

+ 145 - 0
src/main/java/com/uas/platform/b2b/openapi/controller/UsoftController.java

@@ -0,0 +1,145 @@
+package com.uas.platform.b2b.openapi.controller;
+
+import com.uas.platform.b2b.openapi.model.*;
+import com.uas.platform.b2b.openapi.service.UsoftService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:55 2018/11/08.
+ */
+@RestController
+@RequestMapping("/openapi/usoft")
+public class UsoftController {
+
+    @Autowired
+    UsoftService usoftService;
+
+    /**
+     * 根据卖方uu获取订单数据
+     * @param enUU
+     *      卖方uu
+     * @param startTime
+     *      起始时间
+     * @param endTime
+     *      截止时间
+     * @return
+     */
+    @RequestMapping(value = "/order", method = RequestMethod.GET)
+    public List<UsoftOrder> getUsoftOrders(@RequestParam(required = true) Long enUU, Long startTime, Long endTime) {
+        return usoftService.getUsoftOrders(enUU, startTime, endTime);
+    }
+
+    /**
+     * 根据订单获取订单明细
+     * @param orderIds
+     *      订单id
+     * @return
+     */
+    @RequestMapping(value = "/order/item/batch", method = RequestMethod.GET)
+    public List<UsoftOrderItem> getUsoftOrderItemsBatch(String orderIds) {
+        return usoftService.getUsoftOrderItemsBatch(orderIds);
+    }
+
+    /**
+     * 根据订单获取订单明细
+     * @param orderId
+     *      订单id
+     * @return
+     */
+    @RequestMapping(value = "/order/item", method = RequestMethod.GET)
+    public List<UsoftOrderItem> getUsoftOrderItems(Long orderId) {
+        return usoftService.getUsoftOrderItems(orderId);
+    }
+
+    /**
+     * 根据卖方uu获取验收单数据
+     * @param enUU
+     *      卖方uu
+     * @param startTime
+     *      起始时间
+     * @param endTime
+     *      截止时间
+     * @return
+     */
+    @RequestMapping(value = "/accept", method = RequestMethod.GET)
+    public List<UsoftAccept> getUsoftAccepts(Long enUU, Long startTime, Long endTime) {
+        return usoftService.getUsoftAccepts(enUU, startTime, endTime);
+    }
+
+    /**
+     * 根据验收单id获取验收明细
+     * @param acceptId
+     *      验收单id
+     * @return
+     */
+    @RequestMapping(value = "/accept/item", method = RequestMethod.GET)
+    public List<UsoftAcceptItem> getUsoftAcceptItems(Long acceptId) {
+        return usoftService.getUsoftAcceptItems(acceptId);
+    }
+
+    /**
+     * 根据验收单id获取验收明细
+     * @param acceptIds
+     *      验收单id字符串
+     * @return
+     */
+    @RequestMapping(value = "/accept/item/batch", method = RequestMethod.GET)
+    public List<UsoftAcceptItem> getUsoftAcceptItemsBatch(String acceptIds) {
+        return usoftService.getUsoftAcceptItemsBatch(acceptIds);
+    }
+
+    /**
+     * 获取白名单用户数据
+     *
+     * @return
+     */
+    @RequestMapping(value = "/whitelist", method = RequestMethod.GET)
+    public List<UsoftWhitelist> getUsoftWhitelists() {
+        return usoftService.getUsoftWhitelists();
+    }
+
+    /**
+     * 获取所有用户历史交易数据
+     * @return
+     */
+    @RequestMapping(value = "/summary/history/trading", method = RequestMethod.GET)
+    public UsoftHistoryTradingData getUsoftHistoryTradingDate() {
+        return usoftService.getUsoftHistoryTradingData();
+    }
+
+    /**
+     * 获取所有用户运营效率分析一览表
+     * @return
+     */
+    @RequestMapping(value = "/summary/running/efficient", method = RequestMethod.GET)
+    public UsoftRunningEfficient getUsoftRunningEfficient() {
+        return usoftService.getUsoftRunningEfficient();
+    }
+
+    /**
+     * 获取所有用户分布区间数据
+     * @return
+     */
+    @RequestMapping(value = "/summary/interval", method = RequestMethod.GET)
+    public UsoftInterval getUsoftInterval() {
+        return usoftService.getUsoftInterval();
+    }
+
+    /**
+     * 获取所有用户近三年交易数据
+     */
+    @RequestMapping(value = "/summary/trading", method = RequestMethod.GET)
+    public List<UsoftTrading> getUsoftTradings() {
+        return usoftService.getUsoftTradings();
+    }
+
+    @Scheduled(cron = "0 0 23 * * ? ")
+    public void whitelistTask() {
+        usoftService.initUsoftWhitelists();
+    }
+}

+ 39 - 0
src/main/java/com/uas/platform/b2b/openapi/dao/UsoftWhitelistDao.java

@@ -0,0 +1,39 @@
+package com.uas.platform.b2b.openapi.dao;
+
+import com.uas.platform.b2b.openapi.model.UsoftWhitelist;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Set;
+
+/**
+ * @Author: huj
+ * @Date: Created in 15:46 2018/11/12.
+ */
+@Repository
+public interface UsoftWhitelistDao extends JpaSpecificationExecutor<UsoftWhitelist>, JpaRepository<UsoftWhitelist, Long> {
+
+
+    /**
+     * 查询已存在在白名单的企业uu
+     * @return
+     */
+    @Query(value = "SELECT DISTINCT u.enUU from UsoftWhitelist u")
+    Set<Long> findAllEnuu();
+
+    /**
+     * 按企业uu查找白名单企业
+     * @param enUU
+     * @return
+     */
+    UsoftWhitelist findByEnUU(Long enUU);
+
+    /**
+     * 查找白名单数
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select count(1) from  usofwhitelist")
+    Integer countAll();
+}

+ 49 - 0
src/main/java/com/uas/platform/b2b/openapi/model/Product.java

@@ -0,0 +1,49 @@
+package com.uas.platform.b2b.openapi.model;
+
+/**
+ * @Author: huj
+ * @Date: Created in 14:37 2018/11/09.
+ */
+public class Product {
+
+    private String title;
+
+    private String code;
+
+    private String cmpcode;
+
+    private String spec;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getCmpcode() {
+        return cmpcode;
+    }
+
+    public void setCmpcode(String cmpcode) {
+        this.cmpcode = cmpcode;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+}

+ 112 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftAccept.java

@@ -0,0 +1,112 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:13 2018/11/08.
+ */
+public class UsoftAccept {
+
+    private Long id;
+
+    private String code;
+
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private String acceptTime;
+
+    private String custName;
+
+    private String receivename;
+
+    private String sendCode;
+
+    private String payments;
+
+    private String currency;
+
+    private Double amount;
+
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getAcceptTime() {
+        return acceptTime;
+    }
+
+    public void setAcceptTime(String acceptTime) {
+        this.acceptTime = acceptTime;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getReceivename() {
+        return receivename;
+    }
+
+    public void setReceivename(String receivename) {
+        this.receivename = receivename;
+    }
+
+    public String getSendCode() {
+        return sendCode;
+    }
+
+    public void setSendCode(String sendCode) {
+        this.sendCode = sendCode;
+    }
+
+    public String getPayments() {
+        return payments;
+    }
+
+    public void setPayments(String payments) {
+        this.payments = payments;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public Double getAmount() {
+        return NumFormat.getTwo(amount);
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 110 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftAcceptItem.java

@@ -0,0 +1,110 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:13 2018/11/08.
+ */
+public class UsoftAcceptItem {
+
+    private Long id;
+
+    private String orderCode;
+
+    private Product product;
+
+    private String brand;
+
+    private Double price;
+
+    private String unit;
+
+    private Double checkqty;
+
+    private Double amount;
+
+    private String batchCode;
+
+    private Long acceptId;
+
+    public Long getAcceptId() {
+        return acceptId;
+    }
+
+    public void setAcceptId(Long acceptId) {
+        this.acceptId = acceptId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrderCode() {
+        return orderCode;
+    }
+
+    public void setOrderCode(String orderCode) {
+        this.orderCode = orderCode;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public Double getCheckqty() {
+        return checkqty;
+    }
+
+    public void setCheckqty(Double checkqty) {
+        this.checkqty = checkqty;
+    }
+
+    public Double getAmount() {
+        return NumFormat.getTwo(amount);
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getBatchCode() {
+        return batchCode;
+    }
+
+    public void setBatchCode(String batchCode) {
+        this.batchCode = batchCode;
+    }
+}

+ 204 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftHistoryTradingData.java

@@ -0,0 +1,204 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * 所有用户历史交易数据一览表
+ * @Author: huj
+ * @Date: Created in 11:21 2018/11/08.
+ */
+public class UsoftHistoryTradingData {
+
+    /**
+     * 全部用户数量(家)
+     */
+    private Integer totalQty;
+    /**
+     * 有交易额用户数量(家)
+     */
+    private Integer havingTradingQty;
+    /**
+     * 白名单用户数量(家)
+     */
+    private Integer whitelistQty;
+    /**
+     * 历史交易时间(年)
+     */
+    private Double historyTradingHours;
+    /**
+     * 累计订单笔数(笔)
+     */
+    private Double historyOrderNum;
+    /**
+     * 累计订单金额(元)
+     */
+    private Double historyOrderAmount;
+    /**
+     * 累计验收金额(元)
+     */
+    private Double historyAcceptAmount;
+    /**
+     * 累计验退金额(元)
+     */
+    private Double historyReturnAmount;
+    /**
+     * 累计对账金额(元)
+     */
+    private Double historyApcheckAmount;
+    /**
+     * 累计发票金额(元)
+     */
+    private Double historyApbillAmount;
+    /**
+     * 平均单笔订单金额(元)
+     * 等于累计订单金额/累计订单笔数
+     */
+    private Double avgOrderAmount;
+    /**
+     * 平均单笔对账金额(元)
+     * 等于累计对账金额/累计对账笔数
+     */
+    private Double avgApcheckAmount;
+    /**
+     * 平均单笔发票金额(元)
+     * 等于累计发票金额/累计发票笔数
+     */
+    private Double avgApbillAmount;
+    /**
+     * 平均单个用户金额(元)
+     * 等于累计订单金额/全部用户数量
+     */
+    private Double avgUserAmount;
+
+    public Integer getTotalQty() {
+        return totalQty;
+    }
+
+    public void setTotalQty(Integer totalQty) {
+        this.totalQty = totalQty;
+    }
+
+    public Integer getHavingTradingQty() {
+        return havingTradingQty;
+    }
+
+    public void setHavingTradingQty(Integer havingTradingQty) {
+        this.havingTradingQty = havingTradingQty;
+    }
+
+    public Integer getWhitelistQty() {
+        return whitelistQty;
+    }
+
+    public void setWhitelistQty(Integer whitelistQty) {
+        this.whitelistQty = whitelistQty;
+    }
+
+    public Double getHistoryTradingHours() {
+        return NumFormat.getOne(historyTradingHours);
+    }
+
+    public void setHistoryTradingHours(Double historyTradingHours) {
+        this.historyTradingHours = historyTradingHours;
+    }
+
+    public Double getHistoryOrderNum() {
+        return historyOrderNum;
+    }
+
+    public void setHistoryOrderNum(Double historyOrderNum) {
+        this.historyOrderNum = historyOrderNum;
+    }
+
+    public Double getHistoryOrderAmount() {
+        return NumFormat.getTwo(historyOrderAmount);
+    }
+
+    public void setHistoryOrderAmount(Double historyOrderAmount) {
+        this.historyOrderAmount = historyOrderAmount;
+    }
+
+    public Double getHistoryAcceptAmount() {
+        return NumFormat.getTwo(historyAcceptAmount);
+    }
+
+    public void setHistoryAcceptAmount(Double historyAcceptAmount) {
+        this.historyAcceptAmount = historyAcceptAmount;
+    }
+
+    public Double getHistoryReturnAmount() {
+        return NumFormat.getTwo(historyReturnAmount);
+    }
+
+    public void setHistoryReturnAmount(Double historyReturnAmount) {
+        this.historyReturnAmount = historyReturnAmount;
+    }
+
+    public Double getHistoryApcheckAmount() {
+        return NumFormat.getTwo(historyApcheckAmount);
+    }
+
+    public void setHistoryApcheckAmount(Double historyApcheckAmount) {
+        this.historyApcheckAmount = historyApcheckAmount;
+    }
+
+    public Double getHistoryApbillAmount() {
+        return NumFormat.getTwo(historyApbillAmount);
+    }
+
+    public void setHistoryApbillAmount(Double historyApbillAmount) {
+        this.historyApbillAmount = historyApbillAmount;
+    }
+
+    public Double getAvgOrderAmount() {
+        return NumFormat.getTwo(avgOrderAmount);
+    }
+
+    public void setAvgOrderAmount(Double avgOrderAmount) {
+        this.avgOrderAmount = avgOrderAmount;
+    }
+
+    public Double getAvgApcheckAmount() {
+        return NumFormat.getTwo(avgApcheckAmount);
+    }
+
+    public void setAvgApcheckAmount(Double avgApcheckAmount) {
+        this.avgApcheckAmount = avgApcheckAmount;
+    }
+
+    public Double getAvgApbillAmount() {
+        return NumFormat.getTwo(avgApbillAmount);
+    }
+
+    public void setAvgApbillAmount(Double avgApbillAmount) {
+        this.avgApbillAmount = avgApbillAmount;
+    }
+
+    public Double getAvgUserAmount() {
+        return NumFormat.getTwo(avgUserAmount);
+    }
+
+    public void setAvgUserAmount(Double avgUserAmount) {
+        this.avgUserAmount = avgUserAmount;
+    }
+
+    public UsoftHistoryTradingData(Integer totalQty, Integer havingTradingQty, Integer whitelistQty,
+                                   Double historyTradingHours, Double historyOrderNum, Double historyOrderAmount,
+                                   Double historyAcceptAmount, Double historyReturnAmount, Double historyApcheckNum,
+                                   Double historyApcheckAmount, Double historyApbillNum, Double historyApbillAmount) {
+        this.totalQty = totalQty;
+        this.havingTradingQty = havingTradingQty;
+        this.whitelistQty = whitelistQty;
+        this.historyTradingHours = historyTradingHours;
+        this.historyOrderNum = historyOrderNum;
+        this.historyOrderAmount = historyOrderAmount;
+        this.historyAcceptAmount = historyAcceptAmount;
+        this.historyReturnAmount = historyReturnAmount;
+        this.historyApcheckAmount = historyApcheckAmount;
+        this.historyApbillAmount = historyApbillAmount;
+        this.avgOrderAmount = historyOrderNum == null ? 0 : historyOrderAmount/historyOrderNum;
+        this.avgApcheckAmount = historyApcheckNum == null ? 0 : historyApcheckAmount/historyApcheckNum;
+        this.avgApbillAmount = historyApbillNum == null ? 0 : historyApbillAmount/historyApbillNum;
+        this.avgUserAmount = totalQty == null ? 0 : historyOrderAmount/totalQty;
+    }
+}

+ 47 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftInterval.java

@@ -0,0 +1,47 @@
+package com.uas.platform.b2b.openapi.model;
+
+import java.util.Set;
+
+/**
+ * 用户分布区间
+ * @Author: huj
+ * @Date: Created in 11:45 2018/11/08.
+ */
+public class UsoftInterval {
+
+    private Set<UsoftIntervalItem> tradingTime;
+
+    private Set<UsoftIntervalItem> orderAmount;
+
+    private Set<UsoftIntervalItem> orderNum;
+
+    public Set<UsoftIntervalItem> getTradingTime() {
+        return tradingTime;
+    }
+
+    public void setTradingTime(Set<UsoftIntervalItem> tradingTime) {
+        this.tradingTime = tradingTime;
+    }
+
+    public Set<UsoftIntervalItem> getOrderAmount() {
+        return orderAmount;
+    }
+
+    public void setOrderAmount(Set<UsoftIntervalItem> orderAmount) {
+        this.orderAmount = orderAmount;
+    }
+
+    public Set<UsoftIntervalItem> getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Set<UsoftIntervalItem> orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public UsoftInterval(Set<UsoftIntervalItem> tradingTime, Set<UsoftIntervalItem> orderAmount, Set<UsoftIntervalItem> orderNum) {
+        this.tradingTime = tradingTime;
+        this.orderAmount = orderAmount;
+        this.orderNum = orderNum;
+    }
+}

+ 57 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftIntervalItem.java

@@ -0,0 +1,57 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * @Author: huj
+ * @Date: Created in 11:47 2018/11/08.
+ */
+public class UsoftIntervalItem {
+
+    private String name;
+
+    private Double num;
+
+    private Double percent;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getNum() {
+        return num;
+    }
+
+    public void setNum(Double num) {
+        this.num = num;
+    }
+
+    public Double getPercent() {
+        return NumFormat.getTwo(percent);
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+
+    public UsoftIntervalItem(String name, Double num, Double total) {
+        this.name = name;
+        this.num = num;
+        this.percent = num/total;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return super.equals(obj);
+    }
+}

+ 102 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftOrder.java

@@ -0,0 +1,102 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * @Author: huj
+ * @Date: Created in 09:56 2018/11/08.
+ */
+public class UsoftOrder {
+
+    private Long id;
+
+    private String code;
+
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private String orderTime;
+
+    private String custName;
+
+    private String currency;
+
+    private Double amount;
+
+    private String payments;
+
+    private String address;
+
+    private String remark;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(String orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public Double getAmount() {
+        return NumFormat.getTwo(amount);
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getPayments() {
+        return payments;
+    }
+
+    public void setPayments(String payments) {
+        this.payments = payments;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 91 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftOrderItem.java

@@ -0,0 +1,91 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:04 2018/11/08.
+ */
+public class UsoftOrderItem {
+
+    private Long id;
+
+    private Product product;
+
+    private Double price;
+
+    private Float rate;
+
+    private Double quantity;
+
+    private String unit;
+
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private String delivery;
+
+    private Long orderId;
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Float getRate() {
+        return rate;
+    }
+
+    public void setRate(Float rate) {
+        this.rate = rate;
+    }
+
+    public Double getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(Double quantity) {
+        this.quantity = quantity;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getDelivery() {
+        return delivery;
+    }
+
+    public void setDelivery(String delivery) {
+        this.delivery = delivery;
+    }
+}

+ 99 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftRunningEfficient.java

@@ -0,0 +1,99 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * 所有用户运营效率分析一览表
+ * @Author: huj
+ * @Date: Created in 11:34 2018/11/08.
+ */
+public class UsoftRunningEfficient {
+
+    /**
+     * 历史退货率(%)
+     * 等于累计验退金额/累计验收金额*100%
+     */
+    private Double historyReturnPCT;
+    /**
+     * 有效订单率(%)
+     * 等于累计验收金额/累计订单金额*100%
+     */
+    private Double effectiveOrderPCT;
+    /**
+     * 历史对账率(%)
+     * 等于累计对账金额/累计订单金额*100%
+     */
+    private Double historyApcheckPCT;
+    /**
+     * 历史开票率(%)
+     * 等于累计开票金额/累计订单金额*100%
+     */
+    private Double historyApbillPCT;
+    /**
+     * 活跃用户率(%)
+     * 等于有交易额用户数量/全部用户数量*100%
+     */
+    private Double activeUserPCT;
+    /**
+     * 准入用户率(%)
+     * 等于白名单用户数量/有交易额用户数量*100%
+     */
+    private Double realUserPCT;
+
+    public Double getHistoryReturnPCT() {
+        return NumFormat.getPercent(historyReturnPCT);
+    }
+
+    public void setHistoryReturnPCT(Double historyReturnPCT) {
+        this.historyReturnPCT = historyReturnPCT;
+    }
+
+    public Double getEffectiveOrderPCT() {
+        return NumFormat.getPercent(effectiveOrderPCT);
+    }
+
+    public void setEffectiveOrderPCT(Double effectiveOrderPCT) {
+        this.effectiveOrderPCT = effectiveOrderPCT;
+    }
+
+    public Double getHistoryApcheckPCT() {
+        return NumFormat.getPercent(historyApcheckPCT);
+    }
+
+    public void setHistoryApcheckPCT(Double historyApcheckPCT) {
+        this.historyApcheckPCT = historyApcheckPCT;
+    }
+
+    public Double getHistoryApbillPCT() {
+        return NumFormat.getPercent(historyApbillPCT);
+    }
+
+    public void setHistoryApbillPCT(Double historyApbillPCT) {
+        this.historyApbillPCT = historyApbillPCT;
+    }
+
+    public Double getActiveUserPCT() {
+        return NumFormat.getPercent(activeUserPCT);
+    }
+
+    public void setActiveUserPCT(Double activeUserPCT) {
+        this.activeUserPCT = activeUserPCT;
+    }
+
+    public Double getRealUserPCT() {
+        return NumFormat.getPercent(realUserPCT);
+    }
+
+    public void setRealUserPCT(Double realUserPCT) {
+        this.realUserPCT = realUserPCT;
+    }
+
+    public UsoftRunningEfficient(UsoftHistoryTradingData data) {
+        this.historyReturnPCT = data.getHistoryReturnAmount()/data.getHistoryAcceptAmount();
+        this.effectiveOrderPCT = data.getHistoryAcceptAmount()/data.getHistoryOrderAmount();
+        this.historyApcheckPCT = data.getHistoryApcheckAmount()/data.getHistoryOrderAmount();
+        this.historyApbillPCT = data.getHistoryApbillAmount()/data.getHistoryOrderAmount();
+        this.activeUserPCT = (double) data.getHavingTradingQty()/data.getTotalQty();
+        this.realUserPCT = (double) data.getWhitelistQty()/data.getHavingTradingQty();
+    }
+}

+ 122 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftTrading.java

@@ -0,0 +1,122 @@
+package com.uas.platform.b2b.openapi.model;
+
+import com.uas.platform.b2b.openapi.support.NumFormat;
+
+/**
+ * 近3年优软云平台交易数据一览表
+ * @Author: huj
+ * @Date: Created in 11:58 2018/11/08.
+ */
+public class UsoftTrading {
+
+    /**
+     * 科目
+     */
+    private String name;
+    /**
+     * 前两年
+     */
+    private Double lastTwoYearNum;
+    /**
+     * 前一年
+     */
+    private Double lastYearNum;
+    /**
+     * 当年
+     */
+    private Double thisYearNum;
+    /**
+     * 合计
+     */
+    private Double total;
+    /**
+     * 平均
+     */
+    private Double avg;
+    /**
+     * 前一年增持绿
+     */
+    private Double lastYearPCT;
+    /**
+     * 当年增长绿
+     */
+    private Double thisYearPCT;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getLastTwoYearNum() {
+        return NumFormat.getTwo(lastTwoYearNum);
+    }
+
+    public void setLastTwoYearNum(Double lastTwoYearNum) {
+        this.lastTwoYearNum = lastTwoYearNum;
+    }
+
+    public Double getLastYearNum() {
+        return NumFormat.getTwo(lastYearNum);
+    }
+
+    public void setLastYearNum(Double lastYearNum) {
+        this.lastYearNum = lastYearNum;
+    }
+
+    public Double getThisYearNum() {
+        return NumFormat.getTwo(thisYearNum);
+    }
+
+    public void setThisYearNum(Double thisYearNum) {
+        this.thisYearNum = thisYearNum;
+    }
+
+    public Double getTotal() {
+        return NumFormat.getTwo(total);
+    }
+
+    public void setTotal(Double total) {
+        this.total = total;
+    }
+
+    public Double getAvg() {
+        return NumFormat.getTwo(avg);
+    }
+
+    public void setAvg(Double avg) {
+        this.avg = avg;
+    }
+
+    public Double getLastYearPCT() {
+        return lastYearPCT;
+    }
+
+    public void setLastYearPCT(Double lastYearPCT) {
+        this.lastYearPCT = lastYearPCT;
+    }
+
+    public Double getThisYearPCT() {
+        return thisYearPCT;
+    }
+
+    public void setThisYearPCT(Double thisYearPCT) {
+        this.thisYearPCT = thisYearPCT;
+    }
+
+    public UsoftTrading(String name, Double lastTwoYearNum, Double lastYearNum, Double thisYearNum) {
+        lastTwoYearNum = lastTwoYearNum == null ? 0.0 : lastTwoYearNum;
+        lastYearNum = lastYearNum == null ? 0.0 : lastYearNum;
+        thisYearNum = thisYearNum == null ? 0.0 : thisYearNum;
+        this.name = name;
+        this.lastTwoYearNum = lastTwoYearNum;
+        this.lastYearNum = lastYearNum;
+        this.thisYearNum = thisYearNum;
+        this.total = lastTwoYearNum + lastYearNum + thisYearNum;
+        this.avg = total / 3;
+        this.lastYearPCT = NumFormat.getIncrease(lastTwoYearNum, lastYearNum);
+        this.thisYearPCT = NumFormat.getIncrease(lastYearNum,thisYearNum);
+    }
+}

+ 167 - 0
src/main/java/com/uas/platform/b2b/openapi/model/UsoftWhitelist.java

@@ -0,0 +1,167 @@
+package com.uas.platform.b2b.openapi.model;
+
+import javax.persistence.*;
+
+/**
+ * 白名单用户数据
+ * @Author: huj
+ * @Date: Created in 11:03 2018/11/08.
+ */
+@Entity
+@Table(name = "usofwhitelist", indexes = {@Index(name = "unique_enuu", columnList = "u_enuu", unique = true)})
+public class UsoftWhitelist {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "u_id")
+    private Long id;
+
+    /**
+     * 企业uu
+     */
+    @Column(name = "u_enuu")
+    private Long enUU;
+
+    /**
+     * 企业name
+     */
+    @Column(name = "u_enname")
+    private String enName;
+
+    /**
+     * 企业地址
+     */
+    @Column(name = "u_address")
+    private String address;
+
+    /**
+     * 历史交易时间
+     */
+    @Column(name = "u_history_tradinghours")
+    private Double historyTradingHours;
+
+    /**
+     * 历史交易笔数
+     */
+    @Column(name = "u_history_order_num")
+    private Double historyOrderNum;
+
+    /**
+     * 历史订单总额
+     */
+    @Column(name = "u_history_order_amount")
+    private Double historyOrderAmount;
+
+    /**
+     * 前1年订单笔数(笔)
+     */
+    @Column(name = "u_lastyear_order_num")
+    private Double lastYearOrderNum;
+
+    /**
+     * 前1年订单总额(元)
+     */
+    @Column(name = "u_lastyear_order_amount")
+    private Double lastYearOrderAmount;
+
+    /**
+     * 当年订单笔数(笔)
+     */
+    @Column(name = "u_thisyear_order_num")
+    private Double thisYearOrderNum;
+
+    /**
+     * 当年订单总额
+     */
+    @Column(name = "u_thisyear_order_amount")
+    private Double thisYearOrderAmount;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public String getEnName() {
+        return enName;
+    }
+
+    public void setEnName(String enName) {
+        this.enName = enName;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public Double getHistoryTradingHours() {
+        return historyTradingHours;
+    }
+
+    public void setHistoryTradingHours(Double historyTradingHours) {
+        this.historyTradingHours = historyTradingHours;
+    }
+
+    public Double getHistoryOrderNum() {
+        return historyOrderNum;
+    }
+
+    public void setHistoryOrderNum(Double historyOrderNum) {
+        this.historyOrderNum = historyOrderNum;
+    }
+
+    public Double getHistoryOrderAmount() {
+        return historyOrderAmount;
+    }
+
+    public void setHistoryOrderAmount(Double historyOrderAmount) {
+        this.historyOrderAmount = historyOrderAmount;
+    }
+
+    public Double getLastYearOrderNum() {
+        return lastYearOrderNum;
+    }
+
+    public void setLastYearOrderNum(Double lastYearOrderNum) {
+        this.lastYearOrderNum = lastYearOrderNum;
+    }
+
+    public Double getLastYearOrderAmount() {
+        return lastYearOrderAmount;
+    }
+
+    public void setLastYearOrderAmount(Double lastYearOrderAmount) {
+        this.lastYearOrderAmount = lastYearOrderAmount;
+    }
+
+    public Double getThisYearOrderNum() {
+        return thisYearOrderNum;
+    }
+
+    public void setThisYearOrderNum(Double thisYearOrderNum) {
+        this.thisYearOrderNum = thisYearOrderNum;
+    }
+
+    public Double getThisYearOrderAmount() {
+        return thisYearOrderAmount;
+    }
+
+    public void setThisYearOrderAmount(Double thisYearOrderAmount) {
+        this.thisYearOrderAmount = thisYearOrderAmount;
+    }
+
+}

+ 8 - 0
src/main/java/com/uas/platform/b2b/openapi/service/TradingDataService.java

@@ -35,4 +35,12 @@ public interface TradingDataService {
      * @return
      */
     ModelMap getRecentOfMonth(Long enUU);
+
+    /**
+     * 交易时间
+     * @param enUU 卖方uu
+     * @param custUU 客户uu
+     * @return 交易时间
+     */
+    Double getTimeSum(Long enUU, Long custUU);
 }

+ 102 - 0
src/main/java/com/uas/platform/b2b/openapi/service/UsoftService.java

@@ -0,0 +1,102 @@
+package com.uas.platform.b2b.openapi.service;
+
+import com.uas.platform.b2b.openapi.model.*;
+
+import java.util.List;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:36 2018/11/08.
+ */
+public interface UsoftService {
+
+    /**
+     * 根据卖方uu获取订单数据
+     * @param enUU
+     *      卖方uu
+     * @param startTime
+     *      起始时间
+     * @param endTime
+     *      截止时间
+     * @return
+     */
+    List<UsoftOrder> getUsoftOrders(Long enUU, Long startTime, Long endTime);
+
+    /**
+     * 根据订单获取订单明细
+     * @param orderId
+     *      订单id
+     * @return
+     */
+    List<UsoftOrderItem> getUsoftOrderItems(Long orderId);
+
+    /**
+     * 根据订单获取订单明细(批量)
+     * @param orderIds
+     *      订单id
+     * @return
+     */
+    List<UsoftOrderItem> getUsoftOrderItemsBatch(String orderIds);
+
+    /**
+     * 根据卖方uu获取验收单数据
+     * @param enUU
+     *      卖方uu
+     * @param startTime
+     *      起始时间
+     * @param endTime
+     *      截止时间
+     * @return
+     */
+    List<UsoftAccept> getUsoftAccepts(Long enUU, Long startTime, Long endTime);
+
+    /**
+     * 根据验收单id获取验收明细
+     * @param acceptId
+     *      验收单id
+     * @return
+     */
+    List<UsoftAcceptItem> getUsoftAcceptItems(Long acceptId);
+
+    /**
+     * 根据验收单id获取验收明细
+     * @param acceptIds
+     *      验收单id字符串
+     * @return
+     */
+    List<UsoftAcceptItem> getUsoftAcceptItemsBatch(String acceptIds);
+
+    /**
+     * 获取白名单用户数据
+     * @return
+     */
+    List<UsoftWhitelist> getUsoftWhitelists();
+
+    /**
+     * 获取所有用户历史交易数据
+     * @return
+     */
+    UsoftHistoryTradingData getUsoftHistoryTradingData();
+
+    /**
+     * 获取所有用户运营效率分析一览表
+     * @return
+     */
+    UsoftRunningEfficient getUsoftRunningEfficient();
+
+    /**
+     * 获取所有用户分布区间数据
+     * @return
+     */
+    UsoftInterval getUsoftInterval();
+
+    /**
+     * 获取所有用户近三年交易数据
+     */
+    List<UsoftTrading> getUsoftTradings();
+
+    /**
+     * 定时任务初始化or更新白名单企业
+     */
+    void initUsoftWhitelists();
+}

+ 207 - 205
src/main/java/com/uas/platform/b2b/openapi/service/impl/TradingDataServiceImpl.java

@@ -45,7 +45,8 @@ public class TradingDataServiceImpl implements TradingDataService {
         // 获取累计发票金额
         Double apBillSum = getApBillSum(enUU);
         // 获取历史退货率
-        Double historyReturn = NumFormat.getPercent(returnSum / getOrderSum(enUU));
+        Double orderSum = getOrderSum(enUU);
+        Double historyReturn = NumFormat.getPercent(orderSum == 0.0 ? 0.0 : returnSum / orderSum);
         map.put("timeSum", timeSum);
         map.put("acceptSum", acceptSum);
         map.put("returnSum", returnSum);
@@ -70,13 +71,13 @@ public class TradingDataServiceImpl implements TradingDataService {
                 if (StringUtils.isEmpty(acceptSum) || acceptSum == 0.0) {
                     custTrading.setAcceptPercent(0.00);
                 } else {
-                    custTrading.setAcceptPercent(NumFormat.getPercent((acceptSum - returnSum) / sum));
+                    custTrading.setAcceptPercent(NumFormat.getPercent(sum == 0.0 ? 0.0 : (acceptSum - returnSum) / sum));
                 }
                 Integer acceptNum = getAcceptNum(enUU, custTrading.getCustUU());
                 Integer realNum = acceptNum - getReturnNum(enUU, custTrading.getCustUU());
                 custTrading.setRealNum(realNum);
                 if (0 != acceptNum) {
-                    custTrading.setNumPercent(NumFormat.getPercent((double) realNum / sumNum));
+                    custTrading.setNumPercent(NumFormat.getPercent(sumNum == 0 ? 0 : (double) realNum / sumNum));
                 }
                 custTrading.setTimeSum(NumFormat.getOne(getTimeSum(enUU, custTrading.getCustUU())));
             }
@@ -90,93 +91,93 @@ public class TradingDataServiceImpl implements TradingDataService {
         ModelMap map = new ModelMap();
         List<RecentOfYear> years = new ArrayList<>();
         // 有交易额客户数量
-        RecentOfYear ofYear1 = new RecentOfYear("有交易额客户数量");
-        ofYear1.setTwoYear((double) getAcceptCust(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear1.setOneYear((double) getAcceptCust(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear1.setThisYear((double) getAcceptCust(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear1.setOneYearNum(NumFormat.getIncrease(ofYear1.getTwoYear(), ofYear1.getOneYear()));
-        ofYear1.setThisYearNum(NumFormat.getIncrease(ofYear1.getOneYear(), ofYear1.getThisYear()));
-        years.add(ofYear1);
+        RecentOfYear havingTradingQty = new RecentOfYear("有交易额客户数量");
+        havingTradingQty.setTwoYear((double) getAcceptCust(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        havingTradingQty.setOneYear((double) getAcceptCust(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        havingTradingQty.setThisYear((double) getAcceptCust(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        havingTradingQty.setOneYearNum(NumFormat.getIncrease(havingTradingQty.getTwoYear(), havingTradingQty.getOneYear()));
+        havingTradingQty.setThisYearNum(NumFormat.getIncrease(havingTradingQty.getOneYear(), havingTradingQty.getThisYear()));
+        years.add(havingTradingQty);
         // 验收金额
-        RecentOfYear ofYear2 = new RecentOfYear("验收金额");
-        ofYear2.setTwoYear(getAcceptSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear2.setOneYear(getAcceptSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear2.setThisYear(getAcceptSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear2.setOneYearNum(NumFormat.getIncrease(ofYear2.getTwoYear(), ofYear2.getOneYear()));
-        ofYear2.setThisYearNum(NumFormat.getIncrease(ofYear2.getOneYear(), ofYear2.getThisYear()));
-        years.add(ofYear2);
+        RecentOfYear acceptAmount = new RecentOfYear("验收金额");
+        acceptAmount.setTwoYear(getAcceptSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        acceptAmount.setOneYear(getAcceptSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        acceptAmount.setThisYear(getAcceptSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        acceptAmount.setOneYearNum(NumFormat.getIncrease(acceptAmount.getTwoYear(), acceptAmount.getOneYear()));
+        acceptAmount.setThisYearNum(NumFormat.getIncrease(acceptAmount.getOneYear(), acceptAmount.getThisYear()));
+        years.add(acceptAmount);
         // 验收笔数
-        RecentOfYear ofYear3 = new RecentOfYear("验收笔数");
-        ofYear3.setTwoYear((double) getAcceptNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear3.setOneYear((double) getAcceptNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear3.setThisYear((double) getAcceptNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear3.setOneYearNum(NumFormat.getIncrease(ofYear3.getTwoYear(), ofYear3.getOneYear()));
-        ofYear3.setThisYearNum(NumFormat.getIncrease(ofYear3.getOneYear(), ofYear3.getThisYear()));
-        years.add(ofYear3);
+        RecentOfYear acceptNum = new RecentOfYear("验收笔数");
+        acceptNum.setTwoYear((double) getAcceptNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        acceptNum.setOneYear((double) getAcceptNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        acceptNum.setThisYear((double) getAcceptNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        acceptNum.setOneYearNum(NumFormat.getIncrease(acceptNum.getTwoYear(), acceptNum.getOneYear()));
+        acceptNum.setThisYearNum(NumFormat.getIncrease(acceptNum.getOneYear(), acceptNum.getThisYear()));
+        years.add(acceptNum);
         // 验退金额
-        RecentOfYear ofYear4 = new RecentOfYear("验退金额");
-        ofYear4.setTwoYear(getReturnSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear4.setOneYear(getReturnSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear4.setThisYear(getReturnSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear4.setOneYearNum(NumFormat.getIncrease(ofYear4.getTwoYear(), ofYear4.getOneYear()));
-        ofYear4.setThisYearNum(NumFormat.getIncrease(ofYear4.getOneYear(), ofYear4.getThisYear()));
-        years.add(ofYear4);
+        RecentOfYear returnAmount = new RecentOfYear("验退金额");
+        returnAmount.setTwoYear(getReturnSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        returnAmount.setOneYear(getReturnSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        returnAmount.setThisYear(getReturnSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        returnAmount.setOneYearNum(NumFormat.getIncrease(returnAmount.getTwoYear(), returnAmount.getOneYear()));
+        returnAmount.setThisYearNum(NumFormat.getIncrease(returnAmount.getOneYear(), returnAmount.getThisYear()));
+        years.add(returnAmount);
         // 验退笔数
-        RecentOfYear ofYear5 = new RecentOfYear("验退笔数");
-        ofYear5.setTwoYear((double) getReturnNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear5.setOneYear((double) getReturnNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear5.setThisYear((double) getReturnNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear5.setOneYearNum(NumFormat.getIncrease(ofYear5.getTwoYear(), ofYear5.getOneYear()));
-        ofYear5.setThisYearNum(NumFormat.getIncrease(ofYear5.getOneYear(), ofYear5.getThisYear()));
-        years.add(ofYear5);
+        RecentOfYear returnNum = new RecentOfYear("验退笔数");
+        returnNum.setTwoYear((double) getReturnNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        returnNum.setOneYear((double) getReturnNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        returnNum.setThisYear((double) getReturnNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        returnNum.setOneYearNum(NumFormat.getIncrease(returnNum.getTwoYear(), returnNum.getOneYear()));
+        returnNum.setThisYearNum(NumFormat.getIncrease(returnNum.getOneYear(), returnNum.getThisYear()));
+        years.add(returnNum);
         // 实收金额
-        RecentOfYear ofYear6 = new RecentOfYear("实收金额");
-        ofYear6.setTwoYear(ofYear2.getTwoYear() - ofYear4.getTwoYear());
-        ofYear6.setOneYear(ofYear2.getOneYear() - ofYear4.getOneYear());
-        ofYear6.setThisYear(ofYear2.getThisYear() - ofYear4.getThisYear());
-        ofYear6.setOneYearNum(NumFormat.getIncrease(ofYear6.getTwoYear(), ofYear6.getOneYear()));
-        ofYear6.setThisYearNum(NumFormat.getIncrease(ofYear6.getOneYear(), ofYear6.getThisYear()));
-        years.add(ofYear6);
+        RecentOfYear realAmount = new RecentOfYear("实收金额");
+        realAmount.setTwoYear(acceptAmount.getTwoYear() - returnAmount.getTwoYear());
+        realAmount.setOneYear(acceptAmount.getOneYear() - returnAmount.getOneYear());
+        realAmount.setThisYear(acceptAmount.getThisYear() - returnAmount.getThisYear());
+        realAmount.setOneYearNum(NumFormat.getIncrease(realAmount.getTwoYear(), realAmount.getOneYear()));
+        realAmount.setThisYearNum(NumFormat.getIncrease(realAmount.getOneYear(), realAmount.getThisYear()));
+        years.add(realAmount);
         // 实收笔数
-        RecentOfYear ofYear7 = new RecentOfYear("实收笔数");
-        ofYear7.setTwoYear(ofYear3.getTwoYear() - ofYear5.getTwoYear());
-        ofYear7.setOneYear(ofYear3.getOneYear() - ofYear5.getOneYear());
-        ofYear7.setThisYear(ofYear3.getThisYear() - ofYear5.getThisYear());
-        ofYear7.setOneYearNum(NumFormat.getIncrease(ofYear7.getTwoYear(), ofYear7.getOneYear()));
-        ofYear7.setThisYearNum(NumFormat.getIncrease(ofYear7.getOneYear(), ofYear7.getThisYear()));
-        years.add(ofYear7);
+        RecentOfYear realNum = new RecentOfYear("实收笔数");
+        realNum.setTwoYear(acceptNum.getTwoYear() - returnNum.getTwoYear());
+        realNum.setOneYear(acceptNum.getOneYear() - returnNum.getOneYear());
+        realNum.setThisYear(acceptNum.getThisYear() - returnNum.getThisYear());
+        realNum.setOneYearNum(NumFormat.getIncrease(realNum.getTwoYear(), realNum.getOneYear()));
+        realNum.setThisYearNum(NumFormat.getIncrease(realNum.getOneYear(), realNum.getThisYear()));
+        years.add(realNum);
         // 对账金额
-        RecentOfYear ofYear8 = new RecentOfYear("对账金额");
-        ofYear8.setTwoYear(getApCheckSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear8.setOneYear(getApCheckSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear8.setThisYear(getApCheckSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear8.setOneYearNum(NumFormat.getIncrease(ofYear8.getTwoYear(), ofYear8.getOneYear()));
-        ofYear8.setThisYearNum(NumFormat.getIncrease(ofYear8.getOneYear(), ofYear8.getThisYear()));
-        years.add(ofYear8);
+        RecentOfYear apcheckAmount = new RecentOfYear("对账金额");
+        apcheckAmount.setTwoYear(getApCheckSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        apcheckAmount.setOneYear(getApCheckSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        apcheckAmount.setThisYear(getApCheckSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        apcheckAmount.setOneYearNum(NumFormat.getIncrease(apcheckAmount.getTwoYear(), apcheckAmount.getOneYear()));
+        apcheckAmount.setThisYearNum(NumFormat.getIncrease(apcheckAmount.getOneYear(), apcheckAmount.getThisYear()));
+        years.add(apcheckAmount);
         // 对账笔数
-        RecentOfYear ofYear9 = new RecentOfYear("对账笔数");
-        ofYear9.setTwoYear(getApCheckNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear9.setOneYear(getApCheckNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear9.setThisYear(getApCheckNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear9.setOneYearNum(NumFormat.getIncrease(ofYear9.getTwoYear(), ofYear9.getOneYear()));
-        ofYear9.setThisYearNum(NumFormat.getIncrease(ofYear9.getOneYear(), ofYear9.getThisYear()));
-        years.add(ofYear9);
+        RecentOfYear apcheckNum = new RecentOfYear("对账笔数");
+        apcheckNum.setTwoYear(getApCheckNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        apcheckNum.setOneYear(getApCheckNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        apcheckNum.setThisYear(getApCheckNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        apcheckNum.setOneYearNum(NumFormat.getIncrease(apcheckNum.getTwoYear(), apcheckNum.getOneYear()));
+        apcheckNum.setThisYearNum(NumFormat.getIncrease(apcheckNum.getOneYear(), apcheckNum.getThisYear()));
+        years.add(apcheckNum);
         // 开票金额
-        RecentOfYear ofYear10 = new RecentOfYear("开票金额");
-        ofYear10.setTwoYear(getApBillSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear10.setOneYear(getApBillSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear10.setThisYear(getApBillSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear10.setOneYearNum(NumFormat.getIncrease(ofYear10.getTwoYear(), ofYear10.getOneYear()));
-        ofYear10.setThisYearNum(NumFormat.getIncrease(ofYear10.getOneYear(), ofYear10.getThisYear()));
-        years.add(ofYear10);
+        RecentOfYear apbillAmount = new RecentOfYear("开票金额");
+        apbillAmount.setTwoYear(getApBillSumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        apbillAmount.setOneYear(getApBillSumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        apbillAmount.setThisYear(getApBillSumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        apbillAmount.setOneYearNum(NumFormat.getIncrease(apbillAmount.getTwoYear(), apbillAmount.getOneYear()));
+        apbillAmount.setThisYearNum(NumFormat.getIncrease(apbillAmount.getOneYear(), apbillAmount.getThisYear()));
+        years.add(apbillAmount);
         // 开票笔数
-        RecentOfYear ofYear11 = new RecentOfYear("开票笔数");
-        ofYear11.setTwoYear(getApBillNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
-        ofYear11.setOneYear(getApBillNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
-        ofYear11.setThisYear(getApBillNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
-        ofYear11.setOneYearNum(NumFormat.getIncrease(ofYear11.getTwoYear(), ofYear11.getOneYear()));
-        ofYear11.setThisYearNum(NumFormat.getIncrease(ofYear11.getOneYear(), ofYear11.getThisYear()));
-        years.add(ofYear11);
+        RecentOfYear apbillNum = new RecentOfYear("开票笔数");
+        apbillNum.setTwoYear(getApBillNumTime(enUU, NumFormat.getTwoYear(), NumFormat.getOneYear()));
+        apbillNum.setOneYear(getApBillNumTime(enUU, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        apbillNum.setThisYear(getApBillNumTime(enUU, NumFormat.getThisYear(), NumFormat.getNow()));
+        apbillNum.setOneYearNum(NumFormat.getIncrease(apbillNum.getTwoYear(), apbillNum.getOneYear()));
+        apbillNum.setThisYearNum(NumFormat.getIncrease(apbillNum.getOneYear(), apbillNum.getThisYear()));
+        years.add(apbillNum);
         map.put("data", years);
         return map;
     }
@@ -191,145 +192,119 @@ public class TradingDataServiceImpl implements TradingDataService {
         Date now = NumFormat.getNowM();
         List<RecentOfMonth> months = new ArrayList<>();
         // 有交易额客户数量
-        RecentOfMonth ofMonth1 = new RecentOfMonth("有交易额客户数量");
-        ofMonth1.setFourMonth((double) getAcceptCust(enUU, four, three));
-        ofMonth1.setThreeMonth((double) getAcceptCust(enUU, three, two));
-        ofMonth1.setTwoMonth((double) getAcceptCust(enUU, two, one));
-        ofMonth1.setOneMonth((double) getAcceptCust(enUU, one, now));
-        ofMonth1.setThreeMonthNum(NumFormat.getIncrease(ofMonth1.getFourMonth(), ofMonth1.getThreeMonth()));
-        ofMonth1.setTwoMonthNum(NumFormat.getIncrease(ofMonth1.getThreeMonth(), ofMonth1.getTwoMonth()));
-        ofMonth1.setOneMonthNum(NumFormat.getIncrease(ofMonth1.getTwoMonth(), ofMonth1.getOneMonth()));
-        months.add(ofMonth1);
+        RecentOfMonth havingTradingQty = new RecentOfMonth("有交易额客户数量");
+        havingTradingQty.setFourMonth((double) getAcceptCust(enUU, four, three));
+        havingTradingQty.setThreeMonth((double) getAcceptCust(enUU, three, two));
+        havingTradingQty.setTwoMonth((double) getAcceptCust(enUU, two, one));
+        havingTradingQty.setOneMonth((double) getAcceptCust(enUU, one, now));
+        havingTradingQty.setThreeMonthNum(NumFormat.getIncrease(havingTradingQty.getFourMonth(), havingTradingQty.getThreeMonth()));
+        havingTradingQty.setTwoMonthNum(NumFormat.getIncrease(havingTradingQty.getThreeMonth(), havingTradingQty.getTwoMonth()));
+        havingTradingQty.setOneMonthNum(NumFormat.getIncrease(havingTradingQty.getTwoMonth(), havingTradingQty.getOneMonth()));
+        months.add(havingTradingQty);
         // 验收金额
-        RecentOfMonth ofMonth2 = new RecentOfMonth("验收金额");
-        ofMonth2.setFourMonth(getAcceptSumTime(enUU, four, three));
-        ofMonth2.setThreeMonth(getAcceptSumTime(enUU, three, two));
-        ofMonth2.setTwoMonth(getAcceptSumTime(enUU, two, one));
-        ofMonth2.setOneMonth(getAcceptSumTime(enUU, one, now));
-        ofMonth2.setThreeMonthNum(NumFormat.getIncrease(ofMonth2.getFourMonth(), ofMonth2.getThreeMonth()));
-        ofMonth2.setTwoMonthNum(NumFormat.getIncrease(ofMonth2.getThreeMonth(), ofMonth2.getTwoMonth()));
-        ofMonth2.setOneMonthNum(NumFormat.getIncrease(ofMonth2.getTwoMonth(), ofMonth2.getOneMonth()));
-        months.add(ofMonth2);
+        RecentOfMonth aceptAmount = new RecentOfMonth("验收金额");
+        aceptAmount.setFourMonth(getAcceptSumTime(enUU, four, three));
+        aceptAmount.setThreeMonth(getAcceptSumTime(enUU, three, two));
+        aceptAmount.setTwoMonth(getAcceptSumTime(enUU, two, one));
+        aceptAmount.setOneMonth(getAcceptSumTime(enUU, one, now));
+        aceptAmount.setThreeMonthNum(NumFormat.getIncrease(aceptAmount.getFourMonth(), aceptAmount.getThreeMonth()));
+        aceptAmount.setTwoMonthNum(NumFormat.getIncrease(aceptAmount.getThreeMonth(), aceptAmount.getTwoMonth()));
+        aceptAmount.setOneMonthNum(NumFormat.getIncrease(aceptAmount.getTwoMonth(), aceptAmount.getOneMonth()));
+        months.add(aceptAmount);
         // 验收笔数
-        RecentOfMonth ofMonth3 = new RecentOfMonth("验收笔数");
-        ofMonth3.setFourMonth((double) getAcceptNumTime(enUU, four, three));
-        ofMonth3.setThreeMonth((double) getAcceptNumTime(enUU, three, two));
-        ofMonth3.setTwoMonth((double) getAcceptNumTime(enUU, two, one));
-        ofMonth3.setOneMonth((double) getAcceptNumTime(enUU, one, now));
-        ofMonth3.setThreeMonthNum(NumFormat.getIncrease(ofMonth3.getFourMonth(), ofMonth3.getThreeMonth()));
-        ofMonth3.setTwoMonthNum(NumFormat.getIncrease(ofMonth3.getThreeMonth(), ofMonth3.getTwoMonth()));
-        ofMonth3.setOneMonthNum(NumFormat.getIncrease(ofMonth3.getTwoMonth(), ofMonth3.getOneMonth()));
-        months.add(ofMonth3);
+        RecentOfMonth aceptNum = new RecentOfMonth("验收笔数");
+        aceptNum.setFourMonth((double) getAcceptNumTime(enUU, four, three));
+        aceptNum.setThreeMonth((double) getAcceptNumTime(enUU, three, two));
+        aceptNum.setTwoMonth((double) getAcceptNumTime(enUU, two, one));
+        aceptNum.setOneMonth((double) getAcceptNumTime(enUU, one, now));
+        aceptNum.setThreeMonthNum(NumFormat.getIncrease(aceptNum.getFourMonth(), aceptNum.getThreeMonth()));
+        aceptNum.setTwoMonthNum(NumFormat.getIncrease(aceptNum.getThreeMonth(), aceptNum.getTwoMonth()));
+        aceptNum.setOneMonthNum(NumFormat.getIncrease(aceptNum.getTwoMonth(), aceptNum.getOneMonth()));
+        months.add(aceptNum);
         // 验退金额
-        RecentOfMonth ofMonth4 = new RecentOfMonth("验退金额");
-        ofMonth4.setFourMonth(getReturnSumTime(enUU, four, three));
-        ofMonth4.setThreeMonth(getReturnSumTime(enUU, three, two));
-        ofMonth4.setTwoMonth(getReturnSumTime(enUU, two, one));
-        ofMonth4.setOneMonth(getReturnSumTime(enUU, one, now));
-        ofMonth4.setThreeMonthNum(NumFormat.getIncrease(ofMonth4.getFourMonth(), ofMonth4.getThreeMonth()));
-        ofMonth4.setTwoMonthNum(NumFormat.getIncrease(ofMonth4.getThreeMonth(), ofMonth4.getTwoMonth()));
-        ofMonth4.setOneMonthNum(NumFormat.getIncrease(ofMonth4.getTwoMonth(), ofMonth4.getOneMonth()));
-        months.add(ofMonth4);
+        RecentOfMonth returnAmount = new RecentOfMonth("验退金额");
+        returnAmount.setFourMonth(getReturnSumTime(enUU, four, three));
+        returnAmount.setThreeMonth(getReturnSumTime(enUU, three, two));
+        returnAmount.setTwoMonth(getReturnSumTime(enUU, two, one));
+        returnAmount.setOneMonth(getReturnSumTime(enUU, one, now));
+        returnAmount.setThreeMonthNum(NumFormat.getIncrease(returnAmount.getFourMonth(), returnAmount.getThreeMonth()));
+        returnAmount.setTwoMonthNum(NumFormat.getIncrease(returnAmount.getThreeMonth(), returnAmount.getTwoMonth()));
+        returnAmount.setOneMonthNum(NumFormat.getIncrease(returnAmount.getTwoMonth(), returnAmount.getOneMonth()));
+        months.add(returnAmount);
         // 验退笔数
-        RecentOfMonth ofMonth5 = new RecentOfMonth("验退笔数");
-        ofMonth5.setFourMonth((double) getReturnNumTime(enUU, four, three));
-        ofMonth5.setThreeMonth((double) getReturnNumTime(enUU, three, two));
-        ofMonth5.setTwoMonth((double) getReturnNumTime(enUU, two, one));
-        ofMonth5.setOneMonth((double) getReturnNumTime(enUU, one, now));
-        ofMonth5.setThreeMonthNum(NumFormat.getIncrease(ofMonth5.getFourMonth(), ofMonth5.getThreeMonth()));
-        ofMonth5.setTwoMonthNum(NumFormat.getIncrease(ofMonth5.getThreeMonth(), ofMonth5.getTwoMonth()));
-        ofMonth5.setOneMonthNum(NumFormat.getIncrease(ofMonth5.getTwoMonth(), ofMonth5.getOneMonth()));
-        months.add(ofMonth5);
+        RecentOfMonth returnNum = new RecentOfMonth("验退笔数");
+        returnNum.setFourMonth((double) getReturnNumTime(enUU, four, three));
+        returnNum.setThreeMonth((double) getReturnNumTime(enUU, three, two));
+        returnNum.setTwoMonth((double) getReturnNumTime(enUU, two, one));
+        returnNum.setOneMonth((double) getReturnNumTime(enUU, one, now));
+        returnNum.setThreeMonthNum(NumFormat.getIncrease(returnNum.getFourMonth(), returnNum.getThreeMonth()));
+        returnNum.setTwoMonthNum(NumFormat.getIncrease(returnNum.getThreeMonth(), returnNum.getTwoMonth()));
+        returnNum.setOneMonthNum(NumFormat.getIncrease(returnNum.getTwoMonth(), returnNum.getOneMonth()));
+        months.add(returnNum);
         // 实收金额
-        RecentOfMonth ofMonth6 = new RecentOfMonth("实收金额");
-        ofMonth6.setFourMonth(ofMonth2.getFourMonth() - ofMonth4.getFourMonth());
-        ofMonth6.setThreeMonth(ofMonth2.getThreeMonth() - ofMonth4.getThreeMonth());
-        ofMonth6.setTwoMonth(ofMonth2.getTwoMonth() - ofMonth4.getTwoMonth());
-        ofMonth6.setOneMonth(ofMonth2.getOneMonth() - ofMonth4.getOneMonth());
-        ofMonth6.setThreeMonthNum(NumFormat.getIncrease(ofMonth6.getFourMonth(), ofMonth6.getThreeMonth()));
-        ofMonth6.setTwoMonthNum(NumFormat.getIncrease(ofMonth6.getThreeMonth(), ofMonth6.getTwoMonth()));
-        ofMonth6.setOneMonthNum(NumFormat.getIncrease(ofMonth6.getTwoMonth(), ofMonth6.getOneMonth()));
-        months.add(ofMonth6);
+        RecentOfMonth realAmount = new RecentOfMonth("实收金额");
+        realAmount.setFourMonth(aceptAmount.getFourMonth() - returnAmount.getFourMonth());
+        realAmount.setThreeMonth(aceptAmount.getThreeMonth() - returnAmount.getThreeMonth());
+        realAmount.setTwoMonth(aceptAmount.getTwoMonth() - returnAmount.getTwoMonth());
+        realAmount.setOneMonth(aceptAmount.getOneMonth() - returnAmount.getOneMonth());
+        realAmount.setThreeMonthNum(NumFormat.getIncrease(realAmount.getFourMonth(), realAmount.getThreeMonth()));
+        realAmount.setTwoMonthNum(NumFormat.getIncrease(realAmount.getThreeMonth(), realAmount.getTwoMonth()));
+        realAmount.setOneMonthNum(NumFormat.getIncrease(realAmount.getTwoMonth(), realAmount.getOneMonth()));
+        months.add(realAmount);
         // 实收笔数
-        RecentOfMonth ofMonth7 = new RecentOfMonth("实收笔数");
-        ofMonth7.setFourMonth(ofMonth3.getFourMonth() - ofMonth5.getFourMonth());
-        ofMonth7.setThreeMonth(ofMonth3.getThreeMonth() - ofMonth5.getThreeMonth());
-        ofMonth7.setTwoMonth(ofMonth3.getTwoMonth() - ofMonth5.getTwoMonth());
-        ofMonth7.setOneMonth(ofMonth3.getOneMonth() - ofMonth5.getOneMonth());
-        ofMonth7.setThreeMonthNum(NumFormat.getIncrease(ofMonth7.getFourMonth(), ofMonth7.getThreeMonth()));
-        ofMonth7.setTwoMonthNum(NumFormat.getIncrease(ofMonth7.getThreeMonth(), ofMonth7.getTwoMonth()));
-        ofMonth7.setOneMonthNum(NumFormat.getIncrease(ofMonth7.getTwoMonth(), ofMonth7.getOneMonth()));
-        months.add(ofMonth7);
+        RecentOfMonth realNum = new RecentOfMonth("实收笔数");
+        realNum.setFourMonth(aceptNum.getFourMonth() - returnNum.getFourMonth());
+        realNum.setThreeMonth(aceptNum.getThreeMonth() - returnNum.getThreeMonth());
+        realNum.setTwoMonth(aceptNum.getTwoMonth() - returnNum.getTwoMonth());
+        realNum.setOneMonth(aceptNum.getOneMonth() - returnNum.getOneMonth());
+        realNum.setThreeMonthNum(NumFormat.getIncrease(realNum.getFourMonth(), realNum.getThreeMonth()));
+        realNum.setTwoMonthNum(NumFormat.getIncrease(realNum.getThreeMonth(), realNum.getTwoMonth()));
+        realNum.setOneMonthNum(NumFormat.getIncrease(realNum.getTwoMonth(), realNum.getOneMonth()));
+        months.add(realNum);
         // 对账金额
-        RecentOfMonth ofMonth8 = new RecentOfMonth("对账金额");
-        ofMonth8.setFourMonth(getApCheckSumTime(enUU, four, three));
-        ofMonth8.setThreeMonth(getApCheckSumTime(enUU, three, two));
-        ofMonth8.setTwoMonth(getApCheckSumTime(enUU, two, one));
-        ofMonth8.setOneMonth(getApCheckSumTime(enUU, one, now));
-        ofMonth8.setThreeMonthNum(NumFormat.getIncrease(ofMonth8.getFourMonth(), ofMonth8.getThreeMonth()));
-        ofMonth8.setTwoMonthNum(NumFormat.getIncrease(ofMonth8.getThreeMonth(), ofMonth8.getTwoMonth()));
-        ofMonth8.setOneMonthNum(NumFormat.getIncrease(ofMonth8.getTwoMonth(), ofMonth8.getOneMonth()));
-        months.add(ofMonth8);
+        RecentOfMonth apcheckAmount = new RecentOfMonth("对账金额");
+        apcheckAmount.setFourMonth(getApCheckSumTime(enUU, four, three));
+        apcheckAmount.setThreeMonth(getApCheckSumTime(enUU, three, two));
+        apcheckAmount.setTwoMonth(getApCheckSumTime(enUU, two, one));
+        apcheckAmount.setOneMonth(getApCheckSumTime(enUU, one, now));
+        apcheckAmount.setThreeMonthNum(NumFormat.getIncrease(apcheckAmount.getFourMonth(), apcheckAmount.getThreeMonth()));
+        apcheckAmount.setTwoMonthNum(NumFormat.getIncrease(apcheckAmount.getThreeMonth(), apcheckAmount.getTwoMonth()));
+        apcheckAmount.setOneMonthNum(NumFormat.getIncrease(apcheckAmount.getTwoMonth(), apcheckAmount.getOneMonth()));
+        months.add(apcheckAmount);
         // 对账笔数
-        RecentOfMonth ofMonth9 = new RecentOfMonth("对账笔数");
-        ofMonth9.setFourMonth(getApCheckNumTime(enUU, four, three));
-        ofMonth9.setThreeMonth(getApCheckNumTime(enUU, three, two));
-        ofMonth9.setTwoMonth(getApCheckNumTime(enUU, two, one));
-        ofMonth9.setOneMonth(getApCheckNumTime(enUU, one, now));
-        ofMonth9.setThreeMonthNum(NumFormat.getIncrease(ofMonth9.getFourMonth(), ofMonth9.getThreeMonth()));
-        ofMonth9.setTwoMonthNum(NumFormat.getIncrease(ofMonth9.getThreeMonth(), ofMonth9.getTwoMonth()));
-        ofMonth9.setOneMonthNum(NumFormat.getIncrease(ofMonth9.getTwoMonth(), ofMonth9.getOneMonth()));
-        months.add(ofMonth9);
+        RecentOfMonth apcheckNum = new RecentOfMonth("对账笔数");
+        apcheckNum.setFourMonth(getApCheckNumTime(enUU, four, three));
+        apcheckNum.setThreeMonth(getApCheckNumTime(enUU, three, two));
+        apcheckNum.setTwoMonth(getApCheckNumTime(enUU, two, one));
+        apcheckNum.setOneMonth(getApCheckNumTime(enUU, one, now));
+        apcheckNum.setThreeMonthNum(NumFormat.getIncrease(apcheckNum.getFourMonth(), apcheckNum.getThreeMonth()));
+        apcheckNum.setTwoMonthNum(NumFormat.getIncrease(apcheckNum.getThreeMonth(), apcheckNum.getTwoMonth()));
+        apcheckNum.setOneMonthNum(NumFormat.getIncrease(apcheckNum.getTwoMonth(), apcheckNum.getOneMonth()));
+        months.add(apcheckNum);
         // 开票金额
-        RecentOfMonth ofMonth10 = new RecentOfMonth("开票金额");
-        ofMonth10.setFourMonth(getApBillSumTime(enUU, four, three));
-        ofMonth10.setThreeMonth(getApBillSumTime(enUU, three, two));
-        ofMonth10.setTwoMonth(getApBillSumTime(enUU, two, one));
-        ofMonth10.setOneMonth(getApBillSumTime(enUU, one, now));
-        ofMonth10.setThreeMonthNum(NumFormat.getIncrease(ofMonth10.getFourMonth(), ofMonth10.getThreeMonth()));
-        ofMonth10.setTwoMonthNum(NumFormat.getIncrease(ofMonth10.getThreeMonth(), ofMonth10.getTwoMonth()));
-        ofMonth10.setOneMonthNum(NumFormat.getIncrease(ofMonth10.getTwoMonth(), ofMonth10.getOneMonth()));
-        months.add(ofMonth10);
+        RecentOfMonth apbillAmount = new RecentOfMonth("开票金额");
+        apbillAmount.setFourMonth(getApBillSumTime(enUU, four, three));
+        apbillAmount.setThreeMonth(getApBillSumTime(enUU, three, two));
+        apbillAmount.setTwoMonth(getApBillSumTime(enUU, two, one));
+        apbillAmount.setOneMonth(getApBillSumTime(enUU, one, now));
+        apbillAmount.setThreeMonthNum(NumFormat.getIncrease(apbillAmount.getFourMonth(), apbillAmount.getThreeMonth()));
+        apbillAmount.setTwoMonthNum(NumFormat.getIncrease(apbillAmount.getThreeMonth(), apbillAmount.getTwoMonth()));
+        apbillAmount.setOneMonthNum(NumFormat.getIncrease(apbillAmount.getTwoMonth(), apbillAmount.getOneMonth()));
+        months.add(apbillAmount);
         // 开票笔数
-        RecentOfMonth ofMonth11 = new RecentOfMonth("开票笔数");
-        ofMonth11.setFourMonth(getApBillNumTime(enUU, four, three));
-        ofMonth11.setThreeMonth(getApBillNumTime(enUU, three, two));
-        ofMonth11.setTwoMonth(getApBillNumTime(enUU, two, one));
-        ofMonth11.setOneMonth(getApBillNumTime(enUU, one, now));
-        ofMonth11.setThreeMonthNum(NumFormat.getIncrease(ofMonth11.getFourMonth(), ofMonth11.getThreeMonth()));
-        ofMonth11.setTwoMonthNum(NumFormat.getIncrease(ofMonth11.getThreeMonth(), ofMonth11.getTwoMonth()));
-        ofMonth11.setOneMonthNum(NumFormat.getIncrease(ofMonth11.getTwoMonth(), ofMonth11.getOneMonth()));
-        months.add(ofMonth11);
+        RecentOfMonth apbillNum = new RecentOfMonth("开票笔数");
+        apbillNum.setFourMonth(getApBillNumTime(enUU, four, three));
+        apbillNum.setThreeMonth(getApBillNumTime(enUU, three, two));
+        apbillNum.setTwoMonth(getApBillNumTime(enUU, two, one));
+        apbillNum.setOneMonth(getApBillNumTime(enUU, one, now));
+        apbillNum.setThreeMonthNum(NumFormat.getIncrease(apbillNum.getFourMonth(), apbillNum.getThreeMonth()));
+        apbillNum.setTwoMonthNum(NumFormat.getIncrease(apbillNum.getThreeMonth(), apbillNum.getTwoMonth()));
+        apbillNum.setOneMonthNum(NumFormat.getIncrease(apbillNum.getTwoMonth(), apbillNum.getOneMonth()));
+        months.add(apbillNum);
         map.put("data", months);
         return map;
     }
 
-    /**
-     * 交易时间
-     * @param enUU 卖方uu
-     * @param custUU 客户uu
-     * @return 交易时间
-     */
-    private Double getTimeSum(Long enUU, Long custUU) {
-        StringBuffer last = new StringBuffer("SELECT ifnull((SELECT pu_date from purc$orders "
-                + "WHERE pu_venduu = " + enUU + " and pu_date is not null ");
-        if (!StringUtils.isEmpty(custUU)) {
-            last.append("and pu_enuu = " + custUU + "");
-        }
-        last.append(" ORDER BY pu_date desc limit 1),now()) pu_date");
-        StringBuffer first = new StringBuffer("SELECT ifnull((SELECT pu_date from purc$orders "
-                + "WHERE pu_venduu = " + enUU + " and pu_date is not null ");
-        if (!StringUtils.isEmpty(custUU)) {
-            first.append("and pu_enuu = " + custUU + "");
-        }
-        first.append(" ORDER BY pu_date asc limit 1),now()) pu_date");
-        Date lastTime = commonDao.queryForObject(last.toString(), Date.class);
-        Date firstTime = commonDao.queryForObject(first.toString(), Date.class);
-        StringBuffer result = new StringBuffer("SELECT TIMESTAMPDIFF(MONTH,'" + firstTime + "','" + lastTime + "')");
-        Double resultTime = commonDao.queryForObject(result.toString(), Double.class) / TimeStauts.TYEAR.value();
-        return NumFormat.getOne(resultTime);
-    }
-
     /**
      * 验收金额
      * @param enUU 卖方uu
@@ -587,4 +562,31 @@ public class TradingDataServiceImpl implements TradingDataService {
         Double result = commonDao.queryForObject(sql.toString(), Double.class);
         return NumFormat.getTwo(result);
     }
+
+    /**
+     * 交易时间
+     * @param enUU 卖方uu
+     * @param custUU 客户uu
+     * @return 交易时间
+     */
+    @Override
+    public Double getTimeSum(Long enUU, Long custUU) {
+        StringBuffer last = new StringBuffer("SELECT ifnull((SELECT pu_date from purc$orders "
+                + "WHERE pu_venduu = " + enUU + " and pu_date is not null ");
+        if (!StringUtils.isEmpty(custUU)) {
+            last.append("and pu_enuu = " + custUU + "");
+        }
+        last.append(" ORDER BY pu_date desc limit 1),now()) pu_date");
+        StringBuffer first = new StringBuffer("SELECT ifnull((SELECT pu_date from purc$orders "
+                + "WHERE pu_venduu = " + enUU + " and pu_date is not null ");
+        if (!StringUtils.isEmpty(custUU)) {
+            first.append("and pu_enuu = " + custUU + "");
+        }
+        first.append(" ORDER BY pu_date asc limit 1),now()) pu_date");
+        Date lastTime = commonDao.queryForObject(last.toString(), Date.class);
+        Date firstTime = commonDao.queryForObject(first.toString(), Date.class);
+        StringBuffer result = new StringBuffer("SELECT TIMESTAMPDIFF(MONTH,'" + firstTime + "','" + lastTime + "')");
+        Double resultTime = commonDao.queryForObject(result.toString(), Double.class) / TimeStauts.TYEAR.value();
+        return NumFormat.getOne(resultTime);
+    }
 }

+ 641 - 0
src/main/java/com/uas/platform/b2b/openapi/service/impl/UsoftServiceImpl.java

@@ -0,0 +1,641 @@
+package com.uas.platform.b2b.openapi.service.impl;
+
+import com.uas.platform.b2b.dao.CommonDao;
+import com.uas.platform.b2b.dao.EnterpriseDao;
+import com.uas.platform.b2b.model.Enterprise;
+import com.uas.platform.b2b.openapi.dao.UsoftWhitelistDao;
+import com.uas.platform.b2b.openapi.model.*;
+import com.uas.platform.b2b.openapi.service.TradingDataService;
+import com.uas.platform.b2b.openapi.service.UsoftService;
+import com.uas.platform.b2b.openapi.support.ErpRate;
+import com.uas.platform.b2b.openapi.support.NumFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.sql.Date;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Author: huj
+ * @Date: Created in 10:37 2018/11/08.
+ */
+@Service
+public class UsoftServiceImpl implements UsoftService {
+
+    @Autowired
+    CommonDao commonDao;
+
+    @Autowired
+    UsoftWhitelistDao whitelistDao;
+
+    @Autowired
+    TradingDataService tradingDataService;
+
+    @Autowired
+    EnterpriseDao enterpriseDao;
+
+    /**
+     * 根据卖方uu获取订单数据
+     *
+     * @param enUU      卖方uu
+     * @param startTime 起始时间
+     * @param endTime   截止时间
+     * @return
+     */
+    @Override
+    public List<UsoftOrder> getUsoftOrders(Long enUU, Long startTime, Long endTime) {
+        String sql = "select pu_id id,pu_code code,pu_date orderTime,en_name custName,pu_currency currency,pu_payments "
+                + "payments,pu_shipaddress address,ifnull(pu_remark,'') remark,(case pu_currency when 'RMB' then "
+                + "sum(pd_price * pd_qty) "
+                + "when 'USD' then sum(pd_price * pd_qty) * " + ErpRate.USD_RATE + " when 'HKD' then sum(pd_price * pd_qty) "
+                + "* " + ErpRate.HKD_RATE + " end) amount from purc$orders LEFT JOIN sec$enterprises  on pu_enuu = en_uu "
+                + "LEFT JOIN purc$orderitems ON pu_id = pd_puid where pu_venduu = " + enUU + " and pu_date >= '" + new Date(startTime)
+                + "' and pu_date <='" + new Date(endTime) + "' group by pu_id order by pu_date desc";
+
+        return commonDao.query(sql, UsoftOrder.class);
+    }
+
+    /**
+     * 根据订单获取订单明细
+     *
+     * @param orderId 订单id
+     * @return
+     */
+    @Override
+    public List<UsoftOrderItem> getUsoftOrderItems(Long orderId) {
+        String sql = "SELECT pd_id id,pd_price price,pd_taxrate rate,pd_qty quantity,pr_unit unit,"
+                + "pd_delivery  delivery from purc$orderitems WHERE pd_puid = " + orderId;
+        List<UsoftOrderItem> orderItems = commonDao.query(sql, UsoftOrderItem.class);
+        if (!CollectionUtils.isEmpty(orderItems)) {
+            orderItems.forEach( orderItem -> {
+                Product product = commonDao.queryBean("select pr_code code,pr_title title,pr_cmpcode cmpcode,"
+                        + "pr_spec spec from purc$orderitems WHERE pd_id = " + orderItem.getId(), Product.class);
+                orderItem.setProduct(product);
+            });
+        }
+        return orderItems;
+    }
+
+    /**
+     * 根据订单获取订单明细(批量)
+     *
+     * @param orderIds 订单id
+     * @return
+     */
+    @Override
+    public List<UsoftOrderItem> getUsoftOrderItemsBatch(String orderIds) {
+        String sql = "SELECT pd_id id,pd_price price,pd_taxrate rate,pd_qty quantity,pr_unit unit,pd_puid orderId,"
+                + "pd_delivery  delivery from purc$orderitems WHERE pd_puid in (" + orderIds + ")";
+        List<UsoftOrderItem> orderItems = commonDao.query(sql, UsoftOrderItem.class);
+        if (!CollectionUtils.isEmpty(orderItems)) {
+            orderItems.forEach( orderItem -> {
+                Product product = commonDao.queryBean("select pr_code code,pr_title title,pr_cmpcode cmpcode,"
+                        + "pr_spec spec from purc$orderitems WHERE pd_id = " + orderItem.getId(), Product.class);
+                orderItem.setProduct(product);
+            });
+        }
+        return orderItems;
+    }
+
+    /**
+     * 根据卖方uu获取验收单数据
+     *
+     * @param enUU      卖方uu
+     * @param startTime 起始时间
+     * @param endTime   截止时间
+     * @return
+     */
+    @Override
+    public List<UsoftAccept> getUsoftAccepts(Long enUU, Long startTime, Long endTime) {
+        String sql = "SELECT pa_id id,pa_code code,pa_date acceptTime,en_name custName,pa_receivename receivename,ifnull(pa_sendcode,'') "
+                + "sendCode,pa_payments payments,pa_currency currency,ifnull(pa_remark,'') remark,(CASE pa_currency WHEN 'RMB' THEN SUM"
+                + "(pai_qty*pai_orderprice) WHEN 'USD' THEN SUM(pai_qty*pai_orderprice) * 6.85 WHEN 'HKD' THEN SUM"
+                + "(pai_qty*pai_orderprice) * 0.87 END) amount from purc$accept LEFT JOIN sec$enterprises on pa_enuu = en_uu "
+                + "LEFT JOIN purc$acceptitem on pai_paid=pa_id where pa_venduu = " + enUU +" and pa_date >= '" + new Date(startTime)
+                + "' and pa_date <='" + new Date(endTime) + "' GROUP BY pa_id order by pa_date desc";
+        return commonDao.query(sql, UsoftAccept.class);
+    }
+
+    /**
+     * 根据验收单id获取验收明细
+     *
+     * @param acceptId 验收单id
+     * @return
+     */
+    @Override
+    public List<UsoftAcceptItem> getUsoftAcceptItems(Long acceptId) {
+        String sql = "SELECT pai_id id,pu_code orderCode,a.pr_brand brand,a.pr_unit unit,pai_orderprice price,"
+                + "(case pa_currency when 'RMB' then pai_qty * pai_orderprice when 'USD' then pai_qty * pai_orderprice * "
+                + ErpRate.USD_RATE + " when 'HKD' then pai_qty * pai_orderprice * " + ErpRate.HKD_RATE
+                + " end) amount,pai_qty checkqty,pai_batchcode batchCode from purc$acceptitem a "
+                + "LEFT JOIN purc$orderitems on pai_pdid = pd_id LEFT JOIN purc$orders on pd_puid = pu_id LEFT JOIN purc$accept"
+                + " on pai_paid = pa_id where pai_paid = " + acceptId;
+        List<UsoftAcceptItem> acceptItems = commonDao.query(sql, UsoftAcceptItem.class);
+        if (!CollectionUtils.isEmpty(acceptItems)) {
+            acceptItems.forEach( acceptItem -> {
+                Product product = commonDao.queryBean("select pr_code code,pr_title title,pr_cmpcode cmpcode,"
+                        + "pr_spec spec from purc$acceptitem WHERE pai_id = " + acceptItem.getId(), Product.class);
+                acceptItem.setProduct(product);
+            });
+        }
+        return acceptItems;
+    }
+
+    /**
+     * 根据验收单id获取验收明细
+     *
+     * @param acceptIds 验收单id字符串
+     * @return
+     */
+    @Override
+    public List<UsoftAcceptItem> getUsoftAcceptItemsBatch(String acceptIds) {
+        String sql = "SELECT pai_id id,pu_code orderCode,a.pr_brand brand,a.pr_unit unit,pai_orderprice price, pai_paid acceptId,"
+                + "(case pa_currency when 'RMB' then pai_qty * pai_orderprice when 'USD' then pai_qty * pai_orderprice * "
+                + ErpRate.USD_RATE + " when 'HKD' then pai_qty * pai_orderprice * " + ErpRate.HKD_RATE
+                + " end) amount,pai_qty checkqty,pai_batchcode batchCode from purc$acceptitem a "
+                + "LEFT JOIN purc$orderitems on pai_pdid = pd_id LEFT JOIN purc$orders on pd_puid = pu_id LEFT JOIN purc$accept"
+                + " on pai_paid = pa_id where pai_paid in (" + acceptIds + ")";
+        List<UsoftAcceptItem> acceptItems = commonDao.query(sql, UsoftAcceptItem.class);
+        if (!CollectionUtils.isEmpty(acceptItems)) {
+            acceptItems.forEach( acceptItem -> {
+                Product product = commonDao.queryBean("select pr_code code,pr_title title,pr_cmpcode cmpcode,"
+                        + "pr_spec spec from purc$acceptitem WHERE pai_id = " + acceptItem.getId(), Product.class);
+                acceptItem.setProduct(product);
+            });
+        }
+        return acceptItems;
+    }
+
+    /**
+     * 获取白名单用户数据
+     *
+     * @return
+     */
+    @Override
+    public List<UsoftWhitelist> getUsoftWhitelists() {
+        return whitelistDao.findAll();
+    }
+
+    /**
+     * 定时任务初始化白名单企业
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    @Override
+    public void initUsoftWhitelists() {
+        List<Long> enuus = enterpriseDao.findEnuu(NumFormat.getsixM());
+        List<Long> realEnuus = new ArrayList<>();
+        // 查找符合条件的企业uu
+        if (!CollectionUtils.isEmpty(enuus)) {
+            enuus.forEach(enuu -> {
+                Double orderNum = orderNum(enuu, null, null);
+                Double orderAmount = orderAmount(enuu, null, null);
+                if (orderNum >= 5.0 && orderAmount >= 1000000.0) {
+                    realEnuus.add(enuu);
+                }
+            });
+        }
+        // 更新或新增白名单企业
+        List<UsoftWhitelist> all = new ArrayList<>();
+        Set<Long> whitelistEnuus = whitelistDao.findAllEnuu();
+        if (!CollectionUtils.isEmpty(realEnuus)) {
+            realEnuus.forEach( enuu -> {
+                // 存在则更新
+                if (whitelistEnuus.contains(enuu)) {
+                    UsoftWhitelist usoftWhitelist = whitelistDao.findByEnUU(enuu);
+                    // 更新白名单企业数据
+                    updateWhitelist(usoftWhitelist, enuu);
+                    all.add(usoftWhitelist);
+                } else {
+                    UsoftWhitelist usoftWhitelist = new UsoftWhitelist();
+                    usoftWhitelist.setEnUU(enuu);
+                    Enterprise enterprise = enterpriseDao.findEnterpriseByUu(enuu);
+                    usoftWhitelist.setEnName(enterprise.getEnName());
+                    usoftWhitelist.setAddress(enterprise.getEnAddress());
+                    updateWhitelist(usoftWhitelist, enuu);
+                    all.add(usoftWhitelist);
+                }
+            });
+            whitelistDao.save(all);
+        }
+    }
+
+    /**
+     * 更新白名单属性
+     * @param usoftWhitelist
+     */
+    private void updateWhitelist(UsoftWhitelist usoftWhitelist, Long enuu) {
+        usoftWhitelist.setHistoryTradingHours(tradingDataService.getTimeSum(enuu, null));
+        usoftWhitelist.setHistoryOrderAmount(orderAmount(enuu, null, null));
+        usoftWhitelist.setLastYearOrderAmount(orderAmount(enuu, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        usoftWhitelist.setThisYearOrderAmount(orderAmount(enuu, NumFormat.getThisYear(), NumFormat.getNow()));
+        usoftWhitelist.setHistoryOrderNum(orderNum(enuu, null, null));
+        usoftWhitelist.setLastYearOrderNum(orderNum(enuu, NumFormat.getOneYear(), NumFormat.getThisYear()));
+        usoftWhitelist.setThisYearOrderNum(orderNum(enuu, NumFormat.getThisYear(), NumFormat.getNow()));
+    }
+
+    /**
+     * 订单笔数
+     * @param vendUU
+     * @return
+     */
+    private Double orderNum(Long vendUU, Date start, Date end) {
+        StringBuilder sql = new StringBuilder("select count(1) from purc$orders where pu_venduu = "  + vendUU);
+        if (!StringUtils.isEmpty(vendUU) && !StringUtils.isEmpty(end)) {
+            sql.append(" and pu_date >='" + start + "' and pu_date < '" + end + "'");
+        }
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 订单金额
+     * @param vendUU
+     * @return
+     */
+    private Double orderAmount(Long vendUU, Date start, Date end) {
+        StringBuffer sql = new StringBuffer("SELECT sum(case currency when 'RMB' then a.amount when 'USD' "
+                + "then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE + " end) result "
+                + "FROM (SELECT sum(pd_price*pd_qty) amount,pu_currency currency FROM purc$orders LEFT JOIN purc$orderitems "
+                + "on pu_id=pd_puid where pu_venduu = " + vendUU );
+        if (!StringUtils.isEmpty(start) && !StringUtils.isEmpty(end)) {
+            sql.append(" and pu_date >='" + start + "' and pu_date < '" + end + "'");
+        }
+        sql.append(" GROUP BY pu_currency) a");
+        Double result = commonDao.queryForObject(sql.toString(), Double.class);
+        return result;
+    }
+
+    /**
+     * 获取所有用户历史交易数据
+     *
+     * @return
+     */
+    @Override
+    public UsoftHistoryTradingData getUsoftHistoryTradingData() {
+        // 全部用户数量(家)
+        Integer totalQty = commonDao.queryForObject("select count(1) from sec$enterprises", Integer.class);
+        // 有交易额用户数量(家)
+        Integer havingTradingQty = commonDao.queryForObject("select COUNT(DISTINCT pu_venduu) from purc$orders", Integer.class);
+        // 白名单用户数量(家)
+        Integer whitelistQty = whitelistDao.countAll();
+        // 历史交易时间(年)
+        Date startTime =  commonDao.queryForObject("select min(pu_date) from purc$orders WHERE pu_date is not null ", Date.class);
+        Date endTime =  new Date(new java.util.Date().getTime());
+        Double historyTradingHours = commonDao.queryForObject("SELECT TIMESTAMPDIFF(MONTH,'" + startTime + "','" + endTime + "')", Double.class)/12;
+        // 累计订单笔数(笔)
+        Double historyOrderNum = commonDao.queryForObject("select COUNT(1) from purc$orders", Double.class);
+        // 累计订单金额(元)
+        Double historyOrderAmount = commonDao.queryForObject("SELECT sum(case currency when 'RMB' then a.amount "
+                + "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE + " end) "
+                + "result FROM (SELECT sum(pd_price*pd_qty) amount,pu_currency currency FROM purc$orders LEFT JOIN purc$orderitems "
+                + "on pu_id=pd_puid  GROUP BY pu_currency) a", Double.class);
+        // 累计验收金额(元)
+        Double historyAcceptAmount = commonDao.queryForObject("SELECT sum(case currency when 'RMB' then a.amount " +
+                "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (SELECT SUM(pai_qty*pai_orderprice) amount,pa_currency currency FROM purc$accept "
+                + " LEFT JOIN purc$acceptitem on pai_paid=pa_id GROUP BY pa_currency) a", Double.class);
+        // 累计验退金额(元)
+        Double historyReturnAmount = commonDao.queryForObject("SELECT sum(case currency when 'RMB' then a.amount "
+                + "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end)  result FROM (SELECT SUM(pri_qty*pri_orderprice) amount,pr_currency currency FROM purc$return  "
+                + "LEFT JOIN purc$returnitem on pri_prid=pr_id GROUP BY pr_currency) a", Double.class);
+        // 累计对账笔数
+        Double historyApcheckNum = commonDao.queryForObject("select count(1) from purc$apcheck where "
+                + "pa_checkstatus = '已确认'", Double.class);
+        // 累计对账金额(元)
+        Double historyApcheckAmount = commonDao.queryForObject("SELECT sum(case currency when 'RMB' then a.amount " +
+                "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (select sum(pa_checkamount) amount,pa_currency currency from purc$apcheck where "
+                + "pa_checkstatus = '已确认' GROUP BY pa_currency) a", Double.class);
+        // 累计发票笔数
+        Double historyApbillNum = commonDao.queryForObject("select count(1) from purc$apbill", Double.class);
+        // 累计发票金额(元)
+        Double historyApbillAmount = commonDao.queryForObject("SELECT sum(case currency when 'RMB' then a.amount "
+                + "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (SELECT SUM(pab_paymount) amount,pab_currency currency FROM purc$apbill "
+                + "GROUP BY pab_currency) a", Double.class);
+        UsoftHistoryTradingData data = new UsoftHistoryTradingData(totalQty, havingTradingQty, whitelistQty,
+                historyTradingHours, historyOrderNum, historyOrderAmount, historyAcceptAmount, historyReturnAmount,
+                historyApcheckNum, historyApcheckAmount, historyApbillNum, historyApbillAmount);
+        return data;
+    }
+
+    /**
+     * 获取所有用户运营效率分析一览表
+     *
+     * @return
+     */
+    @Override
+    public UsoftRunningEfficient getUsoftRunningEfficient() {
+        UsoftHistoryTradingData data = getUsoftHistoryTradingData();
+        UsoftRunningEfficient runningEfficient = new UsoftRunningEfficient(data);
+        return runningEfficient;
+    }
+
+    /**
+     * 获取所有用户分布区间数据
+     *
+     * @return
+     */
+    @Override
+    public UsoftInterval getUsoftInterval() {
+        Double havingTradingQty = commonDao.queryForObject("SELECT COUNT(1) from (SELECT pu_venduu,"
+                + "TIMESTAMPDIFF(MONTH,min(pu_date),Max(pu_date)) mouth from purc$orders GROUP BY pu_venduu) a ", Double.class);
+        Double total = commonDao.queryForObject("select count(1) from sec$enterprises", Double.class);
+        Set<UsoftIntervalItem> tradingTime = new HashSet<>(7);
+        tradingTime.add(getTradingTime("4年(含)以上", 48, null, total, "moreThan"));
+        tradingTime.add(getTradingTime("3年(含)- 4年", 36, 48, total, "inter"));
+        tradingTime.add(getTradingTime("2年(含)- 3年", 24, 36, total, "inter"));
+        tradingTime.add(getTradingTime("1年(含)- 2年", 12, 24, total, "inter"));
+        tradingTime.add(getTradingTime("6个月(含)- 1年", 6, 12, total, "inter"));
+        tradingTime.add(getTradingTime("3个月(含)- 6个月", 3, 6, total, "inter"));
+        tradingTime.add(getTradingTime("3个月以下", null, 3, total, "lessThan"));
+        Set<UsoftIntervalItem> orderAmount = new HashSet<>(7);
+        orderAmount.add(getOrderAmount("5000万(含)以上", 50000000, null, total, "moreThan"));
+        orderAmount.add(getOrderAmount("3000万(含)- 5000万", 30000000, 50000000, total, "inter"));
+        orderAmount.add(getOrderAmount("1000万(含)- 3000万", 10000000, 30000000, total, "inter"));
+        orderAmount.add(getOrderAmount("500万(含)- 1000万", 5000000, 10000000, total, "inter"));
+        orderAmount.add(getOrderAmount("100万(含)- 500万", 1000000, 5000000, total, "inter"));
+        orderAmount.add(getOrderAmount("0-100万", null, 1000000, total, "lessThan"));
+        orderAmount.add(new UsoftIntervalItem("0",total - havingTradingQty, total));
+        Set<UsoftIntervalItem> orderNum = new HashSet<>(7);
+        orderNum.add(getOrderNum("2000笔(含)以上", 2000, null, total, "moreThan"));
+        orderNum.add(getOrderNum("1000笔(含)- 2000笔", 1000, 2000, total, "inter"));
+        orderNum.add(getOrderNum("500笔(含)- 1000笔", 500, 1000, total, "inter"));
+        orderNum.add(getOrderNum("200笔(含)- 500笔", 200, 500, total, "inter"));
+        orderNum.add(getOrderNum("50笔(含)- 200笔", 50, 200, total, "inter"));
+        orderNum.add(getOrderNum("0-50笔", null, 50, total, "lessThan"));
+        orderNum.add(new UsoftIntervalItem("0",total - havingTradingQty, total));
+        UsoftInterval usoftInterval = new UsoftInterval(tradingTime, orderAmount, orderNum);
+        return usoftInterval;
+    }
+
+    /**
+     * 用户分布区间交易时间
+     * @param name
+     * @param start
+     * @param end
+     * @param total
+     * @return
+     */
+    private UsoftIntervalItem getTradingTime(String name, Integer start, Integer end, Double total, String type) {
+        StringBuilder sql = new StringBuilder("SELECT COUNT(1) from (SELECT pu_venduu,TIMESTAMPDIFF(MONTH,min(pu_date)," +
+                "Max(pu_date)) mouth from purc$orders GROUP BY pu_venduu) a ");
+        if ("moreThan".equals(type)) {
+            sql.append(" where a.mouth >= " + start);
+        }
+        if ("inter".equals(type)) {
+            sql.append("where a.mouth < " + end + " and a.mouth >= " + start);
+        }
+        if ("lessThan".equals(type)) {
+            sql.append(" where a.mouth < " + end);
+        }
+        UsoftIntervalItem usoftIntervalItem = new UsoftIntervalItem(name, commonDao.queryForObject(sql.toString(),
+                Double.class), total);
+        return usoftIntervalItem;
+    }
+
+    /**
+     * 用户分布区间订单总额
+     * @param name
+     * @param start
+     * @param end
+     * @param total
+     * @param type
+     * @return
+     */
+    private UsoftIntervalItem getOrderAmount(String name, Integer start, Integer end, Double total, String type) {
+        StringBuilder sql = new StringBuilder("SELECT COUNT(1) from (SELECT venduu,sum(case currency when 'RMB' then "
+                + "a.amount when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (SELECT pu_venduu venduu,sum(pd_price*pd_qty) amount,pu_currency currency "
+                + "FROM purc$orders LEFT JOIN purc$orderitems on pu_id=pd_puid GROUP BY pu_venduu,pu_currency) a "
+                + "GROUP BY venduu) r  ");
+        if ("moreThan".equals(type)) {
+            sql.append(" where r.result  >= " + start);
+        }
+        if ("inter".equals(type)) {
+            sql.append("where r.result < " + end + " and r.result >= " + start);
+        }
+        if ("lessThan".equals(type)) {
+            sql.append(" where r.result < " + end);
+        }
+        UsoftIntervalItem usoftIntervalItem = new UsoftIntervalItem(name, commonDao.queryForObject(sql.toString(),
+                Double.class), total);
+        return usoftIntervalItem;
+    }
+
+    /**
+     * 用户分布区间订单笔数
+     * @param name
+     * @param start
+     * @param end
+     * @param total
+     * @param type
+     * @return
+     */
+    private UsoftIntervalItem getOrderNum(String name, Integer start, Integer end, Double total, String type) {
+        StringBuilder sql = new StringBuilder("select COUNT(1) from (SELECT COUNT(1) count,pu_venduu from purc$orders "
+                +"GROUP BY pu_venduu) a ");
+        if ("moreThan".equals(type)) {
+            sql.append("where count >= " + start);
+        }
+        if ("inter".equals(type)) {
+            sql.append("where count  < " + end + " and count >= " + start);
+        }
+        if ("lessThan".equals(type)) {
+            sql.append(" where count < " + end);
+        }
+        UsoftIntervalItem usoftIntervalItem = new UsoftIntervalItem(name, commonDao.queryForObject(sql.toString(),
+                Double.class), total);
+        return usoftIntervalItem;
+    }
+
+    /**
+     * 获取所有用户近三年交易数据
+     */
+    @Override
+    public List<UsoftTrading> getUsoftTradings() {
+        Date twoYear = NumFormat.getTwoYear();
+        Date oneYear = NumFormat.getOneYear();
+        Date thisYear = NumFormat.getThisYear();
+        Date now = NumFormat.getNow();
+        List<UsoftTrading> tradings = new ArrayList<>(10);
+        UsoftTrading totalQty = new UsoftTrading( "全部用户数量", getTotalQty(twoYear, oneYear),
+                getTotalQty(oneYear, thisYear), getTotalQty(thisYear, now));
+        tradings.add(totalQty);
+        Double acceptAmountTwoYear = getAcceptAmount(twoYear, oneYear);
+        Double acceptAmountOneYear = getAcceptAmount(oneYear, thisYear);
+        Double acceptAmountThisYear = getAcceptAmount(thisYear, now);
+        Double havingTradingQtyTwoYear = getHavingTradingQty(twoYear, oneYear);
+        Double havingTradingQtyOneYear = getHavingTradingQty(oneYear, thisYear);
+        Double havingTradingQtyThisYear = getHavingTradingQty(thisYear, now);
+        Double returnAmountTwoYear = getReturnAmount(twoYear, oneYear);
+        Double returnAmountOneYear = getReturnAmount(oneYear, thisYear);
+        Double returnAmountThisYear = getReturnAmount(thisYear, now);
+        UsoftTrading havingTradingQty = new UsoftTrading("有交易额客户数量", getHavingTradingQty(twoYear, oneYear),
+                getHavingTradingQty(oneYear, thisYear), getHavingTradingQty(thisYear, now));
+        tradings.add(havingTradingQty);
+        UsoftTrading avgUser = new UsoftTrading("平均单个用户验收金额",
+                acceptAmountTwoYear/havingTradingQtyTwoYear,
+                acceptAmountOneYear/havingTradingQtyOneYear,
+                acceptAmountThisYear/havingTradingQtyThisYear);
+        tradings.add(avgUser);
+        tradings.add(havingTradingQty);
+        UsoftTrading orderAmount = new UsoftTrading("订单金额", getOrderAmount(twoYear, oneYear),
+                getOrderAmount(oneYear, thisYear), getOrderAmount(thisYear, now));
+        tradings.add(orderAmount);
+        UsoftTrading orderNum = new UsoftTrading("订单笔数", getOrderNum(twoYear, oneYear),
+                getOrderNum(oneYear, thisYear), getOrderNum(thisYear, now));
+        tradings.add(orderNum);
+        UsoftTrading acceptAmount = new UsoftTrading("验收金额", acceptAmountTwoYear, acceptAmountOneYear,
+                acceptAmountThisYear);
+        tradings.add(acceptAmount);
+        UsoftTrading returnAmount = new UsoftTrading("验退金额", returnAmountTwoYear, returnAmountOneYear,
+                returnAmountThisYear);
+        tradings.add(returnAmount);
+        UsoftTrading realAmount = new UsoftTrading("实收金额", acceptAmountTwoYear -
+                returnAmountTwoYear, acceptAmountOneYear - returnAmountOneYear,
+                acceptAmountThisYear - returnAmountThisYear);
+        tradings.add(realAmount);
+        UsoftTrading apcheckAmount = new UsoftTrading("对账金额", getApcheckAmount(twoYear, oneYear),
+                getApcheckAmount(oneYear, thisYear), getApcheckAmount(thisYear, now));
+        tradings.add(apcheckAmount);
+        UsoftTrading apbillAount = new UsoftTrading("开票金额", getApbillAmount(twoYear, oneYear),
+                getApbillAmount(oneYear, thisYear), getApbillAmount(thisYear, now));
+        tradings.add(apbillAount);
+        return tradings;
+    }
+
+    /**
+     * 全部用户数量
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getTotalQty(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT COUNT(1) from sec$enterprises WHERE en_time >= ' " + start
+                + " ' and en_time < ' " +  end +"'");
+        Double total = commonDao.queryForObject(sql.toString(), Double.class);
+        return total;
+    }
+
+    /**
+     * 有交易额客户
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getHavingTradingQty(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("select COUNT(DISTINCT pu_venduu) from purc$orders WHERE pu_date >= ' " + start
+                + " ' and pu_date < ' " +  end +"'");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 订单笔数
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getOrderNum(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("select COUNT(1) from purc$orders WHERE pu_date >= ' " + start
+                + " ' and pu_date < ' " +  end +"'");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 订单金额
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getOrderAmount(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT sum(case currency when 'RMB' then a.amount when 'USD' then "
+                + "a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE + " end) "
+                + "result FROM (SELECT sum(pd_price*pd_qty) amount,pu_currency currency FROM purc$orders LEFT JOIN "
+                + "purc$orderitems on pu_id=pd_puid WHERE pu_date >= ' " + start  + " ' and pu_date < ' " +  end
+                + "' GROUP BY pu_currency) a");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 验收金额
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getAcceptAmount(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT sum(case currency when 'RMB' then a.amount when 'USD' then " +
+                "a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE  + " end) "
+                + "result FROM (SELECT SUM(pai_qty*pai_orderprice) amount,pa_currency currency FROM purc$accept "
+                + " LEFT JOIN purc$acceptitem on pai_paid=pa_id where pa_date >= ' " + start  + " ' and pa_date < ' "
+                +  end + "' GROUP BY pa_currency) a");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 验退金额
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getReturnAmount(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT sum(case currency when 'RMB' then a.amount "
+                + "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end)  result FROM (SELECT SUM(pri_qty*pri_orderprice) amount,pr_currency currency FROM purc$return"
+                + " LEFT JOIN purc$returnitem on pri_prid=pr_id where pr_date >= ' " + start  + " ' and pr_date < ' "
+                +  end + "' GROUP BY pr_currency) a");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 对账金额
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getApcheckAmount(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT sum(case currency when 'RMB' then a.amount " +
+                "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (select sum(pa_checkamount) amount,pa_currency currency from purc$apcheck where "
+                + "pa_checkstatus = '已确认' and pa_recorddate >= ' " + start  + " ' and pa_recorddate < ' "
+                +  end + "' GROUP BY pa_currency) a");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+    /**
+     * 开票金额
+     * @param start
+     *      起始时间
+     * @param end
+     *      截止时间
+     * @return
+     */
+    private Double getApbillAmount(Date start, Date end) {
+        StringBuilder sql = new StringBuilder("SELECT sum(case currency when 'RMB' then a.amount "
+                + "when 'USD' then a.amount * " + ErpRate.USD_RATE + " when 'HKD' then a.amount * " + ErpRate.HKD_RATE
+                + " end) result FROM (SELECT SUM(pab_paymount) amount,pab_currency currency FROM purc$apbill where  "
+                + " pab_date >= ' " + start  + " ' and pab_date < ' "  +  end + "'" + "GROUP BY pab_currency) a");
+        return commonDao.queryForObject(sql.toString(), Double.class);
+    }
+
+}

+ 7 - 1
src/main/java/com/uas/platform/b2b/openapi/support/NumFormat.java

@@ -3,7 +3,6 @@ package com.uas.platform.b2b.openapi.support;
 import org.springframework.util.StringUtils;
 
 import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -86,6 +85,13 @@ public class NumFormat {
         return 0.0;
     }
 
+    public static java.sql.Date getsixM() {
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(getDayStartMon());
+        ca.add(Calendar.MONTH, -6);
+        return new java.sql.Date(ca.getTime().getTime());
+    }
+
     public static java.sql.Date getThreeM() {
         Calendar ca = Calendar.getInstance();
         ca.setTime(getDayStartMon());

+ 9 - 9
src/main/java/com/uas/platform/b2b/ps/ProductUtils.java

@@ -127,7 +127,7 @@ public class ProductUtils {
                 throw new RuntimeException("批量更新物料出现异常:" + e.getMessage());
             }
         }
-        return null;
+        return new ArrayList<>();
     }
 
     /**
@@ -151,7 +151,7 @@ public class ProductUtils {
         } else {
             throw new RuntimeException("单个更新物料异常");
         }
-        return null;
+        return 0L;
     }
 
     /**
@@ -441,7 +441,7 @@ public class ProductUtils {
             String resultCode = null != res ? String.valueOf(res.getStatusCode()) : "access error";
             logger.error("findByEnUUAndCode http response status error: " + resultCode);
         }
-        return null;
+        return new ArrayList<>();
     }
 
     /**
@@ -465,7 +465,7 @@ public class ProductUtils {
             String resultCode = null != res ? String.valueOf(res.getStatusCode()) : "access error";
             logger.error("findByIds http response status error: " + resultCode);
         }
-        return null;
+        return new ArrayList<>();
     }
 
     /**
@@ -494,17 +494,17 @@ public class ProductUtils {
             String resultCode = null != res ? String.valueOf(res.getStatusCode()) : "access error";
             logger.error("findByPageInfo http response status error: " + resultCode);
         }
-        return null;
+        return new Page<>();
     }
 
     /**
      * 搜索物料资料
      *
-     * @param pageParams 分页参数
      * @param keyword 关键字
+     * @param pageParams 分页参数
      * @return
      */
-    public static SPage<Product> searchProducts(String keyword, PageParams pageParams) {
+    public static SPage searchProducts(String keyword, PageParams pageParams) {
         Response res = null;
         try {
             JSONObject formData = JSON.parseObject(JSON.toJSONString(pageParams));
@@ -522,7 +522,7 @@ public class ProductUtils {
             String resultCode = null != res ? String.valueOf(res.getStatusCode()) : "access error";
             logger.error("searchProducts http response status error: " + resultCode);
         }
-        return null;
+        return new SPage<>();
     }
 
     /**
@@ -550,7 +550,7 @@ public class ProductUtils {
             String resultCode = null != res ? String.valueOf(res.getStatusCode()) : "access error";
             logger.error("searchProducts http response status error: " + resultCode);
         }
-        return null;
+        return new SPage<>();
     }
 
     /**

+ 16 - 0
src/main/java/com/uas/platform/b2b/publicapi/controller/ApCheckApiController.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2b.publicapi.controller;
 
 import com.uas.platform.b2b.publicapi.service.ApCheckApiService;
+import com.uas.platform.b2b.task.ApCheckTask;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
@@ -22,6 +23,9 @@ public class ApCheckApiController {
     @Autowired
     private ApCheckApiService apCheckApiService;
 
+    @Autowired
+    ApCheckTask apCheckTask;
+
     /**
      * 日志
      */
@@ -68,4 +72,16 @@ public class ApCheckApiController {
         logger.info("查询企业对账金额: " + enUU + ", " + startTime + ", " + endTime + ", amount: " + amount);
         return new ModelMap("count", amount);
     }
+
+    /**
+     * 执行更新对账数据
+     *
+     * @return 执行时间
+     */
+    @RequestMapping(value = "/updateApCheck", method = RequestMethod.GET)
+    public String updateApCheck() {
+        Long start = System.currentTimeMillis();
+        apCheckTask.updateCount();
+        return "cost: " + (System.currentTimeMillis() - start);
+    }
 }

+ 65 - 0
src/main/java/com/uas/platform/b2b/publicapi/model/ApCheckAmount.java

@@ -0,0 +1,65 @@
+package com.uas.platform.b2b.publicapi.model;
+
+
+/**
+ * 对账金额
+ *
+ * @author hejq
+ * @date 2018-12-14 23:21
+ */
+public class ApCheckAmount {
+
+    /**
+     * 币别
+     */
+    private String currency;
+
+    /**
+     * 金额(字符串: 防止科学计数法)
+     */
+    private String amount;
+
+    /**
+     * 金额
+     */
+    private Double count;
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public Double getCount() {
+        return count;
+    }
+
+    public void setCount(Double count) {
+        this.count = count;
+    }
+
+    /**
+     * 通过币别,总额获取交易额
+     *
+     * @param currency 币别
+     * @param amount 总额
+     */
+    public ApCheckAmount(String currency, Double amount) {
+        this.currency = currency;
+        java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
+        nf.setGroupingUsed(false);
+        this.amount = nf.format(amount);
+    }
+
+    public ApCheckAmount() {}
+}

+ 15 - 0
src/main/java/com/uas/platform/b2b/publicapi/model/TradeCount.java

@@ -106,4 +106,19 @@ public class TradeCount implements Serializable {
     public void setEndDate(String endDate) {
         this.endDate = endDate;
     }
+
+    public TradeCount() {
+
+    }
+
+    /**
+     * 通过币别,总额获取交易额
+     *
+     * @param currency 币别
+     * @param amount 总额
+     */
+    public TradeCount(String currency, Double amount) {
+        this.currency = currency;
+        this.amount = new BigDecimal(amount);
+    }
 }

+ 40 - 11
src/main/java/com/uas/platform/b2b/result/ResultMap.java

@@ -1,13 +1,16 @@
 package com.uas.platform.b2b.result;
 
 
+
+import java.io.*;
+
 /**
  * 封装返回数据格式
  *
  * @author hejq
  * @date 2018-10-22 9:15
  */
-public class ResultMap {
+public class ResultMap<T> implements Serializable {
 
     /**
      * 返回状态码
@@ -65,13 +68,31 @@ public class ResultMap {
 
     }
 
+    /**
+     * 根据状态返回信息
+     *
+     * @param code 状态码
+     */
+    public ResultMap(int code) {
+        if (ResultCode.OK.code() == code) {
+            this.success = true;
+            this.message = ResultCode.OK.message();
+        } else {
+            this.success = false;
+            this.message = ResultCode.ERROR.message();
+        }
+        this.code = code;
+        this.data = null;
+    }
+
+
     /**
      * 通过传入数据封装返回内容
      *
      * @param code 状态码
      * @param message message提示
      */
-    public ResultMap(int code, String message) {
+    public ResultMap(int code, String message, T data) {
         if (ResultCode.OK.code() == code) {
             this.success = true;
         } else {
@@ -79,6 +100,7 @@ public class ResultMap {
         }
         this.code = code;
         this.message = message;
+        this.data = data;
     }
 
     /**
@@ -88,8 +110,16 @@ public class ResultMap {
      * @return ResultMap
      */
     public static ResultMap success(String message) {
-        ResultMap result = new ResultMap(ResultCode.OK.code(), message);
-        return result;
+        return new ResultMap(ResultCode.OK.code(), message, null);
+    }
+
+    /**
+     * 返回成功
+     *
+     * @return ResultMap
+     */
+    public static ResultMap<Object> success(Object data) {
+        return new ResultMap<>(ResultCode.OK.code(), ResultCode.OK.message(), data);
     }
 
     /**
@@ -97,9 +127,8 @@ public class ResultMap {
      *
      * @return ResultMap
      */
-    public static ResultMap success() {
-        ResultMap result = new ResultMap(ResultCode.OK.code(), ResultCode.OK.message());
-        return result;
+    public static ResultMap<Object> success() {
+        return new ResultMap<>(ResultCode.OK.code(), ResultCode.OK.message(), null);
     }
 
 
@@ -109,8 +138,8 @@ public class ResultMap {
      * @param e 异常
      * @return ResultMap
      */
-    public static ResultMap error(Exception e) {
-        return new ResultMap(ResultCode.ERROR.code(), e.getMessage());
+    public static ResultMap<Object> error(Exception e) {
+        return new ResultMap<>(ResultCode.ERROR.code(), e.getMessage(), null);
     }
 
     /**
@@ -118,7 +147,7 @@ public class ResultMap {
      *
      * @return ResultMap
      */
-    public static ResultMap error() {
-        return new ResultMap(ResultCode.ERROR.code(), ResultCode.ERROR.message());
+    public static ResultMap<Object> error() {
+        return new ResultMap<>(ResultCode.ERROR.code(), ResultCode.ERROR.message(), null);
     }
 }

+ 1 - 1
src/main/java/com/uas/platform/b2b/search/RestTempSearchServiceImpl.java

@@ -34,7 +34,7 @@ public class RestTempSearchServiceImpl implements RestTempSearchService {
     /**
      * 邮件服务主机地址
      */
-    @Value("#{sys.searchUrl ?: 'http://10.10.100.179:8081'}")
+    @Value("#{sys.searchUrl ?: 'http://172.21.0.6:8081'}")
     private String SEARCH_URL;
 
     @Autowired

+ 68 - 1
src/main/java/com/uas/platform/b2b/search/SearchService.java

@@ -3,7 +3,47 @@ package com.uas.platform.b2b.search;
 import com.uas.platform.b2b.erp.model.B2BCustomer;
 import com.uas.platform.b2b.erp.model.B2BVendor;
 import com.uas.platform.b2b.erp.model.SaleTenderErp;
-import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.model.Component;
+import com.uas.platform.b2b.model.DeputyOrder;
+import com.uas.platform.b2b.model.Enterprise;
+import com.uas.platform.b2b.model.InvitationRecord;
+import com.uas.platform.b2b.model.Kind;
+import com.uas.platform.b2b.model.MakeAccept;
+import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.model.MakeReturn;
+import com.uas.platform.b2b.model.PurcInquiry;
+import com.uas.platform.b2b.model.PurcInquiryItemInfo;
+import com.uas.platform.b2b.model.PurchaseAccept;
+import com.uas.platform.b2b.model.PurchaseApBill;
+import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.model.PurchaseBadIn;
+import com.uas.platform.b2b.model.PurchaseBadOut;
+import com.uas.platform.b2b.model.PurchaseForecastAll;
+import com.uas.platform.b2b.model.PurchaseInquiryDetail;
+import com.uas.platform.b2b.model.PurchaseInquiryItem;
+import com.uas.platform.b2b.model.PurchaseInquiryMouldInfo;
+import com.uas.platform.b2b.model.PurchaseMRB;
+import com.uas.platform.b2b.model.PurchaseNotice;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderChange;
+import com.uas.platform.b2b.model.PurchaseOrderDone;
+import com.uas.platform.b2b.model.PurchaseOrderEnd;
+import com.uas.platform.b2b.model.PurchaseOrderReceived;
+import com.uas.platform.b2b.model.PurchaseOrderTodo;
+import com.uas.platform.b2b.model.PurchaseOrderWaiting;
+import com.uas.platform.b2b.model.PurchaseProofingApproval;
+import com.uas.platform.b2b.model.PurchaseProofingItem;
+import com.uas.platform.b2b.model.PurchaseProofingSend;
+import com.uas.platform.b2b.model.PurchaseReturn;
+import com.uas.platform.b2b.model.PurchaseTender;
+import com.uas.platform.b2b.model.SaleARCheck;
+import com.uas.platform.b2b.model.SaleQuotationAll;
+import com.uas.platform.b2b.model.SaleQuotationDone;
+import com.uas.platform.b2b.model.SaleSendAll;
+import com.uas.platform.b2b.model.SaleTenderQuestion;
+import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.model.VendorPerformanceAssess;
 import com.uas.search.b2b.model.PageParams;
 import com.uas.search.b2b.model.SPage;
 import com.uas.sso.entity.UserSpaceView;
@@ -538,4 +578,31 @@ public interface SearchService {
 	 * @return
 	 */
 	SPage<PurchaseInquiryDetail> searchPurchaseInquiryDetailIds(String keyword, PageParams pageParams);
+
+    /**
+     * 将id的SPage信息、数据合并
+     *
+     * @param idsPage
+     *            id的SPage信息
+     * @param content
+     *            数据
+     * @return 合并后的结果
+     */
+    <T> SPage<T> toSPage(SPage<Long> idsPage, List<T> content);
+
+    /**
+     * 供应商关系客户ID列表
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    SPage<Long> searchCustomerIdList(String keyword, PageParams pageParams);
+
+    /**
+     * 供应商关系客户ID列表
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    SPage<Long> searchVendorIdList(String keyword, PageParams pageParams);
 }

+ 130 - 5
src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java

@@ -2,12 +2,101 @@ package com.uas.platform.b2b.search;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2b.core.util.SplitArray;
-import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.dao.DeputyOrderDao;
+import com.uas.platform.b2b.dao.DistributeDao;
+import com.uas.platform.b2b.dao.EnterpriseDao;
+import com.uas.platform.b2b.dao.InvitationRecordDao;
+import com.uas.platform.b2b.dao.MakeAcceptDao;
+import com.uas.platform.b2b.dao.MakeOrderChangeItemDao;
+import com.uas.platform.b2b.dao.MakeOrderDao;
+import com.uas.platform.b2b.dao.MakeReturnDao;
+import com.uas.platform.b2b.dao.PurcInquiryDao;
+import com.uas.platform.b2b.dao.PurcInquiryItemInfoDao;
+import com.uas.platform.b2b.dao.PurchaseAcceptDao;
+import com.uas.platform.b2b.dao.PurchaseApBillDao;
+import com.uas.platform.b2b.dao.PurchaseApCheckDao;
+import com.uas.platform.b2b.dao.PurchaseBadInDao;
+import com.uas.platform.b2b.dao.PurchaseBadOutDao;
+import com.uas.platform.b2b.dao.PurchaseForecastAllDao;
+import com.uas.platform.b2b.dao.PurchaseInquiryDetailDao;
+import com.uas.platform.b2b.dao.PurchaseInquiryItemDao;
+import com.uas.platform.b2b.dao.PurchaseInquiryMouldInfoDao;
+import com.uas.platform.b2b.dao.PurchaseMRBDao;
+import com.uas.platform.b2b.dao.PurchaseNoticeDao;
+import com.uas.platform.b2b.dao.PurchaseOrderAllDao;
+import com.uas.platform.b2b.dao.PurchaseOrderChangeDao;
+import com.uas.platform.b2b.dao.PurchaseOrderDoneDao;
+import com.uas.platform.b2b.dao.PurchaseOrderEndDao;
+import com.uas.platform.b2b.dao.PurchaseOrderReceivedDao;
+import com.uas.platform.b2b.dao.PurchaseOrderTodoDao;
+import com.uas.platform.b2b.dao.PurchaseOrderWaitingDao;
+import com.uas.platform.b2b.dao.PurchaseProofingApprovalDao;
+import com.uas.platform.b2b.dao.PurchaseProofingItemDao;
+import com.uas.platform.b2b.dao.PurchaseProofingSendDao;
+import com.uas.platform.b2b.dao.PurchaseReturnDao;
+import com.uas.platform.b2b.dao.PurchaseTenderDao;
+import com.uas.platform.b2b.dao.SaleARCheckDao;
+import com.uas.platform.b2b.dao.SaleQuotationAllDao;
+import com.uas.platform.b2b.dao.SaleQuotationDoneDao;
+import com.uas.platform.b2b.dao.SaleSendAllDao;
+import com.uas.platform.b2b.dao.SaleTenderDao;
+import com.uas.platform.b2b.dao.SaleTenderErpDao;
+import com.uas.platform.b2b.dao.SaleTenderQuestionDao;
+import com.uas.platform.b2b.dao.VendorDao;
+import com.uas.platform.b2b.dao.VendorPerformanceAssessDao;
 import com.uas.platform.b2b.erp.model.B2BCustomer;
 import com.uas.platform.b2b.erp.model.B2BVendor;
 import com.uas.platform.b2b.erp.model.SaleTenderErp;
 import com.uas.platform.b2b.erp.model.SaleTenderItemErp;
-import com.uas.platform.b2b.model.*;
+import com.uas.platform.b2b.model.Brand;
+import com.uas.platform.b2b.model.Component;
+import com.uas.platform.b2b.model.DeputyOrder;
+import com.uas.platform.b2b.model.Enterprise;
+import com.uas.platform.b2b.model.InvitationRecord;
+import com.uas.platform.b2b.model.Kind;
+import com.uas.platform.b2b.model.MakeAccept;
+import com.uas.platform.b2b.model.MakeOrder;
+import com.uas.platform.b2b.model.MakeOrderChangeItem;
+import com.uas.platform.b2b.model.MakeReturn;
+import com.uas.platform.b2b.model.PurcInquiry;
+import com.uas.platform.b2b.model.PurcInquiryItemInfo;
+import com.uas.platform.b2b.model.PurchaseAccept;
+import com.uas.platform.b2b.model.PurchaseApBill;
+import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.model.PurchaseBadIn;
+import com.uas.platform.b2b.model.PurchaseBadOut;
+import com.uas.platform.b2b.model.PurchaseForecastAll;
+import com.uas.platform.b2b.model.PurchaseInquiryDetail;
+import com.uas.platform.b2b.model.PurchaseInquiryItem;
+import com.uas.platform.b2b.model.PurchaseInquiryMouldInfo;
+import com.uas.platform.b2b.model.PurchaseMRB;
+import com.uas.platform.b2b.model.PurchaseNotice;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderAllItem;
+import com.uas.platform.b2b.model.PurchaseOrderChange;
+import com.uas.platform.b2b.model.PurchaseOrderDone;
+import com.uas.platform.b2b.model.PurchaseOrderDoneItem;
+import com.uas.platform.b2b.model.PurchaseOrderEnd;
+import com.uas.platform.b2b.model.PurchaseOrderEndItem;
+import com.uas.platform.b2b.model.PurchaseOrderReceived;
+import com.uas.platform.b2b.model.PurchaseOrderReceivedItem;
+import com.uas.platform.b2b.model.PurchaseOrderTodo;
+import com.uas.platform.b2b.model.PurchaseOrderTodoItem;
+import com.uas.platform.b2b.model.PurchaseOrderWaiting;
+import com.uas.platform.b2b.model.PurchaseOrderWaitingItem;
+import com.uas.platform.b2b.model.PurchaseProofingApproval;
+import com.uas.platform.b2b.model.PurchaseProofingItem;
+import com.uas.platform.b2b.model.PurchaseProofingSend;
+import com.uas.platform.b2b.model.PurchaseReturn;
+import com.uas.platform.b2b.model.PurchaseTender;
+import com.uas.platform.b2b.model.PurchaseTenderProd;
+import com.uas.platform.b2b.model.SaleARCheck;
+import com.uas.platform.b2b.model.SaleQuotationAll;
+import com.uas.platform.b2b.model.SaleQuotationDone;
+import com.uas.platform.b2b.model.SaleSendAll;
+import com.uas.platform.b2b.model.SaleTenderQuestion;
+import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.model.VendorPerformanceAssess;
 import com.uas.platform.b2b.service.BrandService;
 import com.uas.platform.b2b.service.ComponentService;
 import com.uas.platform.b2b.service.KindService;
@@ -34,7 +123,14 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.lang.reflect.Field;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -188,6 +284,9 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
     @Autowired
     private PurchaseOrderService purchaseOrderService;
 
+    @Autowired
+	private DistributeDao distributeDao;
+
 	/**
 	 * 联想词size
 	 */
@@ -283,7 +382,8 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 	 *            数据
 	 * @return 合并后的结果
 	 */
-	private <T> SPage<T> toSPage(SPage<Long> idsPage, List<T> content) {
+	@Override
+	public <T> SPage<T> toSPage(SPage<Long> idsPage, List<T> content) {
 		if (idsPage == null) {
 			return null;
 		}
@@ -846,7 +946,8 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		Set<SaleTenderItemErp> itemErps = new HashSet<>();
 		List<SaleTenderErp> tenderList = new ArrayList<>();
 		for (SaleTenderErp saleTenderErp : content) {
-			saleTenderErp.setSaleTenderItems(itemErps); // erp查看列表只返回主表信息
+            // erp查看列表只返回主表信息
+			saleTenderErp.setSaleTenderItems(itemErps);
 			tenderList.add(saleTenderErp);
 		}
 		sortByProperty(tenderList, SaleTenderErp.class, "id", idsPage.getContent());
@@ -867,6 +968,18 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+    /**
+     * 供应商关系客户ID列表
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    @Override
+    public SPage<Long> searchCustomerIdList(String keyword, PageParams pageParams) {
+        SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PURC$VENDORS_CUST, pageParams);
+        return idsPage;
+    }
+
 	/**
 	 * 供应商
 	 */
@@ -878,6 +991,18 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+    /**
+     * 供应商关系客户ID列表
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    @Override
+    public SPage<Long> searchVendorIdList(String keyword, PageParams pageParams) {
+        SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PURC$VENDORS, pageParams);
+        return idsPage;
+    }
+
 	/**
 	 * 供应商(ERP)
 	 */

+ 36 - 0
src/main/java/com/uas/platform/b2b/service/ApBillAdjustmentService.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.erp.model.PurchaseAPBill;
+import com.uas.platform.b2b.model.ApbillAdjustment;
+
+import java.util.List;
+
+/**
+ * 货款调账接口
+ *
+ * @author US50
+ */
+public interface ApBillAdjustmentService {
+
+	/**
+	 * 批量保存、修改货款调账
+	 * 
+	 * @param apBillAdjustments 货款调账
+	 */
+    void save(List<ApbillAdjustment> apBillAdjustments);
+
+	/**
+	 * 将ERP的已反过账的货款调账,转为反过账的货款调账
+	 * 
+	 * @param apBills
+	 * @return
+	 */
+    List<ApbillAdjustment> convertNonPostAdjustment(List<PurchaseAPBill> apBills);
+
+    /**
+     * 反过账货款调账
+     *
+     * @param adjustments 货款调账信息
+     */
+    void nonPosting(List<ApbillAdjustment> adjustments);
+}

+ 0 - 38
src/main/java/com/uas/platform/b2b/service/ApbillAdjustmentService.java

@@ -1,38 +0,0 @@
-package com.uas.platform.b2b.service;
-
-import java.util.List;
-
-import com.uas.platform.b2b.erp.model.PurchaseAPBill;
-import com.uas.platform.b2b.model.ApbillAdjustment;
-
-public interface ApbillAdjustmentService {
-
-	/**
-	 * 批量保存、修改货款调账
-	 * 
-	 * @param changeItems
-	 * @return
-	 */
-	public void save(List<ApbillAdjustment> apBilladjustments);
-
-	/**
-	 * 获取本企业的货款调账
-	 * 
-	 * @return
-	 */
-	public List<ApbillAdjustment> getAdjustList(List<Long> filter, String keyword, Long fromDate, Long endDate);
-
-	/**
-	 * 将ERP的已反过账的货款调账,转为反过账的货款调账
-	 * 
-	 * @param apBills
-	 * @return
-	 */
-	public List<ApbillAdjustment> convertnonPostAdjustment(List<PurchaseAPBill> apBills);
-
-	/**
-	 * 
-	 * @param Adjustment
-	 */
-	public void nonPosting(List<ApbillAdjustment> adjustments);
-}

+ 15 - 3
src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java

@@ -1,7 +1,8 @@
 package com.uas.platform.b2b.service;
 
 import com.uas.platform.b2b.model.ApcheckKeyWord;
-import com.uas.platform.b2b.model.ErpProdIODetail;
+import com.uas.platform.b2b.model.DateFilter;
+import com.uas.platform.b2b.model.ErpProdIo;
 
 import java.util.List;
 
@@ -20,8 +21,19 @@ public interface ErpProdIODetailService {
 	 * @param keyWord 搜索词
 	 * @param fromDate 开始时间
 	 * @param endDate 截止时间
-	 * @return
+     * @param checkDate 对账月份
+	 * @return 符合条件的数据
 	 */
-	List<ErpProdIODetail> findXlsApChecks(List<Long> filter, ApcheckKeyWord keyWord, Long fromDate, Long endDate);
+    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);
 }

+ 39 - 2
src/main/java/com/uas/platform/b2b/service/PurchaseApCheckService.java

@@ -5,7 +5,11 @@ import com.uas.platform.b2b.model.PurchaseApCheckDone;
 import com.uas.platform.b2b.model.PurchaseApCheckItem;
 import com.uas.platform.b2b.model.PurchaseApCheckTodo;
 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.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.HashMap;
@@ -123,8 +127,41 @@ public interface PurchaseApCheckService {
 
 	/**
 	 * 获取明细表中已开票数
-	 *
-	 * @return
+	 * @param id 发票id
+	 * @return 已开票数
 	 */
     Double getBilledByItemId(Long id);
+
+    /**
+     * 对账获取客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 关键字
+     * @param checkDate 筛选日期
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @return 搜索结果
+     */
+    SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate,  Long fromDate, Long endDate);
+
+    /**
+     * 获取总的应收金额
+     *
+     * @param enUU 企业UU
+     * @param customerUU 客户企业UU
+     * @return 统计结果
+     */
+    List<TradeCount> getDueTrade(Long enUU, Long customerUU);
+
+    /**
+     * 获取指定月份应收金额
+     *
+     * @param enUU 企业UU
+     * @param customerUU 客户企业UU
+     * @param checkDate 筛选月份
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @return 统计结果
+     */
+    List<TradeCount> getThisMonthTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate);
 }

+ 11 - 8
src/main/java/com/uas/platform/b2b/service/SaleARCheckService.java

@@ -2,6 +2,9 @@ package com.uas.platform.b2b.service;
 
 import java.util.List;
 
+import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
 import org.springframework.data.domain.Page;
 
 import com.uas.platform.b2b.model.SaleARCheck;
@@ -79,13 +82,13 @@ public interface SaleARCheckService {
 	 * @throws 
 	 */
 	public long getAllCount();
-	
-	/** 
-	 * @Description: 返回还没有回复的应付对账单
-	 * @date 2015年11月16日
-	 * @return long
-	 */
-	public long getCountByenUUAndStatus();
 
-    Integer getArCheckUnreadCount();
+    /**
+     *  作为买家,获取应付对账单(全部)
+     *
+     * @param params 分页参数
+     * @param searchFilter 过滤条件
+     * @return 搜索结果
+     */
+    SPage<PurchaseApCheck> getApCheck(PageParams params, String searchFilter);
 }

+ 10 - 20
src/main/java/com/uas/platform/b2b/service/UserService.java

@@ -3,9 +3,11 @@ package com.uas.platform.b2b.service;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.User;
+import com.uas.platform.b2b.model.UserBaseInfo;
 import com.uas.platform.b2b.model.UserInfo;
 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 javax.servlet.http.HttpServletRequest;
@@ -60,18 +62,6 @@ public interface UserService {
 	 */
 	User updateUserInfo(User user) throws Exception;
 
-	// /**
-	// * 通过校验码验证手机号,更改手机号码
-	// *
-	// * @TODO
-	// * @param code
-	// * 验证码
-	// * @param tel
-	// * @param uu
-	// * UU号判定唯一性
-	// */
-	// public User updateTel(String code, String tel, Long uu);
-
 	/**
 	 * 修改user基本信息(不修改密码)
 	 * 
@@ -237,7 +227,7 @@ public interface UserService {
 	 * @param ids
 	 * @return
 	 */
-	public boolean addVendorToUser(Long userUU, List<Vendor> ids);
+	public boolean addCustomerToUser(Long userUU, List<Vendor> ids);
 
 	/**
 	 * 为用户分配客户(查询)
@@ -275,7 +265,7 @@ public interface UserService {
 	 * @param enUu
 	 * @return
 	 */
-	public List<User> findUserInfoDistribute(Long enUu);
+    SPage<UserBaseInfo> findUserInfoDistribute(Long id, PageParams params, String keyword);
 
 	/**
 	 * 为客户分配企业用户
@@ -284,15 +274,15 @@ public interface UserService {
 	 * @param users
 	 * @return
 	 */
-	public boolean addUserToVendor(Long custUU, List<User> users);
+    boolean addUserToVendor(Long id, List<UserBaseInfo> users);
 
 	/**
 	 * 将客户权限转移给用户(管理员操作)
-	 * @param custUU
+	 * @param id
 	 * @param users
 	 * @return
 	 */
-	boolean transferUserToVendor(Long custUU, List<User> users);
+	boolean transferUserToVendor(Long id, List<UserBaseInfo> users);
 
 	/**
 	 * 将客户权限转移给用户(有权限的用户操作)
@@ -305,7 +295,7 @@ public interface UserService {
 	/**
 	 * 判断当前企业是否为优企云服用户
 	 */
-	public boolean isNotSaas(Long uu);
+    boolean isNotSaas(Long uu);
 
 	/**
 	 * 按关键词查询用户信息
@@ -326,10 +316,10 @@ public interface UserService {
     Boolean getEnTransfer(Long custUU);
 	/**
 	 * 当前登录用户,是否被分配当前客户权限
-	 * @param custUU
+	 * @param id
 	 * @return
 	 */
-	Boolean getDistribute(Long custUU);
+	Boolean getDistribute(Long id);
 
 
 	User updateUserRole(User user);

+ 85 - 0
src/main/java/com/uas/platform/b2b/service/VendorService.java

@@ -3,9 +3,13 @@ package com.uas.platform.b2b.service;
 import com.uas.platform.b2b.erp.model.VendorRecommend;
 import com.uas.platform.b2b.model.Distribute;
 import com.uas.platform.b2b.model.Product;
+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.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
 
@@ -144,4 +148,85 @@ public interface VendorService {
 	 * @return 物料型号和品牌值对List
 	 */
 	List<Product> getProductAssociate(String field, String condition);
+
+    /**
+     * 获取客户详情
+     *
+     * @param params 分页参数
+     * @param keyword 关键字
+     * @return 搜索结果
+     */
+    SPage<Vendor> getCustomerInfo(PageParams params, String keyword);
+
+    /**
+     * 搜索供应商资料
+     *
+     * @param keyword 关键字
+     * @param params 分页信息
+     * @return 搜索结果
+     */
+    SPage<Vendor> searchVendorCheckIds(String keyword, PageParams params);
+
+    /**
+     * 为用户分配供应商
+     *
+     * @param id 用户UU
+     * @param userList 供应商客户
+     * @return 分配结果 成功或失败
+     */
+    boolean bindVendorToUser(Long id, List<UserBaseInfo> userList);
+
+    /**
+     * 供应商权限转移
+     *
+     * @param id 供应商关系id
+     * @param users 前端选择用户信息
+     * @return 转移结果
+     * @throws IllegalAccessException 没有权限抛出异常
+     */
+    boolean transferVendorToUser(Long id, List<UserBaseInfo> users) throws IllegalAccessException;
+
+    /**
+     * 设置联系人
+     *
+     * @param vendorList 供应商客户资料
+     * @param idList 供应商关系表idList
+     */
+    void setPurchaseContacts(List<Vendor> vendorList, List<Long> idList);
+
+    /**
+     * (针对供应商)设置业务对接人
+     *
+     * @param vendorList 客户列表
+     * @param idList 供应商关系表id
+     */
+    void setSaleContacts(List<Vendor> vendorList, List<Long> idList);
+
+    /**
+     * 通过供应商UU查询供应商分配信息
+     *
+     * @param id 供应商关系表id
+     * @param params  分页参数
+     * @param keyword 搜索词
+     * @return 分配的供应商
+     * @throws IllegalAccessException
+     */
+    SPage<UserBaseInfo> findUserInfoVendDistribute(Long id, PageParams params, String keyword) throws IllegalAccessException;
+
+    /**
+     * 通过分页信息和关键词查询用户信息
+     *
+     * @param params 分页参数
+     * @param keyword 关键词
+     * @return 符合条件的数据
+     */
+    SPage<UserBaseInfo> findUserInfoByPage(PageParams params, String keyword);
+
+    /**
+     * 通过客户关系表id查询分配关系
+     *
+     * @param id 客户关系表id
+     * @return 分配的客户
+     */
+    List<Distribute> findByVeId(Long id);
 }

+ 67 - 0
src/main/java/com/uas/platform/b2b/service/impl/ApBillAdjustmentServiceImpl.java

@@ -0,0 +1,67 @@
+package com.uas.platform.b2b.service.impl;
+
+import com.uas.platform.b2b.dao.ApbillAdjustmentDao;
+import com.uas.platform.b2b.erp.model.PurchaseAPBill;
+import com.uas.platform.b2b.model.ApbillAdjustment;
+import com.uas.platform.b2b.service.ApBillAdjustmentService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.Status;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 货款调账实现方法
+ *
+ * @author US50
+ */
+@Service
+public class ApBillAdjustmentServiceImpl implements ApBillAdjustmentService {
+
+	@Autowired
+	private ApbillAdjustmentDao apbillAdjustmentDao;
+
+	@Override
+	public void save(List<ApbillAdjustment> apBillAdjustments) {
+        apbillAdjustmentDao.save(apBillAdjustments);
+	}
+
+	@Override
+	public List<ApbillAdjustment> convertNonPostAdjustment(List<PurchaseAPBill> apBills) {
+		List<ApbillAdjustment> adjusts = new ArrayList<>();
+		if (!CollectionUtils.isEmpty(apBills)) {
+			Long enUU = SystemSession.getUser().getEnterprise().getUu();
+			for (PurchaseAPBill apBill : apBills) {
+				List<ApbillAdjustment> list = apbillAdjustmentDao.findByCustuuAndInoutno(enUU, apBill.getAb_code());
+				if (!CollectionUtils.isEmpty(list)) {
+					for (ApbillAdjustment adjust : list) {
+						adjusts.add(adjust);
+					}
+				}
+			}
+		}
+		return adjusts;
+	}
+
+	@Override
+	public void nonPosting(List<ApbillAdjustment> adjustments) {
+		if (!CollectionUtils.isEmpty(adjustments)) {
+			for (ApbillAdjustment adjustment : adjustments) {
+				if (adjustment.getSendstatus() != null) {
+					// 已传输到供应商ERP,修改单据反过账状态
+					if (adjustment.getSendstatus() == Status.DOWNLOADED.value()) {
+						adjustment.setNonposting(Constant.YES);
+						apbillAdjustmentDao.save(adjustment);
+					}
+				} else {
+					// 未传输到供应商ERP,直接删除平台上的单据
+					apbillAdjustmentDao.delete(adjustment);
+				}
+			}
+		}
+	}
+}

+ 0 - 167
src/main/java/com/uas/platform/b2b/service/impl/ApbillAdjustmentServiceImpl.java

@@ -1,167 +0,0 @@
-package com.uas.platform.b2b.service.impl;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.axis.utils.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.EmptyResultDataAccessException;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import com.uas.platform.b2b.dao.ApbillAdjustmentDao;
-import com.uas.platform.b2b.dao.CommonDao;
-import com.uas.platform.b2b.erp.model.PurchaseAPBill;
-import com.uas.platform.b2b.model.ApbillAdjustment;
-import com.uas.platform.b2b.service.ApbillAdjustmentService;
-import com.uas.platform.b2b.support.SystemSession;
-import com.uas.platform.core.model.Constant;
-import com.uas.platform.core.model.Status;
-
-
-@Service
-public class ApbillAdjustmentServiceImpl implements ApbillAdjustmentService {
-
-	@Autowired
-	private ApbillAdjustmentDao apbillAdjustmentDao;
-
-	@Autowired
-	private CommonDao commonDao;
-
-	@Override
-	public void save(List<ApbillAdjustment> apBilladjustments) {
-		try {
-			apbillAdjustmentDao.save(apBilladjustments);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	@Override
-	public List<ApbillAdjustment> getAdjustList(List<Long> filter, String keyword, Long fromDate, Long endDate) {
-		Long enuu = SystemSession.getUser().getEnterprise().getUu();
-		String querySql = "select t.aa_id id,t.aa_currency currency,t.aa_custname custname,t.aa_custuu custuu,t.aa_detno detno,t.aa_enuu enuu,"
-				+ " t.aa_factory factory,t.aa_inoutno inoutno,t.aa_ordercode ordercode,t.aa_prodspec prodspec,t.aa_prodcode prodcode,t.aa_prodtitle prodtitle,t.aa_qty qty,"
-				+ "t.aa_rate rate,t.aa_receivecode receivecode,t.aa_receivename receivename,t.aa_sendcode sendcode,t.aa_sourceid sourceid,t.aa_orderprice orderprice,t.aa_orderdate orderdate,"
-				+ "t.aa_taxrate taxrate,t.aa_thischeckqty thischeckqty,t.aa_whname whname,t.aa_ycheckqty ycheckqty,t.aa_prid prid from purc$apbilladjustment t where t.aa_enuu =?";
-		if (!StringUtils.isEmpty(keyword)) {
-			String[] strs = keyword.split("\\|");
-			if (strs.length == 1) {
-				querySql = querySql + " and t.aa_custname = '" + strs[0] + "'";
-			}
-			if (strs.length == 2) {
-				if (strs[0].length() != 0) {
-					querySql = querySql + " and t.aa_custname = '" + strs[0] + "'";
-				}
-				querySql = querySql + " and t.aa_receivename = '" + strs[1] + "'";
-			}
-			if (strs.length == 3) {
-				if (strs[0].length() != 0) {
-					querySql = querySql + " and t.aa_custname = '" + strs[0] + "'";
-				}
-				if (strs[1].length() != 0) {
-					querySql = querySql + " and t.aa_receivename = '" + strs[1] + "'";
-				}
-				querySql = querySql + " and t.aa_factory = '" + strs[2] + "'";
-			}
-			if (strs.length == 4) {
-				if (strs[0].length() != 0) {
-					querySql = querySql + " and t.aa_custname = '" + strs[0] + "'";
-				}
-				if (strs[1].length() != 0) {
-					querySql = querySql + " and t.aa_receivename = '" + strs[1] + "'";
-				}
-				if (strs[2].length() != 0) {
-					querySql = querySql + " and t.aa_factory = '" + strs[2] + "'";
-				}
-				querySql = querySql + " and t.aa_prodtitle = '" + strs[3] + "'";
-			}
-			if (strs.length == 5) {
-				if (strs[0].length() != 0) {
-					querySql = querySql + " and t.aa_custname = '" + strs[0] + "'";
-				}
-				if (strs[1].length() != 0) {
-					querySql = querySql + " and t.aa_receivename = '" + strs[1] + "'";
-				}
-				if (strs[2].length() != 0) {
-					querySql = querySql + " and t.aa_factory = '" + strs[2] + "'";
-				}
-				if (strs[3].length() != 0) {
-					querySql = querySql + " and t.aa_prodtitle = '" + strs[3] + "'";
-				}
-				querySql = querySql + " and t.aa_prodspec = '" + strs[4] + "'";
-			}
-		}
-		if (fromDate != null) {
-			querySql = querySql + " and t.aa_orderdate>=" + "str_to_date('"
-					+ new java.sql.Date(new Date(fromDate).getTime())
-					+ "','%Y-%m-%d')";
-		}
-		if (endDate != null) {
-			querySql = querySql + " and t.aa_orderdate <=" + "str_to_date('"
-					+ new java.sql.Date(new Date(endDate).getTime())
-					+ "','%Y-%m-%d')";
-		}
-		Object[] args = new Object[] { enuu };
-		if (!CollectionUtils.isEmpty(filter)) {
-			String[] str = new String[filter.size()];
-			Long[] lon = new Long[filter.size() + 1];
-			String s = "";
-			for (int i = 0; i < filter.size(); i++) {
-				if (i != filter.size() - 1) {
-					str[i] = "?,";
-				} else {
-					str[i] = "?";
-				}
-				lon[i + 1] = filter.get(i);
-				s = s + str[i];
-			}
-			querySql = querySql + " and t.aa_custuu in (" + s + ")";
-			lon[0] = enuu;
-			args = lon;
-		}
-		querySql = querySql + " order by t.aa_orderdate desc";
-		try {
-			List<ApbillAdjustment> list = commonDao.query(querySql, args, ApbillAdjustment.class);
-			return list;
-		} catch (EmptyResultDataAccessException e) {
-			return null;
-		}
-	}
-
-	@Override
-	public List<ApbillAdjustment> convertnonPostAdjustment(List<PurchaseAPBill> apBills) {
-		List<ApbillAdjustment> adjusts = new ArrayList<ApbillAdjustment>();
-		if (!CollectionUtils.isEmpty(apBills)) {
-			Long enUU = SystemSession.getUser().getEnterprise().getUu();
-			for (PurchaseAPBill apBill : apBills) {
-				List<ApbillAdjustment> list = apbillAdjustmentDao.findByCustuuAndInoutno(enUU, apBill.getAb_code());
-				if (!CollectionUtils.isEmpty(list)) {
-					for (ApbillAdjustment adjust : list) {
-						adjusts.add(adjust);
-					}
-				}
-			}
-		}
-		return adjusts;
-	}
-
-	@Override
-	public void nonPosting(List<ApbillAdjustment> adjustments) {
-		if (!CollectionUtils.isEmpty(adjustments)) {
-			for (ApbillAdjustment adjustment : adjustments) {
-				if (adjustment.getSendstatus() != null) {
-					// 已传输到供应商ERP,修改单据反过账状态
-					if (adjustment.getSendstatus() == Status.DOWNLOADED.value()) {
-						adjustment.setNonposting(Constant.YES);
-						apbillAdjustmentDao.save(adjustment);
-					}
-				} else {
-					// 未传输到供应商ERP,直接删除平台上的单据
-					apbillAdjustmentDao.delete(adjustment);
-				}
-			}
-		}
-	}
-}

+ 127 - 51
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -1,15 +1,32 @@
 package com.uas.platform.b2b.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.core.util.DateFormatUtils;
+import com.uas.platform.b2b.core.util.DateUtils;
+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;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
+import com.uas.platform.b2b.support.CollectionUtil;
 import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.task.ApCheckTask;
+import com.uas.platform.core.exception.IllegalOperatorException;
 import org.apache.axis.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -24,8 +41,15 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
 	@Autowired
 	private CommonDao commonDao;
 
+	@Autowired
+    private PurchaseApCheckService apCheckService;
+
+	@Autowired
+    private VendorDao vendorDao;
+
 	@Override
-	public List<ErpProdIODetail> findXlsApChecks(List<Long> filter, ApcheckKeyWord keyword, Long fromDate, Long endDate) {
+	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();
         List<ErpProdIODetail> details = new ArrayList<>();
@@ -38,19 +62,19 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             });
         }
 		// 货款调账
-		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, fromDate, endDate, enUU);
+		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
 		// 采购验收单
-        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 采购验退单
-        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 客户不良品入库单
-        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 客户不良品出库单
-        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 委外验收单
-        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         // 委外验退单
-        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, dateFilter.getFromDate(), dateFilter.getEndDate(), enUU);
         details.addAll(adjustments);
         details.addAll(saleAccepts);
         details.addAll(saleReturns);
@@ -58,9 +82,68 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
         details.addAll(badOuts);
         details.addAll(makeAccepts);
         details.addAll(makeReturns);
-		return details;
+        ErpProdIo erpProdIo = new ErpProdIo();
+        erpProdIo.setDetails(details);
+        // 应收总额
+       if (null != keyword.getCustomerUU()) {
+           List<TradeCount> totalTrades = apCheckService.getDueTrade(enUU, keyword.getCustomerUU());
+           List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(keyword.getCustomerUU(), enUU);
+           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 = apCheckService.getThisMonthTrade(enUU, keyword.getCustomerUU(), checkDate, fromDate, endDate);
+           erpProdIo.setThisMonthCount(thisMonthTrades);
+       }
+		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);
+    }
+
     /**
      * 获取待对账的委外验退单
      *
@@ -69,9 +152,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 委外验退单
      */
-    private List<ErpProdIODetail> getMakeReturns(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -105,13 +188,12 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and mr_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(mr_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and mr_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(mr_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and mr_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> makeReturns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return makeReturns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -122,9 +204,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 委外验收单
      */
-    private List<ErpProdIODetail> getMakeAccepts(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -158,13 +240,12 @@ 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(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and make$accept.ma_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(make$accept.ma_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and make$accept.ma_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> makeAccepts = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return makeAccepts;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -175,9 +256,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户不良品出库单
      */
-    private List<ErpProdIODetail> getBadOuts(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -211,13 +292,12 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and po_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(po_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and po_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(po_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and po_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> badOuts = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return badOuts;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -228,9 +308,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户不良品入库单
      */
-    private List<ErpProdIODetail> getBadIns(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -264,13 +344,12 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pb_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pb_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and pb_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pb_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and pb_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> badIns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return badIns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -281,9 +360,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户采购验退单信息
      */
-    private List<ErpProdIODetail> getSaleReturns(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -317,13 +396,12 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pr_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pr_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and pr_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pr_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and pr_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> saleReturns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return saleReturns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -334,9 +412,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 客户采购验收单信息
      */
-    private List<ErpProdIODetail> getSaleAccepts(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -370,13 +448,12 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and pa_enuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(pa_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and pa_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pa_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and pa_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> saleAccepts = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return saleAccepts;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -387,9 +464,9 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param fromDate 开始时间
      * @param endDate 截止时间
      * @param enUU 当前企业UU
-     * @return
+     * @return 货款调账信息
      */
-    private List<ErpProdIODetail> getAdjustments(StringBuffer distributes, ApcheckKeyWord keyword, Long fromDate, Long endDate, Long enUU) {
+    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, " +
                 "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, " +
@@ -418,12 +495,11 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             sql.append("and aa_custuu in (").append(distributes).append(") ");
         }
         if (fromDate != null) {
-            sql.append("and DAYFORMDATE(aa_date) >= '").append(new java.sql.Date(fromDate)).append("' ");
+            sql.append("and aa_date >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(aa_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and aa_date < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> adjustments = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return adjustments;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 }

+ 17 - 15
src/main/java/com/uas/platform/b2b/service/impl/OrderRedDotServiceImpl.java

@@ -172,7 +172,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
      *
      * @param orderType 单据类型
      * @param roleName 角色
-     * @return
+     * @return 未读单据的id,原表id
      */
     @Override
     public List<Long> getUnreadIds(String orderType, String roleName) {
@@ -192,13 +192,15 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
      *
      * @param orderType 单据类型
      * @param roleName  角色
-     * @return 数量
+     * @return 设置已读的数量
      */
     @Override
     public Integer setReadByState(String orderType, String roleName) {
         List<Long> redAllIdList = getUnreadRedAllIdList(orderType, roleName);
-        List<List<Long>> idsList = SplitArray.splitAry(redAllIdList, SplitArray.QUERY_MAX_NUMBER);
-        idsList.forEach(ids -> setReadByIdList(ids));
+        if (!CollectionUtil.isEmpty(redAllIdList)) {
+            List<List<Long>> idsList = SplitArray.splitAry(redAllIdList, SplitArray.QUERY_MAX_NUMBER);
+            idsList.forEach(this::setReadByIdList);
+        }
         return redAllIdList.size();
     }
 
@@ -210,7 +212,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
      * @return List<Long>
      */
     private List<Long> getUnreadRedAllIdList(String orderType, String roleName) {
-        StringBuffer buffer = new StringBuffer("select red_id from reddot$all");
+        StringBuilder buffer = new StringBuilder("select red_id from reddot$all");
         Long enUU = SystemSession.getUser().getEnterprise().getUu();
         if (Role.SELLER.equals(roleName)) {
             buffer.append(" where red_venduu = ?");
@@ -235,7 +237,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Integer repliedCount = 0;
         // 待回复数量
         Integer notReplyCount = 0;
-        if (CollectionUtils.isEmpty(idList)){
+        if (CollectionUtils.isEmpty(idList)) {
             return map;
         }
         List<List<Long>> idsArray = SplitArray.splitAry(idList, SplitArray.QUERY_MAX_NUMBER);
@@ -307,7 +309,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Integer notReplyCount = 0;
         // 无需确认数量
         Integer unNeedReply = 0;
-        if (org.apache.commons.collections.CollectionUtils.isEmpty(idList)){
+        if (org.apache.commons.collections.CollectionUtils.isEmpty(idList)) {
             return map;
         }
         List<List<Long>> idsArray = SplitArray.splitAry(idList, SplitArray.QUERY_MAX_NUMBER);
@@ -347,7 +349,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Integer repliedCount = 0;
         // 未回复数量
         Integer notReplyCount = 0;
-        if (CollectionUtils.isEmpty(unreadIds)){
+        if (CollectionUtils.isEmpty(unreadIds)) {
             return map;
         }
         List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);
@@ -383,7 +385,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Integer repliedCount = 0;
         // 待送样数量
         Integer notReplyCount = 0;
-        if (CollectionUtils.isEmpty(unreadIds)){
+        if (CollectionUtils.isEmpty(unreadIds)) {
             return map;
         }
         // 超过1000条需要拆分,不然会报错
@@ -431,7 +433,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
     public List<Object[]> getVpaCount(String roleName) {
         List<Long> ids = getUnreadIds(OrderType.vendorPerformanceAssess.name(), roleName);
         List<Object[]> objects = new ArrayList<>();
-        if (CollectionUtils.isEmpty(ids)){
+        if (CollectionUtils.isEmpty(ids)) {
             return objects;
         }
         objects.add(new Object[]{ids.size(), "1"});
@@ -448,7 +450,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
     public Map<String, Integer> getInquiryCount(String roleName) {
         List<Long> unreadIds = getUnreadIds(OrderType.purcinquiry.name(), roleName);
         Map<String, Integer> map = new HashMap<>(3);
-        if (CollectionUtils.isEmpty(unreadIds)){
+        if (CollectionUtils.isEmpty(unreadIds)) {
             return map;
         }
         // 已报价数量
@@ -486,7 +488,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Map<String, Integer> map = new HashMap<>(2);
         // 待投标/带评标数量
         Integer notReplyCount = 0;
-        if (CollectionUtils.isEmpty(unreadIds)){
+        if (CollectionUtils.isEmpty(unreadIds)) {
             return map;
         }
         // 客户需要显示待投标红点,供应商需要显示待评标红点
@@ -504,7 +506,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
                     notReplyCount = notReplyCount + purchaseTenderDao.getEvaluationCount(ids);
                 }
             }
-        } else if (Role.BUYER.equals(roleName)){
+        } else if (Role.BUYER.equals(roleName)) {
             if (unreadIds.size() <= SplitArray.QUERY_MAX_NUMBER) {
                 notReplyCount = purchaseTenderDao.getTenterCount(unreadIds,
                     SystemSession.getUser().getEnterprise().getUu());
@@ -534,7 +536,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
     @Override
     public List<Object[]> getApCheckCount(String roleName) {
         List<Long> ids = getUnreadIds(OrderType.apcheck.name(), roleName);
-        if (CollectionUtils.isEmpty(ids)){
+        if (CollectionUtils.isEmpty(ids)) {
             return new ArrayList<>();
         }
         return purchaseApCheckDao.getUnreadCountEveryStatus(ids);
@@ -554,7 +556,7 @@ public class OrderRedDotServiceImpl implements OrderRedDotService {
         Integer repliedCount = 0;
         // 待报价数量
         Integer notReplyCount = 0;
-        if (CollectionUtils.isEmpty(unreadIds)){
+        if (CollectionUtils.isEmpty(unreadIds)) {
             return map;
         }
         List<List<Long>> idsArray = SplitArray.splitAry(unreadIds, SplitArray.QUERY_MAX_NUMBER);

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

@@ -1,25 +1,40 @@
 package com.uas.platform.b2b.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.constant.StringConstant;
+import com.uas.platform.b2b.core.util.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 +70,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 +187,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 +214,448 @@ 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", StringConstant.BLANK, true));
+        pageInfo.expression(PredicateUtils.isNotNull("totalCountString"));
+        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 (fromDate != null) {
+            sql.append("and mr_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and 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 (fromDate != null) {
+            sql.append("and make$accept.ma_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and 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 (fromDate != null) {
+            sql.append("and po_date >= '").append(fromDate).append("' ");
+        }
+        if (endDate != null) {
+            sql.append("and 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 (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 (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 (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);
+    }
 }

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

@@ -1,11 +1,20 @@
 package com.uas.platform.b2b.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.constant.StringConstant;
 import com.uas.platform.b2b.core.util.ContextUtils;
+import com.uas.platform.b2b.core.util.DateFormatUtils;
+import com.uas.platform.b2b.core.util.DateUtils;
+import com.uas.platform.b2b.core.util.ThreadUtils;
+import com.uas.platform.b2b.dao.CommonDao;
+import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDoneDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckItemDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckTodoDao;
+import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.event.PurchaseApCheckReplyReleaseEvent;
+import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.OrderRedDotAll;
 import com.uas.platform.b2b.model.OrderType;
 import com.uas.platform.b2b.model.PurchaseApCheck;
@@ -14,17 +23,30 @@ import com.uas.platform.b2b.model.PurchaseApCheckItem;
 import com.uas.platform.b2b.model.PurchaseApCheckTodo;
 import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.SourceForApcheck;
+import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.model.util.UnCheckedCountSqls;
+import com.uas.platform.b2b.publicapi.model.TradeCount;
+import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.OrderRedDotService;
 import com.uas.platform.b2b.service.PurchaseApCheckService;
+import com.uas.platform.b2b.service.UserService;
+import com.uas.platform.b2b.support.DecimalUtils;
+import com.uas.platform.b2b.support.SPageUtils;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.ps.core.util.StringUtils;
+import com.uas.search.b2b.model.MultiValue;
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
-import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -34,6 +56,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.sql.SQLException;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -63,11 +86,38 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 	PurchaseApCheckItemDao purchaseApCheckItemDao;
 
 	@Autowired
-	private JdbcTemplate jdbcTemplate;
+	private CommonDao commonDao;
 
 	@Autowired
 	private OrderRedDotService redDotService;
 
+	@Autowired
+    private EnterpriseDao enterpriseDao;
+
+	@Autowired
+    private SearchService searchService;
+
+	@Autowired
+    private UserService userService;
+
+	@Autowired
+    private VendorDao vendorDao;
+
+    /**
+     * RMB
+     */
+    private final String RMB = "RMB";
+
+    /**
+     * 港币
+     */
+    private final String HKD = "HKD";
+
+    /**
+     * 美元
+     */
+    private final String USD = "USD";
+
 	@Override
 	public List<PurchaseApCheck> findNotUploadAPcheck() {
 		return purchaseApCheckDao.findByCustUuAndStatusAndCheckStatus(SystemSession.getUser().getEnterprise().getUu(),
@@ -150,7 +200,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 					}
 					String sql = "update " + sourceTable + " set " + yCheckQtyName + " = " + newYCheckQtyVal + " where "
 							+ idName + " = " + sourceIdVal;
-					jdbcTemplate.execute(sql);
+                    commonDao.getJdbcTemplate().execute(sql);
 				}
 			}
 			check.setCheckStatus("已作废");
@@ -162,7 +212,12 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 
 	@Override
 	public PurchaseApCheck findById(Long id) {
-		return purchaseApCheckDao.findOne(id);
+        PurchaseApCheck apCheck = purchaseApCheckDao.findOne(id);
+        if (null != apCheck) {
+            Enterprise enterprise = enterpriseDao.findOne(apCheck.getEnUu());
+            apCheck.setVendorName(enterprise.getEnName());
+        }
+		return apCheck;
 	}
 
 	@Override
@@ -208,7 +263,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 				}
 				String sql = "update " + sourceTable + " set " + yCheckQtyName + " = " + newYCheckQtyVal + " where "
 						+ idName + " = " + sourceIdVal;
-				jdbcTemplate.execute(sql);
+                commonDao.getJdbcTemplate().execute(sql);
 
 			}
 		}
@@ -232,7 +287,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 				if (list != null && list.size() == 3) {
 					String sql = "select count(0) from " + item.getSourceTable() + " where " + list.get(1) + "="
 							+ item.getSourceId();
-					Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
+					Integer count = commonDao.queryForObject(sql, Integer.class);
 					if (count == 0) {
 						apCheck.setStatus((short) Status.DISABLED.value());
 						purchaseApCheckDao.save(apCheck);
@@ -259,6 +314,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 		purchaseApCheck.setCode(code);
 		purchaseApCheck.setRecorder(SystemSession.getUser().getUserName());
 		purchaseApCheck.setRecorderUU(SystemSession.getUser().getUserUU());
+        purchaseApCheck.setStatus((short) Status.NOT_UPLOAD.value());
 		Short number = 0;
 		List<PurchaseApCheckItem> items = new ArrayList<PurchaseApCheckItem>();
 		// 保存成功的同时来源单据更新一下
@@ -309,7 +365,7 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 					}
 					String sql = "update " + source.getSourcetable() + " set " + yCheckQtyName + " = "
 							+ source.getNewYCheckQty() + " where " + idName + " = " + source.getSourceid();
-					jdbcTemplate.execute(sql);
+                    commonDao.getJdbcTemplate().execute(sql);
 				} else {
 					throw new IllegalOperatorException("保存失败!");
 				}
@@ -452,4 +508,245 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
     public Double getBilledByItemId(Long id) {
         return purchaseApCheckItemDao.getBilledById(id);
     }
+
+    /**
+     * 对账获取客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 关键字
+     * @param checkDate 筛选日期
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @return 搜索结果
+     */
+    @Override
+    public SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
+        SPage<Vendor> vendorSPage = findCustomerByPage(params, keyword);
+        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        if (!CollectionUtils.isEmpty(vendorSPage.getContent())) {
+            vendorSPage.getContent().stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
+                .forEach(customer -> {
+                    Long customerUU = customer.getMyEnUU();
+                    if (!StringUtils.isEmpty(customer.getTotalCountString())) {
+                        List<TradeCount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), TradeCount.class);
+                        customer.setTotalCount(tradeCounts);
+                    }
+                    // 本月应收
+                    List<TradeCount> thisMonthTrades = getThisMonthTrade(enUU, customerUU, checkDate, fromDate, endDate);
+                    customer.setThisMonthCount(thisMonthTrades);
+                });
+        }
+        return vendorSPage;
+    }
+
+    /**
+     * 通过分页信息查询客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 搜索关键词
+     * @return 搜索结果
+     */
+    private SPage<Vendor> findCustomerByPage(PageParams params, String keyword) {
+        // 只使用前端的页码和分页大小,防止排序信息注入
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return new SPage<>();
+        }
+        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、 客户已分配
+         * 3、 开启B2B对账
+         * 4、 需要对账价格不为空
+         */
+        pageInfo.filter("vendEnUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("apcheck", Constant.YES);
+        pageInfo.expression(PredicateUtils.ne("totalCountString", StringConstant.BLANK, true));
+        pageInfo.expression(PredicateUtils.isNotNull("totalCountString"));
+        if (filter != null) {
+            pageInfo.expression(PredicateUtils.in("myEnUU", filter.getDistribute(), true));
+        }
+        if (!StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("myEnterprise.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 enUU 企业UU
+     * @param customerUU 客户企业UU
+     * @param checkDate 筛选月份
+     * @param fromDate 开始时间
+     * @param endDate 截止时间
+     * @return 统计结果
+     */
+    @Override
+    public List<TradeCount> getThisMonthTrade(Long enUU, Long customerUU, String checkDate, Long fromDate, Long endDate) {
+        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<TradeCount> totalTrades = new ArrayList<>();
+        ThreadUtils
+            // 货款调账
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.THISMONTH_ADJUSTMENT_COUNT_SQL, TradeCount.class, enUU, customerUU, sqlFromDate, sqlEndDate);
+                totalTrades.addAll(trades);
+            })
+            // 采购验收
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.THISMONTH_SALE_ACCEPT_COUNT_SQL, TradeCount.class, enUU, customerUU, sqlFromDate, sqlEndDate);
+                totalTrades.addAll(trades);
+            })
+            // 采购验退
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.THISMONTH_SALE_RETURN_COUNT_SQL, TradeCount.class, enUU, customerUU, sqlFromDate, sqlEndDate);
+                totalTrades.addAll(trades);
+            })
+            // 委外验收
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.THISMONTH_MAKE_ACCEPT_COUNT_SQL, TradeCount.class, enUU, customerUU, sqlFromDate, sqlEndDate);
+                totalTrades.addAll(trades);
+            })
+            // 委外验退
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.THISMONTH_MAKE_RETURN_COUNT_SQL, TradeCount.class, enUU, customerUU, sqlFromDate, sqlEndDate);
+                totalTrades.addAll(trades);
+            })
+            .run();
+        Double rmbCount = totalTrades.stream().filter(tradeCount -> RMB.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        Double usdCount = totalTrades.stream().filter(tradeCount -> USD.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        Double hkdCount = totalTrades.stream().filter(tradeCount -> HKD.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        List<TradeCount> resultCounts = new ArrayList<>();
+        if (rmbCount > 0) {
+            resultCounts.add(new TradeCount(RMB, DecimalUtils.decimalPoint(rmbCount, 2)));
+        }
+        if (usdCount > 0) {
+            resultCounts.add(new TradeCount(USD, DecimalUtils.decimalPoint(usdCount, 2)));
+        }
+        if (hkdCount > 0) {
+            resultCounts.add(new TradeCount(HKD, DecimalUtils.decimalPoint(hkdCount, 2)));
+        }
+        return resultCounts;
+    }
+
+    /**
+     * 获取总的应收金额
+     *
+     * @param enUU 企业UU
+     * @param customerUU 客户企业UU
+     * @return 统计结果
+     */
+    @Override
+    public List<TradeCount> getDueTrade(Long enUU, Long customerUU) {
+        List<TradeCount> totalTrades = new ArrayList<>();
+        ThreadUtils
+            // 货款调账
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.ADJUSTMENT_COUNT_SQL, TradeCount.class, enUU, customerUU);
+                totalTrades.addAll(trades);
+            })
+            // 采购验收
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.SALE_ACCEPT_COUNT_SQL, TradeCount.class, enUU, customerUU);
+                totalTrades.addAll(trades);
+            })
+            // 采购验退
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.SALE_RETURN_COUNT_SQL, TradeCount.class, enUU, customerUU);
+                totalTrades.addAll(trades);
+            })
+            // 委外验收
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.MAKE_ACCEPT_COUNT_SQL, TradeCount.class, enUU, customerUU);
+                totalTrades.addAll(trades);
+            })
+            // 委外验退
+            .task(() -> {
+                List<TradeCount> trades = commonDao.query(UnCheckedCountSqls.MAKE_RETURN_COUNT_SQL, TradeCount.class, enUU, customerUU);
+                totalTrades.addAll(trades);
+            })
+            .run();
+        Double rmbCount = totalTrades.stream().filter(tradeCount -> RMB.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        Double usdCount = totalTrades.stream().filter(tradeCount -> USD.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        Double hkdCount = totalTrades.stream().filter(tradeCount -> HKD.equals(tradeCount.getCurrency()) && null != tradeCount.getAmount())
+            .mapToDouble(trade -> trade.getAmount().doubleValue()).sum();
+        List<TradeCount> resultCounts = new ArrayList<>();
+        if (rmbCount > 0) {
+            resultCounts.add(new TradeCount(RMB, DecimalUtils.decimalPoint(rmbCount, 2)));
+        }
+        if (usdCount > 0) {
+            resultCounts.add(new TradeCount(USD, DecimalUtils.decimalPoint(usdCount, 2)));
+        }
+        if (hkdCount > 0) {
+            resultCounts.add(new TradeCount(HKD, DecimalUtils.decimalPoint(hkdCount, 2)));
+        }
+        return resultCounts;
+    }
+
+    /**
+     * 查询客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 关键词
+     * @return 符合条件的客户
+     */
+    private SPage<Vendor> searchCustomerInfo(PageParams params, String keyword) {
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+        List<Object> vendInfo = new ArrayList<>();
+        vendInfo.add(SystemSession.getUser().getEnterprise().getUu());
+        vendInfo.add(SystemSession.getUser().getEnterprise().getEnBussinessCode());
+        pageParams.getFilters().put("ve_vendenuu", new MultiValue(vendInfo, false));
+        pageParams.getFilters().put("ve_custswitch", Constant.YES);
+        List<Sort> sortList = new ArrayList<>();
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return new SPage<>();
+        }
+        if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
+            List<Object> list = new ArrayList<>();
+            for (Object object : filter.getDistribute()) {
+                list.add(object);
+            }
+            pageParams.getFilters().put("ve_myenuu", new MultiValue(list, true));
+        }
+        sortList.add(new Sort("ve_id", false, Sort.Type.INT, new Long(1)));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        return searchService.searchCustCheckIds(keyword, pageParams);
+    }
 }

+ 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());

+ 7 - 22
src/main/java/com/uas/platform/b2b/service/impl/RoleServiceImpl.java

@@ -36,21 +36,6 @@ public class RoleServiceImpl implements RoleService {
 	@Autowired
     private CommonDao commonDao;
 
-    /**
-     * 销售经理
-     */
-	private static final String ROLE_SALEMANAGER = "ROLE_SALEMANAGER";
-
-    /**
-     * 普通用户
-     */
-	private static final String ROLE_USER = "ROLE_USER";
-
-    /**
-     * 管理员
-     */
-	private static final String ROLE_ADMIN = "ROLE_ADMIN";
-
 	@Override
 	public List<Role> findAll() {
 		return findByEnterprise(SystemSession.getUser().getEnterprise().getUu());
@@ -114,23 +99,23 @@ public class RoleServiceImpl implements RoleService {
 	@Override
 	public ModelMap getCurrentRoles() {
 		List<String> roles = new ArrayList<>();
-		roles.add(ROLE_SALEMANAGER);
-		roles.add(ROLE_ADMIN);
-		return new ModelMap("count", roleDao.findByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(),SystemSession.getUser().getUserUU(), roles));
+		roles.add(Role.ROLE_SALEMANAGER);
+		roles.add(Role.ROLE_ADMIN);
+		return new ModelMap("count", roleDao.countByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(),SystemSession.getUser().getUserUU(), roles));
 	}
 
 	@Override
 	public ModelMap isManager() {
         List<String> roles = new ArrayList<>();
-        roles.add(ROLE_ADMIN);
-		return new ModelMap("isManager", roleDao.findByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), roles) > 0 ? true : false);
+        roles.add(Role.ROLE_ADMIN);
+		return new ModelMap("isManager", roleDao.countByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), roles) > 0 ? true : false);
 	}
 
 	@Override
 	public ModelMap isUser() {
         List<String> roles = new ArrayList<>();
-        roles.add(ROLE_USER);
-		return new ModelMap("isUser", roleDao.findByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), roles) > 0 ? true : false);
+        roles.add(Role.ROLE_USER);
+		return new ModelMap("isUser", roleDao.countByEnUUAndUserUU(SystemSession.getUser().getEnterprise().getUu(), SystemSession.getUser().getUserUU(), roles) > 0 ? true : false);
 	}
 
     @Override

+ 38 - 15
src/main/java/com/uas/platform/b2b/service/impl/SaleARCheckServiceImpl.java

@@ -1,11 +1,15 @@
 package com.uas.platform.b2b.service.impl;
 
-import com.uas.platform.b2b.dao.PagingReleaseCountDao;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.SaleARCheckDao;
 import com.uas.platform.b2b.dao.SaleARCheckItemDao;
 import com.uas.platform.b2b.dao.SaleARCheckReplyDao;
+import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.OrderRedDotAll;
 import com.uas.platform.b2b.model.OrderType;
+import com.uas.platform.b2b.model.PurchaseApCheck;
 import com.uas.platform.b2b.model.SaleARCheck;
 import com.uas.platform.b2b.model.SaleARCheckItem;
 import com.uas.platform.b2b.model.SaleARCheckReply;
@@ -19,6 +23,9 @@ 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 com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
@@ -58,10 +65,10 @@ public class SaleARCheckServiceImpl implements SaleARCheckService {
 	private SearchService searchService;
 
 	@Autowired
-	private PagingReleaseCountDao pagingReleaseCountDao;
+    private OrderRedDotService redDotService;
 
 	@Autowired
-    private OrderRedDotService redDotService;
+    private EnterpriseDao enterpriseDao;
 
 	@Override
 	public void save(List<SaleARCheckItem> checkItems) {
@@ -237,16 +244,32 @@ public class SaleARCheckServiceImpl implements SaleARCheckService {
 		return saleARCheckDao.countByVendUU(SystemSession.getUser().getEnterprise().getUu());
 	}
 
-	@Override
-	public long getCountByenUUAndStatus() {
-		return saleARCheckDao.getCountByenUUAndStatus(SystemSession.getUser().getEnterprise().getUu(),
-				(short) Status.NOT_REPLY.value());
-	}
-
-	@Override
-	public Integer getArCheckUnreadCount() {
-		return pagingReleaseCountDao.getUnreadCount(SystemSession.getUser().getEnterprise().getUu(),
-				SystemSession.getUser().getUserUU(), "purc", "SALE$ARCHECK");
-	}
-
+    /**
+     * 作为买家,获取应付对账单(全部)
+     *
+     * @param params       分页参数
+     * @param searchFilter 过滤条件
+     * @return 搜索结果
+     */
+    @Override
+    public SPage<PurchaseApCheck> getApCheck(com.uas.platform.core.model.PageParams params, String searchFilter) {
+        JSONObject jsonObject = JSON.parseObject(searchFilter);
+        String keyword = null;
+        if (jsonObject != null) {
+            keyword = jsonObject.getString("keyword");
+        }
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, searchFilter);
+        // 当前登录企业作为买家
+        pageParams.getFilters().put("pa_custuu", SystemSession.getUser().getEnterprise().getUu());
+        // 排序条件
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pa_id", false, Sort.Type.INT, 1));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        SPage<PurchaseApCheck> sPage = searchService.searchPurchaseApCheckIds(keyword, pageParams);
+        sPage.getContent().forEach(apCheck -> {
+            Enterprise enterprise = enterpriseDao.findOne(apCheck.getEnUu());
+            apCheck.setVendorName(enterprise.getEnName());
+        });
+        return sPage;
+    }
 }

+ 125 - 64
src/main/java/com/uas/platform/b2b/service/impl/UserServiceImpl.java

@@ -4,6 +4,7 @@ import com.uas.message.mail.service.MailService;
 import com.uas.platform.b2b.dao.DistributeDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.RoleDao;
+import com.uas.platform.b2b.dao.UserBaseInfoDao;
 import com.uas.platform.b2b.dao.UserDao;
 import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.model.Distribute;
@@ -11,6 +12,7 @@ import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.Role;
 import com.uas.platform.b2b.model.SearchFilter;
 import com.uas.platform.b2b.model.User;
+import com.uas.platform.b2b.model.UserBaseInfo;
 import com.uas.platform.b2b.model.UserInfo;
 import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.service.UserService;
@@ -26,6 +28,7 @@ import com.uas.platform.core.exception.SystemException;
 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.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.util.AgentUtils;
 import com.uas.platform.core.util.encry.Md5Utils;
@@ -49,6 +52,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author US50
@@ -80,6 +84,8 @@ public class UserServiceImpl implements UserService {
 	private MailService mailService;
 	@Autowired
 	private MessageConf messageConf;
+	@Autowired
+    private UserBaseInfoDao userBaseInfoDao;
 
 	static final String TEL_REGEXP = "^((\\(\\d{3}\\))|(\\d{3}\\-))?(13|15|18|17)\\d{9}$";
 
@@ -619,15 +625,16 @@ public class UserServiceImpl implements UserService {
 	 */
 	@Override
 	public Set<User> findUsersByKeyWord(String keyword) {
-		List<User> users = new ArrayList<User>();
-		Set<User> userSet = new HashSet<User>();
+		Set<User> userSet = new HashSet<>();
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		userSet.addAll(userDao.findUserByUserEmailAndEnUU(keyword, enUU));
 		userSet.addAll(userDao.findUserByUserTelAndEnUU(keyword, enUU));
-		userSet.addAll(userDao.findByEnUUAndUserUU(enUU, Long.parseLong(keyword)));
+		if (keyword.matches(UU_REGEXP)) {
+            userSet.addAll(userDao.findByEnUUAndUserUU(enUU, Long.parseLong(keyword)));
+        }
 		userSet.addAll(userDao.findUserByUserNameAndEnUU(keyword, enUU));
 		if (!CollectionUtils.isEmpty(userSet)) {
-			for (User user : users) {
+			for (User user : userSet) {
 				user.setCurrentEnterpriseRoles(enUU);
 			}
 		}
@@ -646,9 +653,9 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public Boolean getDistribute(Long custUU) {
-		List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(custUU, SystemSession.getUser().getEnterprise().getUu());
-		List<Distribute> distributes = distributeDao.findByUserUUAndVendorId(SystemSession.getUser().getUserUU(), vendors.get(0).getId());
+	public Boolean getDistribute(Long id) {
+		Vendor vendor = vendorDao.findOne(id);
+		List<Distribute> distributes = distributeDao.findByUserUUAndVendorId(SystemSession.getUser().getUserUU(), vendor.getId());
 		// 被分配了权限
 		if (!CollectionUtils.isEmpty(distributes)) {
 			return true;
@@ -734,8 +741,10 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public boolean addVendorToUser(Long userUU, List<Vendor> vendors) {
+	public boolean addCustomerToUser(Long userUU, List<Vendor> vendors) {
 		if (!CollectionUtils.isEmpty(vendors)) {
+		    List<Distribute> needToSave = new ArrayList<>();
+		    List<Distribute> needToRemove = new ArrayList<>();
 			for (Vendor vendor : vendors) {
 				Distribute disbute = new Distribute();
 				if (vendor.getDistribute()) {
@@ -743,15 +752,21 @@ public class UserServiceImpl implements UserService {
 					if (CollectionUtils.isEmpty(disbutes)) {
 						disbute.setUserUU(userUU);
 						disbute.setVendorId(vendor.getId());
-						distributeDao.save(disbute);
+                        needToSave.add(disbute);
 					}
 				} else {
 					List<Distribute> disbutes = distributeDao.findByUserUUAndVendorId(userUU, vendor.getId());
 					if (!CollectionUtils.isEmpty(disbutes)) {
-						distributeDao.delete(disbutes.get(0));
+                        needToRemove.add(disbutes.get(0));
 					}
 				}
 			}
+			if (!CollectionUtils.isEmpty(needToSave)) {
+                distributeDao.save(needToSave);
+            }
+            if (!CollectionUtils.isEmpty(needToRemove)) {
+                distributeDao.delete(needToRemove);
+            }
 			return true;
 		}
 		return false;
@@ -759,19 +774,8 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public List<Vendor> findChooseVendor(Long userUU) {
-		List<Vendor> vendors = vendorDao.findByVendEnUU(SystemSession.getUser().getEnterprise().getUu());
-		List<Vendor> vendors2 = new ArrayList<Vendor>();
-		List<Distribute> distributes = distributeDao.findByUserUU(userUU);
-		if (!CollectionUtils.isEmpty(distributes) && !CollectionUtils.isEmpty(vendors)) {
-			for (Distribute d : distributes) {
-				for (int i = 0; i < vendors.size(); i++) {
-					if (d.getVendorId().equals(vendors.get(i).getId())) {
-						vendors2.add(vendors.get(i));
-					}
-				}
-			}
-		}
-		return vendors2;
+        List<Distribute> distributes = distributeDao.findByUserUUAndVendorUU(userUU, SystemSession.getUser().getEnterprise().getUu());
+        return distributes.stream().map(Distribute::getVendor).collect(Collectors.toList());
 	}
 
 	@Override
@@ -827,12 +831,13 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public List<User> findUserInfoDistribute(Long enUu) {
-		List<Distribute> butes = vendorService.findUserInfo(enUu);
-		List<User> users = userDao.findByEnUU(SystemSession.getUser().getEnterprise().getUu());
-		if (!CollectionUtils.isEmpty(users)) {
-			if (!CollectionUtils.isEmpty(butes)) {
-				for (User u : users) {
+	public SPage<UserBaseInfo> findUserInfoDistribute(Long id, PageParams params, String keyword) {
+        SPage<UserBaseInfo> userBaseInfoSPage = vendorService.findUserInfoByPage(params, keyword);
+        if (!CollectionUtils.isEmpty(userBaseInfoSPage.getContent())) {
+            List<Long> userUUList = userBaseInfoSPage.getContent().stream().map(UserBaseInfo::getUserUU).collect(Collectors.toList());
+            List<Distribute> butes = distributeDao.findByVendorIdAndUserUUIn(id, userUUList);
+            if (!CollectionUtils.isEmpty(butes)) {
+				for (UserBaseInfo u : userBaseInfoSPage.getContent()) {
 					for (Distribute d : butes) {
 						if (u.getUserUU().equals(d.getUserUU())) {
 							u.setDistribute(true);
@@ -843,54 +848,84 @@ public class UserServiceImpl implements UserService {
 					}
 				}
 			}
-			return users;
+			return userBaseInfoSPage;
 		}
-		return null;
+		return new SPage<>();
 	}
 
 	@Override
-	public boolean addUserToVendor(Long custUU, List<User> users) {
-		List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(custUU, SystemSession.getUser().getEnterprise().getUu());
+	public boolean addUserToVendor(Long id, List<UserBaseInfo> users) {
+		Vendor vendor = vendorDao.findOne(id);
 		if (!CollectionUtils.isEmpty(users)) {
-			for (User u : users) {
-				Distribute distribute = new Distribute();
-				List<Distribute> butes = distributeDao.findByUserUUAndVendorId(u.getUserUU(), vendors.get(0).getId());
-				if (u.getDistribute()) {
-					if (CollectionUtils.isEmpty(butes)) {
-						distribute.setUserUU(u.getUserUU());
-						distribute.setVendorId(vendors.get(0).getId());
-						distribute.setLeaderUU(SystemSession.getUser().getUserUU());
-						distributeDao.save(distribute);
-					}
-				} else {
-					if (!CollectionUtils.isEmpty(butes)) {
-						List<Distribute> deleteList = new ArrayList<>();
-						// 删除时,同时删除其绑定权限的其他用户
-						List<Distribute> distributes = distributeDao.findByVendorIdAndLeaderUU(vendors.get(0).getId(), u.getUserUU());
-						if (!CollectionUtils.isEmpty(distributes)) {
-							deleteList.addAll(distributes);
-						}
-						deleteList.add(butes.get(0));
-						distributeDao.deleteAndLog(deleteList);
-					}
-				}
-			}
+		    List<Distribute> saveList = new ArrayList<>();
+			for (UserBaseInfo u : users) {
+				List<Distribute> deleteList = new ArrayList<>();
+				if (null != u.getUserUU()) {
+                    Distribute distribute = new Distribute();
+                    List<Distribute> butes = distributeDao.findByUserUUAndVendorId(u.getUserUU(), vendor.getId());
+                    if (u.isDistribute()) {
+                        if (CollectionUtils.isEmpty(butes)) {
+                            distribute.setUserUU(u.getUserUU());
+                            distribute.setVendorId(vendor.getId());
+                            distribute.setLeaderUU(SystemSession.getUser().getUserUU());
+                            saveList.add(distribute);
+                        }
+                    } else {
+                        // 删除当前用户的权限子节点用户
+                        if (!CollectionUtils.isEmpty(butes)) {
+                            // 当前用户
+                            deleteList.add(butes.get(0));
+                            Long userUU = u.getUserUU();
+							if (null != butes.get(0).getIsTransfer() && 1 == butes.get(0).getIsTransfer()) {
+								deleteList = deleteChildrenDistributes(id, userUU, deleteList);
+							}
+                            // 防止出现作为参数的用户之间存在权限父子节点关系,导致重复查询,所以每次递归完成,执行一次删除
+                            distributeDao.delete(deleteList);
+                        }
+                    }
+                }
+            }
+            distributeDao.save(saveList);
 			return true;
 		}
 		return false;
 	}
 
+    /**
+     * 删除用户的所有关联节点
+     * @param vendorId 供应商关系id
+     * @param userUU  用户UU
+     * @param deleteList 删除idList
+     * @return
+     */
+	private List<Distribute> deleteChildrenDistributes(Long vendorId, Long userUU, List<Distribute> deleteList) {
+        // 删除时,同时删除被其分配权限的其他用户
+        List<Distribute> distributes = distributeDao.findByVendorIdAndLeaderUU(vendorId, userUU);
+        if (!CollectionUtils.isEmpty(distributes)) {
+            deleteList.addAll(distributes);
+            // 被删除用户拥有转移权限时,继续删除其子节点
+            for (Distribute distribute : distributes) {
+                if (null != distribute.getIsTransfer() && 1 == distribute.getIsTransfer()) {
+                    return deleteChildrenDistributes(vendorId, distribute.getUserUU(), deleteList);
+                }
+            }
+        }
+        return deleteList;
+    }
+
 	@Override
-	public boolean transferUserToVendor(Long custUU, List<User> users) {
-		List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(custUU, SystemSession.getUser().getEnterprise().getUu());
+	public boolean transferUserToVendor(Long id, List<UserBaseInfo> users) {
 		if (!CollectionUtils.isEmpty(users)) {
-			for (User u : users) {
+			// 被转移人UU,用于修改转移人下属权限的leaderUU
+            Vendor vendor = vendorDao.findOne(id);
+			Long userUU = null;
+			for (UserBaseInfo u : users) {
 				Distribute distribute = new Distribute();
-				List<Distribute> transfers = distributeDao.findByUserUUAndVendorId(u.getUserUU(), vendors.get(0).getId());
-				if (u.getTransfer()) {
+				List<Distribute> transfers = distributeDao.findByUserUUAndVendorId(u.getUserUU(), vendor.getId());
+				if (u.isTransfer()) {
 					if (CollectionUtils.isEmpty(transfers)) {
 						distribute.setUserUU(u.getUserUU());
-						distribute.setVendorId(vendors.get(0).getId());
+						distribute.setVendorId(vendor.getId());
 						distribute.setLeaderUU(SystemSession.getUser().getUserUU());
 						distribute.setIsTransfer(Constant.YES);
 						distributeDao.save(distribute);
@@ -902,8 +937,24 @@ public class UserServiceImpl implements UserService {
 							distributeDao.save(transfer);
 						}
 					}
+
+					// 被管理员转移的客户绑定用户,修改供应商关系中供应商联系人为被转移人
+					userUU = u.getUserUU();
+					vendor.setVendUserUU(userUU);
+					vendorDao.save(vendor);
 				} else {
 					if (!CollectionUtils.isEmpty(transfers) && null != transfers.get(0).getIsTransfer() &&  transfers.get(0).getIsTransfer() == Constant.YES) {
+
+						// 转移人下属权限,转移到被转移人下
+						List<Distribute> distributes = distributeDao.findByLeaderUU(transfers.get(0).getUserUU());
+						List<Distribute> changeLeaderUUList = new ArrayList<>();
+						for (Distribute bute : distributes) {
+							bute.setLeaderUU(userUU);
+							changeLeaderUUList.add(bute);
+						}
+						distributeDao.save(changeLeaderUUList);
+
+						// 删除被转移人权限
 						distributeDao.delete(transfers.get(0));
 					}
 
@@ -920,11 +971,21 @@ public class UserServiceImpl implements UserService {
 		if (null != userUU) {
 			List<Distribute> transfers = distributeDao.findByUserUUAndVendorId(SystemSession.getUser().getUserUU(), vendors.get(0).getId());
 			if (!CollectionUtils.isEmpty(transfers)) {
+				Long oldUserUU = transfers.get(0).getUserUU();
 				transfers.get(0).setUserUU(userUU);
+
+				// 如果被转移方已有当前客户的分配,先删除(可能是非转移的权限,比被管理员转移的权限低级)
+                List<Distribute> oldDistributes = distributeDao.findByUserUUAndVendorId(userUU, vendors.get(0).getId());
+                if (!CollectionUtils.isEmpty(oldDistributes)) {
+                    distributeDao.delete(oldDistributes);
+                }
+
 				distributeDao.save(transfers.get(0));
-				List<Distribute> distributes = distributeDao.findByUserUUAndVendorId(userUU, vendors.get(0).getId());
+
+				// 删除其他可能存在的转移方与当前客户权限关系
+				List<Distribute> distributes = distributeDao.findByUserUUAndVendorId(oldUserUU, vendors.get(0).getId());
 				if (!CollectionUtils.isEmpty(distributes)) {
-					distributeDao.delete(distributes.get(0));
+					distributeDao.delete(distributes);
 				}
 				return true;
 			}

+ 372 - 11
src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java

@@ -3,23 +3,42 @@ package com.uas.platform.b2b.service.impl;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.DistributeDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
+import com.uas.platform.b2b.dao.RoleDao;
+import com.uas.platform.b2b.dao.UserBaseInfoDao;
+import com.uas.platform.b2b.dao.UserDao;
 import com.uas.platform.b2b.dao.VendorContactDao;
 import com.uas.platform.b2b.dao.VendorDao;
+import com.uas.platform.b2b.dao.VendorDistributeDao;
 import com.uas.platform.b2b.erp.model.B2BCustomer;
 import com.uas.platform.b2b.erp.model.B2BVendor;
 import com.uas.platform.b2b.erp.model.VendorRecommend;
 import com.uas.platform.b2b.model.Distribute;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.Role;
+import com.uas.platform.b2b.model.SearchFilter;
+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;
 import com.uas.platform.b2b.service.VendorService;
+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.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.MultiValue;
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
@@ -27,11 +46,15 @@ import org.springframework.util.StringUtils;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 供应商
@@ -47,6 +70,9 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private DistributeDao distributeDao;
 
+	@Autowired
+    private VendorDistributeDao vendorDistributeDao;
+
 	@Autowired
 	private VendorContactDao vendorContactDao;
 
@@ -59,6 +85,18 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private com.uas.platform.b2b.erp.service.VendorService vendorService;
 
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private RoleDao roleDao;
+
+    @Autowired
+    private UserBaseInfoDao userBaseInfoDao;
+
     /**
      * 应用来源
      */
@@ -94,20 +132,14 @@ public class VendorsServiceImpl implements VendorService {
 
 	@Override
 	public Page<Vendor> findAllByPageInfo(final PageInfo pageInfo) {
-		return vendorDao.findAll(new Specification<Vendor>() {
-
-			@Override
-			public Predicate toPredicate(Root<Vendor> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
-				query.where(pageInfo.getPredicates(root, query, builder));
-				return null;
-			}
-		}, pageInfo);
+        return vendorDao.findAll((Root<Vendor> root, CriteriaQuery<?> query, CriteriaBuilder builder)
+            -> query.where(pageInfo.getPredicates(root, query, builder)).getRestriction(), pageInfo);
 	}
 
 	@Override
 	public List<Distribute> findUserInfo(Long custUU) {
 		List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(custUU, SystemSession.getUser().getEnterprise().getUu());
-		List<Long> ids = new ArrayList<Long>();
+		List<Long> ids = new ArrayList<>();
 		if (!CollectionUtils.isEmpty(vendors)) {
 			for (Vendor v : vendors) {
 				ids.add(v.getId());
@@ -367,4 +399,333 @@ public class VendorsServiceImpl implements VendorService {
 		return commonDao.query(productSql, Product.class);
 	}
 
+    /**
+     * 获取客户详情
+     *
+     * @param params  分页参数
+     * @param keyword 关键字
+     * @return 搜索结果
+     */
+    @Override
+    public SPage<Vendor> getCustomerInfo(PageParams params, String keyword) {
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+        List<Object> vendInfo = new ArrayList<>();
+        vendInfo.add(SystemSession.getUser().getEnterprise().getUu());
+        vendInfo.add(SystemSession.getUser().getEnterprise().getEnBussinessCode());
+        pageParams.getFilters().put("ve_vendenuu", new MultiValue(vendInfo, false));
+        pageParams.getFilters().put("ve_custswitch", Constant.YES);
+        List<Sort> sortList = new ArrayList<>();
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return null;
+        }
+        if (filter != null && !CollectionUtils.isEmpty(filter.getDistribute())) {
+            List<Object> list = new ArrayList<>();
+            for (Object object : filter.getDistribute()) {
+                list.add(object);
+            }
+            pageParams.getFilters().put("ve_myenuu", new MultiValue(list, true));
+        }
+        sortList.add(new Sort("ve_id", false, Sort.Type.INT, new Long(1)));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        SPage<Long> idSPage = searchService.searchCustomerIdList(keyword, pageParams);
+        List<Vendor> vendors = vendorDao.findAll(idSPage.getContent());
+        if (!CollectionUtil.isEmpty(idSPage.getContent())) {
+            setPurchaseContacts(vendors, idSPage.getContent());
+        }
+        return searchService.toSPage(idSPage, vendors);
+    }
+
+    /**
+     * 设置联系人
+     *
+     * @param vendorList 供应商客户资料
+     * @param idList 供应商关系表idList
+     */
+    @Override
+    public void setPurchaseContacts(List<Vendor> vendorList, List<Long> idList) {
+        List<Distribute> distributeList = distributeDao.findByVendorId(idList);
+        List<Distribute> distributeListCopy = new ArrayList<>();
+        distributeListCopy.addAll(distributeList);
+        if (!CollectionUtil.isEmpty(vendorList)) {
+            vendorList.forEach(vendor -> {
+                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(new VendorContactMan(distribute.getUserUU(), distribute.getUser().getUserName()));
+                        iterator.remove();
+                    }
+                }
+                List<String> contactMans = contacts.stream().map(VendorContactMan::getName).collect(Collectors.toList());
+                vendor.setPurchaseContacts(contactMans);
+            });
+        }
+    }
+
+    /**
+     * 搜索供应商资料
+     *
+     * @param keyword 关键字
+     * @param params  分页信息
+     * @return 搜索结果
+     */
+    @Override
+    public SPage<Vendor> searchVendorCheckIds(String keyword, PageParams params) {
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+        pageParams.getFilters().put("ve_myenuu", SystemSession.getUser().getEnterprise().getUu());
+        pageParams.getFilters().put("ve_vendswitch", Constant.YES);
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("ve_id", false, Sort.Type.INT, new Long(1)));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        SPage<Long> idSPage = searchService.searchVendorIdList(keyword, pageParams);
+        List<Vendor> vendors = vendorDao.findAll(idSPage.getContent());
+        if (!CollectionUtil.isEmpty(idSPage.getContent())) {
+            setSaleContacts(vendors, idSPage.getContent());
+        }
+        return searchService.toSPage(idSPage, vendors);
+    }
+
+    /**
+     * (针对供应商)设置业务对接人
+     *
+     * @param vendorList 客户列表
+     * @param idList 供应商关系表id
+     */
+    @Override
+    public void setSaleContacts(List<Vendor> vendorList, List<Long> idList) {
+        List<VendorDistribute> distributeList = vendorDistributeDao.findByVendorIdList(idList);
+        List<VendorDistribute> distributeListCopy = new ArrayList<>();
+        distributeListCopy.addAll(distributeList);
+        if (!CollectionUtil.isEmpty(vendorList)) {
+            vendorList.forEach(vendor -> {
+                Set<VendorContactMan> contacts = new HashSet<>();
+                // 使用后移除,减少后面循环次数
+                Iterator<VendorDistribute> iterator = distributeListCopy.iterator();
+                while (iterator.hasNext()) {
+                    VendorDistribute distribute = iterator.next();
+                    boolean existContacts = Objects.equals(vendor.getId(), distribute.getVendorId())
+                        && (1 == distribute.getIsTransfer() || 1 == distribute.getDistribute());
+                    if (existContacts) {
+                        contacts.add(new VendorContactMan(distribute.getUserUU(), distribute.getUser().getUserName()));
+                        iterator.remove();
+                    }
+                }
+                List<String> contactMans = contacts.stream().map(VendorContactMan::getName).collect(Collectors.toList());
+                vendor.setSaleContacts(contactMans);
+            });
+        }
+    }
+
+    /**
+     * 为用户分配供应商
+     *
+     * @param id 供应商Id
+     * @param userList    用户
+     * @return 分配结果 成功或失败
+     */
+    @Override
+    public boolean bindVendorToUser(Long id, List<UserBaseInfo> userList) {
+        if (!CollectionUtils.isEmpty(userList)) {
+            List<VendorDistribute> needSaveOrUpdateList = new ArrayList<>();
+            List<VendorDistribute> needDeleteList = new ArrayList<>();
+            for (UserBaseInfo user : userList) {
+                Long userUU = user.getUserUU();
+                VendorDistribute distribute = new VendorDistribute();
+                if (user.isDistribute()) {
+                    List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(userUU, id);
+                    if (CollectionUtils.isEmpty(distributes)) {
+                        distribute.setUserUU(userUU);
+                        distribute.setVendorId(id);
+                        distribute.setDistribute(Constant.YES);
+                        needSaveOrUpdateList.add(distribute);
+                    } else {
+                        distribute = distributes.get(0);
+                        distribute.setDistribute(Constant.YES);
+                        needSaveOrUpdateList.add(distribute);
+                    }
+                } else {
+                    List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(userUU, id);
+                    if (!CollectionUtils.isEmpty(distributes)) {
+                        /*
+                         * 判断分配和权限转移关系
+                         * 1、只存在分配关系,取消分配直接删除
+                         * 2、存在权限转移,将分配关系取消即可
+                         */
+                        distribute = distributes.get(0);
+                        if (Constant.YES == distribute.getIsTransfer()) {
+                            distribute.setDistribute(Constant.NO);
+                            needSaveOrUpdateList.add(distribute);
+                        } else {
+                            needDeleteList.add(distribute);
+                        }
+                    }
+                }
+            }
+            if (!CollectionUtil.isEmpty(needSaveOrUpdateList)) {
+                vendorDistributeDao.save(needSaveOrUpdateList);
+            }
+            if (!CollectionUtil.isEmpty(needDeleteList)) {
+                vendorDistributeDao.delete(needDeleteList);
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 供应商权限转移
+     *
+     * @param id 供应商关系id
+     * @param users    前端选择用户信息
+     * @return 转移结果
+     */
+    @Override
+    public boolean transferVendorToUser(Long id, List<UserBaseInfo> users) throws IllegalAccessException {
+        Vendor vendor = vendorDao.findOne(id);
+        if (!CollectionUtils.isEmpty(users)) {
+            List<VendorDistribute> saveList = new ArrayList<>();
+            for (UserBaseInfo u : users) {
+                if (null != u.getUserUU()) {
+                    VendorDistribute distribute = new VendorDistribute();
+                    List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(u.getUserUU(), vendor.getId());
+                    List<VendorDistribute> transferDistributes = vendorDistributeDao.findByVendorIdAndIsTransfer(id, Constant.YES);
+                    if (u.isTransfer()) {
+                        if (CollectionUtils.isEmpty(distributes)) {
+                            distribute.setUserUU(u.getUserUU());
+                            distribute.setVendorId(vendor.getId());
+                            distribute.setLeaderUU(SystemSession.getUser().getUserUU());
+                            distribute.setIsTransfer(Constant.YES);
+                            saveList.add(distribute);
+                        } else {
+                            distribute = distributes.get(0);
+                            distribute.setLeaderUU(SystemSession.getUser().getUserUU());
+                            distribute.setIsTransfer(Constant.YES);
+                            saveList.add(distribute);
+                        }
+                        // 进行权限转移时判断该用户是否是当前用户,如果不是,去掉当前用户的转移状态
+                        if (!Objects.equals(u.getUserUU(), SystemSession.getUser().getUserUU())) {
+                            List<VendorDistribute> currentDistributes = vendorDistributeDao.findByUserUUAndVendorId(SystemSession.getUser().getUserUU(), vendor.getId());
+                            if (!CollectionUtil.isEmpty(currentDistributes)) {
+                                distribute = currentDistributes.get(0);
+                                distribute.setIsTransfer(Constant.NO);
+                                saveList.add(distribute);
+                            }
+                        }
+                        // 删除该企业以前转移的用户
+                        if (!CollectionUtil.isEmpty(transferDistributes) && !Objects.equals(u.getUserUU(), transferDistributes.get(0).getUserUU())) {
+                            distribute = transferDistributes.get(0);
+                            distribute.setIsTransfer(Constant.NO);
+                            saveList.add(distribute);
+                        }
+                    } else {
+                        // 删除当前用户的权限子节点用户
+                        if (!CollectionUtils.isEmpty(distributes)) {
+                            distribute = distributes.get(0);
+                            distribute.setLeaderUU(SystemSession.getUser().getUserUU());
+                            distribute.setIsTransfer(Constant.NO);
+                            saveList.add(distribute);
+                        }
+                    }
+                }
+            }
+            vendorDistributeDao.save(saveList);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 查询是否有操作转移的权限
+     * <pre>
+     *     1、 先判断是否是管理员,如果是,后面不用判断
+     *     2、 非管理员判断是否被转移权限,有权限继续,没有权限返回给出提示,不能操作
+     * </pre>
+     *
+     * @param vendId 供应商关系表id
+     */
+    private void checkAuthority(Long vendId) throws IllegalAccessException {
+        User user = SystemSession.getUser();
+        List<String> roles = new ArrayList<>();
+        roles.add(Role.ROLE_ADMIN);
+        // 查询是否是管理员
+        Integer count = roleDao.countByEnUUAndUserUU(user.getEnterprise().getUu(), user.getUserUU(), roles);
+        if (count == 0) {
+            // 查询是否被转移权限
+            List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(user.getUserUU(), vendId);
+            if (!CollectionUtil.isEmpty(distributes)) {
+                VendorDistribute distribute = distributes.get(0);
+                if (Constant.NO == distribute.getIsTransfer()) {
+                    throw new IllegalAccessException("当前用户没有分配或转移的权限");
+                }
+            } else {
+                throw new IllegalAccessException("当前用户没有分配或转移的权限");
+            }
+        }
+    }
+
+    /**
+     * 通过供应商UU查询供应商分配信息
+     *
+     * @param veId 供应商客户关系表id
+     * @return 分配的供应商
+     */
+    @Override
+    public SPage<UserBaseInfo> findUserInfoVendDistribute(Long veId, PageParams params, String keyword) throws IllegalAccessException {
+        checkAuthority(veId);
+        List<VendorDistribute> distributes = vendorDistributeDao.findByVendorId(veId);
+        SPage<UserBaseInfo> userBaseInfoSPage = findUserInfoByPage(params, keyword);
+        if (!CollectionUtil.isEmpty(userBaseInfoSPage.getContent())) {
+            userBaseInfoSPage.getContent().forEach(user -> {
+                distributes.forEach(distribute -> {
+                    if (user.getUserUU().equals(distribute.getUserUU())) {
+                        if (Constant.YES == distribute.getDistribute()) {
+                            user.setDistribute(true);
+                        }
+                        if (null != distribute.getIsTransfer() && Constant.YES == distribute.getIsTransfer()) {
+                            user.setTransfer(true);
+                        }
+                    }
+                });
+            });
+        }
+        return userBaseInfoSPage;
+    }
+
+    /**
+     * 通过分页信息和关键词查询用户信息
+     *
+     * @param params  分页参数
+     * @param keyword 关键词
+     * @return 符合条件的数据
+     */
+    @Override
+    public SPage<UserBaseInfo> findUserInfoByPage(PageParams params, String keyword) {
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        PageInfo pageInfo = new PageInfo(params);
+        List<UserBaseInfo> userList;
+        Integer total;
+        Integer startIndex = (pageInfo.getPageNumber() - 1) * pageInfo.getPageSize();
+        if (StringUtils.isEmpty(keyword)) {
+            userList = userBaseInfoDao.findByEnUU(enUU, startIndex, pageInfo.getPageSize());
+            total = userBaseInfoDao.countByEnUU(enUU);
+        } else {
+            userList = userBaseInfoDao.findByEnUUAndKeyword(enUU, keyword, startIndex, pageInfo.getPageSize());
+            total = userBaseInfoDao.countByEnUUAndKeyword(enUU, keyword);
+        }
+        return SPageUtils.covertSPage(new PageImpl<>(userList, pageInfo, total));
+    }
+
+    /**
+     * 通过客户关系表id查询分配关系
+     *
+     * @param id 客户关系表id
+     * @return 分配的客户
+     */
+    @Override
+    public List<Distribute> findByVeId(Long id) {
+        return distributeDao.findByVendorId(id);
+    }
 }

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff