Browse Source

Merge remote-tracking branch 'origin/feature-201843-hejq' into dev

# Conflicts:
#	src/main/java/com/uas/platform/b2b/model/Vendor.java
wangcz 7 years ago
parent
commit
0b7e06e0ad
48 changed files with 3792 additions and 929 deletions
  1. 36 52
      src/main/java/com/uas/platform/b2b/controller/PurchaseARCheckController.java
  2. 16 4
      src/main/java/com/uas/platform/b2b/controller/SaleApCheckController.java
  3. 0 2
      src/main/java/com/uas/platform/b2b/controller/SaleOrderController.java
  4. 7 6
      src/main/java/com/uas/platform/b2b/controller/UserController.java
  5. 4 58
      src/main/java/com/uas/platform/b2b/controller/VendorController.java
  6. 77 0
      src/main/java/com/uas/platform/b2b/controller/VendorDistributeController.java
  7. 2 0
      src/main/java/com/uas/platform/b2b/core/util/DateFormatUtils.java
  8. 17 0
      src/main/java/com/uas/platform/b2b/core/util/DateUtils.java
  9. 4 1
      src/main/java/com/uas/platform/b2b/dao/DistributeDao.java
  10. 10 0
      src/main/java/com/uas/platform/b2b/dao/PurchaseApCheckDao.java
  11. 0 11
      src/main/java/com/uas/platform/b2b/dao/PurchaseOrderAllDao.java
  12. 54 0
      src/main/java/com/uas/platform/b2b/dao/VendorDistributeDao.java
  13. 7 2
      src/main/java/com/uas/platform/b2b/erp/service/impl/VendorServiceImpl.java
  14. 3 3
      src/main/java/com/uas/platform/b2b/listener/GlobalExceptionHandler.java
  15. 17 29
      src/main/java/com/uas/platform/b2b/mobile/controller/SaleController.java
  16. 39 0
      src/main/java/com/uas/platform/b2b/model/BusinessContacts.java
  17. 29 4
      src/main/java/com/uas/platform/b2b/model/PurchaseApCheck.java
  18. 401 340
      src/main/java/com/uas/platform/b2b/model/Vendor.java
  19. 150 0
      src/main/java/com/uas/platform/b2b/model/VendorDistribute.java
  20. 72 0
      src/main/java/com/uas/platform/b2b/model/util/UnCheckedCountSqls.java
  21. 40 11
      src/main/java/com/uas/platform/b2b/result/ResultMap.java
  22. 68 1
      src/main/java/com/uas/platform/b2b/search/SearchService.java
  23. 124 4
      src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java
  24. 3 2
      src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java
  25. 14 2
      src/main/java/com/uas/platform/b2b/service/PurchaseApCheckService.java
  26. 1 13
      src/main/java/com/uas/platform/b2b/service/UserService.java
  27. 63 0
      src/main/java/com/uas/platform/b2b/service/VendorService.java
  28. 69 43
      src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java
  29. 90 7
      src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java
  30. 27 5
      src/main/java/com/uas/platform/b2b/service/impl/UserServiceImpl.java
  31. 293 10
      src/main/java/com/uas/platform/b2b/service/impl/VendorsServiceImpl.java
  32. 1 1
      src/main/resources/ptest/jdbc.properties
  33. 3 3
      src/main/resources/ptest/sys.properties
  34. BIN
      src/main/webapp/resources/css/font/iconfont.woff
  35. 0 0
      src/main/webapp/resources/css/wui.min.css
  36. 13 0
      src/main/webapp/resources/js/common/services.js
  37. 611 31
      src/main/webapp/resources/js/index/app.js
  38. 4 2
      src/main/webapp/resources/js/index/main.js
  39. 4 0
      src/main/webapp/resources/js/index/services/Fa.js
  40. 653 0
      src/main/webapp/resources/lib/wui/wui-date.js
  41. 6 0
      src/main/webapp/resources/tpl/index/account/add_userInfo.html
  42. 6 0
      src/main/webapp/resources/tpl/index/account/transfer_userInfo.html
  43. 451 156
      src/main/webapp/resources/tpl/index/fa/apCheck.html
  44. 247 0
      src/main/webapp/resources/tpl/index/fa/apChecknot.html
  45. 5 21
      src/main/webapp/resources/tpl/index/fa/arCheck.html
  46. 21 87
      src/main/webapp/resources/tpl/index/fa/arCheck_detail.html
  47. 20 10
      src/main/webapp/resources/tpl/index/purc/vendor.html
  48. 10 8
      src/main/webapp/resources/tpl/index/sale/customer.html

+ 36 - 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,34 @@ 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("应付对账单", "获取全部应付对账单");
+        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, Type.INT, 1));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        return searchService.searchPurchaseApCheckIds(keyword, pageParams);
+    }
 
 	/**
 	 * 作为买家,根据ID查找应付对账单(含明细)
@@ -102,10 +92,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 +103,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 +122,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 +142,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 +159,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 +176,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;

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

@@ -185,7 +185,7 @@ public class SaleApCheckController {
 	 * @return List<ErpProdIODetail>
 	 */
 	@RequestMapping(value = "/getAllByKeywords", method = RequestMethod.GET)
-	public List<ErpProdIODetail> getAllApchecksByDate(Long fromDate, Long endDate, ApcheckKeyWord searchKeyWord) {
+	public List<ErpProdIODetail> getAllApchecksByDate(Long fromDate, Long endDate, ApcheckKeyWord searchKeyWord, String checkDate) {
 		List<Long> distributes = null;
 		// 判断当前用户是否被客户分配
 		if (!SystemSession.getUser().isSys()) {
@@ -199,9 +199,20 @@ public class SaleApCheckController {
 				return null;
 			}
 		}
-		return erpProdIODetailService.findXlsApChecks(distributes, searchKeyWord, fromDate, endDate);
+		return erpProdIODetailService.findXlsApChecks(distributes, searchKeyWord, fromDate, endDate, checkDate);
 	}
 
+    /**
+     * 获取客户
+     * @param keyword 关键字
+     * @param params 分页参数
+     * @return 符合条件的客户信息
+     */
+    @RequestMapping(value = "/customer", method = RequestMethod.GET)
+    public SPage<Vendor> getCustomers(PageParams params, String keyword) {
+        return purchaseApCheckService.getCustomerInfo(params, keyword);
+    }
+
 	/**
 	 * 保存生成的应收对账单主记录
      *
@@ -539,10 +550,11 @@ 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) {
+	public ModelAndView export(ApcheckKeyWord keyword, Long fromDate, Long endDate, String checkDate) {
 		List<Long> distributes = null;
 		// 判断当前用户是否被客户分配
 		if (!SystemSession.getUser().isSys()) {
@@ -559,7 +571,7 @@ public class SaleApCheckController {
 		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", erpProdIODetailService.findXlsApChecks(distributes, keyword, fromDate, endDate, checkDate));
 		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/fa/faApCheck", "客户应收对账单"));
 		logger.log("客户应收对账单", "导出Excel列表", "导出全部Excel列表");
 		return modelAndView;

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

+ 7 - 6
src/main/java/com/uas/platform/b2b/controller/UserController.java

@@ -148,7 +148,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 +225,7 @@ public class UserController {
 				request.getSession().setAttribute("user", user);
 			}
 		}
-		return new ResponseEntity<String>(HttpStatus.OK);
+		return new ResponseEntity<>(HttpStatus.OK);
 	}
 
 	/**
@@ -244,7 +244,7 @@ public class UserController {
                 request.getSession().setAttribute("user", user);
             }
 		}
-		return new ResponseEntity<String>(HttpStatus.OK);
+		return new ResponseEntity<>(HttpStatus.OK);
 	}
 
 	/**
@@ -257,7 +257,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);
 	}
 
 	/**
@@ -313,7 +313,7 @@ public class UserController {
 	@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);
+		boolean result = userService.addCustomerToUser(userUU, ids);
 		String resultInfo = result ? "成功" : "失败";
         LOGGER.log("客户权限", "分配客户权限", "userUU: " + userUU + "结果: 分配" + resultInfo);
 		if (result) {
@@ -324,7 +324,8 @@ public class UserController {
 	}
 
 	/**
-	 * 将用户绑定到供应商
+	 * 客户权限转移
+     *
 	 * @param custUU
 	 * @param json
 	 * @return

+ 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")) {

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

@@ -0,0 +1,77 @@
+package com.uas.platform.b2b.controller;
+
+import com.uas.platform.b2b.model.User;
+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.util.serializer.FlexJsonUtils;
+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<User> users = FlexJsonUtils.fromJsonArray(json, User.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) {
+        List<User> users = FlexJsonUtils.fromJsonArray(json, User.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.POST)
+    public List<User> getUsersAndDistribute(@PathVariable("id") Long id) {
+        LOGGER.log("用户信息", "查询[" + id +"]供应商分配信息");
+        return vendorService.findUserInfoVendDistribute(id);
+    }
+}

+ 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日
      */

+ 17 - 0
src/main/java/com/uas/platform/b2b/core/util/DateUtils.java

@@ -226,4 +226,21 @@ 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();
+    }
 }

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

@@ -3,6 +3,8 @@ 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;
@@ -31,7 +33,8 @@ 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);
 
 	List<Distribute> findByVendorId(Long vendorId);
 

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

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

@@ -0,0 +1,54 @@
+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);
+}

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

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

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

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

+ 401 - 340
src/main/java/com/uas/platform/b2b/model/Vendor.java

@@ -1,340 +1,401 @@
-package com.uas.platform.b2b.model;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import com.uas.platform.b2b.erp.model.InquiryVendorInfo;
-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.*;
-import java.io.Serializable;
-import java.util.List;
-
-@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;
-
-	/**
-	 * 客户资料中的我方联系人显示
-	 */
-	@Transient
-	private List<User> myContacts;
-
-	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 List<User> getMyContacts() {
-		return myContacts;
-	}
-
-	public void setMyContacts(List<User> myContacts) {
-		this.myContacts = myContacts;
-	}
-
-	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.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.Date;
+import java.util.HashSet;
+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;
+
+    /**
+     * 最近一次对账时间
+     */
+	@Transient
+    private Date lastCheckDate;
+
+    /**
+     * 最近一次对账金额
+     */
+	@Transient
+    private Double uncheckedCount;
+
+    /**
+     * (针对买家、客户)采购联系人
+     */
+	@Transient
+    private Set<String> purchaseContacts = new HashSet<>();
+
+    /**
+     * (针对卖家、供应商) 业务对接人
+     */
+	@Transient
+    private Set<String> saleContacts = new HashSet<>();
+
+	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<String> getPurchaseContacts() {
+        return purchaseContacts;
+    }
+
+    public void setPurchaseContacts(Set<String> purchaseContacts) {
+        this.purchaseContacts = purchaseContacts;
+    }
+
+    public Set<String> getSaleContacts() {
+        return saleContacts;
+    }
+
+    public void setSaleContacts(Set<String> saleContacts) {
+        this.saleContacts = saleContacts;
+    }
+
+    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;
+	}
+}

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

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

@@ -0,0 +1,72 @@
+package com.uas.platform.b2b.model.util;
+
+import com.uas.platform.b2b.publicapi.model.UsoftRate;
+
+/**
+ * 未对账总额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) " +
+        "from purc$apbilladjustment where coalesce(aa_thischeckqty, 0) <> 0 and aa_enuu = ? and aa_custuu = ?";
+
+    /**
+     * 客户采购验收单未对账金额查询语句
+     */
+    public static final String SALE_ACCEPT_COUNT_SQL = "select coalesce(sum(case " +
+        " when currency = 'USD' then count * " + UsoftRate.USD_RATE +
+        " when currency = 'HKD' then count * " + UsoftRate.HKD_RATE +
+        " else count end), 0) " +
+        "from (" +
+        "select sum((pai_qty - coalesce(pai_ycheckqty, 0)) * pai_orderprice) as count, pa_currency as currency " +
+        "from purc$accept left join `purc$acceptitem` on pai_paid = pa_id " +
+        "where pai_qty > coalesce(pai_ycheckqty, 0) and pa_enuu = ? and  pa_venduu = ? and pai_orderprice <> 0 " +
+        "group by pa_currency) a";
+
+    /**
+     * 客户采购验退单未对账金额查询语句
+     */
+    public static final String SALE_RETURN_COUNT_SQL = "select coalesce(sum(case " +
+        " when currency = 'USD' then count * " + UsoftRate.USD_RATE +
+        " when currency = 'HKD' then count * " + UsoftRate.HKD_RATE +
+        " else count end), 0) " +
+        "from (" +
+        "select sum(((-(1) * pri_qty ) - coalesce(pri_ycheckqty, 0)) *  pri_orderprice) as count, pr_currency as currency " +
+        "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) a";
+
+    //todo 不良品出入库价格为0,暂不用计算
+
+    /**
+     * 客户委外验收单未对账金额查询语句
+     */
+    public static final String MAKE_ACCEPT_COUNT_SQL = "select coalesce(sum(case " +
+        " when currency = 'USD' then count * " + UsoftRate.USD_RATE +
+        " when currency = 'HKD' then count * " + UsoftRate.HKD_RATE +
+        " else count end), 0) " +
+        "from (" +
+        "select sum((mai_qty - coalesce(mai_ycheckqty, 0)) * mai_orderpice) as count,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) a";
+
+    /**
+     * 客户委外验退单未对账金额查询语句
+     */
+    public static final String MAKE_RETURN_COUNT_SQL = "select coalesce(sum(case " +
+        " when currency = 'USD' then count * " + UsoftRate.USD_RATE +
+        " when currency = 'HKD' then count * " + UsoftRate.HKD_RATE +
+        " else count end), 0) " +
+        "from (" +
+        "select sum(((-(1) *  mri_qty ) - coalesce(mri_ycheckqty, 0)) * mri_orderpice) as count,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) a";
+}

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

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

+ 124 - 4
src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java

@@ -2,12 +2,100 @@ 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.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 +122,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;
 
 /**
@@ -286,7 +381,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;
 		}
@@ -886,6 +982,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;
+    }
+
 	/**
 	 * 供应商
 	 */
@@ -897,6 +1005,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)
 	 */

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

@@ -20,8 +20,9 @@ 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);
+	List<ErpProdIODetail> findXlsApChecks(List<Long> filter, ApcheckKeyWord keyWord, Long fromDate, Long endDate, String checkDate);
 	
 }

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

@@ -5,7 +5,10 @@ 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.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 +126,17 @@ public interface PurchaseApCheckService {
 
 	/**
 	 * 获取明细表中已开票数
-	 *
-	 * @return
+	 * @param id 发票id
+	 * @return 已开票数
 	 */
     Double getBilledByItemId(Long id);
+
+    /**
+     * 对账获取客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 关键字
+     * @return 搜索结果
+     */
+    SPage<Vendor> getCustomerInfo(PageParams params, String keyword);
 }

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

@@ -60,18 +60,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 +225,7 @@ public interface UserService {
 	 * @param ids
 	 * @return
 	 */
-	public boolean addVendorToUser(Long userUU, List<Vendor> ids);
+	public boolean addCustomerToUser(Long userUU, List<Vendor> ids);
 
 	/**
 	 * 为用户分配客户(查询)

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

@@ -3,9 +3,12 @@ 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.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 +147,64 @@ 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<User> userList);
+
+    /**
+     * 供应商权限转移
+     *
+     * @param id 供应商关系id
+     * @param users 前端选择用户信息
+     * @return 转移结果
+     */
+    boolean transferVendorToUser(Long id, List<User> users);
+
+    /**
+     * 设置联系人
+     *
+     * @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 vendUU 供应商UU
+     * @return 分配的供应商
+     */
+    List<User> findUserInfoVendDistribute(Long vendUU);
 }

+ 69 - 43
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -1,15 +1,21 @@
 package com.uas.platform.b2b.service.impl;
 
+import com.uas.platform.b2b.core.util.DateFormatUtils;
+import com.uas.platform.b2b.core.util.DateUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.model.ApcheckKeyWord;
 import com.uas.platform.b2b.model.ErpProdIODetail;
 import com.uas.platform.b2b.service.ErpProdIODetailService;
 import com.uas.platform.b2b.support.SystemSession;
+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;
 
 /**
@@ -25,9 +31,36 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
 	private CommonDao commonDao;
 
 	@Override
-	public List<ErpProdIODetail> findXlsApChecks(List<Long> filter, ApcheckKeyWord keyword, Long fromDate, Long endDate) {
+	public List<ErpProdIODetail> findXlsApChecks(List<Long> filter, ApcheckKeyWord keyword, Long fromDate, Long endDate, String checkDate) {
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
         StringBuffer distributes = new StringBuffer();
+        String sqlFromDate;
+        String sqlEndDate;
+        /*
+         * 1、 如果前端指定开始截止时间,直接使用
+         * 2、 如果前端未指定,采用选择月份,使用月份处理
+         * 3、 截止时间筛为指定月份加1,即下月一号,采用小于这天,能取到当月所有数据
+         */
+        final Integer oneDayMilliseconds = 86400000;
+        boolean onlyCheckDate = (null == fromDate || null == endDate) && null != checkDate;
+        if (null != fromDate && null != endDate ) {
+            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(new Date(fromDate));
+            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(new Date(endDate + oneDayMilliseconds));
+        } else if (onlyCheckDate) {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+            Date date;
+            Date checkTime;
+            try {
+                date = DateUtils.dateAddMonth(format.parse(checkDate), 1);
+                checkTime = format.parse(checkDate);
+            } catch (ParseException e) {
+                throw new IllegalOperatorException("时间格式异常");
+            }
+            sqlFromDate = DateFormatUtils.DATE_FORMAT.format(checkTime);
+            sqlEndDate = DateFormatUtils.DATE_FORMAT.format(date);
+        } else {
+            throw new IllegalOperatorException("请选择对账时间");
+        }
         List<ErpProdIODetail> details = new ArrayList<>();
         if (null != filter) {
             filter.forEach(uu -> {
@@ -38,19 +71,19 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
             });
         }
 		// 货款调账
-		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, fromDate, endDate, enUU);
+		List<ErpProdIODetail> adjustments = getAdjustments(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
 		// 采购验收单
-        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> saleAccepts = getSaleAccepts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         // 采购验退单
-        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> saleReturns = getSaleReturns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         // 客户不良品入库单
-        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> badIns = getBadIns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         // 客户不良品出库单
-        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> badOuts = getBadOuts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         // 委外验收单
-        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> makeAccepts = getMakeAccepts(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         // 委外验退单
-        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, fromDate, endDate, enUU);
+        List<ErpProdIODetail> makeReturns = getMakeReturns(distributes, keyword, sqlFromDate, sqlEndDate, enUU);
         details.addAll(adjustments);
         details.addAll(saleAccepts);
         details.addAll(saleReturns);
@@ -71,7 +104,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +138,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 DAYFORMDATE(mr_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(mr_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(mr_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> makeReturns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return makeReturns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -124,7 +156,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +190,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 DAYFORMDATE(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 DAYFORMDATE(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);
     }
 
     /**
@@ -177,7 +208,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +242,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 DAYFORMDATE(po_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(po_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(po_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> badOuts = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return badOuts;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -230,7 +260,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +294,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 DAYFORMDATE(pb_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pb_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(pb_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> badIns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return badIns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -283,7 +312,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +346,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 DAYFORMDATE(pr_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pr_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(pr_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> saleReturns = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return saleReturns;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -336,7 +364,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +398,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 DAYFORMDATE(pa_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(pa_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(pa_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> saleAccepts = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return saleAccepts;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 
     /**
@@ -389,7 +416,7 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
      * @param enUU 当前企业UU
      * @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 +445,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 DAYFORMDATE(aa_date) >= '").append(fromDate).append("' ");
         }
         if (endDate != null) {
-            sql.append("and DAYFORMDATE(aa_date) <= '").append(new java.sql.Date(endDate)).append("' ");
+            sql.append("and DAYFORMDATE(aa_date) < '").append(endDate).append("' ");
         }
-        List<ErpProdIODetail> adjustments = commonDao.query(sql.toString(), ErpProdIODetail.class);
-        return adjustments;
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
 }

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

@@ -1,11 +1,14 @@
 package com.uas.platform.b2b.service.impl;
 
 import com.uas.platform.b2b.core.util.ContextUtils;
+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.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 +17,27 @@ 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.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.service.VendorService;
 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.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;
@@ -63,11 +76,23 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 	PurchaseApCheckItemDao purchaseApCheckItemDao;
 
 	@Autowired
-	private JdbcTemplate jdbcTemplate;
+	private CommonDao commonDao;
 
 	@Autowired
 	private OrderRedDotService redDotService;
 
+	@Autowired
+    private EnterpriseDao enterpriseDao;
+
+	@Autowired
+    private VendorService vendorService;
+
+	@Autowired
+    private SearchService searchService;
+
+	@Autowired
+    private UserService userService;
+
 	@Override
 	public List<PurchaseApCheck> findNotUploadAPcheck() {
 		return purchaseApCheckDao.findByCustUuAndStatusAndCheckStatus(SystemSession.getUser().getEnterprise().getUu(),
@@ -150,7 +175,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 +187,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 +238,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 +262,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);
@@ -309,7 +339,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 +482,57 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
     public Double getBilledByItemId(Long id) {
         return purchaseApCheckItemDao.getBilledById(id);
     }
+
+    /**
+     * 对账获取客户信息
+     *
+     * @param params  分页参数
+     * @param keyword 关键字
+     * @return 搜索结果
+     */
+    @Override
+    public SPage<Vendor> getCustomerInfo(PageParams params, String keyword) {
+        SPage<Vendor> vendorSPage = searchCustomerInfo(params, keyword);
+        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        vendorSPage.getContent().stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
+            .forEach(customer -> {
+                Long customerUU = customer.getMyEnUU();
+                PurchaseApCheck apCheck = purchaseApCheckDao.findByCustomerUUAndEnUU(customerUU, enUU);
+                if (null != apCheck) {
+                    customer.setLastCheckDate(apCheck.getRecordDate());
+                }
+                Double adjustmentCount = commonDao.queryForObject(UnCheckedCountSqls.ADJUSTMENT_COUNT_SQL, Double.class, enUU, customerUU);
+                Double saleAcceptCount = commonDao.queryForObject(UnCheckedCountSqls.SALE_ACCEPT_COUNT_SQL, Double.class, enUU, customerUU);
+                Double saleReturnCount = commonDao.queryForObject(UnCheckedCountSqls.SALE_RETURN_COUNT_SQL, Double.class, enUU, customerUU);
+                Double makeAcceptCount = commonDao.queryForObject(UnCheckedCountSqls.MAKE_ACCEPT_COUNT_SQL, Double.class, enUU, customerUU);
+                Double makeReturnCount = commonDao.queryForObject(UnCheckedCountSqls.MAKE_RETURN_COUNT_SQL, Double.class, enUU, customerUU);
+                Double totalCount = adjustmentCount + saleAcceptCount + saleReturnCount + makeAcceptCount + makeReturnCount;
+                customer.setUncheckedCount(totalCount);
+            });
+        return vendorSPage;
+    }
+
+    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 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);
+        return searchService.searchCustCheckIds(keyword, pageParams);
+    }
 }

+ 27 - 5
src/main/java/com/uas/platform/b2b/service/impl/UserServiceImpl.java

@@ -1,11 +1,26 @@
 package com.uas.platform.b2b.service.impl;
 
 import com.uas.message.mail.service.MailService;
-import com.uas.platform.b2b.dao.*;
-import com.uas.platform.b2b.model.*;
+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.UserDao;
+import com.uas.platform.b2b.dao.VendorDao;
+import com.uas.platform.b2b.model.Distribute;
+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.UserInfo;
+import com.uas.platform.b2b.model.Vendor;
 import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.service.VendorService;
-import com.uas.platform.b2b.support.*;
+import com.uas.platform.b2b.support.MessageConf;
+import com.uas.platform.b2b.support.SPageUtils;
+import com.uas.platform.b2b.support.SendMailService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.TokenService;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.exception.SystemException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
@@ -26,7 +41,14 @@ import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * @author US50
@@ -712,7 +734,7 @@ 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)) {
 			for (Vendor vendor : vendors) {
 				Distribute disbute = new Distribute();

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

@@ -5,21 +5,32 @@ import com.uas.platform.b2b.dao.DistributeDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 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.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.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.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.stereotype.Service;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
@@ -27,11 +38,14 @@ 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;
 
 /**
  * 供应商
@@ -47,6 +61,9 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private DistributeDao distributeDao;
 
+	@Autowired
+    private VendorDistributeDao vendorDistributeDao;
+
 	@Autowired
 	private VendorContactDao vendorContactDao;
 
@@ -59,6 +76,12 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private com.uas.platform.b2b.erp.service.VendorService vendorService;
 
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private UserService userService;
+
     /**
      * 应用来源
      */
@@ -94,14 +117,8 @@ 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
@@ -367,4 +384,270 @@ 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());
+        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<String> contacts = new HashSet<>();
+                // 使用后移除,减少后面循环次数
+                Iterator<Distribute> iterator = distributeListCopy.iterator();
+                while (iterator.hasNext()) {
+                    Distribute distribute = iterator.next();
+                    if (Objects.equals(vendor.getId(), distribute.getVendorId())) {
+                        contacts.add(distribute.getUser().getUserName());
+                        iterator.remove();
+                    }
+                }
+                vendor.setPurchaseContacts(contacts);
+            });
+        }
+    }
+
+    /**
+     * 搜索供应商资料
+     *
+     * @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());
+        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<String> contacts = new HashSet<>();
+                // 使用后移除,减少后面循环次数
+                Iterator<VendorDistribute> iterator = distributeListCopy.iterator();
+                while (iterator.hasNext()) {
+                    VendorDistribute distribute = iterator.next();
+                    if (Objects.equals(vendor.getId(), distribute.getVendorId())) {
+                        contacts.add(distribute.getUser().getUserName());
+                        iterator.remove();
+                    }
+                }
+                vendor.setSaleContacts(contacts);
+            });
+        }
+    }
+
+    /**
+     * 为用户分配供应商
+     *
+     * @param id 供应商Id
+     * @param userList    用户
+     * @return 分配结果 成功或失败
+     */
+    @Override
+    public boolean bindVendorToUser(Long id, List<User> userList) {
+        if (!CollectionUtils.isEmpty(userList)) {
+            List<VendorDistribute> needSaveOrUpdateList = new ArrayList<>();
+            List<VendorDistribute> needDeleteList = new ArrayList<>();
+            for (User user : userList) {
+                Long userUU = user.getUserUU();
+                VendorDistribute distribute = new VendorDistribute();
+                if (user.getDistribute()) {
+                    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<User> users) {
+        Vendor vendor = vendorDao.findOne(id);
+        if (!CollectionUtils.isEmpty(users)) {
+            List<VendorDistribute> saveList = new ArrayList<>();
+            for (User u : users) {
+                List<VendorDistribute> deleteList = new ArrayList<>();
+                if (null != u.getUserUU()) {
+                    VendorDistribute distribute = new VendorDistribute();
+                    List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(u.getUserUU(), vendor.getId());
+                    if (u.getTransfer()) {
+                        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);
+                        }
+                    } else {
+                        // 删除当前用户的权限子节点用户
+                        if (!CollectionUtils.isEmpty(distributes)) {
+                            // 当前用户
+                            deleteList.add(distributes.get(0));
+                            Long vendorId = vendor.getId();
+                            Long userUU = u.getUserUU();
+                            if (null != distributes.get(0).getIsTransfer() && 1 == distributes.get(0).getIsTransfer()) {
+                                deleteList = deleteChildrenDistributes(vendorId, userUU, deleteList);
+                            }
+                            // 防止出现作为参数的用户之间存在权限父子节点关系,导致重复查询,所以每次递归完成,执行一次删除
+                            vendorDistributeDao.delete(deleteList);
+                        }
+                    }
+                }
+            }
+            vendorDistributeDao.save(saveList);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 删除用户的所有关联节点
+     * @param vendorId 供应商关系id
+     * @param userUU  用户UU
+     * @param deleteList 删除idList
+     * @return
+     */
+    private List<VendorDistribute> deleteChildrenDistributes(Long vendorId, Long userUU, List<VendorDistribute> deleteList) {
+        // 删除时,同时删除被其分配权限的其他用户
+        List<VendorDistribute> distributes = vendorDistributeDao.findByVendorIdAndLeaderUU(vendorId, userUU);
+        if (!CollectionUtils.isEmpty(distributes)) {
+            deleteList.addAll(distributes);
+            // 被删除用户拥有转移权限时,继续删除其子节点
+            for (VendorDistribute distribute : distributes) {
+                if (null != distribute.getIsTransfer() && 1 == distribute.getIsTransfer()) {
+                    return deleteChildrenDistributes(vendorId, distribute.getUserUU(), deleteList);
+                }
+            }
+        }
+        return deleteList;
+    }
+
+    /**
+     * 通过供应商UU查询供应商分配信息
+     *
+     * @param veId 供应商客户关系表id
+     * @return 分配的供应商
+     */
+    @Override
+    public List<User> findUserInfoVendDistribute(Long veId) {
+        List<VendorDistribute> distributes = vendorDistributeDao.findByVendorId(veId);
+        List<User> users = userService.findUsersByEnUU(SystemSession.getUser().getEnterprise().getUu());
+        users.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 users;
+    }
 }

+ 1 - 1
src/main/resources/ptest/jdbc.properties

@@ -1,6 +1,6 @@
 #mysql info
 jdbc.driverClassName=com.mysql.jdbc.Driver
-jdbc.url=jdbc:mysql://192.168.100.3:3306/b2b_mysql_test?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
+jdbc.url=jdbc:mysql://188.131.128.107:3306/b2b_mysql_test?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
 jdbc.username=sa
 jdbc.password=select111***
 jdbc.initialSize=5

+ 3 - 3
src/main/resources/ptest/sys.properties

@@ -11,16 +11,16 @@ reportPrintUrl=http://192.168.100.8:8080/report/print?userName=B2B%s&profile=${p
 reportUploadUrl=http://192.168.100.8:8080/report/fileUpload?userName=B2B%s
 
 #product service url
-productServiceUrl=http://192.168.100.11:8080/
+productServiceUrl=http://188.131.128.107:24002
 
 #inquiry service url
-inquiryServiceUrl=https://192.168.100.9:8080/
+inquiryServiceUrl=https://188.131.128.107:24000
 
 #message service ip
 messageServiceIp=http://message.ubtob.com/
 
 #search url
-searchUrl=http://192.168.100.15:8080
+searchUrl=http://188.131.128.107:24005
 
 # dfs file url
 dfsFileUrl=http://dfs-api.ubtob.com

BIN
src/main/webapp/resources/css/font/iconfont.woff


File diff suppressed because it is too large
+ 0 - 0
src/main/webapp/resources/css/wui.min.css


+ 13 - 0
src/main/webapp/resources/js/common/services.js

@@ -369,10 +369,23 @@ define(['angular', 'toaster', 'big'], function(angular, big) {
                 method: 'POST',
                 isArray: true
             },
+            findSaleUsers: {
+                url: 'vendorDistribute/:id',
+                method: 'POST',
+                isArray: true
+            },
+            addSaleUserToVendor: {
+                url: 'vendorDistribute/bindVendor/:id',
+                method: 'POST'
+            },
             addUserToVendor: {
                 url: 'account/user/bindUserToVendor/:uu',
                 method: 'POST'
             },
+            transferSaleUserToVendor: {
+                url: 'vendorDistribute/bindUserToVendor/:id',
+                method: 'POST'
+            },
             transferUserToVendor: {
                 url: 'account/user/transferUserToVendor/:uu',
                 method: 'POST'

+ 611 - 31
src/main/webapp/resources/js/index/app.js

@@ -1,6 +1,6 @@
-define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token', 'service/ProductUsers', 'service/File', 'service/PublicInquiry', 'service/Customer', 'service/PurcChange', 'angularTreeview'], function () {
+define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token', 'service/ProductUsers', 'service/File', 'service/PublicInquiry', 'service/Customer', 'service/PurcChange', 'angularTreeview', 'wui.date'], function () {
     'use strict';
-    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService', 'ProductUserService', 'ui.tour', 'FileService', 'publicInquiryService', 'CustomerService', 'changeService', 'angularTreeview']);
+    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService', 'ProductUserService', 'ui.tour', 'FileService', 'publicInquiryService', 'CustomerService', 'changeService', 'angularTreeview', 'wui.date']);
     app.init = function () {
         angular.bootstrap(document, ['myApp']);
     };
@@ -680,6 +680,10 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
             },
             templateUrl: "static/tpl/index/fa/apCheck.html",
             controller: 'PurchaseApCheckCtrl'
+        }).state('fa.apCheck_not', {
+            url: "/apChecknot/:id",
+            templateUrl: "static/tpl/index/fa/apChecknot.html",
+            controller: 'PurchaseApCheckNotCtrl'
         }).state('fa.apCheck_detail', {
             url: "/apCheck/:id",
             templateUrl: "static/tpl/index/fa/apCheck_detail.html",
@@ -2152,6 +2156,9 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                         resolve: {
                             customer: function () {
                                 return customer;
+                            },
+                            type: function () {
+                                return 'purchase'
                             }
                         }
                     });
@@ -2189,6 +2196,9 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                         resolve: {
                             customer: function () {
                                 return customer;
+                            },
+                            type: function () {
+                                return 'purchase'
                             }
                         }
                     });
@@ -2436,6 +2446,9 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                     resolve: {
                         customer: function () {
                             return $scope.customerInfo;
+                        },
+                        type: function () {
+                            return 'purchase'
                         }
                     }
                 });
@@ -2462,18 +2475,32 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         }
     }]);
 
-    app.controller('AddUserInfoCtrl', ['$scope', '$modalInstance', 'customer', 'AccountUser', 'toaster', 'AuthenticationService',
-        function ($scope, $modalInstance, customer, AccountUser, toaster, AuthenticationService) {
+    app.controller('AddUserInfoCtrl', ['$scope', '$modalInstance', 'customer', 'AccountUser', 'toaster', 'AuthenticationService', 'type',
+        function ($scope, $modalInstance, customer, AccountUser, toaster, AuthenticationService, type) {
         AuthenticationService.getAuthentication().success(function (data) {
             $scope.thisUser = data;
         });
 
+        var urlData, urlSaveData, uuData;
+        var params = {};
+        if (type === 'sale') {
+            params = {id : customer.id};
+            urlSaveData = 'addSaleUserToVendor';
+            urlData = 'findSaleUsers';
+            uuData = customer.id;
+        } else {
+            params = {uu : customer.myEnterprise.uu};
+            urlSaveData = 'addUserToVendor';
+            urlData = 'findUsers';
+            uuData = customer.myEnterprise.uu;
+        }
+
         $scope.checkboxes = {
             checked: false
         };
         $scope.loading = true;
         $scope.distribute = [];
-        AccountUser.findUsers({uu: customer.myEnterprise.uu}, null, function (data) {
+        AccountUser[urlData](params, null, function (data) {
             $scope.userinfos = data;
             var distribute = [];
             angular.forEach($scope.userinfos, function (user, index) {
@@ -2522,13 +2549,13 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         $scope.close = function (save) {
             var chooseResult = [];
             if (save) {
-                if (customer.myEnterprise.uu) {
+                if (uuData) {
                     angular.forEach($scope.userinfos, function (item, i) {
                         chooseResult.push(item);
                     });
                     if (chooseResult.length > 0) {
                         $scope.loading = true;
-                        AccountUser.addUserToVendor({uu: customer.myEnterprise.uu}, chooseResult, function (data) {
+                        AccountUser[urlSaveData](params, chooseResult, function (data) {
                             $scope.loading = false;
                             toaster.pop('success', '提示', '保存成功');
                             $modalInstance.close(false);
@@ -2551,7 +2578,21 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
     }]);
 
     // 转移权限
-    app.controller('TransferUserInfoCtrl', ['$scope', '$modalInstance', 'customer', 'AccountUser', 'toaster', 'AuthenticationService', function ($scope, $modalInstance, customer, AccountUser, toaster, AuthenticationService) {
+    app.controller('TransferUserInfoCtrl', ['$scope', '$modalInstance', 'customer', 'AccountUser', 'toaster', 'AuthenticationService', 'type', function ($scope, $modalInstance, customer, AccountUser, toaster, AuthenticationService, type) {
+        var urlData, urlSaveData, uuData;
+        var params = {};
+        if (type === 'sale') {
+            params = {id : customer.id};
+            urlSaveData = 'transferSaleUserToVendor';
+            urlData = 'findSaleUsers';
+            uuData = customer.vendorEnterprise.uu;
+        } else {
+            params = {uu : customer.myEnterprise.uu};
+            urlSaveData = 'transferUserToVendor';
+            urlData = 'findUsers';
+            uuData = customer.myEnterprise.uu;
+        }
+
         AuthenticationService.getAuthentication().success(function (data) {
             $scope.loading = false;
             $scope.thisUser = data;
@@ -2561,7 +2602,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         };
         $scope.loading = true;
         $scope.transfer = [];
-        AccountUser.findUsers({uu: customer.myEnterprise.uu}, {}, function (data) {
+        AccountUser[urlData](params, {}, function (data) {
             $scope.userinfos = data;
             var transfer = [];
             angular.forEach($scope.userinfos, function (user, index) {
@@ -2638,7 +2679,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         $scope.close = function (save) {
             var chooseResult = [];
             if (save) {
-                if (customer.myEnterprise.uu) {
+                if (uuData) {
                     // 当前用户是管理员时
                     if ($scope.thisUser.sys) {
                         angular.forEach($scope.userinfos, function (item, i) {
@@ -2646,7 +2687,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                         });
                         if (chooseResult.length > 0) {
                             $scope.loading = true;
-                            AccountUser.transferUserToVendor({uu: customer.myEnterprise.uu}, chooseResult, function (data) {
+                            AccountUser[urlSaveData](params, chooseResult, function (data) {
                                 $scope.loading = false;
                                 toaster.pop('success', '提示', '保存成功');
                                 $modalInstance.close(false);
@@ -2659,6 +2700,10 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('error', '保存失败', "您未勾选任何记录");
                         }
                     } else {
+                        if(type === 'sale') {
+                            toaster.pop('info', '提示', "您没有权限转移对象");
+                            return
+                        }
                         // 非管理员转移自己的权限时
                         angular.forEach($scope.userinfos, function (item, i) {
                             if (item.transfer && item.userUU !== $scope.thisUser.userUU) {
@@ -2669,7 +2714,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                             toaster.pop('error', '保存失败', "您未选择权限转移对象");
                         } else {
                             $scope.loading = true;
-                            AccountUser.transferMyDistribute({custUU: customer.myEnterprise.uu, userUU: $scope.target.userUU}, {} ,function (data) {
+                            AccountUser.transferMyDistribute({custUU: uuData, userUU: $scope.target.userUU}, {} ,function (data) {
                                 $scope.loading = false;
                                 toaster.pop('success', '提示', '保存成功');
                                 $modalInstance.close(false);
@@ -9399,7 +9444,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
             var total = 0;
             if (check.items) {
                 angular.forEach(check.items, function (value) {
-                    total += value.qty;
+                    total += value.checkQty;
                 });
             }
             return total;
@@ -9424,7 +9469,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         BaseService.scrollBackToTop();
         var loadData = function () {
             FaArCheck.get({id: $stateParams.id}, function (data) {
-                $scope.order = data;
+                $scope.order = data.data;
                 $scope.loading = false;
             });
         };
@@ -9464,7 +9509,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
 
 
     //应收对账单列表
-    app.controller('PurchaseApCheckCtrl', ['$scope', 'FaApCheck', 'BaseService', 'ngTableParams', 'toaster', 'ReportService', 'Symbol', 'CurrentRole', function ($scope, FaApCheck, BaseService, ngTableParams, toaster, ReportService, Symbol, CurrentRole) {
+    app.controller('PurchaseApCheckCtrl', ['$scope', 'FaApCheck', 'BaseService', 'ngTableParams', 'toaster', 'ReportService', 'Symbol', 'CurrentRole', 'DecimalNumber', '$filter', '$state', function ($scope, FaApCheck, BaseService, ngTableParams, toaster, ReportService, Symbol, CurrentRole, DecimalNumber, $filter, $state) {
         BaseService.scrollBackToTop();
         // 获取当前用户是否为普通用户
         CurrentRole.isUser({}, {}, function (data) {
@@ -9473,7 +9518,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         $scope.dateZoneText = '不限';
         $scope.condition = {dateZone: 1};
         $scope.currency = Symbol.currency;//将币别转化为对应的符号
-        $scope.active = 'todo';
+        $scope.active = 'all';
 
         /* 时间筛选初始化*/
         var fromDate = new Date();
@@ -9504,6 +9549,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                     $scope.tableParams.reload();
                 else
                     $scope.tableParams.page(1);
+                $scope.showNotCheck = false
             }
         };
         $scope.changeDateZone = function (zone) {
@@ -9529,21 +9575,38 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                 $scope.loading = true;
                 var pageParams = params.url();
                 pageParams.searchFilter = { // 筛选条件
-                    keyword: $scope.keyword,
                     fromDate: getDateTime($scope.condition.dateFrom),
                     endDate: getDateTime($scope.condition.dateTo)
                 };
-                FaApCheck[getState($scope.active)](BaseService.parseParams(pageParams), function (page) {
-                    $scope.loading = false;
-                    if (page) {
-                        params.total(page.totalElement);
-                        $scope.data = $defer.resolve(page.content);
-                        $scope.searchFilterXls = angular.copy(pageParams.searchFilter);//保存当前取值的条件
-                    }
-                }, function (response) {
-                    $scope.loading = false;
-                    toaster.pop('error', '数据加载失败', response.data);
-                });
+                pageParams.keyword = $scope.keyword;
+                if ($scope.active === 'all') {
+                    pageParams.keyword = $scope.keyword
+                    FaApCheck.customer(BaseService.parseParams(pageParams), function (page) {
+                        $scope.loading = false;
+                        if (page) {
+                            params.total(page.totalElement);
+                            $defer.resolve(page.content);
+                        }
+                        $scope.ALLList = page.content
+                        $scope.totalCount = page.totalElement;
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '数据加载失败', response.data);
+                    });
+                } else {
+                    FaApCheck[getState($scope.active)](BaseService.parseParams(pageParams), function (page) {
+                        $scope.loading = false;
+                        if (page) {
+                            params.total(page.totalElement);
+                            $scope.data = $defer.resolve(page.content);
+
+                            $scope.searchFilterXls = angular.copy(pageParams.searchFilter);//保存当前取值的条件
+                        }
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '数据加载失败', response.data);
+                    });
+                }
             }
         });
 
@@ -9611,7 +9674,8 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         };
 
         // 搜索框回车
-        $scope.onSearch = function () {
+        $scope.onSearch = function (keyword) {
+            $scope.keyword = keyword;
             $scope.tableParams.page(1);
             $scope.tableParams.reload();
         };
@@ -9632,8 +9696,403 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                 toaster.pop('error', '数据加载失败', response.data);
             });
         }
+
+        $scope.data = [];// 列表数据
+
+        $scope.condition = {
+            $fromOpened: false
+        }
+
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            item[openParam] = !item[openParam];
+        }
+
+        // 客户联想词
+        $scope.getSimilarCustomers = function (value) {
+            if (value) {
+                return Vendor.getSimilarCustomers({keyword: value}).$promise.then(function (data) {
+                    return data.map(function (item) {
+                        return item;
+                    });
+                });
+            }
+        };
+
+        $scope.onAssociateCustomerClick = function (vendor) {
+            if (vendor.apcheck == 0) {
+                toaster.pop('info', '提示', '该客户暂未启用平台对账功能');
+                $scope.suuorname = '';
+            } else {
+                $scope.suuorname = vendor.custName;
+            }
+        }
+
+        //查找客户
+        $scope.searchCust = function (suuorname) {
+            var modalInstance = $modal.open({
+                animation: true,
+                templateUrl: 'static/tpl/index/fa/apcheck_customer.html',
+                controller: 'SearchCustInfoCtrl',
+                size: 'lg',
+                resolve: {
+                    suuorname: function () {
+                        return suuorname;
+                    }
+                }
+            });
+            modalInstance.result.then(function (customer) {
+                $scope.suuorname = customer.myEnterprise.enName;
+            });
+
+        }
+
+        $scope.showNotCheck = false
+        $scope.goToMNs = function(item) {
+            $scope.chooseItem = item;
+            $scope.showNotCheck = true
+            $scope.suuorname = item.myEnterprise.enName
+            this.searchOrder()
+        }
+
+        // 点击筛选根据条件选择数据
+        // 默认本月
+        $scope.sdateTo = new Date();
+        $scope.sdateFrom = new Date($scope.sdateTo.getFullYear(), $scope.sdateTo.getMonth(), 1);
+        $scope.thisMouth = $scope.sdateTo.getFullYear() +'-'+ ($scope.sdateTo.getMonth())
+        $scope.condition.uuorname = '';
+        // $scope.condition.dateFrom = '';
+        // $scope.condition.dateTo = '';
+        $scope.condition.venduuorname = '';
+        $scope.condition.factory = '';
+        $scope.condition.prodtitle = '';
+        $scope.condition.prodspec = '';
+
+        $scope.searchOrder = function (check) {
+            $scope.data = [];
+            $scope.checkboxes.checked = false;
+            $scope.totalMoney = 0;
+            $scope.condition.uuorname = $scope.suuorname;
+            $scope.condition.factory = $scope.factory
+            $scope.condition.prodtitle = $scope.prodtitle;
+            $scope.condition.prodspec = $scope.prodspec;
+            // $scope.condition.dateFrom = ($scope.sdateFrom || 0);
+            $scope.thisdatato = ($scope.sdateTo || 0);
+            if ($scope.thisdatato != 0) {
+                $scope.condition.dateTo = (new Date($scope.thisdatato.valueOf()) || 0);
+            } else {
+                $scope.condition.dateTo = ($scope.sdateTo || 0);
+            }
+            $scope.condition.venduuorname = $scope.vuuorname;
+            if ($scope.condition.dateTo != null || $scope.keywordXls != null) {
+
+                // $scope.fromDate = $scope.condition.dateFrom ? $scope.condition.dateFrom.getTime() : null;
+                // $scope.endDate = $scope.condition.dateTo ? $scope.condition.dateTo.getTime() : null;
+                $scope.searchKeyWord = {
+                    receiveName: $scope.receiveName,
+                    factory: $scope.factory,
+                    prodTitle: $scope.prodTitle,
+                    prodSpec: $scope.prodSpec,
+                    taxRate: $scope.taxRate,
+                    suuorname: $scope.suuorname
+                }
+                $scope.exportKeywords = encodeURIComponent($scope.searchKeyWord);
+                // $scope.fromDateXls = angular.copy($scope.condition.dateFrom ? $scope.condition.dateFrom.getTime() : null);//保存当前取值的起始日期
+                // $scope.endDateXls = angular.copy($scope.condition.dateTo ? $scope.condition.dateTo.getTime() : null);//保存当前取值的截止日期
+                // if (!$scope.suuorname) {
+                //     toaster.pop('warning', '提示', '请先选择客户');
+                //     document.getElementById('suuorname').focus();//光标默认在客户
+                // } else {
+                    $scope.loading = true;
+                    FaApCheck.getAllByKeywords({
+                        // fromDate: $scope.fromDate,
+                        // endDate: $scope.endDate,
+                        receiveName: $scope.receiveName,
+                        factory: $scope.factory,
+                        prodTitle: $scope.prodTitle,
+                        prodSpec: $scope.prodSpec,
+                        taxRate: $scope.taxRate,
+                        checkDate: $scope.thisMouth,
+                        suuorname: $scope.suuorname
+                    }, function (data) {
+                        if (data.length > 0) {
+                            angular.forEach(data, function (item) {
+                                item.$selected = true;
+                            });
+                            $scope.data = data;
+                            $scope.checkboxes.checked = true;
+                            $scope.getTotalMoney();
+                        } else {
+                            toaster.pop('info', '提示', '当前没有需要对账记录');
+                        }
+                        $scope.loading = false;
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '提示', response.data);
+                    });
+                // }
+            }
+
+        }
+
+        $scope.exportApcheckList = function() {
+            var url = 'sale/apCheck/xls?fromDate=' + $scope.fromDate + '&endDate=' + $scope.endDate;
+            if (angular.isDefined($scope.receiveName)) {
+                url = url + '&receiveName=' + $scope.receiveName;
+            }
+            if (angular.isDefined($scope.factory)) {
+                url = url + '&factory=' + $scope.factory;
+            }
+            if (angular.isDefined($scope.prodTitle)) {
+                url = url + '&prodTitle=' + $scope.prodTitle;
+            }
+            if (angular.isDefined($scope.prodSpec)) {
+                url = url + '&prodSpec=' + $scope.prodSpec;
+            }
+            if (angular.isDefined($scope.suuorname)) {
+                url = url + '&suuorname=' + $scope.suuorname;
+            }
+            if (angular.isDefined($scope.taxRate)) {
+                url = url + '&receiveName=' + $scope.taxRate;
+            }
+            window.location.href = url;
+        }
+
+        /**
+         * 点击勾选框,选中要转应收对账单的订单
+         * */
+        $scope.totalMoney = 0;
+        $scope.checkboxes = {
+            checked: false
+        };
+
+        // 点击勾选全部的复选框
+        $scope.checkAll = function () {
+            $scope.totalMoney = 0;
+            $scope.filteredData = $filter('filter')($scope.data, $scope.condition.prodtitle || $scope.condition.uuorname || $scope.condition.venduuorname || $scope.condition.prodspec || $scope.condition.factory);
+            // var dateFrom = $scope.condition.dateFrom;
+            // var dateTo = $scope.condition.dateTo;
+            angular.forEach($scope.filteredData, function (item) {
+                // if ((item.pidate >= dateFrom || dateFrom == '') && (item.pidate < dateTo || dateTo == '')) {
+                    item.$selected = $scope.checkboxes.checked;
+                // }
+            });
+            $scope.getTotalMoney();
+        };
+
+        //获取已选单据总金额
+        $scope.getTotalMoney = function () {
+            $scope.totalMoney = 0;
+            angular.forEach($scope.data, function (check) {
+                if (check.$selected) {
+                    var price = DecimalNumber.accMul((check.thischeckqty || 0), (check.orderprice || 0));
+                    $scope.totalMoney += Math.round(price * 100) / 100;
+                } else {
+                    $scope.totalMoney += 0;
+                }
+            });
+
+        }
+
+        // 点击其中一个明细的复选框
+        $scope.checkOne = function (check) {
+            var result = true;
+            angular.forEach($scope.data, function (item) {
+                if (item.$selected != true) {
+                    result = false;
+                    return;
+                }
+            });
+            $scope.checkboxes.checked = result;
+        };
+
+        $scope.haveSelected = false;
+
+        //生成应收对账单
+        $scope.createApCheck = function () {
+            //保存应收对账单主记录字段
+            $scope.apCheck = {
+                custUu: '',
+                custName: '',
+                enUu: '',
+                apDate: '',
+                beginDate: '',
+                endDate: '',
+                checkStatus: '未对账',
+                checkAmount: 0,
+                currency: '',
+                rate: '',
+                items: [],
+                taxrate: ''
+            };
+            //保存来源单据相关信息
+            var sourceInfos = [];
+
+
+            //所允许的本次对账最大最小数量
+            $scope.data.maxThisCheckQty = 0;
+            $scope.data.minThisCheckQty = 0;
+
+            $scope.sameCust = true;
+            $scope.validQty = true;
+            $scope.loading = true;
+
+            angular.forEach($scope.data, function (check) {
+                //保存应收对账单明细行数据
+                $scope.item = {
+                    inoutno: '',
+                    inoutnodetno: '',
+                    orderCode: '',
+                    orderClass: '',
+                    orderDetno: '',
+                    price: '',
+                    checkQty: '',
+                    amount: '',
+                    sourceId: '',
+                    sourceTable: '',
+                    oldYCheckQty: '',
+                    status: 0,
+                    receiveCode: '',
+                    receiveName: '',
+                    prodCode: '',
+                    prodTitle: '',
+                    prodUnit: '',
+                    prodSpec: '',
+                    taxrate: '',
+                    sendcode: '',
+                    whname: '',
+                    custUserUU: ''
+                };
+
+                //应收对账单明细行来源表信息
+                $scope.sourceInfo = {
+                    sourceId: '',
+                    sourceTable: '',
+                    newYCheckQty: ''
+                };
+
+                //此次对账后新的已转数
+                $scope.newYCheckQty = 0;
+                if (check.$selected == true) {
+                    $scope.apCheck.custName = check.custname;
+                    $scope.apCheck.enUu = check.enuu;
+                    $scope.apCheck.checkAmount += (check.thischeckqty || 0) * (check.orderprice || 0);
+                    $scope.apCheck.apDate = check.pidate;
+                    $scope.apCheck.rate = check.rate;
+
+                    //必须是同一家客户才能生成对账单,否则提示错误
+                    if ($scope.apCheck.custUu == '') {
+                        $scope.apCheck.custUu = check.custuu;
+                    } else if ($scope.apCheck.custUu !== check.custuu) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择同一家客户');
+                    }
+
+                    //必须是相同币别才能生成对账单,否则提示错误
+                    if ($scope.apCheck.currency == '') {
+                        $scope.apCheck.currency = check.currency;
+                    } else if ($scope.apCheck.currency !== check.currency) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择同一种币别');
+                    }
+
+                    //必须是相同税率才能生成对账单,否则提示错误
+                    if (!angular.isNumber($scope.apCheck.taxrate)) {
+                        $scope.apCheck.taxrate = check.taxrate;
+                    } else if ($scope.apCheck.taxrate != check.taxrate) {
+                        $scope.sameCust = false;
+                        $scope.loading = false;
+                        toaster.pop('error', '请选择相同的税率');
+                    }
+
+                    //本次对账数量必须小于总对账数量
+                    if (check.qty > 0) {
+                        $scope.data.maxThisCheckQty = check.qty;
+                        $scope.data.minThisCheckQty = 0;
+                        if (check.qty - (check.ycheckqty || 0) < check.thischeckqty || check.thischeckqty < 0 || check.thischeckqty == 0) {
+                            $scope.validQty = false;
+                            $scope.loading = false;
+                            toaster.pop('error', '本次对账数量,填写有误!');
+                        }
+                    } else if (check.qty < 0) {
+                        $scope.data.maxThisCheckQty = 0;
+                        $scope.data.minThisCheckQty = check.qty;
+                        if (((-check.qty) - (-check.ycheckqty) < (-check.thischeckqty)) || check.thischeckqty > 0 || check.thischeckqty == 0) {
+                            $scope.validQty = false;
+                            $scope.loading = false;
+                            toaster.pop('error', '本次对账数量,填写有误!');
+                        }
+                    }
+
+                    //获取筛选时间的开始时间为对账的开始时间
+                    $scope.apCheck.beginDate = $scope.fromDate;
+
+                    //获取筛选的截止时间为对账的截止时间
+                    $scope.apCheck.endDate = $scope.endDate;
+
+                    //应收对账单明细行数据
+                    $scope.item.orderCode = check.ordercode;
+                    $scope.item.orderClass = check.piclass;
+                    $scope.item.orderDetno = check.orderdetno;
+                    $scope.item.price = check.orderprice;
+                    $scope.item.checkQty = check.thischeckqty;
+                    $scope.item.amount = (check.thischeckqty || 0) * (check.orderprice || 0);
+                    $scope.item.sourceId = check.sourceid;
+                    $scope.item.sourceTable = check.sourcetable;
+                    $scope.item.oldYCheckQty = check.ycheckqty;
+                    $scope.item.prodCode = check.prodcode;
+                    $scope.item.prodTitle = check.prodtitle;
+                    $scope.item.prodSpec = check.prodspec;
+                    $scope.item.prodUnit = check.produnit;
+                    $scope.item.inoutno = check.inoutno;
+                    $scope.item.inoutnodetno = check.detno;
+                    $scope.item.taxrate = check.taxrate;
+                    $scope.item.receiveCode = check.receivecode;
+                    $scope.item.receiveName = check.receivename;
+                    $scope.item.sendcode = check.sendcode;
+                    $scope.item.whname = check.whname;
+                    $scope.item.custUserUU = check.custuseruu;
+
+                    //来源表相关信息
+                    $scope.sourceInfo.sourceid = check.sourceid;
+                    $scope.sourceInfo.sourcetable = check.sourcetable;
+                    $scope.sourceInfo.newYCheckQty = ((check.ycheckqty || 0) + check.thischeckqty);
+
+                    sourceInfos.push($scope.sourceInfo);
+                    $scope.apCheck.items.push($scope.item);
+                    $scope.haveSelected = true;
+                }
+            });
+
+            //保存生成的应收对账单
+            $scope.saveApCheck = function () {
+                if ($scope.apCheck.items.length == 0) {
+                    $scope.loading = false;
+                    toaster.pop('error', '请先选择需要对账的数据');
+                } else {
+                    FaApCheck.saveApCheck({}, $scope.apCheck, function (data) {
+                        $scope.loading = false;
+                        toaster.pop('success', '成功', '生成应收对账成功');
+                        $state.go('fa.apCheck_detail', {id: data.id}, {reload: true});
+                    }, function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', '生成对账单失败', response.data);
+                    })
+                }
+            };
+
+            //如果是同一家客户,生成对账单的同时,关闭模态框
+            if ($scope.sameCust && $scope.validQty) {
+                $scope.saveApCheck();
+            }
+        }
+
     }]);
 
+
     //应收对账单详情
     app.controller('PurchaseApCheckDetailCtrl', ['$scope', 'toaster', 'FaApCheck', '$stateParams', 'BaseService', 'CurrentRole', function ($scope, toaster, FaApCheck, $stateParams, BaseService, CurrentRole) {
         BaseService.scrollBackToTop();
@@ -14175,6 +14634,9 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                     resolve: {
                         customer: function () {
                             return customer;
+                        },
+                        type: function () {
+                            return 'purchase'
                         }
                     }
                 });
@@ -14278,7 +14740,125 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
         $scope.purcByEn = function (businessCode) {
             $rootScope.businessCode = businessCode;
             window.location.hash = "#/purc/addOrder";
-        }
+        };
+
+        // 分配用户
+        $scope.addUserInfo = function (customer) {
+            var modalInstance = $modal.open({
+                animation: true,
+                templateUrl: 'static/tpl/index/account/add_userInfo.html',
+                controller: 'AddUserInfoCtrl',
+                resolve: {
+                    customer: function () {
+                        return customer;
+                    },
+                    type: function () {
+                        return 'sale'
+                    }
+                }
+            });
+            modalInstance.result.then(function (changed, checked) {
+                if (changed) {
+                    if (checked)
+                        $scope.newUser.roles = checked;
+                    else
+                        loadUsers();
+                }
+                $scope.customerParams.reload();
+            });
+            // if (!$scope.enabled) {
+            //     toaster.pop('error', '您没有为当前客户分配用户的权限!');
+            //     return;
+            // }
+            // 获取当前用户在当前企业是否被转移权限
+            // AccountUser.getEnTransfer({custUU: customer.myEnterprise.uu}, function (data) {
+            //     customer.enTransfer = data.result;
+            //     //是管理员,或者被转移了权限时
+            //     if ($scope.enabled || customer.enTransfer) {
+            //         var modalInstance = $modal.open({
+            //             animation: true,
+            //             templateUrl: 'static/tpl/index/account/add_userInfo.html',
+            //             controller: 'AddUserInfoCtrl',
+            //             resolve: {
+            //                 customer: function () {
+            //                     return customer;
+            //                 }
+            //             }
+            //         });
+            //         modalInstance.result.then(function (changed, checked) {
+            //             if (changed) {
+            //                 if (checked)
+            //                     $scope.newUser.roles = checked;
+            //                 else
+            //                     loadUsers();
+            //             }
+            //             $scope.customerParams.reload();
+            //         });
+            //     } else {
+            //         toaster.pop('error', '您没有为当前客户分配用户的权限!');
+            //     }
+            // });
+        };
+
+        // 转移权限
+        $scope.transferUserInfo = function (customer) {
+            var modalInstance = $modal.open({
+                animation: true,
+                templateUrl: 'static/tpl/index/account/transfer_userInfo.html',
+                controller: 'TransferUserInfoCtrl',
+                resolve: {
+                    customer: function () {
+                        return customer;
+                    },
+                    type: function () {
+                        return 'sale'
+                    }
+                }
+            });
+            modalInstance.result.then(function (changed, checked) {
+                if (changed) {
+                    if (checked)
+                        $scope.newUser.roles = checked;
+                    else
+                        loadUsers();
+                }
+                $scope.customerParams.reload();
+            });
+
+            // customer.enDistribute = null;
+            // if (!$scope.enabled) {
+            //     toaster.pop('error', '您没有转移当前客户权限的权限!');
+            //     return;
+            // }
+            // 获取当前用户在当前企业是否被转移权限
+            // AccountUser.getDistribute ({custUU: customer.myEnterprise.uu}, function(data) {
+            //     customer.enDistribute = data.result;
+            //     //是管理员,或者被分配时
+            //     if ($scope.enabled || customer.enDistribute) {
+            //         var modalInstance = $modal.open({
+            //             animation: true,
+            //             templateUrl: 'static/tpl/index/account/transfer_userInfo.html',
+            //             controller: 'TransferUserInfoCtrl',
+            //             resolve: {
+            //                 customer: function () {
+            //                     return customer;
+            //                 }
+            //             }
+            //         });
+            //         modalInstance.result.then(function (changed, checked) {
+            //             if (changed) {
+            //                 if (checked)
+            //                     $scope.newUser.roles = checked;
+            //                 else
+            //                     loadUsers();
+            //             }
+            //             $scope.customerParams.reload();
+            //         });
+            //     } else {
+            //         toaster.pop('error', '您没有转移当前客户权限的权限!');
+            //     }
+            // });
+        };
 
     }]);
 
@@ -15167,7 +15747,7 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
                 $scope.loading = true;
                 var pageParams = params.url();
                 pageParams.keyword = $scope.keyword;
-                VendorService.customer.get(BaseService.parseParams(pageParams), function (page) {
+                FaApCheck.customer(BaseService.parseParams(pageParams), function (page) {
                     $scope.loading = false;
                     if (page) {
                         params.total(page.totalElement);

+ 4 - 2
src/main/webapp/resources/js/index/main.js

@@ -20,7 +20,8 @@ require.config({
 		'ngSanitize': 'lib/angular/angular-sanitize.min',
 		'jquery' : 'lib/jquery/jquery.min',
 		'big' : 'lib/decimal/big.min',
-		'angularTreeview' : 'lib/treeview/js/angular.treeview'
+		'angularTreeview' : 'lib/treeview/js/angular.treeview',
+        'wui.date' : 'lib/wui/wui-date'
 	},
 	shim : {
 		'angular' : {
@@ -40,7 +41,8 @@ require.config({
 			'exports' : 'ngTable',
 			'deps' : [ 'angular' ]
 		},
-		'angularTreeview' : ['angular']
+		'angularTreeview' : ['angular'],
+        'wui.date' : ['angular']
 	}
 });
 require([ 'app/app' ], function(app) {

+ 4 - 0
src/main/webapp/resources/js/index/services/Fa.js

@@ -117,6 +117,10 @@ define([ 'ngResource'], function() {
 				method: 'GET',
 				isArray: true
 			},
+            customer: {
+                url: 'sale/apCheck/customer',
+                method: 'GET'
+            },
 			getAllCustomers: {
 				url: 'sale/apCheck/getAllCustomers',
 				method: 'GET',

+ 653 - 0
src/main/webapp/resources/lib/wui/wui-date.js

@@ -0,0 +1,653 @@
+angular.module('wui.date',[]).directive('wuiDate', function() {
+	return {
+		// Restrict to elements and attributes
+		restrict: 'EA',
+
+		// Assign the angular link function
+		compile: fieldCompile,
+
+		// Assign the angular directive template HTML
+		template: fieldTemplate,
+		// templateUrl: "pageTemplate.html",
+
+		// Assign the angular scope attribute formatting
+		scope: {
+			id: '@?', // 时间插件主键 默认scope.$id
+			name: '@?', // 绑定表单验证input的name属性
+			format: '@?', // 定义时间格式 默认yyyy-mm-dd
+			interval: '@?', // 定义time时间间隔 默认30minutes
+			placeholder: '@?', // 选择框提示语 默认 '选择时间'
+			position: '@?', // 定义选择框浮动位置 默认left
+			ngModel: '=', // 父scope绑定的时间的属性
+			btns: '@', // 按钮信息 空则不显示任何按钮
+			dateClass: '@?', // 自定义样式
+			width: '@?', // 输入框宽度 支持px及百分比
+			size: '@?' // 插件大小 默认为迷你型  large、L、l表示大型窗
+		}
+
+	};
+
+	function fieldCompile(scope, element, attr) {
+		return {
+			pre: function(scope, element, attr) {
+
+				scope.id = scope.id || 'date' + scope.$id; // 生成插件唯一id
+				var position = scope.position || 'left', // 面板浮动
+					iptWidth = parseInt(scope.width); // 输入框宽度
+					iptWidthU = scope.width?scope.width.search('%') == -1 ? 'px' : '%':null,
+					size = scope.size != 'large' && scope.size != 'l' && scope.size != 'L' ? 'small' : null;
+				angular.element(element).find('.wui-date').addClass('wui-date-' + scope.id);
+				if(scope.name != '' && typeof scope.name != 'undefined') {
+					angular.element(element).find('.wui-date input').attr('name', scope.name);
+				}
+				if(size) {
+					angular.element(element).find('.wui-date').addClass(size); // 大小
+				}
+				angular.element(element).find('.wui-date .wui-date-picker').addClass(position); // 面板添加浮动
+				scope.dateClass ? angular.element(element).find('.wui-date').addClass(scope.dateClass) : null; // 插件外部样式
+				iptWidth ? angular.element(element).find('.wui-date').css('width', iptWidth + iptWidthU) : null; // 输入框宽度
+			},
+			post: function(scope, element, attr) {
+				fieldLink(scope, element, attr);
+			}
+		}
+	}
+
+	function fieldLink(scope, element, attr) {
+		// 初始化
+		var GMTDate, // GMT格式时间
+			format = (scope.format || 'yyyy-mm-dd').toLowerCase(), // 时间格式
+			interval = parseInt(scope.interval) || 30, // time间隔
+			interval = (60 % interval === 0 || interval % 60 === 0) && interval <= 12 * 60 ? interval : 30,
+			placeholder = scope.placeholder || "选择时间",
+			maxYear = parseInt(new Date().getFullYear()) + 100, // 插件最大year
+			minYear = 1900, // 插件最小year
+			SPECIAL_DATE_RULES = ['至今'], // 特殊字符串规则
+			DATE_RULES = ['yyyy-mm-dd hh:mm:ss', 'yyyy-mm-dd hh:mm', 'yyyy-mm-dd', 'yyyy-mm']; // 内置的日期格式
+
+		// angular对象初始化
+		scope.date = {
+			year: '0000',
+			month: '00',
+			date: '00',
+			hours: '00',
+			minutes: '00',
+			seconds: '00',
+			dateList: [],
+			timeList: [],
+			yearList: {},
+			showPicker: false,
+			showTimePicker: false,
+			showTimeList: true,
+			showClearIcon: false,
+			selector: 1,
+			btns: scope.btns ? JSON.parse(scope.btns.replace(/'/g, '"')) : {}, // btns字符串转对象
+			showBtn: false,
+		};
+
+		// 初始化GMT时间
+		function GMTDateInit(date) {
+			date = dateFormat(date);
+			if(date) {
+				if(!SPECIAL_DATE_RULES.includes(date)) {
+					GMTDate = StrDateToGMT(date);
+				} else {
+					GMTDate = new Date();
+				}
+			} else {
+				GMTDate = new Date();
+			}
+		}
+
+		// 加载dom
+		function domBootstrap(format) {
+			if(Object.keys(scope.date.btns).length) {
+				scope.date.showBtn = true;
+			}
+			switch(format) {
+				case 'yyyy-mm-dd hh:mm:ss':
+				case 'yyyy-mm-dd hh:mm':
+					scope.date.showTimePicker = true; // 
+					scope.date.selector = 1;
+					angular.element(element).find('.wui-date .wui-date-picker').removeClass('no_timer');
+					break;
+				case 'yyyy-mm-dd':
+					scope.date.showTimePicker = false;
+					angular.element(element).find('.wui-date .wui-date-picker').addClass('no_timer');
+					scope.date.selector = 1;
+					break;
+				case 'yyyy-mm':
+					scope.date.showTimePicker = false;
+					scope.date.selector = 2;
+					angular.element(element).find('.wui-date .wui-date-picker').addClass('no_timer');
+					break;
+				default:
+					break;
+			}
+		}
+
+		// 时间格式化
+		function dateFormat(date) {
+			if(!date) {
+				return null;
+			}
+			if(SPECIAL_DATE_RULES.includes(date)) { // 特殊字符串
+				return date;
+			}
+			date = date.toString().replace(/[\D]/g, ""); // 清除时间除数字外字符
+			var len = format.replace(/\W/g, "").length; // 默认格式长度
+			var str = date.length >= len ? date.slice(0, len) : '';
+			if(date && str) {
+				switch(format) {
+					case 'yyyy-mm-dd hh:mm:ss':
+						date = str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5:$6");
+						break;
+					case 'yyyy-mm-dd hh:mm':
+						date = str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5");
+						break;
+					case 'yyyy-mm-dd':
+						date = str.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3");
+						break;
+					case 'yyyy-mm':
+						date = str.replace(/(\d{4})(\d{2})/, "$1-$2");
+						break;
+					default:
+						break;
+				}
+				return str !== date ? date : null; // 正则替换失败后返回原字符串  替换成功则 str != date 
+			}
+			return null;
+		}
+		// 字符串时间格式化为标准时间
+		function StrDateToGMT(date) {
+			if(date && new Date(date) != 'Invalid Date') {
+				return new Date(date);
+			}
+			return null;
+		}
+		// 标准时间格式化为字符串时间
+		function GMTToStrDate(date) {
+			date = new Date(date);
+			if(date && toString.call(date) == '[object Date]') {
+				return date.getFullYear() + '/' + getDoubleDigit(date.getMonth() + 1) + '/' + getDoubleDigit(date.getDate()) + ' ' + getDoubleDigit(date.getHours()) + ':' + getDoubleDigit(date.getMinutes()) + ':' + getDoubleDigit(date.getSeconds());
+			}
+			return null;
+		}
+		// 生成两位月、日
+		function getDoubleDigit(num) {
+			num = '0' + num;
+			return num.slice(-2);
+		}
+
+		// 显示的年月日时分秒数据 
+		function getAllDate() {
+			scope.date.year = GMTDate.getFullYear(); // 初始化年份
+			scope.date.month = getDoubleDigit(GMTDate.getMonth() + 1); // 两位月份
+			scope.date.day = getDoubleDigit(GMTDate.getDate()); // 两位日期
+			scope.date.hours = getDoubleDigit(GMTDate.getHours()); // 两位时
+			scope.date.minutes = getDoubleDigit(GMTDate.getMinutes()); // 两位分
+			scope.date.seconds = getDoubleDigit(GMTDate.getSeconds()); // 两位秒
+		}
+		// 生成日期数据
+		function getDateList(date) {
+			date = date || new Date();
+			if(date.getFullYear() <= maxYear && date.getFullYear() >= minYear) { // 判断年份上下限
+				// 初始化数据
+				var dateList = [], // 属性type:1 表示上月的日期 2表示当月日期 3表示下月日期, 属性date:当天是几号
+					weekOfFirstDay, // 当月第一天是周几
+					endDayOfMonth, // 当前月份最后一天
+					endDayOfLastMonth, // 上月最后一天
+					modelDate = StrDateToGMT(scope.ngModel);
+
+				getAllDate();
+
+				weekOfFirstDay = new Date(scope.date.year, scope.date.month - 1, 1).getDay();
+				endDayOfMonth = new Date(scope.date.year, scope.date.month, 0).getDate();
+				endDayOfLastMonth = new Date(scope.date.year, scope.date.month - 1, 0).getDate();
+
+				// 当月日期列表
+				for(var i = 1; i <= endDayOfMonth; i++) {
+					// 面板显示日期与输入框日期相同返回 true
+					if(modelDate) {
+						var condition1 = modelDate.getFullYear() == scope.date.year && (modelDate.getMonth() + 1) == scope.date.month && modelDate.getDate() == i;
+					}
+					// 面板日期为系统当天日期返回 true
+					var condition2 = new Date().getFullYear() == GMTDate.getFullYear() && new Date().getMonth() == GMTDate.getMonth() && new Date().getDate() == i;
+					var dateObj = {
+						'type': 2,
+						'date': i
+					};
+					if(condition1) {
+						dateObj.current = true; // currently picked
+					}
+					if(condition2) {
+						dateObj.today = true; // today
+					}
+					dateList.push(dateObj);
+				}
+
+				// 根据week生成填充上月日期
+				var prevLen = 0; // the length of prev month day
+				prevLen = weekOfFirstDay || 7;
+				for(var j = 0; j < prevLen; j++) {
+					dateList.unshift({
+						'type': 1,
+						'date': endDayOfLastMonth--
+					});
+				}
+
+				// 每个面板最多显示42天  计算剩余下月显示的天数
+				var nextLen = 42 - prevLen - endDayOfMonth;
+				for(var k = 1; k <= nextLen; k++) {
+					dateList.push({
+						'type': 3,
+						'date': k
+					});
+				}
+
+				// 按每行显示7天分割数组
+				var count = 0,
+					arr = [],
+					resList = [];
+				for(var l = 0; l < dateList.length; l++) {
+					count++;
+					arr.push(dateList[l]);
+					if(count >= 7) {
+						resList.push(arr);
+						count = 0;
+						arr = [];
+					}
+				}
+				return resList;
+			}
+		}
+
+		// 生成时间选择列表数据
+		function createTimeList() {
+			var h = 8,
+				m = 0,
+				resList = [{
+					'time': '08:00'
+				}];
+			// fill time list
+			for(var i = 1; i < 24 * 60 / interval; i++) {
+				m = m + interval;
+				if(m >= 60) {
+					h = h + (m / 60);
+					m = 0;
+				}
+				if(h >= 24) {
+					h = h - 24;
+				}
+				var timeObj = {
+					'time': getDoubleDigit(h) + ":" + getDoubleDigit(m)
+				};
+				resList.push(timeObj);
+			}
+			return resList;
+		}
+
+		// 生成年份选择列表数据
+		function createYearList(year) {
+			year = parseInt(year) || GMTDate.getFullYear();
+			if(year) {
+				var yearList = {};
+				yearList.startYear = year;
+				yearList.endYear = yearList.startYear + 10;
+				yearList.y1 = [];
+				yearList.y2 = [];
+				yearList.y3 = [];
+
+				for(var i = 0; i < 4; i++) {
+					yearList.y1.push(year + i);
+					yearList.y2.push(year + i + 4);
+					if(yearList.y3.length <= 2) {
+						yearList.y3.push(year + i + 8);
+					}
+				}
+				return yearList;
+			}
+			return null;
+		}
+
+		// 输出时间
+		function outputDate() {
+			scope.ngModel = dateFormat(GMTToStrDate(GMTDate));
+		}
+
+		// 点击某天关闭弹窗的规则
+		var DATE_PICK_CLOSE = (format == DATE_RULES[2]);
+
+		// Pick Date
+		scope.pickDate = function(item, e) {
+			if(item.type == 2) {
+				GMTDate.setDate(item.date);
+				if(DATE_PICK_CLOSE) {
+					scope.date.showPicker = false;
+				}
+			} else if(item.type == 1) {
+				GMTDate.setDate(item.date);
+				GMTDate.setMonth(scope.date.month - 2);
+			} else if(item.type == 3) {
+				GMTDate.setDate(item.date);
+				GMTDate.setMonth(scope.date.month);
+			}
+			outputDate();
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+		}
+
+		// Pick Time
+		scope.pickTime = function(time) {
+			GMTDate.setHours(time.slice(0, 2));
+			GMTDate.setMinutes(time.slice(3, 5));
+			outputDate();
+			getAllDate();
+		}
+
+		// Prev Year
+		scope.prevYear = function() {
+			var y = scope.date.year - 1;
+			if(y >= minYear) {
+				GMTDate.setFullYear(y);
+				scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+			}
+		}
+
+		// Next Year
+		scope.nextYear = function() {
+			var y = scope.date.year + 1;
+			if(y <= maxYear) {
+				GMTDate.setFullYear(y);
+				scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+			}
+		}
+
+		// Prev Year
+		scope.prevYearByMonth = function() {
+			var y = scope.date.year - 1;
+			if(y >= minYear) {
+				GMTDate.setFullYear(y);
+				getAllDate();
+			}
+		}
+
+		// Next Year
+		scope.nextYearByMonth = function() {
+			var y = scope.date.year + 1;
+			if(y <= maxYear) {
+				GMTDate.setFullYear(y);
+				getAllDate();
+			}
+		}
+
+		// Prev Month
+		scope.prevMonth = function() {
+			var m = scope.date.month - 2;
+			GMTDate.setMonth(m);
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+		}
+
+		// Next Month
+		scope.nextMonth = function() {
+			var m = scope.date.month;
+			GMTDate.setMonth(m);
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+		}
+
+		// 打开年份选择列表
+		scope.openYearPicker = function(year) {
+			scope.date.selector = 3;
+			scope.date.yearList = createYearList(year);
+		}
+
+		// Pick Year
+		scope.selectYear = function(year) {
+			GMTDate.setFullYear(year);
+			scope.date.selector = 2;
+			getAllDate();
+			outputDate();
+		}
+
+		scope.pickPrevYear = function() {
+			var year = scope.date.yearList.startYear - 11;
+			if(year >= minYear) {
+				scope.openYearPicker(year);
+			}
+		}
+
+		scope.pickNextYear = function() {
+			var year = scope.date.yearList.startYear + 11;
+			if(year <= maxYear) {
+				scope.openYearPicker(year);
+			}
+		}
+
+		// 打开月份选择列表
+		scope.openMonthPicker = function() {
+			scope.date.selector = 2;
+		}
+
+		// 点击某月关闭弹窗的规则
+		var MONTH_PICK_CLOSE = (format == DATE_RULES[3]);
+
+		// Select Month
+		scope.selectMonth = function(m) {
+			GMTDate.setMonth(m - 1);
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+			scope.date.selector = 1;
+			outputDate();
+			if(MONTH_PICK_CLOSE) {
+				scope.date.showPicker = false;
+			}
+		}
+
+		// 选择至今
+		scope.hitherto = function() {
+			scope.ngModel = '至今';
+			scope.date.showPicker = false;
+		}
+
+		// Picker open
+		scope.openPicker = function() {
+			domBootstrap(format); // 打开日期面板更新样式
+			angular.element(".wui-date .wui-date-picker").hide();
+			angular.element(".wui-date-" + scope.id + " .wui-date-picker").show();
+			GMTDateInit(scope.ngModel);
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+			scope.date.showPicker = true;
+		}
+
+		// 确定按钮
+		scope.confirm = function() {
+			outputDate();
+			scope.date.showPicker = false;
+		}
+
+		// 此刻按钮
+		scope.moment = function() {
+			GMTDate = new Date();
+			outputDate();
+			scope.date.showPicker = false;
+		}
+
+		// 格式化input的date
+		scope.checkDateFormat = function() {
+			scope.ngModel = dateFormat(scope.ngModel);
+		}
+
+		// date init
+		scope.dateInit = function() {
+			domBootstrap(format);
+			GMTDateInit(scope.ngModel);
+			scope.date.dateList = getDateList(GMTDate); // 生成年月日数据
+			scope.date.timeList = createTimeList();
+		}
+
+		scope.$watch('date.showPicker', function() {
+			if(scope.date.showPicker) {
+				scope.dateInit();
+			}
+		});
+
+		// Close by click blank
+		element.on('click', function(e) {
+			//阻止底层冒泡
+			e.stopPropagation();
+		});
+
+		angular.element('body').on('click', ':not(.wui-date)', function() {
+			angular.element(element).find('.wui-date-picker').hide();
+		});
+
+	}
+
+	function fieldTemplate(scope, element, attr) {
+		return(
+			'<div class="wui-date wui-date" ng-app="wui.date">' +
+			'<div class="wui-date-editor" ng-click="openPicker()">' +
+			'<input class="wui-input wui-input-block wui-date-input" type="text" placeholder="{{placeholder}}" ng-model="ngModel" autocomplete="off" ng-blur=checkDateFormat()>' +
+			'<i class="iconfont icon1">&#xe807;</i>' +
+			'</div>' +
+			'<br/>' +
+			'<div class="wui-date-picker" ng-show="date.showPicker">' +
+			'<div class="wui-date-picker_body">' +
+			'<div class="wui-date-picker_panel" ng-show="date.selector == 1">' +
+			'<div class="wui-date-panel_header">' +
+			'<i class="iconfont" ng-click="prevYear()">&#xe809;</i>' +
+			'<i class="iconfont" ng-click="prevMonth()">&#xe808;</i>' +
+			'<span class="title">' +
+			'<span class="txt" ng-click="openYearPicker()"><span>{{date.year}}</span> 年 </span>' +
+			'<span class="txt" ng-click="openMonthPicker()"><span>{{date.month}}</span> 月</span>' +
+			'</span>' +
+			'<i class="iconfont" ng-click="nextMonth()">&#xe886;</i>' +
+			'<i class="iconfont" ng-click="nextYear()">&#xe640;</i>' +
+			'</div>' +
+			'<div class="wui-date-picker_content">' +
+			'<table class="wui-data-table">' +
+			'<tr>' +
+			'<th>日</th>' +
+			'<th>一</th>' +
+			'<th>二</th>' +
+			'<th>三</th>' +
+			'<th>四</th>' +
+			'<th>五</th>' +
+			'<th>六</th>' +
+			'</tr>' +
+			'<tr ng-repeat="item in date.dateList track by $index">' +
+			'<td ng-repeat="subItem in date.dateList[$index]"><div ng-class="{&apos;prev-date&apos;:subItem.type==1,&apos;date&apos;:subItem.type==2,&apos;next-date&apos;:subItem.type==3}"><span ng-click="pickDate(subItem,$event)" ng-class="{&apos;today&apos;:subItem.today,&apos;current&apos;:subItem.current}">{{subItem.date}}</span></div></td>' +
+			'</tr>' +
+			'</table>' +
+			'</div>' +
+			'</div>' +
+			'<div class="wui-date-picker_panel month_panel" ng-show="date.selector == 2">' +
+			'<div class="wui-date-panel_header">' +
+			'<i class="iconfont" ng-click="prevYearByMonth()">&#xe809;</i>' +
+			'<span class="title">' +
+			'<span class="txt" ng-click="openYearPicker()"><span>{{date.year}}</span> 年</span>' +
+			'</span>' +
+			'<i class="iconfont" ng-click="nextYearByMonth()">&#xe640;</i>' +
+			'</div>	' +
+			'<div class="wui-date-picker_content">' +
+			'<table class="wui-data-table">' +
+			'<tr>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(1)">一月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(2)">二月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(3)">三月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(4)">四月</a>' +
+			'</td>' +
+			'</tr>' +
+			'<tr>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(5)">五月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(6)">六月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(7)">七月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(8)">八月</a>' +
+			'</td>' +
+			'</tr>' +
+			'<tr>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(9)">九月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(10)">十月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(11)">十一月</a>' +
+			'</td>' +
+			'<td>' +
+			'<a class="cell" ng-click="selectMonth(12)">十二月</a>' +
+			'</td>' +
+			'</tr>' +
+			'</table>' +
+			'</div>	' +
+			'</div>' +
+			'<div class="wui-date-picker_panel year_panel" ng-show="date.selector == 3 ">' +
+			'<div class="wui-date-panel_header">' +
+			'<i class="iconfont" ng-click="pickPrevYear()">&#xe809;</i>' +
+			'<span class="title">' +
+			'<span class="txt"><span>{{date.yearList.startYear}}</span> 年 - <span>{{date.yearList.endYear}}</span> 年</span>' +
+			'</span>' +
+			'<i class="iconfont" ng-click="pickNextYear()">&#xe640;</i>' +
+			'</div>' +
+			'<div class="wui-date-picker_content">' +
+			'<table class="wui-data-table">' +
+			'<tr>' +
+			'<td ng-repeat="item in date.yearList.y1 track by $index">' +
+			'<a class="cell" ng-click="selectYear(item)">{{item}}</a>' +
+			'</td>' +
+			'</tr>' +
+			'<tr>' +
+			'<td ng-repeat="item in date.yearList.y2 track by $index">' +
+			'<a class="cell" ng-click="selectYear(item)">{{item}}</a>' +
+			'</td>' +
+			'</tr>' +
+			'<tr>' +
+			'<td ng-repeat="item in date.yearList.y3 track by $index">' +
+			'<a class="cell" ng-click="selectYear(item)">{{item}}</a>' +
+			'</td>' +
+			'</tr>' +
+			'</table>' +
+			'</div>' +
+			'</div>' +
+			'<div class="wui-date-picker_aside" ng-show="date.showTimePicker">' +
+			'<div class="wui-date-aside_header">' +
+			'<div class="wui-select wui-select-block time-select" id="time">' +
+			'<div class="wui-select-selection time-selection">' +
+			'<input type="hidden" name="" value="" >' +
+			'<span class="wui-select-icon iconfont time-icon">&#xe887;</span>' +
+			'<span class="wui-select-placeholder placeholder">{{date.hours}}:{{date.minutes}}</span>' +
+			'<span class="wui-select-selected-value value"></span>' +
+			'</div>' +
+			'<div class="wui-select-menu time-menu" ng-show="date.showTimeList">' +
+			'<ul>' +
+			'<li class="wui-select-item time-menu-item" ng-repeat="item in date.timeList" ng-click="pickTime(item.time)">{{item.time}}</li>' +
+			'</ul>' +
+			'</div>' +
+			'</div>' +
+			'</div>' +
+			'</div>' +
+			'</div>' +
+			'<div class="wui-date-picker_footer" ng-show="date.showBtn">' +
+			'<button type="button" class="wui-btn wui-btn-white wui-btn-xsmall" ng-click="moment()" ng-if="date.btns.now">{{date.btns.now}}</button>' +
+			'<button type="button" class="wui-btn wui-btn-primary wui-btn-xsmall" ng-click="confirm()" ng-if="date.btns.ok">{{date.btns.ok}}</button>' +
+			'<button type="button" class="wui-btn wui-btn-white wui-btn-xsmall" ng-click="hitherto()" ng-if="date.btns.hitherto">至今</button>' +
+			'</div>' +
+			'</div>' +
+			'</div>'
+		);
+	}
+
+});

+ 6 - 0
src/main/webapp/resources/tpl/index/account/add_userInfo.html

@@ -15,6 +15,12 @@
 		}
 	}
 </style>
+<div class="loading in" ng-class="{'in': loading}">
+	<!--<i></i>-->
+	<div class="wrap">
+		<div class="outer"></div>
+	</div>
+</div>
 <div class="modal-header">
 	<h3 class="modal-title">
 		客户分配

+ 6 - 0
src/main/webapp/resources/tpl/index/account/transfer_userInfo.html

@@ -15,6 +15,12 @@
 		}
 	}
 </style>
+<div class="loading in" ng-class="{'in': loading}">
+	<!--<i></i>-->
+	<div class="wrap">
+		<div class="outer"></div>
+	</div>
+</div>
 <div class="modal-header">
 	<h3 class="modal-title">
 		权限转移

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

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

+ 247 - 0
src/main/webapp/resources/tpl/index/fa/apChecknot.html

@@ -0,0 +1,247 @@
+<style>
+    .add-apCheckList {
+        background: #fff
+    }
+
+    .add-apCheckList input[type="checkbox"] {
+        /*width: 16px;
+        height: 16px*/
+    }
+
+    .add-apCheckList .table-wrap {
+        overflow: hidden
+    }
+
+    .add-apCheckList .table-header-wrap {
+        background: #f9f9f9;
+        overflow-x: hidden;
+        overflow-y: scroll;
+    }
+
+    .add-apCheckList .table-header-wrap table,.add-apCheckList .table-body-wrap table
+    {
+        width: 100%;
+        table-layout: fixed;
+        border-collapse: collapse;
+        border-spacing: 0;
+        margin-bottom: 0
+    }
+
+    .add-apCheckList .table-header-wrap th {
+        text-align: center;
+    }
+
+    .add-apCheckList .table-body-wrap {
+        max-height: 600px;
+        overflow-x: auto;
+        overflow-y: scroll;
+    }
+
+    .add-apCheckList td {
+        word-break: break-all;
+        text-align: center;
+    }
+
+    .add-apCheckList tbody {
+        overflow: auto;
+    }
+
+    #order-detail-list .input-sm {
+        border: #ccc 1px solid;
+    }
+
+    .has-feedback input[type="search"] {
+        padding-right: 0 !important;
+    }
+    .table>tbody>tr>td{
+        vertical-align: middle;
+    }
+    .form-horizontal .form-group-sm .control-label{
+        font-size: 14px;
+    }
+    .form-group .form-control{
+        font-size: 14px;
+    }
+    .wui-date.small .wui-date-picker {
+        width: 260px
+    }
+</style>
+<link rel="stylesheet" href="static/css/wui.min.css">
+<div>
+    <div class="add-apCheckList">
+        <div class="pub-com_head">
+            <span>新增对账单</span>
+            <div class="p-right"></div>
+        </div>
+        <form class="form-horizontal"
+              style="padding-top: 10px; padding-bottom: 20px;">
+            <div class="form-group form-group-sm form-group-inline">
+                <label class="col-sm-2 control-label">客&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;户:</label>
+                <div class="col-sm-6 control-label" style="text-align:left">
+                   优软商城公司
+                </div>
+                <label class="col-sm-2 control-label">请选择月份:</label>
+                <div class="col-sm-2" style="padding-right: 5px">
+                    <wui-date
+                            format="yyyy-mm"
+                            placeholder="请选择或输入日期"
+                            id="date4"
+                            btns="{'ok':'确定','now':'此刻'}"
+                            ng-model="date4"
+                    >
+                    </wui-date>
+                </div>
+            </div>
+            <div class="form-group form-group-sm form-group-inline">
+                <div class="col-sm-12 text-right">
+                    <a ng-click="condition.$open=!condition.$open" class="text-simple"><span
+                            ng-bind="condition.$open ? '收起筛选条件' : '更多筛选条件'"></span><i
+                            class="fa fa-fw"
+                            ng-class="{'fa-angle-up': condition.$open, 'fa-angle-down': !condition.$open}"></i></a>
+                    <div class="btn-group btn-group-sm">
+                        <a class="btn btn-default" ng-click="searchOrder()" title="筛选"><i class="fa fa-search fa-fw btn-icon-left"></i>筛选</a>
+                        <a class="btn btn-default" ng-click="createApCheck(check.$selected)" ng-disabled="!data || data.length==0"><i class="fa fa-check-circle-o fa-fw btn-icon-left"></i>对账</a>
+                        <a class="btn btn-default" ng-click="exportApcheckList()" title="导出Excel" ng-disabled="!data || data.length==0"><i class="fa fa-file-text fa-fw btn-icon-left"></i>导出</a>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group form-group-sm form-group-inline"
+                 ng-show="condition.$open">
+                <label class="col-sm-2 control-label">应付供应商:</label>
+                <div class="col-sm-4">
+                    <div class="form-group form-group-sm has-feedback">
+                        <input type="search" class="form-control input-sm"
+                               ng-model="receiveName" placeholder="可用应付供应商名称筛选" /><span
+                            class="form-control-feedback text-simple"><i
+                            class="fa fa-search"></i></span>
+                    </div>
+                </div>
+                <label class="col-sm-2 control-label">送货工厂:</label>
+                <div class="col-sm-4">
+                    <div class="form-group form-group-sm has-feedback">
+                        <input type="search" class="form-control input-sm"
+                               ng-model="factory" placeholder="请输入送货工厂名称" /><span
+                            class="form-control-feedback text-simple"><i
+                            class="fa fa-search"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group form-group-sm form-group-inline"
+                 ng-show="condition.$open">
+                <label class="col-sm-2 control-label">物料名称:</label>
+                <div class="col-sm-4">
+                    <div class="form-group form-group-sm has-feedback">
+                        <input type="search" class="form-control input-sm"
+                               ng-model="prodTitle" placeholder="请输入物料名称" /><span
+                            class="form-control-feedback text-simple"><i
+                            class="fa fa-search"></i></span>
+                    </div>
+                </div>
+                <label class="col-sm-2 control-label">规&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;格:</label>
+                <div class="col-sm-4">
+                    <div class="form-group form-group-sm has-feedback">
+                        <input type="search" class="form-control input-sm"
+                               ng-model="prodSpec" placeholder="请输入物料规格" /><span
+                            class="form-control-feedback text-simple"><i
+                            class="fa fa-search"></i></span>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group form-group-sm form-group-inline"
+                 ng-show="condition.$open">
+                <label class="col-sm-2 control-label">税率:</label>
+                <div class="col-sm-4">
+                    <div class="form-group form-group-sm has-feedback">
+                        <input type="search" class="form-control input-sm"
+                               ng-model="taxRate" placeholder="请输入税率" /><span
+                            class="form-control-feedback text-simple"><i
+                            class="fa fa-search"></i></span>
+                    </div>
+                </div>
+            </div>
+        </form>
+        <!-- 标签scroll-table用于表头滚动 -->
+        <div class="table-wrap" id="order-detail-list" scroll-table>
+            <div class="table-header-wrap">
+                <table class="table table-bordered">
+                    <tr>
+                        <th width="36" style="vertical-align: middle;"><input type="checkbox" name="checkbox"
+                                                                              ng-model="checkboxes.checked" ng-click="checkAll()"></th>
+                        <th width="100">本次<br>对账数</th>
+                        <th width="70">客户<br>名称</th>
+                        <th width="60">单据<br>编号</th>
+                        <th width = "60">发货<br>单号</th>
+                        <th width="35">序号</th>
+                        <th width="60">类型</th>
+                        <th width="60">单据<br>日期</th>
+                        <th width="90">应付<br>供应商</th>
+                        <th width="70">客户<br>采购单</th>
+                        <th width="65">客户<br>料号</th>
+                        <th width="70">客户物<br>料名称</th>
+                        <th width="70">客户规<br>格型号</th>
+                        <th width="65">送货<br>工厂</th>
+                        <th width="55">数量</th>
+                        <th width="40">单价</th>
+                        <th width="30">币别</th>
+                        <th width="40">税率</th>
+                        <th width="60">金额</th>
+                        <th width="70">本次对<br>账金额
+                        </th>
+                    </tr>
+                </table>
+            </div>
+            <div class="table-body-wrap">
+                <table class="table table-bordered">
+                    <tr ng-repeat="check in data"
+                        ng-if="((condition.dateFrom == '') || ((condition.dateFrom !== '') && (condition.dateFrom <= check.pidate))) && ((condition.dateTo == '') || ((condition.dateTo !== '') && (condition.dateTo >= check.pidate)))"
+                        class="thAlign" style="height: 40px;">
+                        <td width="36" style="text-align: center;vertical-align: middle;"><input
+                                ng-model="check.$selected" name="checkbox"
+                                ng-click="checkOne(check)" ng-change="getTotalMoney()"
+                                type="checkbox"></td>
+                        <td width="100"><input ng-model="check.thischeckqty"
+                                               type="number" max="data.maxThisCheckQty"
+                                               min="data.minThisCheckQty" ng-change="getTotalMoney()"
+                                               style="width: 75px;" class=" input-sm text-center"></td>
+                        <td width="70" title="{{check.custname}}"><div
+                                style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.custname}}</div></td>
+                        <td width="60">{{::check.inoutno}}</td>
+                        <td width="60">{{::check.sendcode}}</td>
+                        <td width="35" align="center">{{::check.detno}}</td>
+                        <td width="60">{{::check.piclass}}</td>
+                        <td width="60">{{::check.pidate | date:'yyyy-MM-dd' }}</td>
+                        <td width="90" title="{{check.receivename}}">
+                            <div
+                                    style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.receivename}}</div>
+                        </td>
+                        <td width="70">{{::check.ordercode}}</td>
+                        <td width="65">{{::check.prodcode}}</td>
+                        <td width="70" title="{{check.prodtitle}}">
+                            <div
+                                    style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.prodtitle}}</div>
+                        </td>
+                        <td width="70" title="{{check.prodspec}}"><div
+                                style="display: -webkit-box; text-overflow: ellipsis; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical;">{{::check.prodspec}}</div></td>
+                        <td width="65">{{::check.factory}}</td>
+                        <td width="55">{{::check.qty}}</td>
+                        <td width="40">{{::check.orderprice}}</td>
+                        <td width="30">{{::check.currency}}</td>
+                        <td width="40" align="center">{{::check.taxrate}}</td>
+                        <td width="60">{{::(check.qty || 0)*(check.orderprice || 0) |
+                            number:2}}</td>
+                        <td width="60">{{::(check.orderprice || 0)*(check.thischeckqty || 0) | number:2}}</td>
+                    </tr>
+                    <tr ng-if="!data || data.length==0">
+                        <td colspan="19">
+                            <div class="empty-block">
+                                <i class="fa fa-exclamation-circle"></i>
+                                <p class="text-muted">没有对账数据,请先筛选</p>
+                            </div>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+            <div style="padding: 10px 20px">总金额合计:{{totalMoney | number:2 || 0}}</div>
+        </div>
+    </div>
+</div>

+ 5 - 21
src/main/webapp/resources/tpl/index/fa/arCheck.html

@@ -202,7 +202,6 @@
 			<th width="180">明细条目</th>
 			<th width="180">商品总数</th>
 			<th width="100">对账结果</th>
-			<th width="100">操作</th>
 		</tr>
 		</thead>
 		<tbody ng-if="$data.length === 0">
@@ -224,13 +223,13 @@
 			<tr>
 				<td class="first info" colspan="4">
 					<div class="">
-						<span class="text-num" title="录单时间">{{::check.date | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>&nbsp;&nbsp;&nbsp;
-						<span><i class="fa fa-star" ng-class="{'text-default':check.status==201}"></i> {{::check.vendor.enName}}</span>
+						<span class="text-num" title="录单时间">{{::check.recordDate | date:'MM月dd日 HH:mm'}} <i class="fa fa-clock-o"></i></span>&nbsp;&nbsp;&nbsp;
+						<span><i class="fa fa-star" ng-class="{'text-default':check.status==201}"></i> {{::check.vendorName}}</span>
 						<span>单据编号:</span>
 						<span class="text-num"><a ui-sref="fa.arCheck_detail({id:check.id})" title="点击查看详情">{{::check.code}}</a></span>
 					</div>
 					<div class="static">
-						<p class="f14 text-num">{{::check.fromDate | date:'yyyy/MM/dd'}} - {{::check.toDate | date:'yyyy/MM/dd'}}</p>
+						<p class="f14 text-num">{{::check.beginDate | date:'yyyy/MM/dd'}} - {{::check.endDate | date:'yyyy/MM/dd'}}</p>
 						<p>
 							<strong class="text-num">{{::check.checkAmount | number:6}}</strong>
 							<span class="text-number">{{::check.currency}}</span><br>
@@ -243,23 +242,8 @@
 						</p>
 					</div>
 				</td>
-				<td class="status" colspan="2">
-					<div ng-if="check.status == 200" class="text-center text-muted f14"><br>还未开始对账!</div>
-					<div ng-if="check.status == 201 && check.items.length == check.agree" class="text-center text-muted f14">
-						<br> <i class="fa fa-check-square-o"></i> 已全部确认
-					</div>
-					<div ng-if="check.status == 201 && check.items.length != check.agree" class="text-center text-muted f14">
-						已开始对账,但未全部确认
-					</div>
-					<div ng-if="check.status == 201 && check.items.length != check.agree">
-						<div class="text-success text-bold"><i class="fa fa-smile-o fa-lg fa-fw"></i>已确认: {{::check.agree}}</div>
-						<div class="text-warning text-bold"><i class="fa fa-frown-o fa-lg fa-fw"></i>不同意: {{::check.disagree}}</div>
-						<div class="text-muted text-bold"><i class="fa fa-meh-o fa-lg fa-fw"></i>未对账: {{check.items.length - check.agree - check.disagree}}</div>
-					</div>
-					<!-- <a ng-if="check.status == 200 || check.items.length != check.agree" class="operate operate-undo text-center" 
-						ui-sref="fa.arCheck_detail({id:check.id})" target="_blank">立即开始对账</a>
-					<a ng-if="check.status == 201 && check.items.length == check.agree" class="operate operate-done text-center" 
-						ui-sref="fa.arCheck_detail({id:check.id})" target="_blank">查看详情</a> -->
+				<td class="status" colspan="1">
+					<span ng-bind="::check.checkStatus"></span>
 				</td>
 			</tr>
 		</tbody>

+ 21 - 87
src/main/webapp/resources/tpl/index/fa/arCheck_detail.html

@@ -50,45 +50,37 @@
 		<div class="row row-sm item">
 			<div class="col-xs-6">
 				<span class="title">供应商</span>
-				<div class="content" ng-bind="::order.vendor.enName"></div>
+				<div class="content" ng-bind="::order.vendorName"></div>
 			</div>
 			<div class="col-xs-6">
 				<span class="title">对账期间</span>
-				<div class="content text-num">{{::order.fromDate | date:'yyyy/MM/dd'}} - {{::order.toDate | date:'yyyy/MM/dd'}}</div>
+				<div class="content text-num">{{::order.beginDate | date:'yyyy/MM/dd'}} - {{::order.endDate | date:'yyyy/MM/dd'}}</div>
 			</div>
 		</div>
 		<div class="row row-sm item">
-			<div class="col-xs-3">
+			<div class="col-xs-6">
 				<span class="title">单据编号</span>
 				<div class="content text-num" ng-bind="::order.code"></div>
 			</div>
-			<div class="col-xs-3">
-				<span class="title">录单日期</span>
-				<div class="content" ng-bind="::order.date | date:'MM月dd日 HH:mm'"></div>
-			</div>
-			<div class="col-xs-3">
-				<span class="title">录单人</span>
-				<div class="content" ng-bind="::order.recorder"></div>
-			</div>
-			<div class="col-xs-3">
-				<span class="title">审批人</span>
-				<div class="content" ng-bind="::order.auditor"></div>
-			</div>
+            <div class="col-xs-6">
+                <span class="title">应收日期</span>
+                <div class="content" ng-bind="::order.apDate | date:'MM月dd日'"></div>
+            </div>
 		</div>
 		<div class="row row-sm item">
-			<div class="col-xs-3">
-				<span class="title">应收日期</span>
-				<div class="content" ng-bind="::order.arDate | date:'MM月dd日'"></div>
-			</div>
-			<div class="col-xs-3">
-				<span class="title">对方业务员</span>
-				<div class="content" ng-bind="::order.sellerName"></div>
-			</div>
+            <div class="col-xs-6">
+                <span class="title">录单日期</span>
+                <div class="content" ng-bind="::order.recordDate | date:'MM月dd日 HH:mm'"></div>
+            </div>
+            <div class="col-xs-6">
+                <span class="title">录单人</span>
+                <div class="content" ng-bind="::order.recorder"></div>
+            </div>
 		</div>
-		<div class="row row-sm item" ng-if="order.remark">
+		<div class="row row-sm item" ng-if="order.reason">
 			<div class="col-xs-9">
-				<span class="title">供应商备注</span>
-				<div class="content" ng-bind="::order.remark"></div>
+				<span class="title">备注</span>
+				<div class="content" ng-bind="::order.reason"></div>
 			</div>
 		</div>
 		<div class="title-div" style="border-bottom: 1px dashed #3f84f6;">
@@ -141,7 +133,6 @@
 						<th width="80">单价</th>
 						<th width="120">对账数量</th>
 						<th width="120">对账金额</th>
-						<th width="100">操作</th>
 					</tr>
 				</thead>
 				<tbody>
@@ -157,12 +148,8 @@
 						</td>
 						<td class="text-muted text-num">
 							<div>
-								<i class="fa fa-file-text-o fa-fw" title="采购订单编号"></i> 
-								<span ng-bind="::item.poCode"></span>
-							</div>
-							<div>
-								<i class="fa fa-share-square-o fa-fw" title="供应商出库单号"></i> 
-								<span ng-bind="::item.inoutCode"></span> 第<span ng-bind="item.sourceNumber"></span>行
+								<i class="fa fa-share-square-o fa-fw" title="出库单号"></i>
+								<span ng-bind="::item.orderCode"></span> 第<span ng-bind="item.orderDetno"></span>行
 							</div>
 						</td>
 						<td class="text-center">
@@ -172,64 +159,11 @@
 						<td class="text-center">
 							<div>
 								<span class="badge" ng-if="item.status==201 && !item.agreed">供</span> 
-								<span class="text-num text-bold" ng-bind="::item.qty | number"></span>
-							</div>
-							<div ng-if="item.status==201 && !item.agreed">
-								<span class="badge badge-info">我</span> 
-								<span class="text-num text-bold" ng-bind="::item.replyQty | number"></span>
-							</div>
-							<div ng-if="item.$editing">
-								<input ng-model="item.$replyQty" class="form-control input-xs" type="number" placeholder="确认数量">
+								<span class="text-num text-bold" ng-bind="::item.checkQty | number"></span>
 							</div>
 						</td>
 						<td>
 							<div class="text-num text-inverse text-bold" ng-bind="::item.amount | number:6"></div>
-							<div ng-if="item.$editing">
-								<input ng-model="item.$replyRemark" class="form-control input-xs" type="text" placeholder="确认备注">
-							</div>
-							<div ng-if="item.replyQty > 0" class="dropdown text-center">
-								<a href="javascript:void(0);" class="dropdown-toggle text-default"
-									ng-mouseover="getReplies(item)">对账记录<i class="fa fa-fw fa-angle-down"></i></a>
-								<div class="dropdown-menu dropdown-menu-right pane" style="width: 270px;">
-									<div class="pane-body">
-										<ul class="list-unstyled list-menu">
-											<li ng-repeat="reply in ::item.replies">
-												<div ng-if="reply.type=='v'" class="text-left">
-													<div ng-class="{'text-inverse': $last}">
-														<span class="pull-right text-muted" ng-bind="reply.date | date:'MM-dd HH:mm'"></span>
-														<span class="badge">供</span> 数量:{{::reply.qty}}
-													</div>
-													<div class="text-muted">{{reply.remark}}</div>
-												</div>
-												<div ng-if="reply.type=='c'" class="text-right"
-													ng-class="{'text-inverse': $last}">
-													<div>
-														<span class="pull-left text-muted" ng-bind="reply.date | date:'MM-dd HH:mm'"></span>
-														{{::reply.qty}}:<span ng-bind="reply.recorder"></span>  <span class="badge badge-info">我</span> 
-													</div>
-													<div class="text-muted">{{reply.remark}}</div>
-												</div>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</td>
-						<td class="text-center">
-							<div ng-if="item.status == 200 && !item.$editing">
-								<a ng-click="onReplyClick(item, true)" class="">确认<i class="fa fa-check-square-o"></i></a><br>
-								<a ng-click="item.$editing = true" class="text-muted f12">不同意</a>
-							</div>
-							<div ng-if="item.$editing">
-								<a ng-click="item.$editing = false" class="text-muted f12">取消</a><br>
-								<a ng-click="onReplyClick(item, false)" class="">确认对账</a>
-							</div>
-							<div ng-if="item.status == 201 && item.agreed">
-								<span class="label label-success">已确认</span>
-							</div>
-							<div ng-if="item.waiting">
-								<span class="text-muted f12">您确认的数量正在等待供应商确认...</span>
-							</div>
 						</td>
 					</tr>
 					<tr>

+ 20 - 10
src/main/webapp/resources/tpl/index/purc/vendor.html

@@ -79,6 +79,12 @@
 }
 </style>
 <link rel="stylesheet" href="static/css/public.css">
+<div class="loading in" ng-class="{'in': loading}">
+	<!--<i></i>-->
+	<div class="wrap">
+		<div class="outer"></div>
+	</div>
+</div>
 <div class="pub-com_head">
 	<span>供应商资料</span>
 	<div class="p-right">
@@ -111,18 +117,17 @@
 			ng-table="customerParams">
 			<thead>
 				<tr class="pane-header">
-					<th width="80" class="text-center">UU</th>
-					<th width="180" class="text-center">供应商名称</th>
-					<th width="120" class="text-center">简称</th>
+					<th width="250" class="text-center">供应商名称</th>
 					<th width="200" class="text-center">地址</th>
 					<th width="100" class="text-center">联系人</th>
-					<th width="80" class="text-center">联系电话</th>
-					<th width="170" class="text-center">操作</th>
+					<th width="80" class="text-center">供应商电话</th>
+					<th width="200" class="text-center">采购对接人</th>
+					<th width="100" class="text-center">操作</th>
 				</tr>
 			</thead>
 			<tbody ng-if="$data.length === 0">
 			<tr>
-				<td colspan="7">
+				<td colspan="6">
 					<div id="empty">
 						<div class="left_img">
 							<a href="http://www.usoftchina.com/" target="_blank" title="优软云首页"><img src="static/img/empty/uas_empty.png"></a>
@@ -137,15 +142,20 @@
 			</tbody>
 			<tbody>
 					<tr ng-repeat="vendor in $data">
-						<td ng-bind="::vendor.vendorEnterprise.uu"></td>
 						<td class="text-center"><a href="#/purc/vendor/{{vendor.id}}" ng-bind="::vendor.vendorEnterprise.enName" title="查看供应商资料" class="color32 order-detail"></a></td>
-						<td class="text-center" ng-bind="::vendor.vendorEnterprise.enShortname"></td>
 						<td class="text-center" ng-bind="::vendor.vendorEnterprise.enAddress"></td>
 						<td class="text-center" ng-bind="::vendor.vendorUser.userName"></td>
 						<td class="text-center" ng-bind="::vendor.vendorUser.userTel"></td>
+						<td class="text-center" title="{{vendor.saleContacts.toString()}}">
+							<span ng-repeat="users in vendor.saleContacts | limitTo: 3">{{users}}<br/></span>
+							<span ng-if="vendor.saleContacts.length > 3">...</span>
+							<span ng-if="!vendor.saleContacts || vendor.saleContacts.length === 0">-</span>
+						</td>
 						<td class="text-center">
-							<a ng-click="purcByEn(vendor.vendorEnterprise.enBussinessCode)">下采购单</a>
-							<a href="#/purc/purcinquiry/{{vendor.vendorEnterprise.enBussinessCode}}">立即询价</a>
+							<a ng-click="purcByEn(vendor.vendorEnterprise.enBussinessCode)">下采购单</a><br/>
+							<a href="#/purc/purcinquiry/{{vendor.vendorEnterprise.enBussinessCode}}">立即询价</a><br/>
+							<a title="被分配的用户享有查看和操作权限" ng-click="addUserInfo(vendor)">分配</a><br/>
+							<a title="被转移权限的用户可以分配权限给其他用户" ng-click="transferUserInfo(vendor)">转移</a>
 						</td>
 					</tr>
 			</tbody>

+ 10 - 8
src/main/webapp/resources/tpl/index/sale/customer.html

@@ -119,23 +119,25 @@
 			ng-table="customerParams">
 			<thead>
 				<tr class="header">
-					<th width="80">UU</th>
-					<th width="180">客户名称</th>
+					<th width="190">客户名称</th>
 					<th width="180">地址</th>
 					<th width="80">客户联系人</th>
-					<th width="100">联系人电话</th>
-					<th width="80">我方联系人</th>
-					<th width="110">用户分配</th>
+					<th width="100">客户电话</th>
+					<th width="160">业务对接人</th>
+					<th width="100">用户分配</th>
 				</tr>
 			</thead>
 			<tbody ng-repeat="customer in $data" ng-mouseenter="showUserInfo(customer,true)" ng-mouseleave="showUserInfo(customer,false)">
 					<tr>
-						<td class="text-center" ng-bind="::customer.myEnterprise.uu"></td>
 						<td class="text-center"><a ng-click="viewDetail(customer.id)" title="查看客户资料" ng-bind="::customer.myEnterprise.enName" class="color32 order-detail"></a></td>
 						<td class="text-center" ng-bind="::customer.myEnterprise.enAddress"></td>
 						<td class="text-center" ng-bind="::customer.myUser.userName"></td>
 						<td ng-bind="::customer.myUser.userTel"></td>
-						<td class="text-center" ng-bind="::customer.vendorUser.userName"></td>
+						<td class="text-center" title="{{customer.purchaseContacts.toString()}}">
+							<span ng-repeat="users in customer.purchaseContacts | limitTo: 3">{{users}}<br/></span>
+							<span ng-if="customer.purchaseContacts.length > 3">...</span>
+							<span ng-if="!customer.purchaseContacts || customer.purchaseContacts.length === 0">-</span>
+						</td>
 						<td class="text-center">
 								<!--<a title="展开" class="text-muted" ng-click="open(customer,$index)"><i class="fa fa-toggle-down fa-lg"></i></a>-->
 								<!--<a ng-click="viewDetail(customer.id)">查看详情</a><br/>-->
@@ -146,7 +148,7 @@
 			</tbody>
 			<tbody ng-if="$data.length === 0">
 			<tr>
-				<td colspan="7">
+				<td colspan="6">
 					<div id="empty">
 						<div class="left_img">
 							<a href="http://www.usoftchina.com/" target="_blank" title="优软云首页"><img src="static/img/empty/uas_empty.png"></a>

Some files were not shown because too many files changed in this diff