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

新增供应商关系分配,权限转移功能

hejq 7 лет назад
Родитель
Сommit
93c3de0234

+ 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

+ 42 - 30
src/main/java/com/uas/platform/b2b/controller/VendorController.java

@@ -7,13 +7,18 @@ import com.uas.platform.b2b.model.Role;
 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.result.ResultCode;
+import com.uas.platform.b2b.result.ResultMap;
 import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.OrderRedDotService;
 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.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort.Type;
@@ -25,7 +30,6 @@ 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;
@@ -55,26 +59,20 @@ public class VendorController {
 	@Autowired
     private OrderRedDotService redDotService;
 
+    private final static UsageBufferedLogger LOGGER = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
 	/**
 	 * 获取供应商
 	 */
 	@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());
@@ -92,7 +90,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/{id}/info", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor getVendorDetail(@PathVariable Long id) {
 		return vendorService.findById(id);
 	}
@@ -101,7 +98,6 @@ public class VendorController {
 	 * 获取客户
 	 */
 	@RequestMapping(value = "/customer/info/search", method = RequestMethod.GET)
-	@ResponseBody
 	public SPage<Vendor> getCustomers(PageParams params, String keyword) {
 		return vendorService.getCustomerInfo(params, keyword);
 	}
@@ -110,7 +106,6 @@ public class VendorController {
 	 * 获取客户在供应商对应的用户
 	 */
 	@RequestMapping(value = "/userInfo/{uu}", method = RequestMethod.GET)
-	@ResponseBody
 	public List<Distribute> getUserInfo(@PathVariable("uu") Long custUu){
 		return vendorService.findUserInfo(custUu);
 	}
@@ -119,7 +114,6 @@ public class VendorController {
 	 * 获取当前用户
 	 */
 	@RequestMapping(value = "/user", method = RequestMethod.GET)
-	@ResponseBody
 	public User getUser(){
 		return SystemSession.getUser();
 	}
@@ -131,7 +125,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/customer/{id}/info", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor getCustomerDetail(@PathVariable Long id) {
 		return vendorService.findById(id);
 	}
@@ -145,6 +138,7 @@ public class VendorController {
 	public ModelMap exportVendorsPermission() {
 		return new ModelMap("success", true);
 	}
+
 	/**
 	 * 导出
 	 * 
@@ -155,22 +149,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();
@@ -186,7 +175,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);
@@ -198,7 +186,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/contacts/{venduu}", method = RequestMethod.GET)
-	@ResponseBody
 	private List<VendorContact> getContacts(@PathVariable Long venduu) {
 		return vendorService.getContacts(venduu);
 	}
@@ -209,7 +196,6 @@ public class VendorController {
 	 * @param id
 	 */
 	@RequestMapping(value = "/deleteContact/{id}", method = RequestMethod.DELETE)
-	@ResponseBody
 	private void deleteContact(@PathVariable Long id) {
 		vendorService.deleteContact(id);
 	}
@@ -221,7 +207,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);
@@ -233,7 +218,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/custContacts/{enuu}", method = RequestMethod.GET)
-	@ResponseBody
 	private List<VendorContact> getCustContacts(@PathVariable Long enuu) {
 		return vendorService.getCustContacts(enuu);
 	}
@@ -245,7 +229,6 @@ public class VendorController {
 	 * @return
 	 */
 	@RequestMapping(value = "/vendorInfo", method = RequestMethod.GET)
-	@ResponseBody
 	public Vendor findByBusinessCode(String businessCode) {
 		return vendorService.findByBusinessCode(businessCode);
 	}
@@ -255,7 +238,6 @@ public class VendorController {
 	 * @author wangmh
 	 */
 	@RequestMapping(value = "/customer/setRead", method = RequestMethod.POST)
-	@ResponseBody
 	public void setReadByIds() {
         redDotService.setReadByState(OrderType.vendors.name(), Role.SELLER);
 	}
@@ -265,7 +247,6 @@ public class VendorController {
 	 * @author wangmh
 	 */
 	@RequestMapping(value = "/vendor/setRead", method = RequestMethod.POST)
-	@ResponseBody
 	public void setVendorReadByIds() {
 		redDotService.setReadByState(OrderType.vendors.name(), Role.BUYER);
 	}
@@ -274,11 +255,42 @@ 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")) {
 			vendorService.synchronizeToPartnerShipRecord();
 		}
 	}
+
+    /**
+     * 为用户分配客户权限,保存绑定(管理员才能操作)
+     *
+     * @param userUU 用户关系
+     * @param json 前端数据
+     * @return 绑定结果
+     */
+    @RequestMapping(value = "/bindVendor/{uu}", method = RequestMethod.POST)
+    public ResultMap bindVendor(@PathVariable("uu") Long userUU, @RequestBody String json) {
+        List<Vendor> ids = FlexJsonUtils.fromJsonArray(json, Vendor.class);
+        boolean result = vendorService.bindVendorToUser(userUU, ids);
+        String resultInfo = result ? "成功" : "失败";
+        LOGGER.log("供应商权限", "分配供应商", "userUU: " + userUU + "结果: 分配" + resultInfo);
+        return new ResultMap(result ? ResultCode.OK.code() : ResultCode.ERROR.code());
+    }
+
+    /**
+     * 供应商权限转移
+     *
+     * @param vendorUU 供应商UU
+     * @param json 前端json数据
+     * @return 绑定结果
+     */
+    @RequestMapping(value = "/bindUserToVendor/{uu}", method = RequestMethod.POST)
+    public ResultMap bindUserToVendor(@PathVariable("uu") Long vendorUU, @RequestBody String json) {
+        List<User> users = FlexJsonUtils.fromJsonArray(json, User.class);
+        boolean result = vendorService.transferVendorToUser(vendorUU, users);
+        String resultInfo = result ? "成功" : "失败";
+        LOGGER.log("供应商权限", "转移权限", "供应商UU: " + vendorUU + "结果: 绑定" + resultInfo);
+        return new ResultMap(result ? ResultCode.OK.code() : ResultCode.ERROR.code());
+    }
 }

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

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

@@ -0,0 +1,46 @@
+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> findByVendorId(@Param("vendorIds") List<Long> vendorIds);
+
+    /**
+     * 通过用户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);

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

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

@@ -24,7 +24,14 @@ import javax.persistence.Table;
 import javax.persistence.Transient;
 import java.io.*;
 import java.util.Date;
-
+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")
@@ -174,6 +181,18 @@ public class Vendor implements Serializable {
 	@Transient
     private Double uncheckedCount;
 
+    /**
+     * (针对买家、客户)采购联系人
+     */
+	@Transient
+    private Set<String> purchaseContacts;
+
+    /**
+     * (针对卖家、供应商) 业务对接人
+     */
+	@Transient
+    private Set<String> saleContacts;
+
 	public Long getId() {
 		return id;
 	}
@@ -355,6 +374,22 @@ public class Vendor implements Serializable {
         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);

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

@@ -0,0 +1,134 @@
+package com.uas.platform.b2b.model;
+
+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;
+
+	/**
+	 * 分配此权限的人的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;
+	}
+}

+ 19 - 2
src/main/java/com/uas/platform/b2b/result/ResultMap.java

@@ -68,6 +68,24 @@ public class ResultMap<T> implements Serializable {
 
     }
 
+    /**
+     * 根据状态返回信息
+     *
+     * @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;
+    }
+
+
     /**
      * 通过传入数据封装返回内容
      *
@@ -92,8 +110,7 @@ public class ResultMap<T> implements Serializable {
      * @return ResultMap
      */
     public static ResultMap success(String message) {
-        ResultMap result = new ResultMap(ResultCode.OK.code(), message, null);
-        return result;
+        return new ResultMap(ResultCode.OK.code(), 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;
 
 /**
@@ -283,7 +378,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;
 		}
@@ -867,6 +963,18 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+    /**
+     * 供应商关系客户ID列表
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    @Override
+    public SPage<Long> searchCustomerIdList(String keyword, PageParams pageParams) {
+        SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PURC$VENDORS_CUST, pageParams);
+        return idsPage;
+    }
+
 	/**
 	 * 供应商
 	 */
@@ -878,6 +986,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)
 	 */

+ 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);
 
 	/**
 	 * 为用户分配客户(查询)

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

@@ -3,6 +3,7 @@ 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;
@@ -155,4 +156,31 @@ public interface VendorService {
      * @return 搜索结果
      */
     SPage<Vendor> getCustomerInfo(PageParams params, String keyword);
+
+    /**
+     * 搜索供应商资料
+     *
+     * @param keyword 关键字
+     * @param params 分页信息
+     * @return 搜索结果
+     */
+    SPage<Vendor> searchVendorCheckIds(String keyword, PageParams params);
+
+    /**
+     * 为用户分配供应商
+     *
+     * @param userUU 用户UU
+     * @param ids 供应商客户
+     * @return 分配结果 成功或失败
+     */
+    boolean bindVendorToUser(Long userUU, List<Vendor> ids);
+
+    /**
+     * 供应商权限转移
+     *
+     * @param vendorUU 供应商UU
+     * @param users 前端选择用户信息
+     * @return 转移结果
+     */
+    boolean transferVendorToUser(Long vendorUU, List<User> users);
 }

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

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

@@ -5,6 +5,7 @@ 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;
@@ -12,11 +13,14 @@ 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;
@@ -27,7 +31,6 @@ 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;
@@ -35,11 +38,13 @@ 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.List;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * 供应商
@@ -55,6 +60,9 @@ public class VendorsServiceImpl implements VendorService {
 	@Autowired
 	private DistributeDao distributeDao;
 
+	@Autowired
+    private VendorDistributeDao vendorDistributeDao;
+
 	@Autowired
 	private VendorContactDao vendorContactDao;
 
@@ -108,14 +116,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
@@ -410,6 +412,171 @@ public class VendorsServiceImpl implements VendorService {
         }
         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);
+        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
+     */
+    private void setPurchaseContacts(List<Vendor> vendorList, List<Long> idList) {
+        List<Distribute> distributeList = distributeDao.findByVendorId(idList);
+        if (!CollectionUtil.isEmpty(vendorList)) {
+            vendorList.forEach(vendor -> {
+                Set<String> contacts = new HashSet<>();
+                distributeList.forEach(distribute -> {
+                    if (Objects.equals(vendor.getId(), distribute.getVendorId())) {
+                        contacts.add(distribute.getUser().getUserName());
+                    }
+                });
+                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
+     */
+    private void setSaleContacts(List<Vendor> vendorList, List<Long> idList) {
+        List<VendorDistribute> distributeList = vendorDistributeDao.findByVendorId(idList);
+        if (!CollectionUtil.isEmpty(vendorList)) {
+            vendorList.forEach(vendor -> {
+                Set<String> contacts = new HashSet<>();
+                distributeList.forEach(distribute -> {
+                    if (Objects.equals(vendor.getId(), distribute.getVendorId())) {
+                        contacts.add(distribute.getUser().getUserName());
+                    }
+                });
+                vendor.setSaleContacts(contacts);
+            });
+        }
+    }
+
+    /**
+     * 为用户分配供应商
+     *
+     * @param userUU 用户UU
+     * @param vendors    供应商客户
+     * @return 分配结果 成功或失败
+     */
+    @Override
+    public boolean bindVendorToUser(Long userUU, List<Vendor> vendors) {
+        if (!CollectionUtils.isEmpty(vendors)) {
+            for (Vendor vendor : vendors) {
+                Distribute distribute = new Distribute();
+                if (vendor.getDistribute()) {
+                    List<VendorDistribute> distributes = vendorDistributeDao.findByUserUUAndVendorId(userUU, vendor.getId());
+                    if (CollectionUtils.isEmpty(distributes)) {
+                        distribute.setUserUU(userUU);
+                        distribute.setVendorId(vendor.getId());
+                        distributeDao.save(distribute);
+                    }
+                } else {
+                    List<Distribute> distributes = distributeDao.findByUserUUAndVendorId(userUU, vendor.getId());
+                    if (!CollectionUtils.isEmpty(distributes)) {
+                        distributeDao.delete(distributes.get(0));
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 供应商权限转移
+     *
+     * @param vendorUU 供应商UU
+     * @param users    前端选择用户信息
+     * @return 转移结果
+     */
+    @Override
+    public boolean transferVendorToUser(Long vendorUU, List<User> users) {
+        List<Vendor> vendors = vendorDao.findByMyEnUUAndVendUU(SystemSession.getUser().getEnterprise().getUu(), vendorUU);
+        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> butes = vendorDistributeDao.findByUserUUAndVendorId(u.getUserUU(), vendors.get(0).getId());
+                    if (u.getDistribute()) {
+                        if (CollectionUtils.isEmpty(butes)) {
+                            distribute.setUserUU(u.getUserUU());
+                            distribute.setVendorId(vendors.get(0).getId());
+                            distribute.setLeaderUU(SystemSession.getUser().getUserUU());
+                            saveList.add(distribute);
+                        }
+                    } else {
+                        // 删除当前用户的权限子节点用户
+                        if (!CollectionUtils.isEmpty(butes)) {
+                            // 当前用户
+                            deleteList.add(butes.get(0));
+                            Long vendorId = vendors.get(0).getId();
+                            Long userUU = u.getUserUU();
+                            if (null != butes.get(0).getIsTransfer() && 1 == butes.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;
     }
 }