Browse Source

新增招标单型号和品牌联想词,产品类目和品牌弹窗选择

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@7803 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
dongbw 9 years ago
parent
commit
eb7b6b68c6
25 changed files with 1931 additions and 246 deletions
  1. 70 0
      src/main/java/com/uas/platform/b2b/controller/BrandController.java
  2. 54 7
      src/main/java/com/uas/platform/b2b/controller/ComponentController.java
  3. 5 9
      src/main/java/com/uas/platform/b2b/controller/KindController.java
  4. 0 11
      src/main/java/com/uas/platform/b2b/controller/PurchaseTenderController.java
  5. 36 0
      src/main/java/com/uas/platform/b2b/dao/BrandDao.java
  6. 55 0
      src/main/java/com/uas/platform/b2b/dao/BrandInfoDao.java
  7. 5 4
      src/main/java/com/uas/platform/b2b/dao/ComponentDao.java
  8. 332 0
      src/main/java/com/uas/platform/b2b/model/Brand.java
  9. 68 29
      src/main/java/com/uas/platform/b2b/search/SearchController.java
  10. 20 2
      src/main/java/com/uas/platform/b2b/search/SearchService.java
  11. 130 86
      src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java
  12. 50 0
      src/main/java/com/uas/platform/b2b/service/BrandService.java
  13. 1 0
      src/main/java/com/uas/platform/b2b/service/ComponentService.java
  14. 13 2
      src/main/java/com/uas/platform/b2b/service/KindService.java
  15. 107 0
      src/main/java/com/uas/platform/b2b/service/impl/BrandServiceImpl.java
  16. 5 0
      src/main/java/com/uas/platform/b2b/service/impl/ComponentServiceImpl.java
  17. 22 11
      src/main/java/com/uas/platform/b2b/service/impl/KindServiceImpl.java
  18. 28 1
      src/main/webapp/resources/js/common/services.js
  19. 313 70
      src/main/webapp/resources/js/index/app.js
  20. 52 1
      src/main/webapp/resources/js/index/services/Purc.js
  21. 52 0
      src/main/webapp/resources/tpl/index/purc/modal/product_brandChoose_modal.html
  22. 418 0
      src/main/webapp/resources/tpl/index/purc/modal/product_kindChoose_modal.html
  23. 1 0
      src/main/webapp/resources/tpl/index/purc/saved_tender.html
  24. 93 12
      src/main/webapp/resources/tpl/index/purc/tender.html
  25. 1 1
      src/main/webapp/resources/tpl/index/purc/tender_evaluation.html

+ 70 - 0
src/main/java/com/uas/platform/b2b/controller/BrandController.java

@@ -0,0 +1,70 @@
+package com.uas.platform.b2b.controller;
+
+import com.uas.platform.b2b.model.BrandInfo;
+import com.uas.platform.b2b.service.BrandService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.List;
+
+/**
+ * 品牌查询
+ *
+ *
+ */
+@RestController
+@RequestMapping("product/brand")
+public class BrandController {
+
+	@Autowired
+	private BrandService brandService;
+
+	/**
+	 * 查找所有简单有效品牌信息
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/Info", method = RequestMethod.GET)
+	public List<BrandInfo> getBrandInfo() {
+		return brandService.getAllBrandInfo();
+	}
+
+	/**
+	 * 查找所有简单有效品牌信息
+	 * 
+	 * @param params
+	 *            分页信息
+	 * @return
+	 */
+	@RequestMapping(value = "/Info/ByPage", method = RequestMethod.GET)
+	public Page<BrandInfo> getBrandInfoPage(PageParams params, String keyword) {
+		PageInfo info = new PageInfo(params);
+		return brandService.getBrandInfoPage(info, keyword);
+	}
+
+	/**
+	 * 通过名字获取品牌信息
+	 * @param name
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	@RequestMapping(value = "/ByName/{name}", method = RequestMethod.GET)
+	public BrandInfo getByName(@PathVariable("name") String name) throws UnsupportedEncodingException {
+		name = URLDecoder.decode(name, "utf-8");
+		BrandInfo brand =  brandService.findByName(name, name);
+		if (brand.getUuid() == null) {
+			throw new IllegalOperatorException("此品牌不存在,请重新输入或选择正确的品牌");
+		}
+		return brand;
+	}
+
+}

+ 54 - 7
src/main/java/com/uas/platform/b2b/controller/ComponentController.java

@@ -1,16 +1,16 @@
 package com.uas.platform.b2b.controller;
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-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.RestController;
-
 import com.uas.platform.b2b.model.Component;
+import com.uas.platform.b2b.model.User;
 import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.ComponentService;
+import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.PageParams;
 import com.uas.search.b2b.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 器件属性
@@ -26,6 +26,9 @@ public class ComponentController {
 	@Autowired
 	private SearchService searchService;
 
+	@Autowired
+	private ComponentService componentService;
+
 	@RequestMapping(value = "/cmplist/{kindId}", method = RequestMethod.GET)
 	@ResponseBody
 	public SPage<Component> getCmpListByKindId(@PathVariable("kindId") Long kindId, PageParams params, String keyword) {
@@ -34,4 +37,48 @@ public class ComponentController {
 		pageParams.getFilters().put("cmp_kiid", kindId);
 		return searchService.searchProductComponentCheckIds(keyword, pageParams);
 	}
+
+	/**
+	 * 根据uuid查找Component
+	 *
+	 * @param uuid
+	 * @return
+	 */
+	@RequestMapping(value = "/{uuid}", method = RequestMethod.GET)
+	public Component findComponentByUuid(@PathVariable("uuid") String uuid, HttpServletRequest request) {
+		//获取user信息 方便获取器件信息时 能根据是否登录 返回不同的附件链接,不登陆 不能看附件信息。
+		User user = (User) request.getSession().getAttribute("user");
+		SystemSession.setUser(user);
+		return componentService.findByUuid(uuid);
+	}
+
+//	/**
+//	 * 分页查找类目下器件信息
+//	 *
+//	 * @param params
+//	 *            分页信息
+//	 * @return
+//	 */
+//	@RequestMapping(value = "/list", method = RequestMethod.GET)
+//	public Page<Component> findAllComponentActiveSimpleInfo(PageParams params, boolean reserve) {
+//		PageInfo info = new PageInfo(params);
+//		if (reserve) {
+//			SimpleExpression siExpression = new SimpleExpression("reserve", new Double(0), Operator.GT);
+//			info.expression(siExpression);
+//		}
+//		return componentService.findInfoPage(info);
+//	}
+//
+//	/**
+//	 * 查找所有简单有效标准器件信息
+//	 *
+//	 * @param params
+//	 *            分页信息
+//	 * @return
+//	 */
+//	@RequestMapping(value = "/info", method = RequestMethod.GET)
+//	public Page<Component> findPageComponentSimpleInfo(PageParams params) {
+//		PageInfo info = new PageInfo(params);
+//		return componentService.findInfoPage(info);
+//	}
 }

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

@@ -1,16 +1,11 @@
 package com.uas.platform.b2b.controller;
 
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-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.RestController;
-
 import com.uas.platform.b2b.model.Kind;
 import com.uas.platform.b2b.service.KindService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * 器件类目查询接口
@@ -36,4 +31,5 @@ public class KindController {
 	public List<Kind> getProductKinds(@PathVariable("parentId") Long parentId) {
 		return kindService.getChildProductKinds(parentId);
 	}
+
 }

+ 0 - 11
src/main/java/com/uas/platform/b2b/controller/PurchaseTenderController.java

@@ -701,15 +701,4 @@ public class PurchaseTenderController {
     }
 
 
-//    /**
-//     * 根据输入获取联想词(产品型号)
-//     *
-//     * @param code
-//     * @return
-//     */
-//    @RequestMapping(value = "/similarKeywords", method = RequestMethod.GET)
-//    @ResponseBody
-//    public List<String> getSimilarKeywords(String code) {
-//        return searchService.getSimilarCodes(code);
-//    }
 }

+ 36 - 0
src/main/java/com/uas/platform/b2b/dao/BrandDao.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.Brand;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 品牌
+ * 
+ * @author suntg
+ * @since 2016年3月15日下午2:37:56
+ */
+@Repository
+public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository<Brand, Long> {
+
+	public Brand findByUuid(String uuid);
+
+	/**
+	 * 依据品牌中文名获取品牌信息
+	 * 
+	 * @param nameCn
+	 * @return
+	 */
+	public List<Brand> findByNameCn(String nameCn);
+
+	/**
+	 * 依据品牌英文名获取品牌信息
+	 * 
+	 * @param nameEn
+	 * @return
+	 */
+	public List<Brand> findByNameEn(String nameEn);
+}

+ 55 - 0
src/main/java/com/uas/platform/b2b/dao/BrandInfoDao.java

@@ -0,0 +1,55 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.BrandInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 品牌
+ * 
+ * @author suntg
+ * @since 2016年3月15日下午2:37:56
+ */
+@Repository
+public interface BrandInfoDao extends JpaSpecificationExecutor<BrandInfo>, JpaRepository<BrandInfo, Long> {
+
+	/**
+	 * 增加品牌权重
+	 * 
+	 * @param uuid
+	 */
+	@Modifying
+	@Query("update Brand b set b.weight = b.weight+ :increaseNum where b.uuid = :uuid")
+	public void increaseWeight(@Param("uuid") String uuid, @Param("increaseNum") Double increaseNum);
+
+	/**
+	 * 按id获取品牌,并且按照给定的id的顺序
+	 * 
+	 * @param ids
+	 * @return
+	 */
+	@Query("select b from BrandInfo b where b.id in (:ids) order by instr(':ids', b.id)")
+	public List<BrandInfo> findByIdsInOrder(@Param("ids") Long[] ids);
+
+	/**
+	 * 根据品牌中文名查找品牌信息
+	 * 
+	 * @param nameCn
+	 * @return
+	 */
+	public List<BrandInfo> findByNameCn(String nameCn);
+	
+	/**
+	 * 根据品牌英文名查找品牌信息
+	 * 
+	 * @param nameEn
+	 * @return
+	 */
+	public List<BrandInfo> findByNameEn(String nameEn);
+}

+ 5 - 4
src/main/java/com/uas/platform/b2b/dao/ComponentDao.java

@@ -1,12 +1,11 @@
 package com.uas.platform.b2b.dao;
 
-import java.util.List;
-
+import com.uas.platform.b2b.model.Component;
+import com.uas.search.b2b.model.SPage;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
-import com.uas.platform.b2b.model.Component;
-import com.uas.search.b2b.model.SPage;
+import java.util.List;
 
 public interface ComponentDao extends JpaRepository<Component, Long>, JpaSpecificationExecutor<Component> {
 
@@ -26,4 +25,6 @@ public interface ComponentDao extends JpaRepository<Component, Long>, JpaSpecifi
 	 * @return
 	 */
 	SPage<Component> findByKindid(Long kindid);
+
+    Component findByUuid(String uuid);
 }

+ 332 - 0
src/main/java/com/uas/platform/b2b/model/Brand.java

@@ -0,0 +1,332 @@
+package com.uas.platform.b2b.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 品牌
+ * 
+ * @author suntg
+ * @since 2016年3月11日上午9:30:00
+ */
+@Entity
+@Table(name = "product$brand")
+public class Brand implements Serializable {
+
+	/**
+	 * 序列号
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "br_id")
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product$brand_active_gen")
+	@SequenceGenerator(name = "product$brand_active_gen", sequenceName = "product$brand_active_seq", allocationSize = 1)
+	private Long id;
+
+	/**
+	 * uuid
+	 */
+	@Column(name = "br_uuid", unique = true)
+	private String uuid;
+
+	/**
+	 * 品牌中文名称
+	 */
+	@Column(name = "br_name_cn")
+	private String nameCn;
+
+	/**
+	 * 品牌英文名称
+	 */
+	@Column(name = "br_name_en")
+	private String nameEn;
+
+	/**
+	 * logo路径
+	 */
+	@Column(name = "br_logourl")
+	private String logoUrl;
+
+	/**
+	 * 品牌所属厂商
+	 */
+	@Column(name = "br_vendor")
+	private String vendor;
+
+	/**
+	 * 品牌官网
+	 */
+	@Column(name = "br_url")
+	private String url;
+
+	/**
+	 * 品牌简介
+	 */
+	@Column(name = "br_brief", length = 4000)
+	private String brief;
+
+	/**
+	 * 产品系列
+	 */
+	@Column(name = "br_series", length = 4000)
+	private String series;
+
+	/**
+	 * 主要成就
+	 */
+	@Column(name = "br_achievement", length = 4000)
+	private String achievement;
+
+	/**
+	 * 所属地区
+	 */
+	@Column(name = "br_area")
+	private String area;
+
+	/**
+	 * 应用领域
+	 */
+	@Column(name = "br_application")
+	private String application;
+
+	/**
+	 * 创建人
+	 */
+	@Column(name = "defineuu")
+	private Long defineuu;
+
+	/**
+	 * 创建人
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "defineuu", insertable = false, updatable = false)
+	private UserBaseInfo userDefine;
+
+	/**
+	 * 创建时间
+	 */
+	@Column(name = "br_createtime")
+	private Date createTime;
+
+	/**
+	 * 最近更新人
+	 */
+	@Column(name = "modifyuu")
+	private Long modifyuu;
+
+	/**
+	 * 最近更新人
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "modifyuu", insertable = false, updatable = false)
+	private UserBaseInfo userModify;
+
+	/**
+	 * 最后修改时间
+	 */
+	@Column(name = "br_modifytime")
+	private Date modifyTime;
+
+	/**
+	 * 版本号
+	 */
+	@Column(name = "br_version")
+	private Short version;
+
+	/**
+	 * 权重,可用于排序
+	 */
+	@Column(name = "br_weight")
+	private Double weight;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getUuid() {
+		return uuid;
+	}
+
+	public void setUuid(String uuid) {
+		this.uuid = uuid;
+	}
+
+	public String getNameCn() {
+		return nameCn;
+	}
+
+	public void setNameCn(String nameCn) {
+		this.nameCn = nameCn;
+	}
+
+	public String getNameEn() {
+		return nameEn;
+	}
+
+	public void setNameEn(String nameEn) {
+		this.nameEn = nameEn;
+	}
+
+	public String getLogoUrl() {
+		return logoUrl;
+	}
+
+	public void setLogoUrl(String logoUrl) {
+		this.logoUrl = logoUrl;
+	}
+
+	public String getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(String vendor) {
+		this.vendor = vendor;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getBrief() {
+		return brief;
+	}
+
+	public void setBrief(String brief) {
+		this.brief = brief;
+	}
+
+	public String getSeries() {
+		return series;
+	}
+
+	public void setSeries(String series) {
+		this.series = series;
+	}
+
+	public String getAchievement() {
+		return achievement;
+	}
+
+	public void setAchievement(String achievement) {
+		this.achievement = achievement;
+	}
+
+	public String getArea() {
+		return area;
+	}
+
+	public void setArea(String area) {
+		this.area = area;
+	}
+
+	public String getApplication() {
+		return application;
+	}
+
+	public void setApplication(String application) {
+		this.application = application;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Long getDefineuu() {
+		return defineuu;
+	}
+
+	public void setDefineuu(Long defineuu) {
+		this.defineuu = defineuu;
+	}
+
+	public UserBaseInfo getUserDefine() {
+		return userDefine;
+	}
+
+	public void setUserDefine(UserBaseInfo userDefine) {
+		this.userDefine = userDefine;
+	}
+
+	public UserBaseInfo getUserModify() {
+		return userModify;
+	}
+
+	public void setUserModify(UserBaseInfo userModify) {
+		this.userModify = userModify;
+	}
+
+	public Long getModifyuu() {
+		return modifyuu;
+	}
+
+	public void setModifyuu(Long modifyuu) {
+		this.modifyuu = modifyuu;
+	}
+
+	public Date getModifyTime() {
+		return modifyTime;
+	}
+
+	public void setModifyTime(Date modifyTime) {
+		this.modifyTime = modifyTime;
+	}
+
+	public Double getWeight() {
+		return weight;
+	}
+
+	public void setWeight(Double weight) {
+		this.weight = weight;
+	}
+
+	public Short getVersion() {
+		return version;
+	}
+
+	public void setVersion(Short version) {
+		this.version = version;
+	}
+
+	public Brand() {
+
+	}
+
+//	public Brand(BrandVersion brandVersion) {
+//		this.uuid = brandVersion.getUuid();
+//		this.nameCn = brandVersion.getNameCn();
+//		this.nameEn = brandVersion.getNameEn();
+//		this.logoUrl = brandVersion.getLogoUrl();
+//		this.vendor = brandVersion.getVendor();
+//		this.url = brandVersion.getUrl();
+//		this.brief = brandVersion.getBrief();
+//		this.series = brandVersion.getSeries();
+//		this.achievement = brandVersion.getAchievement();
+//		this.defineuu = brandVersion.getDefineuu();
+//		this.userDefine = brandVersion.getUserDefine();
+//		this.modifyuu = brandVersion.getModifyuu();
+//		this.userModify = brandVersion.getUserModify();
+//		this.area = brandVersion.getArea();
+//		this.application = brandVersion.getApplication();
+//		this.createTime = brandVersion.getDefinetime();
+//		this.modifyTime = brandVersion.getLastModifyDate();
+//		this.version = brandVersion.getVersion();
+//	}
+
+}

+ 68 - 29
src/main/java/com/uas/platform/b2b/search/SearchController.java

@@ -1,39 +1,16 @@
 package com.uas.platform.b2b.search;
 
+import com.uas.platform.b2b.model.*;
+import com.uas.search.b2b.model.PageParams;
+import com.uas.search.b2b.model.SPage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-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.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.Product;
-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.PurchaseInquiryItem;
-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.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.SaleARCheck;
-import com.uas.platform.b2b.model.SaleQuotationAll;
-import com.uas.platform.b2b.model.SaleSendAll;
-import com.uas.platform.b2b.model.Vendor;
-import com.uas.search.b2b.model.PageParams;
-import com.uas.search.b2b.model.SPage;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 搜索请求
@@ -311,4 +288,66 @@ public class SearchController {
 	public SPage<Vendor> searchVendorCheckIds(String keyword, PageParams pageParams) {
 		return searchService.searchVendorCheckIds(keyword, pageParams);
 	}
+
+	/**
+	 * 根据输入获取联想词(器件)
+	 *
+	 * @param keyword
+	 * @return
+	 */
+	@RequestMapping(value = "/similarComponents", method = RequestMethod.GET)
+	@ResponseBody
+	public List<Map<String, Object>> getSimilarComponents(String keyword) {
+		return searchService.getSimilarComponents(keyword);
+	}
+
+
+	/**
+	 * 根据输入的联想词(品牌)
+	 *
+	 * @param keyword
+	 * @return
+	 */
+	@RequestMapping(value = "/similarBrands", method = RequestMethod.GET)
+	@ResponseBody
+	public List<Map<String, Object>> getSimilarBrand(String keyword) {
+		return searchService.getSimilarBrands(keyword);
+	}
+
+	/**
+	 * 点击联想词,返回器件
+	 *
+	 * @param code  产品型号
+	 * @return
+	 */
+	@RequestMapping(value = "/getComponentByCode", method = RequestMethod.GET)
+	@ResponseBody
+	public Component getComponentByCode(String code) {
+		return searchService.getComponentByCode(code);
+	}
+
+//    /**
+//     * 根据输入获取联想词(类目)
+//     *
+//     * @param userUU
+//     * @param keyword
+//     * @return
+//     */
+//    @RequestMapping(value = "/similarKinds", method = RequestMethod.GET)
+//    @ResponseBody
+//    public List<String> getSimilarKind(Long userUU, String keyword) {
+//        return searchService.getSimilarKinds(keyword);
+//    }
+//
+//    /**
+//     * 根据输入获取联想词(末级类目)
+//     *
+//     * @param keyword
+//     * @return
+//     */
+//    @RequestMapping(value = "/similarLeafKinds", method = RequestMethod.GET)
+//    @ResponseBody
+//    public List<String> getSimilarLeafKinds(String keyword) {
+//        return searchService.getSimilarLeafKinds(keyword);
+//    }
 }

+ 20 - 2
src/main/java/com/uas/platform/b2b/search/SearchService.java

@@ -37,6 +37,9 @@ import com.uas.platform.b2b.model.Vendor;
 import com.uas.search.b2b.model.PageParams;
 import com.uas.search.b2b.model.SPage;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 搜索接口
  * 
@@ -318,7 +321,7 @@ public interface SearchService {
 	 * @param pageParams
 	 * @return
 	 */
-	public SPage<PagingReleaseDetail> searchPagingReleaseDetailIds(String keyword, PageParams pageParams);
+	SPage<PagingReleaseDetail> searchPagingReleaseDetailIds(String keyword, PageParams pageParams);
 
 	/**
 	 * 供应商
@@ -327,5 +330,20 @@ public interface SearchService {
 	 * @param pageParams
 	 * @return
 	 */
-	public SPage<Vendor> searchVendorCheckIds(String keyword, PageParams pageParams);
+	SPage<Vendor> searchVendorCheckIds(String keyword, PageParams pageParams);
+
+	/**
+	 * 根据型号获取器件
+	 *
+	 * @param code
+	 * @return
+	 */
+	Component getComponentByCode(String code);
+
+	List<Map<String, Object>> getSimilarComponents(String keyword);
+
+	List<Map<String, Object>> getSimilarBrands(String keyword);
+
+//	List<String> getSimilarKinds(String keyword);
+
 }

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

@@ -1,98 +1,27 @@
 package com.uas.platform.b2b.search;
 
-import java.lang.reflect.Field;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-
 import com.alibaba.fastjson.JSONObject;
-import com.uas.platform.b2b.dao.ComponentDao;
-import com.uas.platform.b2b.dao.DeputyOrderDao;
-import com.uas.platform.b2b.dao.EnterpriseDao;
-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.PagingReleaseDetailDao;
-import com.uas.platform.b2b.dao.ProductDao;
-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.PurchaseInquiryItemDao;
-import com.uas.platform.b2b.dao.PurchaseInquiryMouldDao;
-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.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.SaleSendAllDao;
-import com.uas.platform.b2b.dao.VendorDao;
-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.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.PagingReleaseDetail;
-import com.uas.platform.b2b.model.Product;
-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.PurchaseInquiryItem;
-import com.uas.platform.b2b.model.PurchaseInquiryMould;
-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.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.SaleSendAll;
-import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.dao.*;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.core.persistence.criteria.PredicateFactory;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.search.b2b.model.PageParams;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.b2b.util.SearchConstants;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+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.concurrent.ConcurrentHashMap;
 
 /**
  * 搜索实现
@@ -208,6 +137,11 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 	@Autowired
 	private VendorDao vendorDao;
 
+	@Autowired
+	private BrandDao brandDao;
+
+	private static final Integer SIMILAR_NUM = 10;  // 联想词size
+
 	private ConcurrentHashMap<String, Field> sortFields = new ConcurrentHashMap<String, Field>();
 
 	private Field getPropertyField(Class<?> targetCls, String properyName) {
@@ -681,4 +615,114 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+	@Override
+	public Component getComponentByCode(String code) {
+		return componentDao.findByCode(code).get(0); // 因为只能带一个,选找到的第一个
+	}
+
+	@Override
+	public List<Map<String, Object>> getSimilarComponents(String keyword) {
+		SPage<String> codePages = searchService.similar(keyword, Table_name.PRODUCT$COMPONENT, SIMILAR_NUM, "cmp_code");
+		List<Component> contents = new ArrayList<>();
+		for (String code : codePages.getContent()) {
+			Component component = componentDao.findByCode(code).get(0);
+			contents.add(component);
+		}
+		List<Map<String, Object>> components = new ArrayList<Map<String, Object>>();
+		for (Component component : contents) {
+			Map<String, Object> temp = new HashMap<>();
+			temp.put("id", component.getId());
+			temp.put("uuid", component.getUuid());
+			temp.put("code", component.getCode());
+			temp.put("brandCn", component.getBrand().getNameCn());
+			temp.put("brandEn", component.getBrand().getNameEn());
+			temp.put("kindCn", component.getKind().getNameCn());
+			temp.put("kindEn", component.getKind().getNameEn());
+			components.add(temp);
+		}
+		return components;
+	}
+
+
+//	/**
+//	 * 根据输入的类目名获取联想词
+//	 *
+//	 * @param kindName
+//	 *            类目名
+//	 * @return
+//	 */
+//	public List<String> getSimilarKinds(String kindName) {
+//		SPage<String> kindPages = searchService.similar(kindName, Table_name.PRODUCT$COMPONENT, SIMILAR_NUM, "");
+//	}
+
+	@Override
+	public List<Map<String, Object>> getSimilarBrands(String keyword) {
+		List<String> brandList = similarBrands(keyword);
+		List<Brand> contents = new ArrayList<>();
+		for (String brand : brandList) {
+			List<Brand> temps = brandDao.findByNameCn(brand);
+			if (!CollectionUtils.isEmpty(temps)) {
+				contents.add(temps.get(0));
+			} else { // 中文品牌找不到,找英文的
+				temps = brandDao.findByNameEn(brand);
+				if (!CollectionUtils.isEmpty(temps)) {
+					contents.add(temps.get(0));
+				}
+			}
+		}
+		List<Map<String, Object>> brands = new ArrayList<>();
+		for (Brand brand : contents) {
+			Map<String, Object> temp = new HashMap<>();
+			temp.put("brandCn", brand.getNameCn());
+			temp.put("brandEn", brand.getNameEn());
+			temp.put("vendor", brand.getVendor());
+			brands.add(temp);
+		}
+		return brands;
+	}
+
+	private List<String> similarBrands(String keyword) {
+		SPage<String> brandCns = searchService.similar(keyword, Table_name.PRODUCT$BRAND, SIMILAR_NUM, "br_name_cn");
+		// 相似的品牌中文名数量足够,直接返回
+		List<String> brandCnList = brandCns.getContent();
+		List<Map<String, Object>> brands = new ArrayList<>();
+		if (brandCnList != null && brandCnList.size() == SIMILAR_NUM) {
+			return brandCnList;
+		}
+
+		List<String> result = brandCnList;
+		if (result == null) {
+			result = new ArrayList<>();
+		}
+
+		// 获取相似品牌英文名
+		SPage<String> brandEns = searchService.similar(keyword, Table_name.PRODUCT$BRAND, SIMILAR_NUM, "br_name_en");
+		List<String> brandEnList = brandEns.getContent();
+		if (!CollectionUtils.isEmpty(brandEnList)) {
+			result.addAll(brandEnList);
+			// 如果总的数量超出SIMILAR_NUM,去除多余的元素
+			if (result.size() > SIMILAR_NUM) {
+				removeElements(result, SIMILAR_NUM);
+				return result;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 删除lists内startIndex(含)后的元素
+	 *
+	 * @param lists
+	 * @param startIndex
+	 */
+	private void removeElements(List<String> lists, int startIndex) {
+		if (CollectionUtils.isEmpty(lists)) {
+			return;
+		}
+		int listsSize = lists.size();
+		for (int i = listsSize - 1; i >= startIndex; i--) {
+			lists.remove(i);
+		}
+	}
+
 }

+ 50 - 0
src/main/java/com/uas/platform/b2b/service/BrandService.java

@@ -0,0 +1,50 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.model.Brand;
+import com.uas.platform.b2b.model.BrandInfo;
+import com.uas.platform.core.model.PageInfo;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+public interface BrandService {
+
+	/**
+	 * 2016年3月16日 上午10:47:01
+	 *
+	 * @author yujia 获取所有的BrandInfo对象
+	 */
+	public List<BrandInfo> getAllBrandInfo();
+
+	/**
+	 * 获取BrandInfo分页数据
+	 *
+	 * @return
+	 */
+	public Page<BrandInfo> getBrandInfoPage(PageInfo pageInfo, String keyword);
+
+
+	/**
+	 * 初始化
+	 * 
+	 * @param brands
+	 * @return
+	 */
+	List<Brand> init(List<Brand> brands);
+
+
+	/**
+	 * 获取所有
+	 */
+	public List<Brand> findAll();
+
+	/**
+	 * 通过品牌名获取品牌信息
+	 *
+	 * @param brandNameCn
+	 * @param brandNameEn
+	 * @return
+	 */
+	public BrandInfo findByName(String brandNameCn, String brandNameEn);
+
+}

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

@@ -14,4 +14,5 @@ public interface ComponentService {
 	 */
 	SPage<Component> getCmpListByKindId(Long kindid, PageParams params, String keyword);
 
+    Component findByUuid(String uuid);
 }

+ 13 - 2
src/main/java/com/uas/platform/b2b/service/KindService.java

@@ -1,9 +1,9 @@
 package com.uas.platform.b2b.service;
 
-import java.util.List;
-
 import com.uas.platform.b2b.model.Kind;
 
+import java.util.List;
+
 public interface KindService {
 
 	/**
@@ -14,4 +14,15 @@ public interface KindService {
 	 */
 	List<Kind> getChildProductKinds(Long parentId);
 
+
+
+	/**
+	 * 商品类目的所有下级类目
+	 *
+	 * @param parentId
+	 * @return
+	 */
+	List<Kind> getAllChildProductKinds(Long parentId);
+
+
 }

+ 107 - 0
src/main/java/com/uas/platform/b2b/service/impl/BrandServiceImpl.java

@@ -0,0 +1,107 @@
+package com.uas.platform.b2b.service.impl;
+
+import com.uas.platform.b2b.dao.BrandDao;
+import com.uas.platform.b2b.dao.BrandInfoDao;
+import com.uas.platform.b2b.model.Brand;
+import com.uas.platform.b2b.model.BrandInfo;
+import com.uas.platform.b2b.service.BrandService;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
+import com.uas.platform.core.persistence.criteria.LogicalExpression;
+import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import org.apache.commons.collections.CollectionUtils;
+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.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.List;
+
+@Service
+public class BrandServiceImpl implements BrandService {
+
+	@Autowired
+	private BrandDao brandDao;
+
+	@Autowired
+	private BrandInfoDao brandInfoDao;
+
+	@Override
+	public List<Brand> init(List<Brand> brands) {
+		return brandDao.save(brands);
+	}
+
+	@Override
+	public List<BrandInfo> getAllBrandInfo() {
+		return brandInfoDao.findAll();
+	}
+
+
+	// 判断一个字符串是否含有中文
+	public static boolean isChinese(String str) {
+		if (str == null) return false;
+		if (isChinese(str.toCharArray()[0])) return true;// 有一个中文字符就返回
+		return false;
+	}
+
+	public static boolean isChinese(char c) {
+		return c >= 0x4E00 &&  c <= 0x9FA5;// 根据字节码判断
+	}
+
+	@Override
+	public Page<BrandInfo> getBrandInfoPage(final PageInfo pageInfo, String keyword) {
+		if (StringUtils.hasText(keyword)) {
+			SimpleExpression[] simpleArrs = new SimpleExpression[2];
+			simpleArrs[0] = new SimpleExpression("nameCn", keyword, Operator.LIKE, true);
+			simpleArrs[1] = new SimpleExpression("nameEn", keyword, Operator.LIKE, true);
+			LogicalExpression logical = new LogicalExpression(simpleArrs, Operator.OR);
+			pageInfo.expression(logical);
+		}
+		return brandInfoDao.findAll(new Specification<BrandInfo>() {
+			@Override
+			public Predicate toPredicate(Root<BrandInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(pageInfo.getPredicates(root, query, builder));
+				return null;
+			}
+		}, pageInfo);
+	}
+
+	/**
+	 * 通过中文和英文品牌名查找品牌信息
+	 */
+	@Override
+	public BrandInfo findByName(String brandNameCn, String brandNameEn) {
+		BrandInfo brandInfo = new BrandInfo();
+		if (brandNameCn != null) {
+			List<BrandInfo> brandsCn = brandInfoDao.findByNameCn(brandNameCn);
+			if (CollectionUtils.isNotEmpty(brandsCn)) {
+				brandInfo = brandsCn.get(0);
+			} else if (brandNameEn != null) {
+				List<BrandInfo> brandsEn = brandInfoDao.findByNameEn(brandNameEn);
+				if (CollectionUtils.isNotEmpty(brandsEn)) {
+					brandInfo = brandsEn.get(0);
+				}
+			}
+		}
+		if (brandNameEn != null && brandInfo.getUuid() != null) {
+			List<BrandInfo> brandsEn = brandInfoDao.findByNameEn(brandNameEn);
+			if (CollectionUtils.isNotEmpty(brandsEn)) {
+				brandInfo = brandsEn.get(0);
+			}
+		}
+		return brandInfo;
+	}
+
+
+	@Override
+	public List<Brand> findAll() {
+		return brandDao.findAll();
+	}
+
+
+}

+ 5 - 0
src/main/java/com/uas/platform/b2b/service/impl/ComponentServiceImpl.java

@@ -20,4 +20,9 @@ public class ComponentServiceImpl implements ComponentService {
 		return componentDao.findByKindid(kindid);
 	}
 
+	@Override
+	public Component findByUuid(String uuid) {
+		return componentDao.findByUuid(uuid);
+	}
+
 }

+ 22 - 11
src/main/java/com/uas/platform/b2b/service/impl/KindServiceImpl.java

@@ -1,23 +1,34 @@
 package com.uas.platform.b2b.service.impl;
 
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.uas.platform.b2b.dao.KindDao;
 import com.uas.platform.b2b.model.Kind;
 import com.uas.platform.b2b.service.KindService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 @Service
 public class KindServiceImpl implements KindService {
 
-	@Autowired
-	private KindDao kindDao;
+    @Autowired
+    private KindDao kindDao;
+
+
+    @Override
+    public List<Kind> getChildProductKinds(Long parentid) {
+        return kindDao.findByParentidOrderByDetno(parentid);
+    }
 
-	@Override
-	public List<Kind> getChildProductKinds(Long parentid) {
-		return kindDao.findByParentidOrderByDetno(parentid);
-	}
+    @Override
+    public List<Kind> getAllChildProductKinds(Long parentid) {
+        List<Kind> kinds = kindDao.findByParentidOrderByDetno(parentid);
+        for (Kind kind : kinds) {
+            if (!kind.isLeaf()) {
+                kind.setChildren(getAllChildProductKinds(kind.getId()));
+            }
+        }
+        return kinds;
+    }
 
 }

+ 28 - 1
src/main/webapp/resources/js/common/services.js

@@ -398,5 +398,32 @@ define(['angular', 'toaster'], function(angular) {
 				}
 			} 
 		};
-	});;
+	}).factory('Search', ['$resource', function($resource) {
+        return $resource('search/', {}, {// 搜索接口
+            getSimilarBrands: {
+                // 根据品牌名获取品牌联想词
+                url: 'search/similarBrands',
+                method: 'GET',
+                isArray: true
+            },
+            getSimilarKinds: {
+                // 根据类目名获取类目联想词
+                url: 'search/similarKinds',
+                method: 'GET',
+                isArray: true
+            },
+            getSimilarLeafKinds: {
+                // 根据类目名获取 末级类目 联想词
+                url: 'search/similarLeafKinds',
+                method: 'GET',
+                isArray: true
+            },
+            getSimilarComponents: {
+                // 根据器件名获取器件联想词
+                url: 'search/similarComponents',
+                method: 'GET',
+                isArray: true
+            }
+        });
+    }]);
 });

+ 313 - 70
src/main/webapp/resources/js/index/app.js

@@ -9958,7 +9958,13 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
     /**
      * 新增招标单
      */
-    app.controller('PurcNewTenderCtrl', ['$scope', '$filter', 'PurcTender', 'ngTableParams', 'toaster', 'BaseService', '$stateParams', '$modal', '$rootScope', '$upload', 'ShipAddress', '$http', function($scope, $filter, PurcTender, ngTableParams, toaster, BaseService, $stateParams, $modal, $rootScope, $upload, ShipAddress, $http) {
+    app.controller('PurcNewTenderCtrl', ['$scope', '$filter', 'PurcTender', 'ngTableParams', 'toaster', 'BaseService', '$stateParams', '$modal', '$rootScope', '$upload', 'ShipAddress', '$http', 'AuthenticationService', 'KindAPI', 'BrandActiveAPI', 'Search', 'ComponentActiveAPI',function($scope, $filter, PurcTender, ngTableParams, toaster, BaseService, $stateParams, $modal, $rootScope, $upload, ShipAddress, $http, AuthenticationService, KindAPI, BrandActiveAPI, Search, ComponentActiveAPI) {
+
+        // 录入人
+        AuthenticationService.getAuthentication().success(function(data) {
+            $scope.user = data;
+        });
+        $scope.time = $filter('date')(new Date, 'yyyy-MM-dd HH:mm');
 
 
         $scope.loading = false;
@@ -10014,90 +10020,184 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
                 });
             }
         };
-
-        // 搜索
-        $scope.search = function() {
-            if($scope.keyword) {
-                if($scope.searchType.brand) {
-                    SessionService.set('brand', true);
-                    SessionService.unset('component');
-                    window.location.href = 'search?w=' + encodeURI(encodeURI($scope.keyword)) + '&type=brand';
-                }else if($scope.searchType.isCmp()){
-                    SessionService.set('component', angular.toJson($scope.searchType));
-                    SessionService.unset('brand');
-                    window.location.href = 'search?w=' + encodeURI(encodeURI($scope.keyword)) + '&type=component';
-                }else {
-                    SessionService.unset('component');
-                    SessionService.unset('brand');
-                    window.location.href = 'search?w=' + encodeURI(encodeURI($scope.keyword)) + '&type=all';
-                }
-
+        // 联想词start
+
+        // 获取品牌联想词
+        $scope.getSimilarBrands = function(value) {
+            if (value) {
+                // 获取品牌联想词
+                return Search.getSimilarBrands({keyword : value}).$promise.then(function(data) {
+                    return data.map(function(item) {
+                        return item;
+                    });
+                });
             }
         };
 
-        // 搜索框获得焦点,显示联想框
-        $scope.onFocus = function() {
-            $scope.associate = true;
-            $scope.selectIndex = -1;
-            if(!$scope.keyword) $scope.keyword = '';
+        // 获取产品型号联想词
+        $scope.getSimilarCodes = function(value) {
+            if (value) {
+                // 获取产品型号联想词
+                return Search.getSimilarComponents({keyword: value}).$promise.then(function (data) {
+                    return data.map(function (item) {
+                        return item;
+                    })
+                });
+            }
         };
 
-        // 搜索框失去焦点,关闭联想框
-        $scope.onBlur = function() {
-            $scope.associate = false;
-        };
+        // // 获取产品类目联想词
+        // $scope.getSimilarKinds = function(value) {
+        //     if (value) {
+        //         // getSimilarLeafKinds  根据类目名获取末级联想词
+        //         // 获取类目联想词
+        //         return Search.getSimilarKinds({keyword : value}).$promise.then(function(data) {
+        //             return data.map(function(item) {
+        //                 return item;
+        //             })
+        //         });
+        //     }
+        // };
+
+        // // 点击联想词获取类目信息
+        // $scope.onAssociateKindClick = function(kind, submit) {
+        //     KindAPI.getParents({childId : kind.id}, {}, function(data) {
+        //         $scope.actives = data;
+        //         console.log(data);
+        //         var size = data.length;
+        //         if (size > 0) {
+        //             submit.gradeOneKiName = $scope.actives[0].nameCn;
+        //             submit.kiName = submit.gradeOneKiName;
+        //             if (size > 1) {
+        //                 submit.gradeTwoKiName = $scope.actives[1].nameCn;
+        //                 submit.kiName = submit.gradeTwoKiName;
+        //                 if (kind.level < 3) {
+        //                     submit.gradeThreeKiName = null;
+        //                 } else if (size > 2) {
+        //                     submit.gradeThreeKiName = $scope.actives[2].nameCn;
+        //                     submit.kiName = submit.gradeThreeKiName;
+        //                 }
+        //             }
+        //         }
+        //         console.log(submit);
+        //     })
+        // };
 
-        // 搜索框通过按键选取想要的联想词
-        $scope.onKeyup = function() {
-            if($scope.associates && $scope.associates.length) {
-                if(event.keyCode == 40) { //监听到按下键
-                    $scope.selectIndex ++;
-                    if($scope.selectIndex >= $scope.associates.length) $scope.selectIndex = 0;
-                    $scope.keyword = $scope.associates[$scope.selectIndex];
-                } else if(event.keyCode == 38) { //监听到按上键
-                    $scope.selectIndex --;
-                    if($scope.selectIndex < 0) $scope.selectIndex = $scope.associates.length - 1;
-                    $scope.keyword = $scope.keyword = $scope.associates[$scope.selectIndex];
-                } else if(event.keyCode == 13) { //确定键
-                    $scope.search();
+        // 选择类目
+        $scope.selectKind = function(prod) {
+            var submit = [];
+            $modal.open({
+                animation: true,
+                size: 'lg',
+                templateUrl: 'static/tpl/index/purc/modal/product_kindChoose_modal.html',
+                controller: 'KindChooseCtrl',
+                resolve: {
+                    actives: function() {
+                        return $scope.actives;
+                    }
                 }
-            }
+            }).result.then(function(data){
+                $scope.actives = data.actives;
+                var size = data.actives.length;
+                submit.gradeOneKiName = '';
+                submit.gradeTwoKiName = '';
+                submit.gradeThreeKiName = '';
+                if (size > 0) {
+                    submit.gradeOneKiName = $scope.actives[0].nameCn;
+                    prod.prodTitle = submit.gradeOneKiName;
+                    if (size > 1) {
+                        submit.gradeTwoKiName = $scope.actives[1].nameCn;
+                        prod.prodTitle = submit.gradeTwoKiName;
+                        if (size > 2) {
+                            submit.gradeThreeKiName = $scope.actives[2].nameCn;
+                            prod.prodTitle = submit.gradeThreeKiName;
+                        }
+                    }
+                }
+            }, function(){
+
+            });
         };
 
-        // 输入框内容变化,获取新的联想词
-        $scope.onChange = function(prodCode) {
-            if (prodCode) {
-                var params = {
-                    keyword: prodCode
-                };
-                $http.get('tender/similarKeywords', {
-                    params : params
-                }).success(function(data){
-                    $scope.associates = data;// 联想词数组
-                }).error(function(response) {
+        // // 验证分类信息
+        // $scope.checkKind = function() {
+        //     setTimeout(function() {
+        //         if($scope.activesString == null) {
+        //             $scope.component.kindid = null;
+        //             return;
+        //         }
+        //         KindAPI.getKindByName({name : encodeURIComponent($scope.activesString)}, function(kind) {
+        //             $scope.component.kind = kind;
+        //             $scope.component.kindid = kind.id;
+        //             $scope.activesString = $scope.component.kind.nameCn;
+        //             KindAPI.getPropertiesValues({kindId: $scope.component.kindid}, function(data) {
+        //                 $scope.kindProperties = data;
+        //                 angular.forEach($scope.kindProperties, function(kp) {
+        //                     angular.forEach($scope.component.properties, function(pro) {
+        //                         if (pro.value && (kp.propertyId == pro.propertyid)) {
+        //                             kp.value = pro.value;
+        //                         }
+        //                     });
+        //                 });
+        //             }, function(response) {
+        //             });
+        //         }, function (response) {
+        //             $scope.component.kindid = null;
+        //             toaster.pop('error', response.data);
+        //         });
+        //     }, 500);
+        // };
 
-                });
-            } else {
-                $scope.associates = [];// 联想词数组
-            }
 
+        // 点击联想词获取品牌信息
+        $scope.onAssociateBrandClick = function(brand, prod) {
+            // $scope.component.brand = brand;
+            // $scope.component.brandid = brand.id;
+            prod.brand = brand;
         };
 
-        // 点击联想词
-        $scope.onAssociateClick = function(component) {
-            $scope.keyword = component;
-            $scope.search();
-        };
+        // 打开品牌选择的模态框
+        $scope.selectBrand = function(prod){  //打开模态
+            var modalInstance = $modal.open({
+                templateUrl : 'static/tpl/index/purc/modal/product_brandChoose_modal.html',  //指向上面创建的视图
+                controller : 'BrandModalInstanceCtrl'  // 初始化模态范围
+            });
+            modalInstance.opened.then(function(){// 模态窗口打开之后执行的函数
+            });
+            modalInstance.result.then(function(brand){
+                console.log(brand);
+                prod.brand = brand.nameCn;
+            }, function(reason){
 
-        // 鼠标进入联想词框,不能关闭联想词框
-        $scope.onAssociateEnter = function() {
-            $scope.associateEnter = true;
+            });
         };
 
-        // 鼠标离开联想词框,可以关闭联想词框
-        $scope.onAssociateLeave = function() {
-            $scope.associateEnter = false;
+        // // 验证品牌是否正确
+        // $scope.checkBrand = function () {
+        //     setTimeout(function () {
+        //         BrandActiveAPI.findByName({name : encodeURIComponent($scope.component.brand.nameCn)}, function (data) {
+        //             // $scope.component.brand = brand;
+        //             // $scope.component.brandid = brand.id;
+        //         }, function (response) {
+        //             // $scope.component.brandid = null;
+        //             toaster.pop('error', response.data);
+        //         })
+        //     } , 500);
+        // };
+
+
+        // 点击联想词获取器件信息 带入产品分类和品牌
+        $scope.onAssociateCmpClick = function(cmp, prod) {
+            ComponentActiveAPI.get({uuid : cmp.uuid}, {}, function(data) {
+                $scope.component = data;
+                prod.prodCode = data.code;
+                prod.prodTitle = data.kind.nameCn;
+                prod.brand = data.brand.nameCn;
+            }, function(res) {
+                toaster.pop('error', '提示', '产品信息加载失败,请刷新页面');
+            })
         };
+        //联想词end
 
         $scope.condition = {dateZone: 1};
         $scope.tenderProd = [];
@@ -10182,8 +10282,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
         }
 
         if(angular.isUndefined($stateParams.id)) { // 发布招标单之后,再次新增招标单时,新增供应商时不会勾选上一个单据选择的供应商
-            $scope.tenderProd.enterpriseBaseInfo = [{}];
-            $rootScope.tenderVendor = $scope.tenderProd.enterpriseBaseInfo;
+            $rootScope.tenderVendor = [{}];
         }
 
         $scope.changeShipAddress = false;
@@ -10403,6 +10502,150 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
     }]);
 
 
+    //类目选择模态框
+    app.controller('KindChooseCtrl', ['$scope', 'KindAPI', 'actives', 'toaster', '$modalInstance', function($scope, KindAPI, actives, toaster, $modalInstance) {
+        $scope.actives = actives;
+        $scope.kinds = [[], [], [], []];
+        // 获取子类目
+        var getChildren = function(pid, deep) {
+            KindAPI.getChildren({parentId: pid}, function(data) {
+                $scope.kinds[deep] = data;
+            }, function(response) {
+                toaster.pop('error', '获取子类目失败', response.data);
+            });
+        };
+
+        // 改变节点选中状态
+        var changeStatus = function(item, deep) {
+            var actives = [], level = 0;
+            angular.forEach($scope.kinds, function(ks, i) {
+                if(i > deep) {
+                    $scope.kinds[i] = [];
+                } else {
+                    angular.forEach(ks, function(k, j) {
+                        if(i == deep) {
+                            if(k.id == item.id) {
+                                $scope.kinds[i][j].$active = true;
+                                actives.push(k);
+                            } else {
+                                k.$active = null;
+                            }
+                        } else {
+                            if(k.$active) {
+                                actives.push(k);
+                            }
+                        }
+                    });
+                }
+            });
+            // 选择的节点
+            $scope.actives = actives;
+            $scope.active = item;
+            // 当前可操作的层级
+            if(deep < 3) {
+                $scope.activeDeep = deep + 1;
+            }
+        };
+
+        // 节点点击后获取子类目,节点被选中
+        $scope.onItemClick = function(item, deep) {
+            changeStatus(item, deep);
+            if (!item.isLeaf) {
+                getChildren(item.id, deep + 1);
+            }
+        };
+
+        // 重新加载数据
+        function reload(deep) {
+            var pid;
+            if(deep) {
+                pid = $scope.actives[deep - 1].id;
+            } else {
+                pid = 0;
+                deep = 0;
+            }
+            getChildren(pid, deep);
+        }
+
+        // 初始加载数据,获取第一层的类目
+        if($scope.actives) {
+            angular.forEach($scope.actives, function(v, k) {
+                KindAPI.getChildren({parentId: v.parentid}, function(data) {
+                    $scope.kinds[k] = data;
+                    angular.forEach($scope.kinds[k], function(kind, i){
+                        if(kind.id == v.id) {
+                            $scope.kinds[k][i].$active = true;
+                            $scope.actives[k] = $scope.kinds[k][i];
+                        }
+                    })
+                }, function(response) {
+                    toaster.pop('error', '获取子类目失败', response.data);
+                });
+            });
+        } else {
+            reload();
+        }
+
+        // 取消
+        $scope.cancel = function() {
+            $modalInstance.dismiss();
+        };
+
+        // 确认选择
+        $scope.check = function() {
+            var a = {
+                active: $scope.active,
+                actives: $scope.actives
+            };
+            $modalInstance.close(a);
+        };
+    }]);
+
+    //品牌选择模态框的controller
+    app.controller('BrandModalInstanceCtrl', ['$scope', '$modalInstance', 'ngTableParams', 'BrandActiveAPI', 'BaseService', function($scope, $modalInstance, ngTableParams, BrandActiveAPI, BaseService) {
+        $scope.filter = {};
+        $scope.brandsTableParams = new ngTableParams({
+            page : 1,
+            count : 10,
+            sorting : {
+                nameCn: 'asc'
+            }
+        }, {
+            total : 0,
+            counts : [],
+            getData : function($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.keyword = $scope.filter.keyword;
+                var keyword = $scope.filter.keyword;
+                // param.keyword = $scope.filter.keyword;
+                BrandActiveAPI.getSimpleInfoPage(param, {}, function(page) {
+                    if (page) {
+                        params.total(page.totalElements);
+                        $defer.resolve(page.content);
+                    }
+                }, function(){
+
+                });
+            }
+        });
+
+        // 搜索
+        $scope.search = function() {
+            // $scope.brandsTableParams.filter({$: $scope.filter.keyword});
+            $scope.brandsTableParams.page(1);
+            $scope.brandsTableParams.reload();
+        };
+        // 选择
+        $scope.select = function(brand){
+            $modalInstance.close(brand);
+        };
+        // 关闭
+        $scope.cancel = function() {
+            $modalInstance.dismiss();
+        };
+    }]);
+
+
     /**
      * 招标单批量导入
      */

+ 52 - 1
src/main/webapp/resources/js/index/services/Purc.js

@@ -716,5 +716,56 @@ define([ 'ngResource'], function() {
 				method: 'DELETE'
 			}
 		});
-	}]);
+	}]).factory('KindAPI', ['$resource', '$cacheFactory', function($resource, $cacheFactory) {
+        var cache = $cacheFactory('KindAPI');
+        return $resource ('product/kind', {}, {
+            // 根据父级类目获取其子类目,不包含深层
+            getChildren: {
+                url: 'product/kind/:parentId/children',
+                method: 'GET',
+                isArray: true
+            }
+        })
+    }]).factory('BrandActiveAPI', ['$resource', function($resource) {
+        //对单个BrandActive对象操作
+        return $resource('product/brand/:uuid', {}, {
+			/*
+			 * get,根据uuid获得BrandActive
+			 */
+            // 获取所有品牌的简要信息
+            getSimpleInfo : {
+                url : 'product/brand/Info',
+                method : 'GET',
+                isArray : true
+            },
+            // 分页获取简要信息
+            getSimpleInfoPage: {
+                url: 'product/brand/Info/ByPage',
+                method: 'GET'
+            },
+            // 通过名称获取品牌
+            findByName : {
+                url: 'product/brand/ByName/:name',
+                method: 'GET'
+            }
+        })
+    }]).factory('ComponentActiveAPI', ['$resource', function($resource){
+        return $resource('product/component', {},{
+            //获取ComponentInfo的分页数据
+            getInfoPage: {
+                url: 'product/component/list',
+                method: 'GET'
+            },
+            //根据uuid获取器件信息
+            get: {
+                url: 'product/component/:uuid',
+                method: 'GET'
+            },// 根据UUid获取单个器件的简要信息
+            // 分页获取简要信息
+            getInfo: {
+                url: 'product/component/info',
+                method: 'GET'
+            }
+        });
+    }]);
 });

+ 52 - 0
src/main/webapp/resources/tpl/index/purc/modal/product_brandChoose_modal.html

@@ -0,0 +1,52 @@
+<style>
+.modal-dialog {
+    width: 420px;
+    margin: 30px auto;
+}
+table tr {
+	cursor: pointer;
+}
+table tr:hover .br-name {
+	position: relative;
+	left: 4px;
+	font-weight: 600;
+}
+table tr .br-select {
+	display: none;
+}
+table tr:hover .br-select {
+	display: inline-block;
+}
+</style>
+<!-- 品牌选择模态框 -->
+<div class="modal-header">
+	<h3 class="modal-title">选择所属品牌</h3>
+</div>
+<div class="modal-body">
+	<div class="row">
+		<div class="col-xs-12">
+			<table ng-table="brandsTableParams" class="table table-condensed table-bordered table-striped">
+				<tr class="info">
+					<th width="100">
+						<input type="text" ng-model="filter.keyword" ng-change="search()"
+							class="form-control input-sm" placeholder="请输入关键词进行筛选" autofocus/>
+					</th>
+				</tr>
+		        <tr ng-repeat="brand in $data" ng-click="select(brand)">
+		          <td class="text-left">
+		          	<div class="text-num f14">
+		          		<span class="br-name" ng-bind="brand.nameCn"></span>
+		          	</div>
+		          	<div class="text-muted f12">
+		          		<span ng-bind="brand.nameEn||'空'"></span>
+		          		<span class="br-select pull-right">选择</span>
+		          	</div>
+		          </td>
+		        </tr>
+	        </table>
+		</div>
+	</div>
+</div>
+<div class="modal-footer">
+	<button class="btn btn-warning" ng-click="cancel()">取消</button>
+</div>

+ 418 - 0
src/main/webapp/resources/tpl/index/purc/modal/product_kindChoose_modal.html

@@ -0,0 +1,418 @@
+<style>
+.modal-header {
+	padding: 5px 15px 5px 15px;
+}
+
+.modal-body {
+	padding-top: 5px;
+}
+
+.modal-body .tabbable .nav>li>a {
+	padding: 5px 10px;
+}
+
+.modal-body .tips {
+	margin-top: 5px;
+	margin-right: 8px;
+}
+
+.nav-tabs>li {
+	cursor: pointer;
+}
+
+.panel-sm .panel-heading {
+	padding: 5px 10px;
+}
+
+.panel-sm .panel-title {
+	font-size: 100%;
+}
+
+.image-content li {
+	float: left;
+	margin-right: 10px;
+	width: 64px;
+	height: 64px;
+	line-height: 64px;
+	overflow: hidden;
+	border: dotted 1px #d9d9d9;
+	background-color: #f7f7f7;
+	font-size: 18px;
+	font-family: 'Arial';
+	font-style: italic;
+	color: #e1e1e1;
+	text-align: center;
+}
+
+.tab-pane {
+	padding-top: 15px;
+}
+
+/*main*/
+#main {
+	background-color: #f0f0f0;
+	border-top: 1px solid #e7e7e7;
+	border-bottom: 1px solid #e7e7e7;
+	padding-bottom: 30px;
+}
+
+#main [ng-view] .container {
+	width: 990px;
+}
+
+#main .main-guide {
+	width: 600px;
+	margin: 0 auto;
+	text-align: center;
+	font: 16px/43px 'Microsoft Yahei';
+}
+
+#main .main-guide ul {
+	margin-bottom: 0;
+}
+
+#main .main-guide li {
+	cursor: pointer;
+	position: relative;
+}
+
+#main .main-guide li.arrow_right:before {
+	font-family: 'Glyphicons Halflings';
+	content: "\e092";
+	padding-left: 0.5em;
+	padding-right: 0.5em;
+	color: #ddd;
+	font-weight: normal;
+	font-size: 100%;
+}
+
+#main .main-guide li:nth-child(1):before {
+	content: "";
+	padding: 0;
+}
+
+#main .main-guide li.active {
+	color: #ff7300;
+	border-bottom: 3px solid #ff7300;
+}
+
+#main .main-guide li .caret {
+	position: absolute;
+	display: none;
+	bottom: 1px;
+	left: 50%;
+	margin-left: -2px;
+	border-bottom: 5px solid !important;
+	border-top: none;
+}
+
+#main .main-guide li.active .caret {
+	display: block;
+}
+
+#main .main-content {
+	margin-top: 10px;
+}
+
+#main .main-content .panel {
+	padding: 10px;
+	border-color: #d6d6d6;
+	margin-bottom: 10px;
+}
+
+#main .main-content .panel-shadow {
+	-webkit-box-shadow: 2px 2px 8px rgba(0, 0, 0, .2);
+	-moz-box-shadow: 2px 2px 8px rgba(0, 0, 0, .2);
+	box-shadow: 2px 2px 8px rgba(0, 0, 0, .2);
+}
+
+#main .main-content .panel .panel-title {
+	border-bottom: 1px dashed #d7d7d7;
+	padding-left: 7px;
+}
+
+#main .main-content .panel .panel-title * {
+	display: inline-block;
+}
+
+#main .main-content .panel .panel-title h4 {
+	color: #926437;
+	font-size: 14px;
+	font-weight: 700;
+}
+
+#main .main-content .panel .panel-title h5 {
+	color: #444;
+	font-size: 12px;
+}
+
+#main .main-content .panel .panel-title .glyphicon {
+	margin-right: 7px;
+}
+
+#main .main-content .panel .panel-body {
+	padding-bottom: 0;
+}
+
+.choose-body {
+	display: table;
+	width: 100%;
+	margin-top: 10px;
+	padding: 10px;
+	table-layout: fixed;
+	border-collapse: separate;
+	border: 1px solid #ccc;
+}
+
+.choose-body>.choose-item {
+	display: table-cell;
+}
+
+.choose-body>.choose-item>ul {
+	height: 380px;
+	overflow-x: hidden;
+	overflow-y: scroll;
+}
+
+.choose-body>.choose-item>ul>li {
+	line-height: 30px;
+	padding-left: 5px;
+	position: relative;
+}
+
+.choose-body>.choose-item>ul>li.add {
+	margin: 10px 5px;
+	text-align: center;
+	border: 1px solid #ff7300;
+	color: #ff7300;
+	border-radius: 4px;
+	cursor: pointer;
+}
+
+.choose-body>.choose-item>ul>li:hover {
+	background: #f1f1f1;
+}
+
+.choose-body>.choose-item>ul>li.active {
+	background: #fff1d0;
+}
+
+.choose-body>.choose-item>ul>li.active a {
+	color: #ff7300;
+}
+
+.choose-body>.choose-item>ul>li>a {
+	display: block;
+	color: #666666;
+}
+
+.choose-body>.choose-item .caret {
+	float: right;
+	margin-top: 14px;
+	margin-right: 8px;
+	border-left: 3px solid;
+	border-right: none;
+	border-top: 3px solid transparent;
+	border-bottom: 3px solid transparent;
+}
+
+.choose-body>.choose-item .setting {
+	display: none;
+	position: absolute;
+	right: 20px;
+	top: 1px;
+}
+
+.choose-body>.choose-item>ul>li:hover .setting {
+	display: block;
+}
+
+.choose-result {
+	margin-top: 10px;
+}
+
+.choose-result .breadcrumb {
+	border: 1px solid #ffdbab;
+	background-color: #fffbf2;
+	color: #b68571;
+	display: inline-block;
+	margin-bottom: 0;
+}
+
+#main .form-group {
+	margin-bottom: 8px;
+}
+
+#main .modal-body .form-group {
+	margin-left: 0;
+	margin-right: 0;
+}
+
+#main .form-horizontal .control-subinfo {
+	text-align: left;
+	margin-bottom: 0;
+	padding-top: 7px;
+	padding-left: 0;
+	padding-right: 0;
+}
+
+#main .form-horizontal .control-subinfo * {
+	display: inline;
+}
+
+#main .text-danger {
+	color: #e42a2a;
+}
+
+#main .well label.control-label {
+	font-weight: normal;
+	color: #444;
+}
+
+#main .img-thumbnail {
+	cursor: pointer;
+	margin-right: 15px;
+}
+
+.side-box {
+    padding-bottom: 15px;
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 0 14px 14px;
+    border: 1px solid #e6e6e6;
+    background: #fcfcfc;
+    line-height: 22px;
+    color: #555;
+}
+
+.side-box .title {
+	font-size: 14px;
+    font-weight: 700;
+    padding-bottom: 4px;
+    line-height: 20px;
+    margin-bottom: 5px;
+    margin-top: 12px;
+    color: #555;
+}
+
+.base-info {
+	margin-bottom: 10px;
+}
+
+.base-info .item {
+	line-height: 26px;
+	border-bottom: 1px dotted #e8e8e8;
+	padding: 5px 15px;
+	margin: 0;
+}
+
+.base-info .title {
+	float: left;
+	width: 78px;
+	color: #999;
+	font-weight: bold;
+}
+
+.base-info .content {
+	float: left;
+	white-space: nowrap;
+}
+
+.headerline {
+	font-size: 22px;
+	font-family: Microsoft YaHei, SimHei, Verdana;
+	font-weight: 500;
+	line-height: 22px;
+	margin: 25px 0 25px -10px;
+	clear: both;
+	zoom: 1;
+	border-top: 1px solid #eee;
+	position: relative;
+}
+
+.headerline .title {
+	float: left;
+	line-height: 24px;
+	margin-top: -12px;
+	padding: 0 15px 0 18px;
+	border-left: 12px solid #4F9CEE;
+	background: #fff;
+	z-index: 2;
+}
+
+.text-box {
+	padding: 20px;
+	font-size: 14px;
+    word-wrap: break-word;
+    color: #333;
+    margin-bottom: 15px;
+    text-indent: 2em;
+    line-height: 24px;
+    zoom: 1;
+}
+/*mgr*/
+#main .mgr {
+	font-family: "microsoft yahei";
+}
+
+#main .mgr a {
+	color: #666;
+}
+
+#main .mgr a:hover {
+	color: #3ba354 !important;
+}
+</style>
+<!-- 类目修改模态框,修改类目名称 -->
+<div class="modal-header">
+	<h3 class="modal-title">
+		<i class="fa fa-fw fa-sitemap text-default"></i>
+		<span>选择类目(只能选择子类目)</span>
+	</h3>
+</div>
+<div class="modal-body">
+	<div class="choose-body">
+		<div class="choose-item">
+			<ul class="list-unstyled">
+				<li ng-repeat="k in kinds[0]" ng-class="{active: k.$active}"><a
+					ng-click="onItemClick(k, 0)">{{k.nameCn}}<span class="caret"
+						ng-show="!k.isLeaf"></span></a></li>
+			</ul>
+		</div>
+		<div class="choose-item">
+			<ul class="list-unstyled" ng-show="kinds[1].length>0">
+				<li ng-repeat="k in kinds[1]" ng-class="{active: k.$active}"><a
+					ng-click="onItemClick(k, 1)">{{k.nameCn}}<span class="caret"
+						ng-show="!k.isLeaf"></span></a></li>
+			</ul>
+		</div>
+		<div class="choose-item">
+			<ul class="list-unstyled" ng-show="kinds[2].length>0">
+				<li ng-repeat="k in kinds[2]" ng-class="{active: k.$active}"><a
+					ng-click="onItemClick(k, 2)">{{k.nameCn}}<span class="caret"
+						ng-show="!k.isLeaf"></span></a></li>
+			</ul>
+		</div>
+		<div class="choose-item">
+			<ul class="list-unstyled" ng-show="kinds[3].length>0">
+				<li ng-repeat="k in kinds[3]" ng-class="{active: k.$active}"><a
+					ng-click="onItemClick(k, 3)">{{k.nameCn}}<span class="caret"
+						ng-show="!k.isLeaf"></span></a></li>
+			</ul>
+		</div>
+	</div>
+	<div class="choose-result">
+		<ol class="breadcrumb" ng-show="actives.length > 0">
+			<span class="text-muted">您当前选择的类目:</span>
+			<li ng-repeat="a in actives">{{a.nameCn}}</li>
+		</ol>
+	</div>
+</div>
+<div class="modal-footer">
+	<div class="pull-left">
+		如果您觉得类目结构设置有待改善,您可以<a class="text-primary" href="product#/kindAdvice" target="_blank">提出您的宝贵建议</a>。
+	</div>
+	<button class="btn btn-primary" type="button"
+		ng-disabled="!active.isLeaf" ng-click="check()">确认并保存</button>
+	<button class="btn btn-default" ng-click="cancel()" type="button">取消</button>
+</div>

+ 1 - 0
src/main/webapp/resources/tpl/index/purc/saved_tender.html

@@ -184,6 +184,7 @@
         margin-top: 20px;
     }
     .fileInput{
+        width: 100px;
         height:100px;
         font-size: 100px;
         position:absolute;

+ 93 - 12
src/main/webapp/resources/tpl/index/purc/tender.html

@@ -294,10 +294,10 @@
     }
 
     /*招标单*/
-    .tender-list02 dl{width: 100%;margin:0 auto;}
+    .tender-list02 dl{width: 100%;margin:0 auto;position: relative;}
     .tender-list02 dl dt{width: 100%;margin:0 auto;height: 40px;}
     .tender-list02 dl dt span{height: 50px;line-height: 50px;display: inline-block;color: #323232;}
-    .tender-list02 dl dd{width: 100%;margin:0 auto;height: 50px;border-bottom: #ccc 1px dotted;overflow: hidden; position: relative;}
+    .tender-list02 dl dd{width: 100%;margin:0 auto;height: 50px;border-bottom: #ccc 1px dotted;overflow: hidden; }
     .tender-list02 dl dd:hover{border: #d32526 1px solid;}
     .tender-list02 dl dd:hover span a{ display: inline-block;}
     .tender-list02 dl dd span{height: 50px;line-height: 50px;display: inline-block;}
@@ -369,6 +369,66 @@
         cursor: pointer;
     }
 
+    .tender-list02 dl div.wid01{ width:22%; float: left; margin-top: 9px;}
+
+    .tender-list02 dl div.wid02{ width:18%; float: left; margin-top: 9px;}
+
+    .tender-list02 dl div.wid03{ width:5%; float: left; margin-top: 9px;}
+
+    .tender-list02 dl div.input-group>input {
+        border: 1px solid #ccc;
+        border-right: 0;
+        margin-left: 5px;
+    }
+
+    .tender-list02 dl dd input {
+        border: 1px solid #ccc;
+        padding-left: 5px;
+    }
+
+    /*.tender-list02 dl div.input-group .input-group-addon {*/
+        /*border-bottom-right-radius: 0;*/
+        /*border-top-right-radius: 0;*/
+        /*border: 1px solid #ccc;*/
+        /*border-left: 0;*/
+    /*}*/
+
+    #li01 ul {
+        width: 200px;
+    }
+
+    #li01 ul li{
+        height: 30px;
+        line-height: 30px;
+        padding: 0;
+    }
+    #li01 ul li a{
+        display: inline-block;
+        height:30px;
+        width: 100%;
+    }
+    #li01 .input-group{
+        position: absolute;
+        width: 155px;
+    }
+    #li01 .input-group-addon{
+        width: 30px;
+        line-height: 34px;
+        height: 34px;
+        padding: 0;
+        display: inline-block;
+        position: absolute;
+        top: 8.5px;
+        right: -7px;
+    }
+    .dropdown-menu {
+        min-width: 150px;
+    }
+
+    .tender-list02 dl dd span.codeInput input {
+        border: 1px solid #ccc;
+    }
+
 </style>
 
 <div class="ng-scope">
@@ -379,7 +439,11 @@
             <i></i>
             </div>-->
             <div class="tender-label list-unstyled">
-                <div class="com_head"><span>招标单</span></div>
+                <div class="com_head">
+                    <span>招标单</span>
+                    <!--<span class="fr"><em>录入人:张三</em><time>日期:2017-03-07  12:20</time></span>-->
+                    <span class="fr"><em>录入人:{{user.userName}}</em><time>日期:{{time | date :'yyyy-MM-dd hh:MM:ss'}}</time></span>
+            </div>
             </div>
             <div class="tender-content ng-scope" ng-controller="PurcNewTenderCtrl">
                 <div class="title-div" style="border-bottom: 1px dashed #327ebe;">
@@ -503,16 +567,33 @@
                                     <span class="wid03">&nbsp;</span>
                                 </dt>
                                 <div class="scroll-y">
-                                    <dd ng-repeat="prod in tenderProd">
+                                    <dd ng-repeat="prod in tenderProd" id="li01">
                                         <span>{{$index + 1}}</span>
-                                        <span class="wid01"><input type="text"  ng-model="prod.prodCode" placeholder="填入型号" ng-change="onChange(prod.prodCode)" ng-search="search(prod.prodCode)" ng-focus="onFocus(prod.prodCode)" ng-blur="onBlur(prod.prodCode)" ng-keyup="onKeyup(prod.prodCode)" required /></span>
-                                        <ul class="association" ng-show="associate || associateEnter" ng-mouseenter="onAssociateEnter()"
-                                            ng-mouseleave="onAssociateLeave()">
-                                            <li ng-repeat="as in associates" ng-bind="as" ng-class="{'active': $index==selectIndex}"
-                                                ng-click="onAssociateClick(as)"></li>
-                                        </ul>
-                                        <span class="wid01"><input type="text" ng-model="prod.prodTitle" placeholder="点击填入产品名称" required/></span>
-                                        <span class="wid02"><input type="text" ng-model="prod.brand" placeholder="点击填入品牌" required/></span>
+                                        <span class="wid01 codeInput">
+                                            <input type="text" name="code" ng-model="prod.prodCode" ng-change="getSimilarCodes(prod.prodCode)" ng-focus="onFocus('code')" placeholder="请输入标准原厂型号" typeahead="prod.code for prod in getSimilarCodes($viewValue)" autocomplete="off" typeahead-on-select="onAssociateCmpClick($item, prod)" spellcheck = "false" required>
+                                        </span>
+                                        <!--<span class="wid01">-->
+                                            <!--<input type="text" ng-model="prod.prodTitle" placeholder="点击填入产品名称" required/>-->
+                                        <!--</span>-->
+                                        <span class="wid01">
+                                             <div class="input-group">
+                                            <input type="text" style="width: 192px; text-align: left;" class="input01" name="kindName" ng-model="prod.prodTitle"  required placeholder="请输入或选择分类" spellcheck = "false" autocomplete="off" />
+                                                 <!-- typeahead="kind.nameCn  for kind in getSimilarKinds($viewValue)"
+                                                        typeahead-on-select="onAssociateKindClick($item)" -->
+                                            <div class="input-group-addon" ng-click="selectKind(prod)">
+                                                <i class="fa fa-search" aria-hidden="true"></i>
+                                            </div>
+                                        </div>
+                                        </span>
+                                        <!--<span class="wid02"><input type="text" ng-model="prod.brand" placeholder="点击填入品牌" /></span>-->
+                                        <span class="wid02">
+                                            <div class="input-group">
+                                                <input type="text" style="width: 100%; text-align: left;" ng-change="getSimilarBrands(prod.brand)" class="input01" name="brandName" ng-model="prod.brand" required  placeholder="请输入或选择品牌" spellcheck = "false" typeahead="prod.brandCn for prod in getSimilarBrands($viewValue)" autocomplete="off" typeahead-on-select="onAssociateBrandClick($item, prod)" />
+                                                <div class="input-group-addon" ng-click="selectBrand(prod)">
+                                                    <i class="fa fa-search" aria-hidden="true"></i>
+                                                </div>
+                                            </div>
+                                        </span>
                                         <span><input type="text" ng-model="prod.unit" placeholder="点击填入单位" required/></span>
                                         <span><input type="text" ng-model="prod.qty" ng-pattern="/^\+?[1-9][0-9]*$/" placeholder="点击填入数量" required/></span>
                                         <span class="wid03"><a ng-click="del($index)"><i class="fa fa-close"></i></a></span>

+ 1 - 1
src/main/webapp/resources/tpl/index/purc/tender_evaluation.html

@@ -351,7 +351,7 @@
                                 </dd>
                                 <dd ng-repeat="saleTenderItem in tenderProd.saleTenderItems | orderBy: orderType">
                                     <span class="wid01">{{saleTenderItem.saleTender.enterpriseBaseInfo.enName}}
-                                        <a ng-show="tender.overdue != 1" ui-sref="sale.vendortender({vendUU:saleTenderItem.saleTender.enterpriseBaseInfo.uu, id:tender.id})" target="_self" title="查看投标单" >查看投标单
+                                        <a ng-show="tender.overdue == 1" ui-sref="sale.vendortender({vendUU:saleTenderItem.saleTender.enterpriseBaseInfo.uu, id:tender.id})" target="_self" title="查看投标单" >查看投标单
                                         </a>
                                     </span>
                                     <span ng-show="tender.overdue == 1">{{saleTenderItem.taxrate || 0}}</span>