Browse Source

新增物料,下载物料资料;商务平台下采购订单;

git-svn-id: svn+ssh://10.10.101.21/source/platform/platform-b2b@7004 f3bf4e98-0cf0-11e4-a00c-a99a8b9d557d
hejq 9 years ago
parent
commit
b47fe91ac3
43 changed files with 4907 additions and 20 deletions
  1. 223 0
      src/main/java/com/uas/platform/b2b/controller/BaseInfoController.java
  2. 37 0
      src/main/java/com/uas/platform/b2b/controller/ComponentController.java
  3. 39 0
      src/main/java/com/uas/platform/b2b/controller/KindController.java
  4. 35 0
      src/main/java/com/uas/platform/b2b/controller/NewOrderController.java
  5. 7 0
      src/main/java/com/uas/platform/b2b/controller/SnapshotController.java
  6. 29 0
      src/main/java/com/uas/platform/b2b/dao/ComponentDao.java
  7. 20 0
      src/main/java/com/uas/platform/b2b/dao/KindDao.java
  8. 10 0
      src/main/java/com/uas/platform/b2b/dao/KindInfoDao.java
  9. 7 1
      src/main/java/com/uas/platform/b2b/dao/UserBaseInfoDao.java
  10. 131 0
      src/main/java/com/uas/platform/b2b/model/BrandInfo.java
  11. 181 0
      src/main/java/com/uas/platform/b2b/model/Component.java
  12. 255 0
      src/main/java/com/uas/platform/b2b/model/Kind.java
  13. 99 0
      src/main/java/com/uas/platform/b2b/model/KindInfo.java
  14. 139 0
      src/main/java/com/uas/platform/b2b/model/KindProperty.java
  15. 32 0
      src/main/java/com/uas/platform/b2b/model/Product.java
  16. 38 0
      src/main/java/com/uas/platform/b2b/search/SearchController.java
  17. 30 1
      src/main/java/com/uas/platform/b2b/search/SearchService.java
  18. 40 2
      src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java
  19. 61 0
      src/main/java/com/uas/platform/b2b/service/BaseInfoService.java
  20. 17 0
      src/main/java/com/uas/platform/b2b/service/ComponentService.java
  21. 17 0
      src/main/java/com/uas/platform/b2b/service/KindService.java
  22. 2 1
      src/main/java/com/uas/platform/b2b/service/ProductService.java
  23. 244 0
      src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java
  24. 23 0
      src/main/java/com/uas/platform/b2b/service/impl/ComponentServiceImpl.java
  25. 23 0
      src/main/java/com/uas/platform/b2b/service/impl/KindServiceImpl.java
  26. 17 11
      src/main/java/com/uas/platform/b2b/service/impl/ProductServiceImpl.java
  27. 974 4
      src/main/webapp/resources/js/index/app.js
  28. 269 0
      src/main/webapp/resources/js/index/services/BaseInfo.js
  29. 10 0
      src/main/webapp/resources/js/index/services/Purc.js
  30. 0 0
      src/main/webapp/resources/tpl/index/baseInfo/index.html
  31. 39 0
      src/main/webapp/resources/tpl/index/baseInfo/modal/Component_KindChoose_modal.html
  32. 415 0
      src/main/webapp/resources/tpl/index/baseInfo/modal/product_kindChoose_modal.html
  33. 173 0
      src/main/webapp/resources/tpl/index/baseInfo/newProdInfo.html
  34. 185 0
      src/main/webapp/resources/tpl/index/baseInfo/prodList.html
  35. 175 0
      src/main/webapp/resources/tpl/index/baseInfo/productDetail.html
  36. 134 0
      src/main/webapp/resources/tpl/index/baseInfo/quotation.html
  37. 172 0
      src/main/webapp/resources/tpl/index/baseInfo/right.html
  38. 349 0
      src/main/webapp/resources/tpl/index/baseInfo/uploadByBatch.html
  39. 178 0
      src/main/webapp/resources/tpl/index/purc/addOrder.html
  40. 3 0
      src/main/webapp/resources/tpl/index/purc/left.html
  41. 36 0
      src/main/webapp/resources/tpl/index/purc/modal/purc_order_cust.html
  42. 38 0
      src/main/webapp/resources/tpl/index/purc/modal/purc_order_custProd.html
  43. 1 0
      src/main/webapp/resources/tpl/index/purc/right.html

+ 223 - 0
src/main/java/com/uas/platform/b2b/controller/BaseInfoController.java

@@ -0,0 +1,223 @@
+package com.uas.platform.b2b.controller;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
+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.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.uas.platform.b2b.model.Enterprise;
+import com.uas.platform.b2b.model.FileUpload;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseOrderAllItem;
+import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.BaseInfoService;
+import com.uas.platform.b2b.service.ProductService;
+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.b2b.temporary.model.NewPurcOrder;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.model.Sort.Type;
+import com.uas.search.b2b.util.SearchConstants;
+
+/**
+ * 基础资料设置<br>
+ * 物料查看、物料资料上传
+ * 
+ * @author hejq
+ * @time 创建时间:2016年12月22日
+ */
+@RestController
+@RequestMapping("/product/baseInfo")
+public class BaseInfoController {
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	@Autowired
+	private SearchService searchService;
+
+	@Autowired
+	private ProductService productService;
+
+	@Autowired
+	private BaseInfoService baseInfoService;
+
+	/**
+	 * 查看自己的物料资料
+	 */
+	@RequestMapping(method = RequestMethod.GET)
+	@ResponseBody
+	public SPage<Product> getAllProductInfo(PageParams params, String keyword) {
+		logger.log("查看物料", SystemSession.getUser().getUserName() + "查看了物料信息");
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+		pageParams.getFilters().put("pr_enuu", SystemSession.getUser().getEnterprise().getUu());
+		List<Sort> sortList = new ArrayList<>();
+		sortList.add(new Sort("pr_id", false, Type.LONG, new Long(1)));
+		pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+		return searchService.searchProductsCheckIds(keyword, pageParams);
+	}
+
+	/**
+	 * 通过id查看详情
+	 */
+	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
+	@ResponseBody
+	public Product getProductInfoById(@PathVariable("id") Long id) {
+		return baseInfoService.findById(id);
+	}
+
+	/**
+	 * 通过id删除
+	 * 
+	 * @param id
+	 * @return
+	 * @return
+	 */
+	@RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
+	@ResponseBody
+	public String deleteById(@PathVariable("id") Long id) {
+		logger.log("删除物料", "[" + SystemSession.getUser().getUserName() + "]删除了id为 [" + id + "]的物料");
+		baseInfoService.deleteById(id);
+		return "success";
+	}
+
+	/**
+	 * 更新物料信息
+	 * 
+	 * @param prodInfo
+	 * @return
+	 */
+	@RequestMapping(value = "/updateProdInfo", method = RequestMethod.POST)
+	public Product updateProdInfo(@RequestBody String prodInfo) {
+		Product productInfo = FlexJsonUtils.fromJson(prodInfo, Product.class);
+		logger.log("更新物料", "[" + SystemSession.getUser().getUserName() + "]更新了id为" + productInfo.getId() + "的["
+				+ productInfo.getTitle() + "]");
+		return baseInfoService.update(productInfo);
+	}
+
+	/**
+	 * 新增物料
+	 * 
+	 * @param prodInfo
+	 * @return
+	 */
+	@RequestMapping(value = "/addNewProduct", method = RequestMethod.POST)
+	public Product addNewProduct(@RequestBody String prodInfo) {
+		Product productInfo = FlexJsonUtils.fromJson(prodInfo, Product.class);
+		logger.log("新增物料", "[" + SystemSession.getUser().getUserName() + "] 新增了物料:[" + productInfo.getTitle() + "]");
+		return baseInfoService.addNewProduct(productInfo);
+	}
+
+	/**
+	 * 获取批量上传物料的模板
+	 * 
+	 * @return
+	 */
+	@RequestMapping(value = "/upload/template", method = RequestMethod.GET)
+	public ModelAndView exportOrders() {
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/baseInfo/baseInfo_example", "商务平台物料上传"));
+		logger.log("物料上传", "下载批量上传物料的模板");
+		return modelAndView;
+	}
+
+	/**
+	 * 导出Excel
+	 * 
+	 * @param params
+	 * @return
+	 */
+	@RequestMapping(value = "/xls", method = RequestMethod.GET)
+	public ModelAndView export(String keyword) {
+		PageInfo pageInfo = new PageInfo(1, JxlsExcelView.MAX_SIZE, 0);
+		pageInfo.sorting("id", Direction.DESC);
+		pageInfo.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.addObject("data", productService.findAllByPageInfo(pageInfo, keyword).getContent());
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/baseInfo/baseInfo", "物料资料表"));
+		logger.log("物料资料", "导出Excel列表", "导出全部Excel列表");
+		return modelAndView;
+	}
+
+	/**
+	 * 通过excel批量导入物料
+	 * 
+	 * @param uploadItem
+	 * @return
+	 */
+	@RequestMapping(value = "/release/excel", method = RequestMethod.POST)
+	public ModelMap releaseByExcel(FileUpload uploadItem) {
+		ModelMap map = new ModelMap();
+		String fileName = uploadItem.getFile().getOriginalFilename();
+		String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+		InputStream is = null;
+		Workbook workbook = null;
+		try {
+			is = uploadItem.getFile().getInputStream();
+			if ("xls".equals(suffix)) {
+				workbook = new HSSFWorkbook(is);
+			} else if ("xlsx".equals(suffix)) {
+				workbook = new XSSFWorkbook(is);
+			} else {
+				throw new IllegalOperatorException("文件格不正确,请上传.xls或.xlsx的文件");
+			}
+			map = baseInfoService.releaseByWorkbook(workbook);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		logger.log("商品批次", "[" + SystemSession.getUser().getUserName() + "]通过excel导入了物料,数量为" + map.size());
+		return map;
+	}
+	
+	/**
+	 * 企业列表
+	 * 
+	 * @param params
+	 * @param keyword
+	 * @return
+	 */
+	@RequestMapping(value="/enterprise",method = RequestMethod.GET)
+	@ResponseBody
+	public SPage<Enterprise> getAllEnterprises(PageParams params, String keyword) {
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+		return searchService.searchEnterpriseCheckIds(keyword, pageParams);
+	}
+	
+	/**
+	 * 存储平台下的采购单
+	 * 
+	 * @param json
+	 * @return
+	 */
+	@RequestMapping(value = "/newPurcOrder", method = RequestMethod.POST)
+	public ResponseEntity<ModelMap> save(@RequestBody String json) {
+		NewPurcOrder neworder = FlexJsonUtils.fromJson(json, NewPurcOrder.class);
+		List<PurchaseOrderAllItem> item = new ArrayList<>();
+		item = baseInfoService.save(neworder);
+		ModelMap map = new ModelMap();
+		map.put("id", item.get(0).getOrder().getId());
+		return new ResponseEntity<ModelMap>(map, HttpStatus.OK);
+	}
+	
+}

+ 37 - 0
src/main/java/com/uas/platform/b2b/controller/ComponentController.java

@@ -0,0 +1,37 @@
+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.search.SearchService;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
+
+/**
+ * 器件属性
+ * 
+ * @author hejq
+ * @time 创建时间:2016年12月27日
+ */
+
+@RestController
+@RequestMapping("/product/component")
+public class ComponentController {
+
+	@Autowired
+	private SearchService searchService;
+
+	@RequestMapping(value = "/cmplist/{kindId}", method = RequestMethod.GET)
+	@ResponseBody
+	public SPage<Component> getCmpListByKindId(@PathVariable("kindId") Long kindId, PageParams params, String keyword) {
+		com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+		//以当前获取的KindId做过滤条件
+		pageParams.getFilters().put("cmp_kiid", kindId);
+		return searchService.searchProductComponentCheckIds(keyword, pageParams);
+	}
+}

+ 39 - 0
src/main/java/com/uas/platform/b2b/controller/KindController.java

@@ -0,0 +1,39 @@
+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;
+
+/**
+ * 器件类目查询接口
+ * 
+ * @author hejq
+ * @time 创建时间:2016年12月27日
+ */
+@RestController
+@RequestMapping("/product/kind")
+public class KindController {
+
+	@Autowired
+	private KindService kindService;
+
+	/**
+	 * 商品类目的子类目
+	 * 
+	 * @param parentId
+	 * @return
+	 */
+	@RequestMapping(value = "/{parentId}/children", method = RequestMethod.GET)
+	@ResponseBody
+	public List<Kind> getProductKinds(@PathVariable("parentId") Long parentId) {
+		return kindService.getChildProductKinds(parentId);
+	}
+}

+ 35 - 0
src/main/java/com/uas/platform/b2b/controller/NewOrderController.java

@@ -0,0 +1,35 @@
+package com.uas.platform.b2b.controller;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.uas.platform.b2b.model.SaleQuotationItem;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+
+/**
+ * 商务平台新增的采购订单
+ * 
+ * @author hejq
+ * @time 创建时间:2016年12月29日
+ */
+@RequestMapping(value = "/sale/newOrder")
+@ResponseBody
+public class NewOrderController {
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	public ResponseEntity<ModelMap> save(@RequestBody String json) {
+		SaleQuotationItem item = FlexJsonUtils.fromJson(json, SaleQuotationItem.class);
+		logger.log("主动报价单", "在平台上录入主动报价单", item.replyDescription(), item.getQuotation().getCode(),
+				item.getQuotation().getId());
+		ModelMap map = new ModelMap();
+		map.put("id", item.getQuotation().getId());
+		return new ResponseEntity<ModelMap>(map, HttpStatus.OK);
+	}
+}

+ 7 - 0
src/main/java/com/uas/platform/b2b/controller/SnapshotController.java

@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.uas.platform.b2b.service.AddPartnerService;
 import com.uas.platform.b2b.service.MakeAcceptService;
 import com.uas.platform.b2b.service.MakeOrderChangeService;
 import com.uas.platform.b2b.service.MakeOrderService;
@@ -85,6 +86,9 @@ public class SnapshotController {
 	@Autowired
 	private MakeReturnService makeReturnService;
 
+	@Autowired
+	private AddPartnerService addPartnerService;
+
 	/**
 	 * 统计待处理事项
 	 * 
@@ -135,6 +139,9 @@ public class SnapshotController {
 		modelMap.put("purc",
 				purchaseOrderService.getPurcByenUUAdnStatus(SystemSession.getUser().getEnterprise().getUu()));
 		modelMap.put("purcTodo", purchaseOrderService.getPurcOnhandCount());
+
+		// 新的建立合作关系的申请
+		modelMap.put("myMessageTodo", addPartnerService.getMyMessageTodoCount());
 		return modelMap;
 	}
 

+ 29 - 0
src/main/java/com/uas/platform/b2b/dao/ComponentDao.java

@@ -0,0 +1,29 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+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;
+
+public interface ComponentDao extends JpaRepository<Component, Long>, JpaSpecificationExecutor<Component> {
+
+	/**
+	 * 通过code查询UUID<br>
+	 * 商务平台以code与cmpcode对应
+	 * 
+	 * @param code
+	 * @return
+	 */
+	List<Component> findByCode(String code);
+
+	/**
+	 * 通过类目id查询器件的信息
+	 * 
+	 * @param kindid
+	 * @return
+	 */
+	SPage<Component> findByKindid(Long kindid);
+}

+ 20 - 0
src/main/java/com/uas/platform/b2b/dao/KindDao.java

@@ -0,0 +1,20 @@
+package com.uas.platform.b2b.dao;
+
+import java.util.List;
+
+import javax.persistence.QueryHint;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.stereotype.Repository;
+
+import com.uas.platform.b2b.model.Kind;
+
+@Repository
+public interface KindDao extends JpaRepository<Kind, Long>, JpaSpecificationExecutor<Kind> {
+
+	@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
+	List<Kind> findByParentidOrderByDetno(Long parentid);
+
+}

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

@@ -0,0 +1,10 @@
+package com.uas.platform.b2b.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import com.uas.platform.b2b.model.KindInfo;
+
+public interface KindInfoDao extends JpaRepository<KindInfo, Long>, JpaSpecificationExecutor<KindInfo> {
+
+}

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

@@ -9,5 +9,11 @@ import com.uas.platform.b2b.model.UserBaseInfo;
 @Repository
 public interface UserBaseInfoDao extends JpaSpecificationExecutor<UserBaseInfo>, JpaRepository<UserBaseInfo, Long> {
 
-
+	/**
+	 * 通过uu号查询基本用户信息
+	 * 
+	 * @param userUU
+	 * @return
+	 */
+	public UserBaseInfo findByUserUU(Long userUU);
 }

+ 131 - 0
src/main/java/com/uas/platform/b2b/model/BrandInfo.java

@@ -0,0 +1,131 @@
+package com.uas.platform.b2b.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 简要品牌信息
+ * 
+ * @author suntg
+ * @since 2016年3月11日上午10:02:20
+ */
+@Entity
+@Table(name = "product$brand")
+public class BrandInfo {
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "br_id")
+	private Long id;
+
+	/**
+	 * uuid
+	 */
+	@Column(name = "br_uuid", unique = true)
+	private String uuid;
+
+	/**
+	 * 版本号
+	 */
+	@Column(name = "br_version")
+	private Short version;
+
+	/**
+	 * 品牌中文名称
+	 */
+	@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_weight")
+	private Double weight;
+
+	@Column(name = "br_vendor")
+	private String vendor;
+
+	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 Short getVersion() {
+		return version;
+	}
+
+	public void setVersion(Short version) {
+		this.version = version;
+	}
+
+	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 Double getWeight() {
+		return weight;
+	}
+
+	public void setWeight(Double weight) {
+		this.weight = weight;
+	}
+
+	public String getVendor() {
+		return vendor;
+	}
+
+	public void setVendor(String vendor) {
+		this.vendor = vendor;
+	}
+
+	public BrandInfo() {
+
+	}
+}

+ 181 - 0
src/main/java/com/uas/platform/b2b/model/Component.java

@@ -0,0 +1,181 @@
+package com.uas.platform.b2b.model;
+
+import java.io.Serializable;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * 标准器件
+ * 
+ * @author suntg
+ * @since 2016年3月11日上午10:24:29
+ */
+@Entity
+@Table(name = "product$component")
+public class Component implements Serializable {
+
+	/**
+	 * 序列号
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "cmp_id")
+	private Long id;
+
+	/**
+	 * 器件的uuid
+	 */
+	@Column(name = "cmp_uuid", unique = true, nullable = false)
+	private String uuid;
+
+	/**
+	 * 原厂型号
+	 */
+	@Column(name = "cmp_code")
+	private String code;
+
+	/**
+	 * 类目id
+	 */
+	@Column(name = "cmp_kiid")
+	private Long kindid;
+
+	/**
+	 * 器件的类目
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "cmp_kiid", insertable = false, updatable = false)
+	private KindInfo kind;
+
+	/**
+	 * 品牌id
+	 */
+	@Column(name = "cmp_brid")
+	private Long brandid;
+
+	/**
+	 * 器件的品牌
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH })
+	@JoinColumn(name = "cmp_brid", insertable = false, updatable = false)
+	private BrandInfo brand;
+
+	/**
+	 * 器件封装规格 这个封装规格和下面的封装规格值应该是一样的。在componentInfo中有packaging 赋值给spec,
+	 * 现在已packaging 为准(spec 有值的只有一个器件), by yujia
+	 */
+	@Column(name = "cmp_packaging")
+	private String packaging;
+
+	/**
+	 * 附件url
+	 * 
+	 * @TODO 建立对应的附件表
+	 */
+	@Column(name = "cmp_attach")
+	private String attach;
+
+	/**
+	 * 图片path
+	 */
+	@Column(name = "cmp_img")
+	private String img;
+
+	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 getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public Long getKindid() {
+		return kindid;
+	}
+
+	public void setKindid(Long kindid) {
+		this.kindid = kindid;
+	}
+
+	public KindInfo getKind() {
+		return kind;
+	}
+
+	public void setKind(KindInfo kind) {
+		this.kind = kind;
+	}
+
+	public Long getBrandid() {
+		return brandid;
+	}
+
+	public void setBrandid(Long brandid) {
+		this.brandid = brandid;
+	}
+
+	public BrandInfo getBrand() {
+		return brand;
+	}
+
+	public void setBrand(BrandInfo brand) {
+		this.brand = brand;
+	}
+
+	public String getPackaging() {
+		return packaging;
+	}
+
+	public void setPackaging(String packaging) {
+		this.packaging = packaging;
+	}
+
+	public String getAttach() {
+		return attach;
+	}
+
+	public void setAttach(String attach) {
+		this.attach = attach;
+	}
+
+	public String getImg() {
+		return img;
+	}
+
+	public void setImg(String img) {
+		this.img = img;
+	}
+
+	@Override
+	public String toString() {
+		return "Component [id=" + id + ", uuid=" + uuid + ", code=" + code + ", kindid=" + kindid + ", kind=" + kind
+				+ ", brandid=" + brandid + ", brand=" + brand + ", packaging=" + packaging + ", attach=" + attach
+				+ ", img=" + img + "]";
+	}
+
+}

+ 255 - 0
src/main/java/com/uas/platform/b2b/model/Kind.java

@@ -0,0 +1,255 @@
+package com.uas.platform.b2b.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.core.model.Constant;
+
+/**
+ * 产品类目
+ * 
+ * @author suntg
+ * @since 2016年3月10日下午3:08:40
+ */
+@Entity
+@Table(name = "product$kind")
+public class Kind implements Serializable {
+
+	/**
+	 * 序列号
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * ID号
+	 */
+	@Id
+	@Column(name = "ki_id")
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product$kind_gen")
+	@SequenceGenerator(name = "product$kind_gen", sequenceName = "product$kind_seq", allocationSize = 1)
+	private Long id;
+
+	/**
+	 * 父级类目的id号
+	 */
+	@Column(name = "ki_parentid")
+	private Long parentid;
+
+	/**
+	 * 是否为叶子类目 1是 0否
+	 */
+	@Column(name = "ki_isleaf")
+	private Short isLeaf;
+
+	/**
+	 * 在父级类目中的排序序号
+	 */
+	@Column(name = "ki_detno")
+	private Short detno;
+
+	/**
+	 * 类目的名称
+	 */
+	@Column(name = "ki_name")
+	private String nameCn;
+
+	/**
+	 * 类目的英文名称
+	 */
+	@Column(name = "ki_name_en")
+	private String nameEn;
+
+	/**
+	 * 类目包含的器件总数,包括其所有子类目下的
+	 */
+	@Column(name = "ki_count")
+	private Long count;
+
+	/**
+	 * 类目的层级,从1开始,1、2、3、4
+	 */
+	@Column(name = "ki_level")
+	private Short level;
+
+	/**
+	 * 器件编号前缀
+	 */
+	@Column(name = "ki_cmpprefix")
+	private String componentPrefix;
+
+	/**
+	 * 当前器件编号后缀游标
+	 */
+	@Column(name = "ki_cmpsuffix")
+	private Long componentsuffix;
+
+	/**
+	 * 包含的属性
+	 */
+	@OneToMany(mappedBy = "kind", cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY)
+	@OrderBy("detno")
+	private Set<KindProperty> properties;
+
+	/**
+	 * 所含子类目
+	 */
+	@Transient
+	private List<Kind> children;
+
+	/**
+	 * 其兄弟类目
+	 */
+	@Transient
+	private List<Kind> bothers;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getParentid() {
+		return parentid;
+	}
+
+	public void setParentid(Long parentid) {
+		this.parentid = parentid;
+	}
+
+	public Short getIsLeaf() {
+		return isLeaf;
+	}
+
+	public void setIsLeaf(Short isLeaf) {
+		this.isLeaf = isLeaf;
+	}
+
+	public boolean isLeaf() {
+		return this.isLeaf == null ? false : getIsLeaf() == Constant.YES;
+	}
+
+	public Short getDetno() {
+		return detno;
+	}
+
+	public void setDetno(Short detno) {
+		this.detno = detno;
+	}
+
+	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 Long getCount() {
+		return count;
+	}
+
+	public void setCount(Long count) {
+		this.count = count;
+	}
+
+	public void addCount() {
+		this.count = this.count + 1;
+	}
+
+	public void addCount(Long count) {
+		this.count = this.count + count;
+	}
+
+	public void decreaseCount() {
+		this.count = this.count - 1;
+	}
+
+	public List<Kind> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<Kind> children) {
+		this.children = children;
+	}
+
+	public List<Kind> getBothers() {
+		return bothers;
+	}
+
+	public void setBothers(List<Kind> bothers) {
+		this.bothers = bothers;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Set<KindProperty> getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Set<KindProperty> properties) {
+		this.properties = properties;
+	}
+
+	public Short getLevel() {
+		return level;
+	}
+
+	public void setLevel(Short level) {
+		this.level = level;
+	}
+
+	public String getComponentPrefix() {
+		return componentPrefix;
+	}
+
+	public void setComponentPrefix(String componentPrefix) {
+		this.componentPrefix = componentPrefix;
+	}
+
+	public Long getComponentsuffix() {
+		return componentsuffix;
+	}
+
+	public void setComponentsuffix(Long componentsuffix) {
+		this.componentsuffix = componentsuffix;
+	}
+
+	/*
+	 * public KindUas converUas(Kind kind){ KindUas uas = new KindUas();
+	 * uas.setComponentPrefix(kind.getComponentPrefix());
+	 * uas.setComponentsuffix(kind.getComponentsuffix());
+	 * uas.setCount(kind.getCount()); uas.setDetno(kind.getDetno());
+	 * uas.setId(kind.getId()); uas.setIsLeaf(kind.getIsLeaf());
+	 * uas.setLevel(kind.getLevel()); uas.setNameCn(kind.getNameCn());
+	 * uas.setNameEn(kind.getNameEn()); uas.setParentid(kind.getParentid());
+	 * return uas; }
+	 */
+
+}

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

@@ -0,0 +1,99 @@
+package com.uas.platform.b2b.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 简要类目信息
+ * 
+ * @author suntg
+ * @since 2016年3月10日下午5:15:28
+ */
+@Entity
+@Table(name = "product$kind")
+public class KindInfo {
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "ki_id")
+	private Long id;
+
+	/**
+	 * 类目名称
+	 */
+	@Column(name = "ki_name")
+	private String nameCn;
+
+	/**
+	 * 英文名
+	 */
+	@Column(name = "ki_name_en")
+	private String nameEn;
+
+	/**
+	 * 父节点id
+	 */
+	@Column(name = "ki_parentid")
+	private Long parentid;
+
+	/**
+	 * 类目的层级,从1开始,1、2、3、4
+	 */
+	@Column(name = "ki_level")
+	private Short level;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	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 Long getParentid() {
+		return parentid;
+	}
+
+	public void setParentid(Long parentid) {
+		this.parentid = parentid;
+	}
+
+	public Short getLevel() {
+		return level;
+	}
+
+	public void setLevel(Short level) {
+		this.level = level;
+	}
+
+	public KindInfo() {
+
+	}
+
+	public KindInfo(Kind kind) {
+		this.id = kind.getId();
+		this.nameCn = kind.getNameCn();
+		this.nameEn = kind.getNameEn();
+		this.parentid = kind.getParentid();
+	}
+}

+ 139 - 0
src/main/java/com/uas/platform/b2b/model/KindProperty.java

@@ -0,0 +1,139 @@
+package com.uas.platform.b2b.model;
+
+import java.io.Serializable;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * 类目对应的属性
+ * 
+ * @author suntg
+ * @since 2016年3月11日下午3:10:34
+ */
+@Entity
+@Table(name = "product$kindproperty")
+public class KindProperty implements Serializable {
+
+	/**
+	 * 序列号
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@Id
+	@Column(name = "kp_id")
+	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product$kindproperty_gen")
+	@SequenceGenerator(name = "product$kindproperty_gen", sequenceName = "product$kindproperty_seq", allocationSize = 1)
+	private Long id;
+
+	/**
+	 * 类目id
+	 */
+	@Column(name = "kp_kindid")
+	private Long kindId;
+
+	/**
+	 * 类目
+	 */
+	@ManyToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY)
+	@JoinColumn(name = "kp_kindid", insertable = false, updatable = false)
+	private Kind kind;
+
+	/**
+	 * 序号
+	 */
+	@Column(name = "kp_detno")
+	private Short detno;
+
+	/**
+	 * 属性id
+	 */
+	@Column(name = "kp_propertyid")
+	private Long propertyId;
+
+	/**
+	 * 类目属性输入类型,N(number)\T(text)\F(fromTo)\S(search)
+	 */
+	@Column(name = "kp_type")
+	private String type;
+
+	/**
+	 * 基本单位
+	 */
+	@Column(name = "kp_unit")
+	private String unit;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Kind getKind() {
+		return kind;
+	}
+
+	public void setKind(Kind kind) {
+		this.kind = kind;
+	}
+
+	public Short getDetno() {
+		return detno;
+	}
+
+	public void setDetno(Short detno) {
+		this.detno = detno;
+	}
+
+	public Long getKindId() {
+		return kindId;
+	}
+
+	public void setKindId(Long kindId) {
+		this.kindId = kindId;
+	}
+
+	public Long getPropertyId() {
+		return propertyId;
+	}
+
+	public void setPropertyId(Long propertyId) {
+		this.propertyId = propertyId;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+}

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

@@ -145,6 +145,22 @@ public class Product {
 	@Column(name = "pr_erpdate")
 	private Date erpDate;
 
+	/**
+	 * 原厂型号
+	 * 
+	 * @return
+	 */
+	@Column(name = "pr_cmpcode")
+	private String cmpCode;
+
+	/**
+	 * UUID
+	 * 
+	 * @return
+	 */
+	@Column(name = "pr_cmpuuid")
+	private String cmpUuId;
+
 	public Long getId() {
 		return id;
 	}
@@ -289,6 +305,22 @@ public class Product {
 		this.erpDate = erpDate;
 	}
 
+	public String getCmpCode() {
+		return cmpCode;
+	}
+
+	public void setCmpCode(String cmpCode) {
+		this.cmpCode = cmpCode;
+	}
+
+	public String getCmpUuId() {
+		return cmpUuId;
+	}
+
+	public void setCmpUuId(String cmpUuId) {
+		this.cmpUuId = cmpUuId;
+	}
+
 	@Override
 	public String toString() {
 		return "编号:" + getCode() + ",标题:" + getTitle() + ",规格型号:" + getSpec();

+ 38 - 0
src/main/java/com/uas/platform/b2b/search/SearchController.java

@@ -5,10 +5,13 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import com.uas.platform.b2b.model.Component;
+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;
@@ -245,4 +248,39 @@ public class SearchController {
 	public SPage<PurchaseApCheck> searchPurchaseApCheckIds(String keyword, PageParams pageParams) {
 		return searchService.searchPurchaseApCheckIds(keyword, pageParams);
 	}
+
+	/**
+	 * 物料信息表:products
+	 */
+	@RequestMapping("/products")
+	@ResponseBody
+	public SPage<Product> searchProductsCheckIds(String keyword, PageParams pageParams) {
+		return searchService.searchProductsCheckIds(keyword, pageParams);
+	}
+	
+	/**
+	 * 器件信息表
+	 * 
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	@RequestMapping("/component")
+	@ResponseBody
+	public SPage<Component> searchProductComponentCheckIds(String keyword,PageParams pageParams) {
+		return searchService.searchProductComponentCheckIds(keyword, pageParams);
+	}
+	
+	/**
+	 * 企业列表
+	 * 
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	@RequestMapping("/enterprise")
+	@ResponseBody
+	public SPage<Enterprise> searchEnterpriseCheckIds(String keyword, PageParams pageParams) {
+		return searchService.searchEnterpriseCheckIds(keyword, pageParams);
+	}
 }

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

@@ -1,10 +1,12 @@
 package com.uas.platform.b2b.search;
 
+import com.uas.platform.b2b.model.Component;
+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.PurchaseInquiryMould;
+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;
@@ -12,6 +14,7 @@ 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;
@@ -248,6 +251,7 @@ public interface SearchService {
 	 * @return
 	 */
 	public SPage<PurchaseInquiryMould> searchPurcInquiryMouldIds(String keyword, PageParams pageParams);
+
 	/**
 	 * 将com.uas.platform.core.model.PageParams转为搜索项目下的PageParams
 	 * 
@@ -259,5 +263,30 @@ public interface SearchService {
 	public com.uas.search.b2b.model.PageParams convertPageParams(com.uas.platform.core.model.PageParams params,
 			String searchFilter);
 
+	/**
+	 * 物料资料
+	 * 
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	public SPage<Product> searchProductsCheckIds(String keyword, PageParams pageParams);
+
+	/**
+	 * 器件信息
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	public SPage<Component> searchProductComponentCheckIds(String keyword, PageParams pageParams);
+
+	/**
+	 * 企业列表
+	 * 
+	 * @param keyword
+	 * @param pageParams
+	 * @return
+	 */
+	public SPage<Enterprise> searchEnterpriseCheckIds(String keyword, PageParams pageParams);
 
 }

+ 40 - 2
src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java

@@ -19,11 +19,13 @@ 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.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.PurchaseInquiryMouldDao;
+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;
@@ -31,6 +33,7 @@ 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;
@@ -46,11 +49,13 @@ import com.uas.platform.b2b.dao.PurchaseReturnDao;
 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.model.Component;
+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.PurchaseInquiryMould;
+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;
@@ -58,6 +63,7 @@ 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;
@@ -173,6 +179,14 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 	@Autowired
 	private PurchaseInquiryMouldDao purchaseInquiryMouldDao;
 
+	@Autowired
+	private ProductDao productDao;
+
+	@Autowired
+	private ComponentDao componentDao;
+	
+	@Autowired
+	private EnterpriseDao enterpriseDao;
 
 	private ConcurrentHashMap<String, Field> sortFields = new ConcurrentHashMap<String, Field>();
 
@@ -582,4 +596,28 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		return toSPage(idsPage, content);
 	}
 
+	@Override
+	public SPage<Product> searchProductsCheckIds(String keyword, PageParams pageParams) {
+		SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PRODUCTS, pageParams);
+		List<Product> content = productDao.findAll(idsPage.getContent());
+		sortByProperty(content, Product.class, "id", idsPage.getContent());
+		return toSPage(idsPage, content);
+	}
+
+	@Override
+	public SPage<Component> searchProductComponentCheckIds(String keyword, PageParams pageParams) {
+		SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PRODUCT$COMPONENT, pageParams);
+		List<Component> content = componentDao.findAll(idsPage.getContent());
+		sortByProperty(content, Component.class, "id", idsPage.getContent());
+		return toSPage(idsPage, content);
+	}
+
+	@Override
+	public SPage<Enterprise> searchEnterpriseCheckIds(String keyword, PageParams pageParams) {
+		SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.SEC$ENTERPRISES, pageParams);
+		List<Enterprise> content = enterpriseDao.findAll(idsPage.getContent());
+		sortByProperty(content, Enterprise.class, "id", idsPage.getContent());
+		return toSPage(idsPage, content);
+	}
+
 }

+ 61 - 0
src/main/java/com/uas/platform/b2b/service/BaseInfoService.java

@@ -0,0 +1,61 @@
+package com.uas.platform.b2b.service;
+
+import java.util.List;
+
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.ui.ModelMap;
+
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseOrderAllItem;
+import com.uas.platform.b2b.temporary.model.NewPurcOrder;
+
+public interface BaseInfoService {
+
+	/**
+	 * 批量上传物料资料
+	 * 
+	 * @param workbook
+	 * @return
+	 */
+	ModelMap releaseByWorkbook(Workbook workbook);
+
+	/**
+	 * 更新物料信息
+	 * 
+	 * @param prodInfo
+	 * @return
+	 */
+	public Product update(Product prodInfo);
+
+	/**
+	 * 新增物料
+	 * 
+	 * @param prodInfo
+	 * @return
+	 */
+	public Product addNewProduct(Product prodInfo);
+
+	/**
+	 * 通过id查询物料信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public Product findById(Long id);
+
+	/**
+	 * 通过id删除物料信息
+	 * 
+	 * @param id
+	 * @return
+	 */
+	public void deleteById(Long id);
+
+	/**
+	 * 平台下的采购单存储
+	 * 
+	 * @param neworder
+	 * @return
+	 */
+	public List<PurchaseOrderAllItem> save(NewPurcOrder neworder);
+}

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

@@ -0,0 +1,17 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.model.Component;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
+
+public interface ComponentService {
+
+	/**
+	 * 通过kindId查询器件列表
+	 * 
+	 * @param kindid
+	 * @return
+	 */
+	SPage<Component> getCmpListByKindId(Long kindid, PageParams params, String keyword);
+
+}

+ 17 - 0
src/main/java/com/uas/platform/b2b/service/KindService.java

@@ -0,0 +1,17 @@
+package com.uas.platform.b2b.service;
+
+import java.util.List;
+
+import com.uas.platform.b2b.model.Kind;
+
+public interface KindService {
+
+	/**
+	 * 商品类目子类目
+	 * 
+	 * @param parentId
+	 * @return
+	 */
+	List<Kind> getChildProductKinds(Long parentId);
+
+}

+ 2 - 1
src/main/java/com/uas/platform/b2b/service/ProductService.java

@@ -16,7 +16,7 @@ public interface ProductService {
 	 * @return
 	 */
 	public List<Product> save(List<Product> products);
-	
+
 	/**
 	 * 分页查找客户物料(全部)
 	 * 
@@ -26,4 +26,5 @@ public interface ProductService {
 	 * @return
 	 */
 	public Page<Product> findAllByPageInfo(PageInfo pageInfo, String keyword);
+
 }

+ 244 - 0
src/main/java/com/uas/platform/b2b/service/impl/BaseInfoServiceImpl.java

@@ -0,0 +1,244 @@
+package com.uas.platform.b2b.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+
+import com.uas.platform.b2b.dao.ComponentDao;
+import com.uas.platform.b2b.dao.EnterpriseDao;
+import com.uas.platform.b2b.dao.ProductDao;
+import com.uas.platform.b2b.dao.PurchaseOrderAllDao;
+import com.uas.platform.b2b.dao.PurchaseOrderAllItemDao;
+import com.uas.platform.b2b.model.Component;
+import com.uas.platform.b2b.model.EnterpriseInfo;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.PurchaseOrderAll;
+import com.uas.platform.b2b.model.PurchaseOrderAllItem;
+import com.uas.platform.b2b.service.BaseInfoService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.b2b.temporary.model.NewPurcOrder;
+import com.uas.platform.b2b.temporary.model.OrderItems;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.Status;
+
+@Service
+public class BaseInfoServiceImpl implements BaseInfoService {
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	@Autowired
+	private ProductDao productDao;
+
+	@Autowired
+	private ComponentDao componentDao;
+
+	@Autowired
+	private EnterpriseDao enterpriseDao;
+
+	@Autowired
+	private PurchaseOrderAllDao purchaseOrderAllDao;
+
+	@Autowired
+	private PurchaseOrderAllItemDao purchaseOrderAllItemDao;
+
+	/**
+	 * 批量导入物料资料
+	 */
+	@Override
+	public ModelMap releaseByWorkbook(Workbook workbook) {
+		ModelMap modelMap = new ModelMap();
+		List<String> alters = new ArrayList<String>();
+		List<Product> products = new ArrayList<Product>();
+		Sheet sheet = workbook.getSheetAt(0);
+		int rowNum = sheet.getLastRowNum();
+		Row headerRow = sheet.getRow(0);
+		int total = 0;
+		if (headerRow != null) {
+			for (int r = 3; r <= rowNum; r++) {
+				Row row = sheet.getRow(r);
+				if (row != null && row.getCell(0) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+					total++;
+					Product product = new Product();
+
+					// 商品名称
+					if (row.getCell(0) != null) {
+						row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+						product.setTitle(row.getCell(0).getStringCellValue().trim());
+					}
+
+					// 编号
+					if (row.getCell(1) != null) {
+						row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+						String code = row.getCell(1).getStringCellValue().trim();
+						List<Product> prods = productDao
+								.findByEnUUAndCode(SystemSession.getUser().getEnterprise().getUu(), code);
+						if (CollectionUtils.isEmpty(prods)) {
+							product.setCode(code);
+						} else {
+							alters.add(code);
+						}
+					}
+
+					// 规格
+					if (row.getCell(2) != null) {
+						row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+						product.setSpec(row.getCell(2).getStringCellValue().trim());
+					}
+
+					// 单位
+					if (row.getCell(3) != null) {
+						row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+						product.setUnit(row.getCell(3).getStringCellValue().trim());
+					}
+
+					// 品牌
+					if (row.getCell(4) != null) {
+						row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+						product.setBrand(row.getCell(4).getStringCellValue().trim());
+					}
+					// 原厂型号
+					if (row.getCell(5) != null) {
+						row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
+						product.setCmpCode(row.getCell(5).getStringCellValue().trim());
+					}
+					// UUID
+					if (row.getCell(6) != null) {
+						row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
+						product.setCmpUuId(row.getCell(6).getStringCellValue().trim());
+					}
+					product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+					product.setUserUU(SystemSession.getUser().getUserUU());
+					if (alters.size() > 0) {
+						modelMap.put("alters", alters);
+					}
+					if (product.getCode() != null) {
+						modelMap.put("total", total);
+						modelMap.put("success", total - alters.size());
+						products.add(product);
+					}
+				}
+			}
+			if (!CollectionUtils.isEmpty(products)) {
+				productDao.save(products);
+			}
+		}
+		return modelMap;
+
+	}
+
+	/**
+	 * 更新物料信息
+	 */
+	@Override
+	public Product update(Product prodInfo) {
+		Product productInfo = productDao.findOne(prodInfo.getId());
+		productInfo.setBrand(prodInfo.getBrand());
+		productInfo.setCmpCode(prodInfo.getCmpCode());
+		productInfo.setCmpUuId(prodInfo.getCmpUuId());
+		productInfo.setTitle(prodInfo.getTitle());
+		productInfo.setSpec(prodInfo.getSpec());
+		productInfo.setUnit(prodInfo.getUnit());
+		productInfo.setCode(prodInfo.getCode());
+		return productDao.save(productInfo);
+	}
+
+	/**
+	 * 新增物料
+	 */
+	@Override
+	public Product addNewProduct(Product prodInfo) {
+		Product productInfo = new Product();
+		productInfo.setBrand(prodInfo.getBrand());
+		productInfo.setCmpCode(prodInfo.getCmpCode());
+		productInfo.setCmpUuId(prodInfo.getCmpUuId());
+		productInfo.setCode(prodInfo.getCode());
+		productInfo.setTitle(prodInfo.getTitle());
+		productInfo.setSpec(prodInfo.getSpec());
+		productInfo.setUnit(prodInfo.getUnit());
+		productInfo.setUserUU(SystemSession.getUser().getUserUU());
+		productInfo.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		List<Component> comp = componentDao.findByCode(prodInfo.getCode());
+		if (!CollectionUtils.isEmpty(comp)) {
+			productInfo.setCmpUuId(comp.get(0).getUuid());
+			productInfo.setCmpCode(comp.get(0).getCode());
+		} else {
+			productInfo.setCmpCode(prodInfo.getCode());
+		}
+		return productDao.save(productInfo);
+	}
+
+	@Override
+	public Product findById(Long id) {
+		return productDao.findOne(id);
+	}
+
+	@Override
+	public void deleteById(Long id) {
+		if (productDao.exists(id)) {
+			productDao.delete(id);
+		}
+	}
+
+	@Override
+	public List<PurchaseOrderAllItem> save(NewPurcOrder neworder) {
+		PurchaseOrderAll purcOrder = new PurchaseOrderAll();
+		Set<PurchaseOrderAllItem> orderItems = new HashSet<PurchaseOrderAllItem>();
+		EnterpriseInfo enter = enterpriseDao.findEnterpriseInfoByUu(SystemSession.getUser().getEnterprise().getUu());
+		// 采购单
+		purcOrder.setCode(neworder.getCode());
+		purcOrder.setDate(neworder.getDate());
+		purcOrder.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		purcOrder.setSendStatus((short) Status.NOT_UPLOAD.value());
+		purcOrder.setStatus((short) Status.NOT_REPLY.value());
+		purcOrder.setRecorder(SystemSession.getUser().getUserName());
+		purcOrder.setUserUU(SystemSession.getUser().getUserUU());
+		purcOrder.setEnterprise(enter);
+		purcOrder.setUser(SystemSession.getUser());
+		purcOrder.setVendUserUU(neworder.getCustUserUU());
+		purcOrder.setVendUU(neworder.getCust().getUu());
+		purcOrder.setDisplay(Constant.YES);
+		purcOrder.setCurrency("RMB");
+		purcOrder.setType("平台采购");
+		purcOrder.setAuditor(SystemSession.getUser().getUserName());
+		purcOrder.setShipAddress(SystemSession.getUser().getEnterprise().getEnAddress());
+		purcOrder.setReceiveName(neworder.getCust().getEnName());
+		purcOrder.setReceiveCode(String.valueOf(neworder.getCust().getUu()));
+		purcOrder.setEnName(neworder.getCust().getEnName());
+		short i = 1;
+		if (!CollectionUtils.isEmpty(neworder.getOrderItems())) {
+			for (OrderItems orderitem : neworder.getOrderItems()) {
+				// 采购详情
+				PurchaseOrderAllItem orderItem = new PurchaseOrderAllItem();
+				orderItem.setDelivery(orderitem.getDelivery());
+				orderItem.setQty(Double.valueOf(orderitem.getQty()));
+				orderItem.setProduct(productDao.findOne(orderitem.getId()));
+				orderItem.setRemark(orderitem.getRemark());
+				orderItem.setProductId(orderitem.getId());
+				orderItem.setStatus((short) Status.NOT_REPLY.value());
+				orderItem.setNumber(i);
+				orderItem.setOrder(purcOrder);
+				orderItem.setPrice(Double.valueOf(orderitem.getPrice()));
+				orderItems.add(orderItem);
+				i++;
+			}
+		}
+		logger.log("平台新增采购单", "[" + SystemSession.getUser().getEnterprise() + "]的["
+ + SystemSession.getUser().getUserName() + "]向["
+						+ neworder.getCust().getEnName() + "]下了一张采购单,时间:" + new Date());
+		return purchaseOrderAllItemDao.save(orderItems);
+	}
+
+}

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

@@ -0,0 +1,23 @@
+package com.uas.platform.b2b.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.uas.platform.b2b.dao.ComponentDao;
+import com.uas.platform.b2b.model.Component;
+import com.uas.platform.b2b.service.ComponentService;
+import com.uas.platform.core.model.PageParams;
+import com.uas.search.b2b.model.SPage;
+
+@Service
+public class ComponentServiceImpl implements ComponentService {
+
+	@Autowired
+	private ComponentDao componentDao;
+
+	@Override
+	public SPage<Component> getCmpListByKindId(Long kindid, PageParams params, String keyword) {
+		return componentDao.findByKindid(kindid);
+	}
+
+}

+ 23 - 0
src/main/java/com/uas/platform/b2b/service/impl/KindServiceImpl.java

@@ -0,0 +1,23 @@
+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;
+
+@Service
+public class KindServiceImpl implements KindService {
+
+	@Autowired
+	private KindDao kindDao;
+
+	@Override
+	public List<Kind> getChildProductKinds(Long parentid) {
+		return kindDao.findByParentidOrderByDetno(parentid);
+	}
+
+}

+ 17 - 11
src/main/java/com/uas/platform/b2b/service/impl/ProductServiceImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2b.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.criteria.CriteriaBuilder;
@@ -19,20 +20,23 @@ import com.uas.platform.b2b.dao.ProductIndexDao;
 import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.event.ProductSaveEvent;
 import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.search.SearchService;
 import com.uas.platform.b2b.service.ProductService;
-import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 
 @Service
 public class ProductServiceImpl implements ProductService {
-	
+
 	@Autowired
 	private ProductDao productDao;
-	
+
 	@Autowired
 	private ProductIndexDao productIndexDao;
-	
+
+	@Autowired
+	private SearchService searchService;
+
 	@Autowired
 	private VendorDao vendorDao;
 
@@ -47,16 +51,18 @@ public class ProductServiceImpl implements ProductService {
 	public Page<Product> findAllByPageInfo(final PageInfo pageInfo, final String keyword) {
 		return productDao.findAll(new Specification<Product>() {
 
-			public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query,
-					CriteriaBuilder builder) {
-				pageInfo.expression(PredicateUtils.in("enUU", vendorDao.findCustUUByVendEnUU(
-						SystemSession.getUser().getEnterprise().getUu()), false));
-				if (StringUtils.hasText(keyword))
-					pageInfo.expression(PredicateUtils.in("id", productIndexDao.findByKeyword(keyword), false));
+			public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				if (StringUtils.hasText(keyword)) {
+					List<Object> lists = new ArrayList<>();
+					List<Product> prodList = searchService.searchProductsCheckIds(keyword, null).getContent();
+					for (Product list : prodList) {
+						lists.add(list.getId());
+					}
+					pageInfo.expression(PredicateUtils.in("id", lists, false));
+				}
 				query.where(pageInfo.getPredicates(root, query, builder));
 				return null;
 			}
 		}, pageInfo);
 	}
-	
 }

+ 974 - 4
src/main/webapp/resources/js/index/app.js

@@ -1,6 +1,6 @@
-define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize'], function() {
+define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo'], function() {
 	'use strict';
-	var app = angular.module('myApp', [ 'toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule']);
+	var app = angular.module('myApp', [ 'toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices']);
 	app.init = function() {
 		angular.bootstrap(document, [ 'myApp' ]);
 	};
@@ -99,6 +99,10 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			url : "/order/:id",
 			templateUrl : "static/tpl/index/purc/order_detail.html",
 			controller: 'PurcOrderDetailCtrl'
+		}).state('purc.newOrder', {
+			url : "addOrder",
+			templateUrl : "static/tpl/index/purc/addOrder.html",
+			controller : 'PurcNewOrderCtrl'
 		}).state('sale.todo', {
 			url : "/todo",
 			templateUrl : "static/tpl/index/sale/todo.html"
@@ -130,7 +134,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			url : "/inquiry",
 			templateUrl : "static/tpl/index/sale/inquiry.html",
 			controller: 'SaleInquiryCtrl'
-				//TODO 新添加模具询价
 		}).state('sale.inquirymould', {
 			url : "/mould",
 			templateUrl : "static/tpl/index/sale/inquiry_mould.html",
@@ -253,6 +256,63 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			url : "/role",
 			templateUrl : "static/tpl/index/account/role.html",
 			controller: 'RoleCtrl'
+		}).state('baseInfo', {//基础资料 
+			//TODO
+			url : "/baseInfo",
+			views : {
+				"left-view" : {
+					templateUrl : "static/tpl/index/baseInfo/left.html",
+					controller: 'LeftCtrl'
+						
+				},
+				"right-view" : {
+					templateUrl : "static/tpl/index/baseInfo/right.html"
+				}
+			}
+		}).state('baseInfo.index', {
+			url : "",
+			templateUrl : "static/tpl/index/baseInfo/index.html",
+			controller: 'RightCtrl'
+		}).state('baseInfo.home', {
+			url : "/",
+			templateUrl : "static/tpl/index/baseInfo/index.html",
+			controller: 'RightCtrl'
+		}).state('baseInfo.prodList', {
+			url : "/prodList",
+			templateUrl : "static/tpl/index/baseInfo/prodList.html",
+			controller : 'ProductListCtrl'
+		}).state('baseInfo.uploadByBatch', {
+			url : "/uploadByBatch",
+			templateUrl : "static/tpl/index/baseInfo/uploadByBatch.html",
+			controller : 'UploadByBatchCtrl'
+		}).state('baseInfo.productDetail', {
+			url : "/prodList/:id",
+			templateUrl : "static/tpl/index/baseInfo/productDetail.html",
+			controller : 'ProductDetailCtrl'
+		}).state('baseInfo.newProdInfo', {
+			url : "/newProdInfo",
+			templateUrl : "static/tpl/index/baseInfo/newProdInfo.html",
+			controller : 'NewProdInfoCtrl'
+		}).state('baseInfo.enterpriseList', {
+			url : "/enterpriseList",
+			templateUrl : "static/tpl/index/baseInfo/enterpriseList.html",
+			controller : 'EnterpriseListCtrl'
+		}).state('baseInfo.myClient', {
+			url : "/myClient",
+			templateUrl : "static/tpl/index/baseInfo/myClient.html",
+			controller : 'MyClientCtrl'
+		}).state('baseInfo.mySupplier', {
+			url : "/mySupplier",
+			templateUrl : "static/tpl/index/baseInfo/mySupplier.html",
+			controller : 'MySupplierCtrl'
+		}).state('baseInfo.myRequest', {
+			url : "/myRquest",
+			templateUrl : "static/tpl/index/baseInfo/myRequest.html",
+			controller : 'AddPartnerRequestCtrl'
+		}).state('baseInfo.myMessage', {
+			url : "/myMessage",
+			templateUrl : "static/tpl/index/baseInfo/myMessage.html",
+			controller : 'AddPartnerMessageCtrl'
 		}).state('qc', {
 			url : "/qc",
 			views : {
@@ -577,6 +637,7 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
 			$scope.todo = data;
 		});
 	}]);
+	
 	app.controller('TruckCtrl', ['$scope', '$rootScope', '$modal', 'SaleTruck', function($scope, $rootScope, $modal, SaleTruck){
 		SaleTruck.query({}, function(data){
 			$rootScope.truck = data;
@@ -1171,7 +1232,6 @@ define([ 'toaster', 'charts', 'ngTable', 'common/services', 'service/Purc', 'ser
   						fromDate: getDateTime($scope.condition.dateFrom),
   						endDate: getDateTime($scope.condition.dateTo)
   				};
-  				console.log(getPurcStatus($scope.active));
   				PurcOrderItem[getPurcStatus($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
   					$scope.loading = false;
   					if(page) {
@@ -6753,5 +6813,915 @@ app.controller('SaleSendCtrl', ['$scope', '$filter', 'SaleSend', 'ngTableParams'
 		};
 	}]);
 	
+	/**
+	 * 物料资料
+	 */
+	app.controller('ProductListCtrl', ['$scope', 'GetProductInfo', 'ngTableParams', '$filter', 'BaseService', 'toaster', function($scope, GetProductInfo, ngTableParams, $filter, BaseService, toaster) {
+		$scope.active = 'all';
+		$scope.agreedText = '全部';
+		$scope.dateZoneText = '一个月内';
+		$scope.condition = {dateZone: 1};
+		$scope.currency = Symbol.currency;//将币别转化为对应的符号
+		$scope.changeAgreed = function(agreed) {
+			$scope.condition.agreed = agreed;
+			$scope.agreedText = typeof agreed == 'undefined' ? '全部' : (agreed == 1 ? '已同意' : '不同意');
+			$scope.condition.$agreedOpen = false;
+		};
+		$scope.changeDateZone = function(zone) {
+			$scope.condition.dateZone = zone;
+			$scope.dateZoneText = typeof zone == 'undefined' ? '半年前' : (zone == 1 ? '一个月内' : '半年内');
+			$scope.condition.$dateZoneOpen = false;
+			getDateCondition(zone, $scope.condition);
+			$scope.tableParams.reload();
+		};
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		var getService = function() {
+			return GetProductInfo;
+		};
+		
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 5,
+			sorting: {
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.keyword = $scope.keyword;
+				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElement);
+						$defer.resolve(page.content);
+						$scope.keywordXls = angular.copy(pageParams.keyword);//保存当前取值的关键词
+					}
+				}, function(response) {
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+
+		// 搜索框回车
+		$scope.onSearch = function() {
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+		
+		//删除
+		$scope.deleteById = function(id) {
+			console.log(id);
+			GetProductInfo.deleteById({id: id}, function(data) {
+				toaster.pop("success", "提示", "删除成功");
+			}), function(response) {
+				toaster.pop("error", "删除失败", response);
+			};
+		}
+		
+	}]);
+	
+	/**
+	 * 物料批量上传
+	 */
+	app.controller('UploadByBatchCtrl', ['$scope', 'GetProductInfo', '$upload', 'toaster', function($scope, GetProductInfo, $upload, toaster) {
+		
+		// 通过excel批量上传物料
+		$scope.upload = function() {
+			var file = $scope.myFiles[0];
+			$upload.upload({
+				url: 'product/baseInfo/release/excel',
+				file: file,
+				method: 'POST'
+			}).success(function(data) {
+				console.log(data);
+				$scope.result = data;
+				$scope.success = $scope.result.success;
+				$scope.total = $scope.result.total;
+				$scope.alters = $scope.result.alters;
+			}).error(function(response) {
+				toaster.pop('error', response.data || response);
+			});
+		};
+		
+		// 查看范例
+		$scope.showImg = function() {
+			var src = "static/img/product/excel_releaseByBatch_eg.png", box = $('#image-box');
+			box.show();
+			box.find('img').attr('src', src);
+			box.find('a').click(function(){
+				box.hide();
+			});
+			box.dblclick(function(){
+				box.hide();
+			});
+		};
+		
+		// 下载模板
+		$scope.download = function() {
+			window.location.href = 'product/baseInfo/upload/template';
+		};
+	}]);
+	
+	/**
+	 * 物料详情
+	 */
+	app.controller('ProductDetailCtrl', ['$scope', 'GetProductInfo', '$upload', 'ngTableParams', '$stateParams', 'toaster', function($scope, GetProductInfo, $upload, ngTableParams, $stateParams, toaster) {
+		var loadData = function() {
+			GetProductInfo.getOne({id: $stateParams.id}, function(data) {
+				$scope.prodInfo = data;
+				$scope.prodInfo.$editing = false;
+				$scope.loading = false;
+			});
+		};
+		loadData();
+		
+		// 更新
+		$scope.update = function() {
+			$scope.prodInfo.$editing = true;
+		};
+		
+		// 取消
+		$scope.cancel = function() {
+			$scope.prodInfo.$editing = false;
+		};
+		
+		$scope.submit = function(prodInfo) {
+			console.log(prodInfo);
+			GetProductInfo.update({}, prodInfo, function(data) {
+				toaster.pop("success", "提示", "提交成功");
+			}, function(res) {
+				toaster.pop("error", "提示" + res);
+			});
+		}
+	}]);
+	
+	/**
+	 * 新增物料
+	 */
+	app.controller('NewProdInfoCtrl', ['$scope', 'GetProductInfo', '$upload', 'ngTableParams', '$stateParams', 'toaster', '$modal', 'ComponentActive', 'KindAPI', function($scope, GetProductInfo, $upload, ngTableParams, $stateParams, toaster, $modal, ComponentActive, KindAPI) {
+
+		$scope.prodInfo = {unit: 'PCS'};
+		// 选择类目
+	    $scope.selectKind = function(uuids) {
+			$modal.open({
+				animation: true,
+				size: 'lg',
+				templateUrl: 'static/tpl/index/baseInfo/modal/product_kindChoose_modal.html',
+				controller: 'KindChooseCtrl',
+			}).result.then(function(data){
+				$scope.kindId = data;
+				var modalInstance = $modal.open({
+					templateUrl: 'static/tpl/index/baseInfo/modal/Component_KindChoose_modal.html',
+					controller: 'FindComponentCtrl',
+					size: 'lg',
+					resolve: {
+						KindId: function() {
+							return $scope.kindId;
+						}
+					}
+				});
+				
+				modalInstance.result.then(function(data) {
+					$scope.prodInfo.cmpUuId = data.uuid;
+					$scope.prodInfo.cmpCode = data.code;
+					$scope.prodInfo.brand = data.brand.nameEn;
+				}, function(){
+					
+				});
+			}, function(){
+				
+			});
+		};
+
+		//提交
+		$scope.submit = function(prodInfo){
+			GetProductInfo.addNewProd({}, prodInfo, function(data) {
+				toaster.pop("success", "提示", "提交成功");
+				//提交后跳转到详情页面,防止重复提交
+				window.location.href="#/baseInfo/prodList/"+data.id;
+			}, function(res) {
+				toaster.pop("error", "提示" + res);
+			});
+		};
+		
+		// 取消
+		$scope.cancel = function(){
+			$scope.prodInfo = angular.copy($scope.prodInfo);
+		};
+	}]);
+	
+	
+	/**
+	 * 类目选择模态框
+	 */
+	app.controller('KindChooseCtrl', ['$scope', 'KindAPI', 'toaster', '$modalInstance', '$modal', function($scope, KindAPI, toaster, $modalInstance, $modal) {
+		$scope.kindId = null;
+		$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 kindId = null, 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;
+								kindId = k.id;
+							} else {
+								k.$active = null;
+							}
+						}
+					});
+				}
+			});
+			// 选择的节点
+			$scope.kindId = kindId;
+			$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() {
+			$modalInstance.close($scope.kindId);
+		};
+	}]);
+	
+	/**
+	 * 器件筛选
+	 */
+	app.controller('FindComponentCtrl', ['$scope', 'BaseService', 'ngTableParams', 'toaster', '$modalInstance', 'ComponentActive', 'KindId', function($scope, BaseService, ngTableParams, toaster, $modalInstance, ComponentActive, KindId) {
+		//状态
+		$scope.setActive = function (state){
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 10
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.keyword = $scope.keyword;
+				pageParams.kindId = KindId;
+				ComponentActive.getComponentsByKindid(BaseService.parseParams(pageParams), function(page) {
+					console.log(page);
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElement);
+						$defer.resolve(page.content);
+						$scope.keywordXls = angular.copy($scope.keyword);//保存当前取值的关键词
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+		
+		// 取消
+  		$scope.cancel = function() {
+    		$modalInstance.dismiss();
+  		};
+  		
+  		// 选择
+  		$scope.check = function(data){
+  			$modalInstance.close(data);
+  		};
+  		
+  		// 搜索框回车
+		$scope.onSearch = function() {
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+	}]);
+	
+	/**
+	 * 企业列表
+	 */
+	app.controller('EnterpriseListCtrl', ['$scope', 'EnterpriseList', 'ngTableParams', '$filter', 'BaseService', 'toaster', 'AddPartner', function($scope, EnterpriseList, ngTableParams, $filter, BaseService, toaster, AddPartner) {
+		$scope.active = 'all';
+		$scope.agreedText = '全部';
+		$scope.dateZoneText = '一个月内';
+		$scope.condition = {dateZone: 1};
+		$scope.currency = Symbol.currency;//将币别转化为对应的符号
+		$scope.changeAgreed = function(agreed) {
+			$scope.condition.agreed = agreed;
+			$scope.agreedText = typeof agreed == 'undefined' ? '全部' : (agreed == 1 ? '已同意' : '不同意');
+			$scope.condition.$agreedOpen = false;
+		};
+		$scope.changeDateZone = function(zone) {
+			$scope.condition.dateZone = zone;
+			$scope.dateZoneText = typeof zone == 'undefined' ? '半年前' : (zone == 1 ? '一个月内' : '半年内');
+			$scope.condition.$dateZoneOpen = false;
+			getDateCondition(zone, $scope.condition);
+			$scope.tableParams.reload();
+		};
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		var getService = function() {
+			return EnterpriseList;
+		};
+		
+		$scope.tableParams = new ngTableParams({
+			page : 1, 
+			count : 5,
+			sorting: {
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.keyword = $scope.keyword;
+				getService()[getState($scope.active)].call(null, BaseService.parseParams(pageParams), function(page) {
+					console.log(page);
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElement);
+						$defer.resolve(page.content);
+						$scope.keywordXls = angular.copy(pageParams.keyword);//保存当前取值的关键词
+					}
+				}, function(response) {
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+
+		// 搜索框回车
+		$scope.onSearch = function() {
+			$scope.tableParams.page(1);
+			$scope.tableParams.reload();
+		};
+		
+		// 增加合作关系
+		$scope.addPartner = function(uu) {
+			console.log(uu);
+			AddPartner.addPartner({uu: uu}, {}, function(data) {
+				toaster.pop('success', '提示', '请求发送成功');
+			}, function(response) {
+				toaster.pop('error','失败',response.data);
+			});
+		}
+	}]);
+	
+	/**
+	 * 新增采购单
+	 */
+	app.controller('PurcNewOrderCtrl',['$scope', '$modal', 'toaster', '$filter', 'newPurcOrder', function($scope, $modal, toaster, $filter, newPurcOrder) {
+		$scope.order = {
+				date : new Date(),
+				cust : {
+					uu : '',
+				}, 
+				orderItems : {
+					product : {},
+					$endDateOpen: false
+				},
+		};
+		// 查找客户
+		$scope.dbfindCust = function(){
+			var modalInstance = $modal.open({
+				templateUrl: 'static/tpl/index/purc/modal/purc_order_cust.html',
+				controller: 'DbfindCustCtrl',
+				size: 'lg',
+				resolve: {
+					
+				}
+			});
+			
+			modalInstance.result.then(function(data) {
+				$scope.order.cust = data.myEnterprise;
+				$scope.order.custUser = data.myUser;
+			}, function(){
+				
+			});
+		};
+		
+		//商品信息
+		$scope.order.orderItems = [];
+		var item = {
+				code: null,
+				title: null,
+				spec: null,
+				unit: null,
+				qty: null, 
+				price: null,
+				remark: null, 
+				delivery: null
+				};
+		$scope.order.orderItems.push(item);
+		//增加商品
+		$scope.addProduct = function() {
+			$scope.order.orderItems.push({code: null, title: null, spec: null, unit: null, qty: null, price: null, remark: null, delivery: null});
+		};
+		//删除商品
+		$scope.deleteProduct = function(index) {
+			$scope.order.orderItems.splice(index, 1);
+		};
+		
+		// 查找客户物料
+		$scope.dbfindCustProd = function(){
+			if($scope.order.cust.uu) {
+				var modalInstance = $modal.open({
+					templateUrl: 'static/tpl/index/purc/modal/purc_order_custProd.html',
+					controller: 'DbfindCustProdCtrl',
+					size: 'lg',
+					resolve: {
+						custUU: function() {
+							return $scope.order.cust.uu
+							}
+					}
+				});
+				
+				modalInstance.result.then(function(data) {
+					$scope.order.orderItems.push(data);
+					for(var i = 0; i < $scope.order.orderItems.length; i++) {
+						if($scope.order.orderItems[i].code == null) {
+							$scope.order.orderItems.splice(i, 1);
+						}
+					}
+				}, function() {
+					
+				});
+			} else {
+				toaster.pop('info', '提示', '请先选择供应商');
+			}
+		};
+		$scope.getMinDate = function(item) {
+			return $filter('date')(new Date, 'yyyy-MM-dd');
+		};
+		
+		$scope.openDatePicker = function($event, openParam, index) {
+			$event.preventDefault();
+		    $event.stopPropagation();
+		    $scope.order.orderItems[index].$endDateOpen = !openParam;
+		};
+		
+		
+		// 保存
+		$scope.save = function(order){
+			$scope.loading = true;
+			if(!$scope.order.code) //新增,设单号
+				$scope.order.code = 'BMP' + $filter('date')(new Date(), 'yyMMddHHmmss_sss');
+			$scope.order.custUU = $scope.order.cust.uu;
+			$scope.order.custUserUU = $scope.order.custUser.userUU;
+			if($scope.order.date instanceof Date) {
+				$scope.order.date = $scope.order.date.getTime();
+			}
+			for(var i = 0; i < $scope.order.orderItems.length; i++) {
+				if($scope.order.orderItems[i].delivery instanceof Date) {
+					$scope.order.orderItems[i].delivery = $scope.order.orderItems[i].delivery.getTime();
+				}
+			}
+			console.log(order);
+			newPurcOrder.save({}, $scope.order, function(data){
+				$scope.loading = false;
+				toaster.pop('success', '成功', '保存成功');
+				window.location.hash = '#/purc/order/'+data.id;
+			}, function(response){
+				$scope.loading = false;
+				toaster.pop('error', '保存失败', response.data);
+			});
+		};
+	}]);
+	
+	/**
+	 * 我的客户
+	 */
+	app.controller('MyClientCtrl', ['$scope', 'VendorService', 'BaseService','AuthenticationService', 'ngTableParams', '$modal','toaster', function($scope, VendorService, BaseService, AuthenticationService,ngTableParams,$modal, toaster){
+		$scope.userInfoResult = true;
+		AuthenticationService.getAuthentication().success(function(data) {
+			$scope.loading = false;
+			$scope.thisUser = data;
+		});
+		var getCustInfos = function(custuu) {
+			if(custuu) {
+				VendorService.userInfo.query({uu:custuu},null,function(data) {
+					$scope.custInfos = data;
+					var getPage = function(page, size){
+						if($scope.custInfos) {
+							var result = {};
+							result.totalCount = $scope.custInfos.length;
+							result.content = $scope.custInfos.slice((page - 1)*size, page * size);
+							if($scope.custInfos.length % size == 0) {
+								result.totalPage = ($scope.custInfos.length - $scope.custInfos.length % size) / size;
+							}else {
+								result.totalPage = ($scope.custInfos.length - $scope.custInfos.length % size) / size + 1;
+							}
+							result.first = page == 1;
+							result.last = page == result.totalPage;
+							result.page = page;
+							result.next = page - 0 + 1;
+							result.pre = page - 1;
+							return result;
+						}
+					}
+					$scope.userdata = getPage(1,4);
+					$scope.first = function (){
+						$scope.userdata = getPage($scope.userdata.pre,4);
+					}
+					$scope.last = function (){
+						$scope.userdata = getPage($scope.userdata.next,4);
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		}
+		$scope.addUserInfo = function(customer) {
+			//TODO
+			if ($scope.thisUser.sys) {
+				var modalInstance = $modal.open({
+					animation: true,
+					templateUrl: 'static/tpl/index/account/add_userInfo.html',
+					controller: 'AddUserInfoCtrl',
+					resolve: {
+						customer: function() {
+							return customer;
+						}
+					}
+				});
+				modalInstance.result.then(function(changed, checked){
+					if(changed) {
+						if(checked)
+							$scope.newUser.roles = checked;
+						else 
+							loadUsers();
+					}
+				});
+				
+			} else {
+				toaster.pop('error', '您不是管理员,无权限分配用户!');
+			}
+		}
+		$scope.showUserInfo = function(customer,boo) {
+			$scope.custInfo = customer;
+			if(boo) {
+				getCustInfos(customer.myEnterprise.uu);
+				$scope.userInfoResult = true;
+			}
+		}
+		$scope.customerParams = new ngTableParams({
+			page : 1, 
+			count : 10
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				VendorService.customer.get(BaseService.parseParams(params.url()), function(page){
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElements);
+						$defer.resolve(page.content);
+					}
+					$scope.totalCount = page.totalElements;
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+	}]);
+	
+	/**
+	 * 我的供应商
+	 */
+	app.controller('MySupplierCtrl', ['$scope', 'VendorService', 'BaseService','AuthenticationService', 'ngTableParams', '$modal','toaster', function($scope, VendorService, BaseService, AuthenticationService,ngTableParams,$modal, toaster){
+		$scope.userInfoResult = true;
+		AuthenticationService.getAuthentication().success(function(data) {
+			$scope.loading = false;
+			$scope.thisUser = data;
+		});
+		var getCustInfos = function(custuu) {
+			if(custuu) {
+				VendorService.userInfo.query({uu:custuu},null,function(data) {
+					$scope.custInfos = data;
+					var getPage = function(page, size){
+						if($scope.custInfos) {
+							var result = {};
+							result.totalCount = $scope.custInfos.length;
+							result.content = $scope.custInfos.slice((page - 1)*size, page * size);
+							if($scope.custInfos.length % size == 0) {
+								result.totalPage = ($scope.custInfos.length - $scope.custInfos.length % size) / size;
+							}else {
+								result.totalPage = ($scope.custInfos.length - $scope.custInfos.length % size) / size + 1;
+							}
+							result.first = page == 1;
+							result.last = page == result.totalPage;
+							result.page = page;
+							result.next = page - 0 + 1;
+							result.pre = page - 1;
+							return result;
+						}
+					}
+					$scope.userdata = getPage(1,4);
+					$scope.first = function (){
+						$scope.userdata = getPage($scope.userdata.pre,4);
+					}
+					$scope.last = function (){
+						$scope.userdata = getPage($scope.userdata.next,4);
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		}
+		$scope.addUserInfo = function(customer) {
+			//TODO
+			if ($scope.thisUser.sys) {
+				var modalInstance = $modal.open({
+					animation: true,
+					templateUrl: 'static/tpl/index/account/add_userInfo.html',
+					controller: 'AddUserInfoCtrl',
+					resolve: {
+						customer: function() {
+							return customer;
+						}
+					}
+				});
+				modalInstance.result.then(function(changed, checked){
+					if(changed) {
+						if(checked)
+							$scope.newUser.roles = checked;
+						else 
+							loadUsers();
+					}
+				});
+				
+			} else {
+				toaster.pop('error', '您不是管理员,无权限分配用户!');
+			}
+		}
+		$scope.showUserInfo = function(customer,boo) {
+			$scope.custInfo = customer;
+			if(boo) {
+				getCustInfos(customer.myEnterprise.uu);
+				$scope.userInfoResult = true;
+			}
+		}
+		$scope.customerParams = new ngTableParams({
+			page : 1, 
+			count : 10
+		}, {
+			total : 0, 
+			counts: [5, 10, 25, 50],
+			getData : function($defer, params) {
+				$scope.loading = true;
+				VendorService.customer.get(BaseService.parseParams(params.url()), function(page){
+					$scope.loading = false;
+					if(page) {
+						params.total(page.totalElements);
+						$defer.resolve(page.content);
+					}
+					$scope.totalCount = page.totalElements;
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+	}]);
+	
+	/**
+	 * 建立合作关系申请
+	 */
+	app.controller('AddPartnerRequestCtrl', ['$scope', 'AddPartnerMyRequest', 'toaster', 'BaseService', 'ngTableParams', 'AddPartner', function($scope, AddPartnerMyRequest, toaster, BaseService, ngTableParams, AddPartner) {
+		
+		$scope.active = 'todo';
+		
+		var getRequestStatus = function(active) {
+  			var fn = 'getAllRequest';
+  			switch(active) {
+  			case 'done':
+  				fn = 'getRequestDone';break;
+  			case 'todo':
+  				fn = 'getRequestTodo';break;
+  			case 'end':	
+  				fn = 'getRequestEnd';break;
+  			}
+  			return fn;
+  		}
+		// 切换单据类型
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		
+		// 切换数据来源(正常数据 or 历史数据)
+		var getService = function() {
+			return AddPartnerMyRequest;
+		};
+		$scope.tableParams = new ngTableParams({ // ng-Table参数
+			page : 1,
+			count : 5,
+			sorting: {
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 15, 25, 50],
+			getData : function($defer, params) { // 获取数据的方法
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.searchFilter = { // 筛选条件
+					keyword: $scope.keyword,
+				};
+				getService()[getRequestStatus($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
+					console.log(page);
+					$scope.loading = false;
+					if(page) {
+						$defer.resolve(page.content);
+						params.total(page.totalElements);
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+		
+		// 再次申请
+		$scope.reapply = function(id) {
+			AddPartner.reapply({id: id}, {}, function(data) {
+				toaster.pop('success', '提示', '请求发送成功');
+			}, function(response) {
+				toaster.pop('error','失败',response.data);
+			});
+		}
+	}]);
+	
+	
+	/**
+	 * 建立合作关系处理申请
+	 */
+	app.controller('AddPartnerMessageCtrl', ['$scope', 'AddPartnerMyMessage', 'toaster', 'BaseService', 'ngTableParams', 'AddPartner', function($scope, AddPartnerMyMessage, toaster, BaseService, ngTableParams, AddPartner) {
+		$scope.active = 'todo';
+		var getMessagetStatus = function(active) {
+  			var fn = 'getAllMessage';
+  			switch(active) {
+  			case 'done':
+  				fn = 'getMessageDone';break;
+  			case 'todo':
+  				fn = 'getMessageTodo';break;
+  			case 'end':	
+  				fn = 'getMessageEnd';break;
+  			}
+  			return fn;
+  		}
+		
+		// 切换单据类型
+		$scope.setActive = function(state) {
+			if($scope.active != state) {
+				$scope.active = state;
+				if($scope.tableParams.page() == 1)
+					$scope.tableParams.reload();
+				else
+					$scope.tableParams.page(1);
+			}
+		};
+		
+		var getService = function() {
+			return AddPartnerMyMessage;
+		};
+		
+		$scope.tableParams = new ngTableParams({ // ng-Table参数
+			page : 1,
+			count : 5,
+			sorting: {
+            }
+		}, {
+			total : 0, 
+			counts: [5, 10, 15, 25, 50],
+			getData : function($defer, params) { // 获取数据的方法
+				$scope.loading = true;
+				var pageParams = params.url();
+				pageParams.searchFilter = { // 筛选条件
+					keyword: $scope.keyword,
+				};
+				getService()[getMessagetStatus($scope.active)].call(null, BaseService.parseParams(pageParams), function(page){
+					$scope.loading = false;
+					if(page) {
+						$defer.resolve(page.content);
+						params.total(page.totalElements);
+					}
+				}, function(response){
+					$scope.loading = false;
+					toaster.pop('error', '数据加载失败', response.data);
+				});
+			}
+		});
+		
+		// 同意申请
+		$scope.agree = function(id) {
+			AddPartner.agreeRequest({id: id}, {}, function(data) {
+				toaster.pop('success', '提示', '操作成功');
+			}, function(response) {
+				toaster.pop('error', '提示', response.data);
+			});
+		}
+		
+		// 拒绝申请
+		$scope.refuse = function(id, reason) {
+			AddPartner.refuseRequest({id: id, reason: reason}, {}, function(data) {
+				toaster.pop('success', '提示', '操作成功');
+			}, function(response) {
+				toaster.pop('error', '提示', response.data);
+			});
+		}
+	}]);
+	
 	return app;
 });

+ 269 - 0
src/main/webapp/resources/js/index/services/BaseInfo.js

@@ -0,0 +1,269 @@
+define(['ngResource'], function() {
+	angular.module('ProductServices', [ 'ngResource']).factory('GetProductInfo', ['$resource', function($resource) {
+		return $resource('product/baseInfo', {}, {
+			getOne : {
+				url : "product/baseInfo/:id",
+				method : 'GET'
+			},
+			getAll : {
+				isArray : false
+			},
+			uploadByBatch : {
+				url : "product/baseInfo/uploadByBatch",
+				method : 'GET',
+			},
+			addNewProd : {
+				url: "product/baseInfo/addNewProduct",
+				method : 'POST'			},
+			update : {
+				url: "product/baseInfo/updateProdInfo",
+				method : 'POST'
+			},
+			deleteById : {
+				url: "product/baseInfo/delete/:id",
+				method : 'DELETE'
+			}
+		})
+	}]).factory('ComponentActive', ['$resource', function($resource) {
+		//获取ComponentActive的分页数据
+		return $resource('api/product/component/:uuid', {}, {
+			/*
+			 * get 获ComponentsActive的分页数据,根据uuid获得ComponentActive
+			 */
+			//根据kindid获得ComponentsActiveSimpleInfo的分页数据
+			getSimpleInfo : {
+				url : 'api/product/component/simpleInfo',
+				method : 'GET'
+			},
+			// 根据UUid获取单个器件的简要信息
+			getSimpleInfoByUuid: {
+				url: 'api/product/component/Info/:uuid',
+				method: 'GET'
+			},
+			// 根据原厂型号(code)获得ComponentActive
+			getByCode : {
+				url : 'api/product/component/byCode/:code',
+				method : 'GET',
+				isArray : true
+			},
+			// 禁用ComponentActive
+			disable : {
+				url : 'product/component/:uuid/disable',
+				method : 'PUT'
+			},
+			// 根据UUid 获取列表
+			getByUuid: {
+				url : 'api/product/component/byUuid',
+				method : 'GET',
+				isArray : true
+			},
+			//根据批次号获取器件信息
+			getByBatchCode: {
+				url : 'product/component/:batchCode/detail',
+				method : 'GET'
+			},//根据原厂型号和品牌获取器件信息
+			getByCodeAndBrandId: {
+				url: 'product/component/codeAndBrandId/:code',
+				method: 'GET',
+				isArray: true
+			},//根据原厂型号和类目获取器件信息
+			getByCodeAndKindId: {
+				url: 'product/component/codeAndKindId/:code',
+				method: 'GET',
+				isArray: true
+			},
+			/*样品*/
+			getProofCompon: {
+				url: 'api/product/component/list/proofing',
+				method: 'GET'
+			},
+			hasSamples: {
+				url: 'api/product/component/proofing/hasSample',
+				method: 'POST'
+			},
+			recommendProofing: {
+				url: 'api/product/component/:qty/recommend/proofing',
+				method: 'GET',
+				isArray: true
+			},
+			/*现货*/
+			getOriginalCompon: {
+				url: 'api/product/component/list/original',
+				method: 'GET'
+			},
+			recommendOriginal: {
+				url: 'api/product/component/:qty/recommend/original',
+				method: 'GET',
+				isArray: true
+			},
+			// 根据类目id获取封装规格
+			getPackagingByKindid: {
+				url: 'product/component/packaging/:kindid',
+				method: 'GET',
+				isArray: true
+			},
+			// 批量修改器件类目
+			moveCmp: {
+				url: 'product/component/moveCmp',
+				method: 'PUT',
+				isArray : true
+			},
+			//根据类目id获取器件列表
+			getComponentsByKindid: {
+				url: 'product/component/cmplist/:kindId',
+				method: 'GET'
+			}
+		})
+	}]).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
+			},
+			// 获取父级分类的所有子分类,含深层
+			getAllChildren: {
+				url: 'product/kind/:parentId/children_all',
+				method: 'GET',
+				isArray: true
+			},
+			// 获取子类目的所有父类目(含每级类目的兄弟类目),返回逐级向下的类目数组
+			getParentsWithBothers: {
+				url: 'product/kind/:childId/parentsWithBothers',
+				method: 'GET',
+				isArray: true
+			},
+			// 获取子类目的所有父类目,返回逐级向下的类目数组
+			getParents: {
+				url: 'product/kind/:childId/parents',
+				method: 'GET',
+				isArray: true
+			},
+			// 获取分类的所有属性,包括存在的值选项
+			getPropertiesValues: {
+				url: 'product/kind/:kindId/properties/values',
+				method: 'GET',
+				isArray: true
+			},
+			// 获取分类的所有属性,不含值选项
+			getProperties: {
+				url: 'product/kind/:kindId/properties',
+				method: 'GET',
+				isArray: true
+			},
+			// 获取类目下器件的所属品牌列表
+			getBrands: {
+				url: 'product/kind/:kindId/brands',
+				methos: 'GTE',
+				isArray: true
+			},
+			// 获取类目下主要属性存在的值选项
+			getPropertyOptions: {
+				url: 'product/kind/:kindId/propertyOptions',
+				method: 'GET',
+				isArray: true
+			},
+			// 根据kindid获取一页ComponentGoods
+			getCompGoodsByKindid: {
+				url: 'product/product/getCompGoodsByKindid',
+				method: 'GET'
+			},
+			// 根据keyword获取一页ComponentGoods
+			getCompGoodsBySearch: {
+				url: 'product/component/search/compGoods',
+				method: 'GET'
+			},
+			// 根据kindid获取类目属性
+			getKindProperties: {
+				url: 'product/kind/:kindId/kindProperties',
+				method: 'GET',
+				isArray: true
+			}
+		})
+	}]).factory('EnterpriseList', ['$resource', function($resource) {
+		return $resource('product/baseInfo/enterprise', {}, {
+			getAll: {
+				isArray : false
+			},
+		})
+	}]).factory('AddPartner', ['$resource', function($resource) {
+		return $resource('addpartner', {}, {
+			addPartner: {
+				url: 'addpartner/request/:uu',
+				method: 'POST'
+			},
+			agreeRequest: {
+				url: 'addpartner/agree/:id',
+				method: 'POST'
+			},
+			refuseRequest: {
+				url: 'addpartner/refuse/:id',
+				method: 'POST'
+			},
+			reapply: {
+				url: 'addpartner/reapply/:id',
+				method: 'POST'
+			}
+		})
+	}]).factory('AddPartnerMyMessage', ['$resource', function($resource) {
+		return $resource('addpartner/message', {}, {
+			getAllMessage: {
+				url: 'addpartner/message',
+			},
+			getMessageTodo: {
+				url: 'addpartner/message',
+				params: {
+					_state: 'todo'
+				}
+			},
+			getMessageDone: {
+				url: 'addpartner/message',
+				params: {
+					_state: 'done'
+				}
+			},
+			getMessageEnd: {
+				url: 'addpartner/message',
+				params: {
+					_state: 'end'
+				}
+			}
+		})
+	}]).factory('AddPartnerMyRequest', ['$resource', function($resource) {
+		return $resource('addpartner/request', {}, {
+			getAllRequest: {
+				url: 'addpartner/request',
+			},
+			getRequestTodo: {
+				url: 'addpartner/request',
+				params: {
+					_state: 'todo'
+				}
+			},
+			getRequestDone: {
+				url: 'addpartner/request',
+				params: {
+					_state: 'done'
+				}
+			},
+			getRequestEnd: {
+				url: 'addpartner/request',
+				params: {
+					_state: 'end'
+				}
+			},
+		})
+	}]).factory('newPurcOrder', ['$resource', function($resource) {
+		return $resource('product/baseInfo/newPurcOrder', {}, {
+			save: {
+				method: 'POST',
+				isArray: false,
+				headers: {
+					'Content-Type' : 'application/text;charset=UTF-8'
+				}
+			},
+		})
+	}]);
+});

+ 10 - 0
src/main/webapp/resources/js/index/services/Purc.js

@@ -508,5 +508,15 @@ define([ 'ngResource'], function() {
 				url: 'sale/quotation/item/:id'
 			}
 		});
+	}]).factory('PurcOrderSave', ['$resource', function($resource){
+		return $resource('sale/newOrder', {}, {
+			save: {
+				method: 'POST',
+				isArray: false,
+				headers: {
+					'Content-Type' : 'application/text;charset=UTF-8'
+				}
+			}
+		});
 	}]);
 });

+ 0 - 0
src/main/webapp/resources/tpl/index/baseInfo/index.html


+ 39 - 0
src/main/webapp/resources/tpl/index/baseInfo/modal/Component_KindChoose_modal.html

@@ -0,0 +1,39 @@
+<div class="modal-body" style="min-height: 500px;">
+	<div class="headerline">
+		<span class="content"><i class="fa fa-fw fa-edit text-primary"></i>器件选择</span>
+	</div>
+	<form class="form-horizontal">
+		<div class="form-group">
+			<label class="col-md-2 col-sm-2 control-label">筛选:</label>
+			<div class="col-md-8 col-sm-8">
+				<input ng-model="keyword" type="text" class="form-control input-sm" 
+					required placeholder="输入客户物料关键字查询" autofocus ng-search="onSearch()">
+				<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+			</div>
+		</div>
+	</form>
+	<table class="block table table-default table-striped table-bordered"
+		ng-table="tableParams">
+		<thead>
+			<tr class="header">
+				<th width="160px">物料编号</th>
+				<th width="160px">中文品牌</th>
+				<th width="160px">英文品牌</th>
+				<th width="160px">标准料号</th>
+				<th width="50px">选择</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr ng-repeat="product in $data">
+				<td class="text-center" ng-bind="::product.code"></td>
+				<td class="text-center" ng-bind="::product.brand.nameCn"></td>
+				<td class="text-center" ng-bind="::product.brand.nameEn"></td>
+				<td class="text-center f12" ng-bind="::product.uuid"></td>
+				<td class="text-center"><a title="选择" href="javascript:void(0)" ng-click="check(product)"><i class="fa fa-check-square-o"></i></a></td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+<div class="modal-footer">
+	<button class="btn btn-default" ng-click="cancel()" type="button">取消</button>
+</div>

+ 415 - 0
src/main/webapp/resources/tpl/index/baseInfo/modal/product_kindChoose_modal.html

@@ -0,0 +1,415 @@
+<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">
+	<button class="btn btn-success" type="button"
+		ng-disabled="!active.isLeaf" ng-click="check()">确认并保存</button>
+	<button class="btn btn-default" ng-click="cancel()" type="button">取消</button>
+</div>

+ 173 - 0
src/main/webapp/resources/tpl/index/baseInfo/newProdInfo.html

@@ -0,0 +1,173 @@
+<style>
+.new {
+	padding: 0px 20px 20px 20px;
+}
+
+.new label {
+	font-size: 14px;
+	font-weight: normal;
+	font-family: "Microsoft YaHei" ! important;
+}
+
+.headerline {
+	font-size: 16px;
+  	font-family: Microsoft YaHei,SimHei,Verdana;
+  	font-weight: 500;
+  	line-height: 22px;
+  	margin: 25px 0;
+  	clear: both;
+  	zoom: 1;
+  	border-top: 1px solid #eee;
+  	position: relative;
+}
+
+.headerline .content {
+	position: absolute;
+	top: -12px;
+	left: 20px;
+	line-height: 24px;
+  	padding: 0 15px 0 10px;
+  	background: #fff;
+  	z-index: 2;
+}
+
+.headerline .end {
+	position: absolute;
+	top: -12px;
+	right: 20px;
+	line-height: 24px;
+  	padding-left: 15px;
+  	background: #fff;
+  	z-index: 2;
+}
+
+.input-group-addon {
+	background-color: inherit;
+  	border: 1px solid #e1e1e1;
+  	color: #888 !important;
+}
+
+.status {
+	position: absolute;
+  	height: 50px;
+  	width: 100px;
+  	/* border-radius: 50px; */
+  	border: dashed 2px #999;
+  	border-radius: 13px;
+  	padding-top: 7px;
+  	padding-left: 5px;
+  	text-align: center;
+  	right: 83px;
+  	top: 10px;
+  	background-color: #FFFFFF;
+  	color: #999;
+  	word-spacing: 8px;
+  	letter-spacing: 5px;
+  	-webkit-transform: rotate(15deg);
+  	-moz-transform: rotate(15deg);
+  	-o-transform: rotate(15deg);
+  	transform: rotate(14deg);
+  	font-size: 20px;
+  	z-index: 9;
+  	font-family: '楷体', '微软雅黑';
+}
+
+.productSpec textarea {
+	width: 276.656px;
+	height: auto;
+}
+</style>
+<div class="loading" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="block new">
+	<form class="form-horizontal" name="productInfo">
+		<div class="headerline">
+			<div class="content">新增物料</div>
+			<div class="end">
+				<i class="fa fa-angle-down"></i>&nbsp;&nbsp;
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+	<!-- 		<div class="col-sm-2"></div>
+			<div class="from-group col-sm-3">
+				<button class="btn btn-success btn-sm" ng-click="selectKind()" style="width: 100%;">选择类目</button>
+			</div> -->
+		</div>
+			<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">原厂型号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.cmpCode" type="text" readonly="readonly" class="form-control input-dbfind" id="custUser" 
+						placeholder="点击选择原厂型号" style="cursor: pointer;" ng-click="selectKind()">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">标准料号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.cmpUuId" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="标准料号" style="cursor: pointer;" readonly="readonly">
+					<span class="form-control-feedback text-simple"></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">物料品牌</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.brand" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="物料品牌" style="cursor: pointer;" readonly="readonly">
+					<span class="form-control-feedback text-simple"></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customer" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料名称</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.title" type="text" class="form-control" id="customer" 
+						placeholder="物料名称" style="cursor: pointer;" ng-click="dbfindCust()" required="true">
+					<span class="form-control-feedback text-simple"><!-- <i class="fa fa-search"></i> --></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料编号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.code" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="物料编号"  style="cursor: pointer;" required="true">
+					<span class="form-control-feedback text-simple"></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料规格</label>
+			<div class="col-sm-4">
+				<div class="productSpec">
+					<textarea ng-model="prodInfo.spec" type="text"  id="product"  class="input-dbfind"
+						placeholder="物料规格" style="cursor: pointer;"
+						ng-click="dbfindCustProd()" required="true"></textarea>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">单位</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.unit" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="单位" style="cursor: pointer;" required="true">
+				</div>
+			</div>
+		</div>
+	</form>
+	<div class="form-group form-group-sm">
+		<div class="col-sm-2"></div>
+		<div class="col-sm-3">
+			<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="submit(prodInfo)" ng-disabled="productInfo.$invalid">提交</button>
+		</div>
+	</div>
+</div>

+ 185 - 0
src/main/webapp/resources/tpl/index/baseInfo/prodList.html

@@ -0,0 +1,185 @@
+<style>
+.order-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.order-table .sep-row {
+	height: 10px;
+}
+
+.order-table .selector {
+	vertical-align: middle;
+	margin: 0 0 2px 0;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.toolbar .select_all {
+	margin: 0 6px 0 10px;
+	line-height: 20px;
+}
+
+.toolbar .btn {
+	-moz-border-radius: 2px;
+	margin-right: 5px;
+	border: 1px solid #dcdcdc;
+	border-radius: 2px;
+	-webkit-border-radius: 2px;
+}
+
+.order-table .order-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.order-table .order-hd td.first {
+	padding-left: 20px;
+}
+
+.order-table .order-hd .order-main span {
+	margin-right: 8px;
+}
+
+.order-table .order-hd .order-code {
+	font-style: normal;
+	font-family: verdana;
+}
+
+.order-table .order-hd .order-sum {
+	padding: 0 5px;
+}
+
+.order-table>tbody {
+	border: 1px solid transparent;
+}
+
+.order-table>tbody:hover {
+	border-color: #56a022;
+	border-width: 2px;
+}
+
+.order-table .operates {
+	display: none;
+}
+
+.order-table>tbody:hover .operates {
+	display: block;
+}
+
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .product {
+	padding-left: 20px;
+}
+
+.input-xs,.input-group-xs>.form-control,.input-group-xs>.input-group-addon,.input-group-xs>.input-group-btn>.btn
+	{
+	height: 26px;
+	padding: 0 5px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+.input-group-xs .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn {
+	border-top-left-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+ .modal-dialog {
+	margin-top: 110px;
+}
+
+.file {
+	color: #336699;
+	text-decoration: underline;
+}
+
+</style>
+<div class="block">
+<div class="loading in" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="condition block">
+		<div class="row">
+			<div class="col-xs-10">
+				<div class="search">
+					<div class="form-group form-group-sm has-feedback">
+						<input type="search" class="form-control input-sm" ng-model="keyword" ng-search="onSearch()" placeholder="输入商品、客户名称、认定单号、送样单号或认定结果搜索" /><span
+							class="form-control-feedback text-simple"><i
+							class="fa fa-search"></i></span>
+					</div>
+				</div>
+			</div>
+			<div class="col-xs-2">
+				<div class="text-default f14 total">
+					共 <span ng-bind="tableParams.total()" class="text-num"></span>
+				</div>
+			</div>
+</div>
+<table class="order-table block " ng-table="tableParams">
+	<thead>
+		<tr class="header">
+			<th width="120">物料名称</th>
+			<th width="120">物料编码</th>
+			<th width="240">物料规格</th>
+			<th width="140">品牌</th>
+			<th width="70">标准料号</th>
+			<th width="120">原厂型号</th>
+			<th width="70">单位</th>
+			<th width ="100">操作</th>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="5"></td>
+		</tr>
+		<tr class="toolbar toolbar-top">
+			<td colspan="6">
+			</td>
+			<td class="text-center">
+				<a href="product/baseInfo/xls?keyword={{keywordXls}}" target="_self" class="text-simple" title="导出Excel表格"><i class="fa fa-file-excel-o fa-fw"></i>导出</a>
+			</td>
+			<td colspan="1" class="text-center">
+				<a ui-sref="baseInfo.newProdInfo">新增<i class="fa fa-plus-square"></i></a>
+			</td>
+		</tr>
+		<tr class="sep-row">
+			<td colspan="5"></td>
+		</tr>
+	</thead>
+	<tbody ng-repeat="product in $data">
+		<tr class="order-hd">
+			<td class="first text-center" width="120">
+				<div class="order-main">
+					<span ng-bind="::product.title" ></span>
+				</div>
+			</td>
+			<td width="120" class="text-center"><span title="{{product.code}}" ng-bind="::product.code"></span></td>
+			<td width="240" class="order-sum text-center">
+				<span title="{{product.spec}}" ng-bind="::product.spec"></span>
+			</td>
+			<td width="140" class="text-center">
+				<span title="{{product.brand}}" ng-bind="::product.brand"></span>
+			</td>
+			<td width="70" class="text-center"><span title="标准料号" ng-bind="::product.cmpUuId"></span></td>
+			<td width="120" class="text-center"><span title="原厂型号" ng-bind="::product.cmpCode"></span></td>
+			<td width="70" class="text-center"><span title="单位" ng-bind="::product.unit"></span></td>
+			<td width="100" class="text-center"><a ui-sref="baseInfo.productDetail({id:product.id})" target="_self">编辑<i class="fa fa-edit"></i></a>|<a ng-click="deleteById(product.id)">删除<i class="fa fa-trash"></i></a></td>
+		</tr>
+	</tbody>
+</table>

+ 175 - 0
src/main/webapp/resources/tpl/index/baseInfo/productDetail.html

@@ -0,0 +1,175 @@
+<style>
+.new {
+	padding: 0px 20px 20px 20px;
+}
+
+.new label {
+	font-size: 14px;
+	font-weight: normal;
+	font-family: "Microsoft YaHei" ! important;
+}
+
+.headerline {
+	font-size: 16px;
+  	font-family: Microsoft YaHei,SimHei,Verdana;
+  	font-weight: 500;
+  	line-height: 22px;
+  	margin: 25px 0;
+  	clear: both;
+  	zoom: 1;
+  	border-top: 1px solid #eee;
+  	position: relative;
+}
+
+.headerline .content {
+	position: absolute;
+	top: -12px;
+	left: 20px;
+	line-height: 24px;
+  	padding: 0 15px 0 10px;
+  	background: #fff;
+  	z-index: 2;
+}
+
+.headerline .end {
+	position: absolute;
+	top: -12px;
+	right: 20px;
+	line-height: 24px;
+  	padding-left: 15px;
+  	background: #fff;
+  	z-index: 2;
+}
+
+.input-group-addon {
+	background-color: inherit;
+  	border: 1px solid #e1e1e1;
+  	color: #888 !important;
+}
+
+.status {
+	position: absolute;
+  	height: 50px;
+  	width: 100px;
+  	/* border-radius: 50px; */
+  	border: dashed 2px #999;
+  	border-radius: 13px;
+  	padding-top: 7px;
+  	padding-left: 5px;
+  	text-align: center;
+  	right: 83px;
+  	top: 10px;
+  	background-color: #FFFFFF;
+  	color: #999;
+  	word-spacing: 8px;
+  	letter-spacing: 5px;
+  	-webkit-transform: rotate(15deg);
+  	-moz-transform: rotate(15deg);
+  	-o-transform: rotate(15deg);
+  	transform: rotate(14deg);
+  	font-size: 20px;
+  	z-index: 9;
+  	font-family: '楷体', '微软雅黑';
+}
+
+.productSpec textarea {
+	width: 276.656px;
+	height: auto;
+}
+</style>
+<div class="loading" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="block new">
+	<form class="form-horizontal" name="productInfo">
+		<div class="headerline">
+			<div class="content">物料详情</div>
+			<div class="end">
+				<i class="fa fa-angle-down"></i>&nbsp;&nbsp;
+			</div>
+		</div>
+			<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">物料品牌</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.brand" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="物料品牌" readonly="readonly" style="cursor: pointer;">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">原厂型号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.cmpCode" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="原厂型号" readonly="readonly" style="cursor: pointer;">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">标准料号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.cmpUuId" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="标准料号" readonly="readonly" style="cursor: pointer;">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customer" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料名称</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.title" ng-readonly="!prodInfo.$editing" type="text" class="form-control" id="customer" 
+						placeholder="物料名称" style="cursor: pointer;" ng-click="dbfindCustProd()" ng-required="true">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料编号</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.code" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="物料编号" ng-readonly="!prodInfo.$editing" style="cursor: pointer;">
+					<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料规格</label>
+			<div class="col-sm-4">
+				<div class="productSpec">
+					<textarea ng-model="prodInfo.spec" type="text"  id="product"  class="input-dbfind"
+						placeholder="物料规格" ng-readonly="!prodInfo.$editing" ng-required="true"></textarea>
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm has-feedback">
+			<label for="customerUser" class="col-sm-2 control-label">单位</label>
+			<div class="col-sm-4">
+				<div class="">
+					<input ng-model="prodInfo.unit" type="text" class="form-control input-dbfind" id="custUser" 
+						placeholder="单位" ng-readonly="!prodInfo.$editing" style="cursor: pointer;">
+				</div>
+			</div>
+		</div>
+		<div class="form-group form-group-sm">
+			<div class="col-sm-2"></div>
+			<div class="col-sm-3" ng-if="!prodInfo.$editing">
+				<button class="btn btn-warning btn-sm" style="width: 100%;" ng-click="update()">修改</button>
+			</div>
+			<div class="col-sm-3" ng-if="prodInfo.$editing">
+				<button class="btn btn-info btn-sm" style="width: 100%;" ng-click="cancel()">取消</button>
+			</div>
+			<!-- <div class="col-sm-3" ng-if="prodInfo.$editing">
+				<button class="btn btn-success btn-sm" style="width: 100%;" ng-disabled="quotationForm.$invalid" ng-click="save()">保存</button>
+			</div> -->
+			<div class="col-sm-3"  ng-if="prodInfo.$editing">
+				<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="submit(prodInfo)">提交</button>
+			</div>
+		</div>
+	</form>
+</div>

+ 134 - 0
src/main/webapp/resources/tpl/index/baseInfo/quotation.html

@@ -0,0 +1,134 @@
+<style>
+.order-table .header>th {
+	height: 38px;
+	text-align: center;
+	background: #f5f5f5;
+	border-top: 1px solid #e8e8e8;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.order-table .sep-row {
+	height: 10px;
+}
+
+.order-table .selector {
+	vertical-align: middle;
+	margin: 0 0 2px 0;
+}
+
+.toolbar label {
+	margin-right: 10px;
+	margin-bottom: 0;
+}
+
+.toolbar .select_all {
+	margin: 0 6px 0 10px;
+	line-height: 20px;
+}
+
+.toolbar .btn {
+	-moz-border-radius: 2px;
+	margin-right: 5px;
+	border: 1px solid #dcdcdc;
+	border-radius: 2px;
+	-webkit-border-radius: 2px;
+}
+
+.order-table .order-hd {
+	background: #f5f5f5;
+	height: 40px;
+	line-height: 40px;
+}
+
+.order-table .order-hd td.first {
+	padding-left: 20px;
+}
+
+.order-table .order-hd .order-main span {
+	margin-right: 8px;
+}
+
+.order-table .order-hd .order-code {
+	font-style: normal;
+	font-family: verdana;
+}
+
+.order-table .order-hd .order-sum {
+	padding: 0 5px;
+}
+
+.order-table>tbody {
+	border: 1px solid transparent;
+}
+
+.order-table>tbody:hover {
+	border-color: #56a022;
+	border-width: 2px;
+}
+
+.order-table .operates {
+	display: none;
+}
+
+.order-table>tbody:hover .operates {
+	display: block;
+}
+
+.order-table .order-bd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .product {
+	padding-left: 20px;
+}
+
+.input-xs,.input-group-xs>.form-control,.input-group-xs>.input-group-addon,.input-group-xs>.input-group-btn>.btn
+	{
+	height: 26px;
+	padding: 0 5px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+.input-group-xs .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn {
+	border-top-left-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+.input-dbfind {
+	cursor: pointer;
+}
+
+@media ( min-width : 768px) {
+	.form-horizontal .form-group-xs .control-label {
+		padding-top: 5px;
+	}
+}
+
+.inline-show {
+	display: inline-block;
+}
+
+.inline-hide {
+	display: none;
+}
+
+</style>
+<div class="block">
+	<div class="condition block">
+		<div class="row">
+			<div class="col-xs-10">
+				<div class="f16 text-default text-bold" style="line-height: 30px;">
+					 主动报价单</div>
+			</div>
+		</div>
+	</div>
+	<div ui-view></div>
+</div>

+ 172 - 0
src/main/webapp/resources/tpl/index/baseInfo/right.html

@@ -0,0 +1,172 @@
+<div ui-view class="sale-view"></div>
+<style>
+.rbar {
+	opacity: 1;
+	width: 34px;
+	height: 100%;
+	position: fixed;
+	top: 0;
+	right: 0;
+	padding-top: 85px;
+	color: #555;
+	-webkit-box-shadow: 0 0 7px 0 rgba(119, 119, 119, 0.2);
+	box-shadow: 0 0 7px 0 rgba(119, 119, 119, 0.2);
+	background-color: #fafafa;
+	background: -webkit-linear-gradient(left, #e9e9e9, #fafafa);
+	background: -moz-linear-gradient(left, #e9e9e9, #fafafa);
+	background: -o-linear-gradient(left, #e9e9e9, #fafafa);
+	background: -ms-linear-gradient(left, #e9e9e9, #fafafa);
+	background: linear-gradient(left, #e9e9e9, #fafafa);
+	border-left: 1px solid #d9d9d9;
+	zoom: 1;
+	z-index: 2;
+	background: -o-linear-gradient(left, #e9e9e9, #fafafa);
+}
+
+.rbar a:hover {
+	color: #fff;
+}
+
+.rbar a:hover,.rbar a:focus,.rbar a:active {
+	text-decoration: none;
+}
+
+.rbar .item-wrap {
+	position: relative;
+	cursor: pointer;
+	text-align: center;
+	font-family: "Microsoft YaHei", SimHei, "WenQuanYi Micro Hei", STHeiti;
+	border-bottom: 1px solid #f9f9f9;
+	-webkit-transition: all 0.15s ease-in-out;
+	-moz-transition: all 0.15s ease-in-out;
+	transition: all 0.15s ease-in-out;
+}
+
+.rbar .item-inner {
+	border-bottom: 1px solid #e3e3e3;
+	width: 34px;
+	display: block;
+}
+
+.rbar .item-wrap:hover {
+	background-color: #56a022;
+	color: #fff;
+}
+
+.rbar .inner-text {
+	width: 20px;
+	padding: 10px 0 5px 0;
+	margin: auto;
+	text-align: center;
+	display: block;
+}
+
+.item-inner .badge {
+	padding: 3px 5px;
+	margin-bottom: 5px;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	background-color: #56a022;
+}
+
+.item-wrap:hover .badge {
+	background-color: #fff;
+	color: #56a022;
+}
+
+.item-wrap .tip {
+	position: absolute;
+	opacity: 0;
+	zoom: 1;
+	right: -100px;
+	top: 0;
+	width: 100px;
+	height: 100%;
+	background-color: #494949;
+	border-radius: 2px 0 0 2px;
+	-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .2);
+	-moz-box-shadow: 0 0 5px rgba(0, 0, 0, .2);
+	box-shadow: 0 0 5px rgba(0, 0, 0, .2);
+	font-size: 12px;
+	text-align: center;
+	color: #fff;
+	-webkit-transition: all 0.35s ease-in-out;
+	-moz-transition: all 0.35s ease-in-out;
+	transition: all 0.35s ease-in-out;
+	z-index: 0;
+}
+
+.item-wrap .tip:after {
+	position: absolute;
+	content: '';
+	top: 30%;
+	right: -10px;
+	width: 0;
+	height: 0;
+	font-size: 0;
+	border: solid 5px;
+	border-color: transparent transparent transparent #494949;
+}
+
+.item-wrap:hover .tip {
+	opacity: 1;
+	right: 32px;
+}
+
+.item-wrap .tip>ul {
+	margin: 0;
+	padding: 0;
+}
+
+.item-wrap .tip>ul>li {
+	color: #fff;
+	padding: 10px;
+	border-bottom: 1px solid #f6f6f6;
+	-webkit-transition: all 0.15s ease-in-out;
+	-moz-transition: all 0.15s ease-in-out;
+	transition: all 0.15s ease-in-out;
+}
+
+.item-wrap .tip>ul>li>a {
+	color: #fff;
+}
+
+.item-wrap .tip>ul>li:hover {
+	background-color: #56a022;
+}
+
+.rbar .bar-bottom {
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	border-top: 1px solid #e3e3e3;
+}
+
+.bar-bottom .item-wrap:first-child .item-inner {
+	border-top: 1px solid #f9f9f9;
+}
+
+.rbar .icon-left {
+	margin: 8px 10px 0 0;
+	float: left;
+	width: 30%;
+}
+</style>
+
+<!-- Start -->
+
+<!-- End -->
+
+<!-- right static-bar Start -->
+<div class="rbar">
+	<div class="bar-center" ng-controller="TodoCtrl">
+		<div class="item-wrap">
+			<a class="item-inner" ui-sref="baseInfo.myMessage"> <span
+				class="inner-text">收到的请求</span> <span class="badge"
+				ng-bind="todo.myMessageTodo"></span>
+			</a>
+		</div>
+	</div>
+</div>
+<!-- right static-bar End -->

+ 349 - 0
src/main/webapp/resources/tpl/index/baseInfo/uploadByBatch.html

@@ -0,0 +1,349 @@
+<style type="text/css">
+.location {
+	line-height: 28px;
+}
+
+.location ul {
+	border-bottom: solid 1px #ddd;
+}
+
+.block {
+	padding: 0px 15px;
+}
+
+.headerline {
+	font-size: 24px;
+    font-family: Microsoft YaHei, SimHei, Verdana;
+    font-weight: 500;
+    line-height: 22px;
+    margin: 30px 0 35px -15px;
+    clear: both;
+    zoom: 1;
+    border-top: 1px solid #eee;
+    position: relative;
+    font-size: 18px;
+}
+
+.headerline .index {
+	position: absolute;
+    top: -12px;
+    left: 0;
+    width: 6px;
+    height: 24px;
+    line-height: 24px;
+    background: #ff7300;
+    color: #fff;
+    text-align: center;
+    border-radius: 0 2px 2px 0;
+    z-index: 2;
+}
+
+.headerline .content {
+	position: absolute;
+    top: -12px;
+    left: 6px;
+    line-height: 24px;
+    padding: 0 15px 0 10px;
+    background: #fff;
+    z-index: 2;
+}
+
+.headerline .end {
+	position: absolute;
+    top: -12px;
+    right: 0;
+    line-height: 24px;
+    padding-left: 15px;
+    background: #fff;
+    z-index: 2;
+}
+
+.search table.table tr td {
+	border-top: none;
+}
+
+#searchInput {
+	height: 34px;
+}
+
+.suggestion {
+	position: absolute;
+	margin-top: -1px;
+	width: 374px;
+	background-color: #fff;
+	border: 1px solid #bbb;
+	border-top: none;
+	z-index: 20;
+}
+
+.suggestion ul {
+	margin-bottom: 0;
+}
+
+.suggestion ul li {
+	line-height: 20px;
+	font-size: 16px;
+	padding: 0px 12px;
+	color: #0080c0;
+	cursor: pointer;
+}
+
+.suggestion ul li:hover,.suggestion ul li.active {
+	background: #eee;
+}
+
+.productInfo {
+	overflow-x:scroll;
+}
+
+#release .tableMargin {
+	margin-top: 20px;
+}
+
+#release table {
+	margin:0 auto;
+}
+	
+#release th {
+	text-align: center;
+	height: 40px;
+}
+#release-body td {
+	text-align: center;
+	word-break: break-all;
+}
+#release-body td ul li {
+	list-style: none;
+	text-align: right;
+}
+
+#release .checkboxSize input {
+		width: 18px;
+		height: 18px;
+}
+
+#image-box .x-floating-wrap {
+	position: fixed;
+	z-index: 99998;
+	background: #000;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	opacity: 0.5;
+}
+#image-box .x-floating {
+	position: fixed;
+	z-index: 99999;
+	top: 60px;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	text-align: center;
+	vertical-align: middle;
+}
+#image-box .x-floating img {
+	margin: auto auto;
+	max-width: 100%;
+	max-height: 80%;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none
+}
+
+#image-box .x-close-wrap {
+	position: fixed;
+	top: 0;
+	right: 0;
+	z-index: 100000;
+	width: 120px;
+  	height: 120px;
+	margin: -60px -60px 0 0;
+	border-radius: 100%;
+	background: #000;
+	opacity: .3
+}
+
+#image-box .x-close-wrap a {
+	position: absolute;
+	left: 25px;
+	bottom: 25px;
+	font-size: 42px;
+	color: #fff
+}
+
+#image-box .x-close-wrap:hover {
+	opacity: .7
+}
+
+table.table.table-striped  thead {
+	display: none;
+}
+
+.clear-fix {
+    clear: both;
+}
+
+.color-gray-f {
+    color: #858585;
+}
+
+.color-red-f {
+    color: #F30A26;
+}
+
+/* 分页 Start */
+.block div.text-normal-s {
+    margin: 20px 0;
+    width: 100%;
+}
+
+.block div.text-normal-s>div:first-child {
+    float: right;
+    display: inline;
+    height: 28px;
+    line-height: 28px;
+}
+
+.block div.text-normal-s>div:first-child div {
+    padding: 0;
+    margin: 0;
+    height: 26px;
+    line-height: 26px;
+    vertical-align: top;
+    display: inline-block;
+}
+
+.block div.text-normal-s>div:first-child input[type="button"] {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    height: 26px;
+    vertical-align: top;
+    background-color: transparent;
+}
+
+.block div.text-normal-s>div:first-child input[type="button"]:hover {
+    color: #000000;
+}
+
+.block div.text-normal-s>div:first-child span {
+    vertical-align: top;
+}
+
+.block div.text-normal-s>div:first-child input[type="text"]{
+    border: 0;
+    width: 20px;
+    height: 20px;
+    margin: 4px 0;
+    vertical-align: top;
+    text-align: center;
+    background-image: url('static/img/order/number-box.png');
+}
+
+.block div.text-normal-s input[type="button"].btn-jump {
+    width: 56px;
+    height: 26px;
+    border: 0;
+    padding: 0;
+    background-image: url('static/img/order/page-jump.png');
+}
+
+.block div.text-normal-s input[type="button"].btn-jump:hover {
+    border-left: 1px #0000ff solid;
+    border-right: 1px #0000ff solid;
+}
+    
+  /* 分页 End */
+
+</style>
+<!-- location start -->
+<!-- location end -->
+<!-- block start -->
+<div class="block">
+	<div class="headerline">
+		<div class="index"></div>
+		<div class="content f16 text-bold">第一步、下载Excel模板</div>
+		<!-- <div class="end">
+			<a ng-click="closeBox('box1Closed')"
+				class="btn btn-default btn-sm text-simple"> <span
+				ng-if="!box1Closed">收拢 <i class="fa fa-angle-double-up"></i></span>
+				<span ng-if="box1Closed">展开 <i
+					class="fa fa-angle-double-down"></i></span>
+			</a>
+		</div> -->
+	</div>
+	<div class="box-item" ng-hide="box1Closed">
+		<p>
+			<button class="btn btn-success btn-sm" ng-click="download()">下载Excel模板 <i
+				class="fa fa-download"></i></button> 在Excel模板上录入商品发布信息,上传
+			<a class="f14 text-default" ng-click="showImg()">查看表格示例</a>。
+		</p>
+		<p>
+			<span class="text-inverse">*提示: 红色的为必填</span>
+		</p>
+	</div>
+	<div id="image-box" style="display: none">
+		<div class="x-close-wrap" title="关闭">
+			<a href="javascript:void(0);">&times;</a>
+		</div>
+		<div class="x-floating-wrap"></div>
+		<div class="x-floating">
+			<img />
+		</div>
+	</div>
+	<div class="headerline">
+		<div class="index"></div>
+		<div class="content f16 text-bold">第二步、上传已经填好的Excel文件</div>
+		<!-- <div class="end">
+			<a ng-click="closeBox('box2Closed')"
+				class="btn btn-default btn-sm text-simple"> <span
+				ng-if="!box2Closed">收拢 <i class="fa fa-angle-double-up"></i></span>
+				<span ng-if="box2Closed">展开 <i
+					class="fa fa-angle-double-down"></i></span>
+			</a>
+		</div> -->
+		<!-- <input role="button" class="btn btn-primary" value="上传文件" /> -->
+	</div>
+	<div class="box-item" ng-hide="box2Closed">
+		<form class="form-horizontal">
+			<div class="form-group">
+				<label class="control-label col-xs-3" for="xlsFile">请上传已经填写好的Excel文件</label>
+				<div class="col-xs-4">
+					<input required ng-file-select accept="*.xls,*.xlsx"
+						ng-model="myFiles" type="file" ng-multiple="false"
+						class="form-control input-sm" id="xlsFile" name="xlsFile"
+						placeholder="请上传.xls或.xlsx文件" />
+				</div>
+				<div class="col-xs-4">
+					<button ng-click="upload()" class="btn btn-success btn-sm">
+						确认上传 <i class="fa fa-upload"></i>
+					</button>
+				</div class="col-xs-4">
+			</div>
+			<div>
+			</div>
+			<!-- 分页 Start -->
+		</form>
+	</div>
+	<div class="headerline">
+	<div class="index"></div>
+	<div class="content f16 text-bold">第三部、信息提示</div>
+</div>
+<div class="box-item" ng-hide="box3Closed">
+	<p ng-if="result">
+		物料 <span class="text-inverse">{{alters}}</span> 已存在,上传失败
+	</p>
+</div>
+<div id="image-box" style="display: none">
+	<div class="x-close-wrap" title="关闭">
+		<a href="javascript:void(0);">&times;</a>
+	</div>
+	<div class="x-floating-wrap"></div>
+	<div class="x-floating">
+		<img />
+	</div>
+</div>
+</div>
+<!-- block end -->

+ 178 - 0
src/main/webapp/resources/tpl/index/purc/addOrder.html

@@ -0,0 +1,178 @@
+<style>
+
+</style>
+<div class="loading" ng-class="{'in': loading}">
+	<i></i>
+</div>
+<div class="pane">
+	<div class="pane-header f16">
+		采购单<!-- <a ng-click="print(order)" class="pull-right text-simple"><i
+			class="fa fa-print fa-fw"></i>打印</a> -->
+	</div>
+	<div class="pane-body">
+		<div class="headerline">
+				<div class="content">新增采购单</div>
+				<div class="end">
+					<i class="fa fa-angle-down"></i>&nbsp;&nbsp;
+				</div>
+			</div>
+		<div class="block new">
+			<form class="form-horizontal" name="orderForm">
+				<div class="form-group form-group-sm" ng-if="order.code">
+					<label class="col-sm-2 text-right">单据时间</label>
+					<div class="col-sm-2">
+						<div class="">
+							{{::order.date | date:'yyyy-MM-dd HH:mm:ss'}}
+						</div>
+					</div>
+					<label class="col-sm-2 text-right">录入人:</label>
+					<div class="col-sm-2">
+						<div class="">
+							{{::order.user.userName}}
+						</div>
+					</div>
+				</div>
+				<div class="form-group form-group-sm" ng-if="order.code">
+					<label for="code" class="col-sm-2 control-label">单据编号</label>
+					<div class="col-sm-4">
+						<div class="">
+							<input ng-model="order.code" readonly="readonly" type="text" class="form-control" id="code" 
+								>
+						</div>
+					</div>
+				</div>
+				<div class="form-group form-group-sm has-feedback">
+					<label for="customer" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>供应商</label>
+					<div class="col-sm-4">
+						<div class="">
+							<input ng-model="order.cust.enName" readonly="readonly" type="text" class="form-control" id="customer" 
+								placeholder="点击选择供应商" style="cursor: pointer;" ng-click="dbfindCust()" ng-required="true">
+							<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+						</div>
+						<div ng-if="order.cust.enAddress" class="text-muted">
+							<i class="fa fa-map-marker fa-fw"></i> {{order.cust.enAddress}}
+						</div>
+					</div>
+				</div>
+				<div class="form-group form-group-sm has-feedback">
+					<label for="customerUser" class="col-sm-2 control-label">供应商联系人</label>
+					<div class="col-sm-4">
+						<div class="">
+							<input ng-model="order.custUser.userName" type="text" class="form-control input-dbfind" id="custUser" 
+								placeholder="供应商联系人" readonly="readonly" style="cursor: pointer;">
+							<span class="form-control-feedback text-simple"></span>
+						</div>
+						<div ng-if="order.custUser" class="text-muted">
+							<i class="fa fa-phone fa-fw icon-left"></i>{{order.custUser.userTel}}
+						</div>
+					</div>
+				</div>
+				<div class="form-group form-group-sm has-feedback" ng-model="order.orderItems" name="orderItems">
+					<div ng-repeat="item in order.orderItems">
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>物料编码</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.code" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="点击选择物料" readonly="readonly" style="cursor: pointer;"
+										ng-click="dbfindCustProd()" ng-required="true">
+									<span class="form-control-feedback text-simple"><i class="fa fa-search"></i></span>
+								</div>
+							</div>
+						</div>
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label">物料名称</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.title" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="物料名称" readonly="readonly" style="cursor: pointer;">
+									<span class="form-control-feedback text-simple"></span>
+								</div>
+							</div>
+						</div>
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label">物料规格</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.spec" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="物料规格" readonly="readonly" style="cursor: pointer;">
+									<span class="form-control-feedback text-simple"></span>
+								</div>
+							</div>
+						</div>
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label">单位</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.unit" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="单位" readonly="readonly" style="cursor: pointer;">
+									<span class="form-control-feedback text-simple"></span>
+								</div>
+							</div>
+						</div>
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>订购数量</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.qty" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="需求数量" style="cursor: pointer;" required="true">
+									<span class="form-control-feedback text-simple"></span>
+								</div>
+							</div>
+						</div>
+						<div class="form-group form-group-sm has-feedback">
+							<label for="product" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>订购价格</label>
+							<div class="col-sm-4">
+								<div class="">
+									<input ng-model="item.price" type="text" class="form-control input-dbfind" id="product" 
+										placeholder="单价" style="cursor: pointer;" required="true">
+									<span class="form-control-feedback text-simple"></span>
+								</div>
+							</div>
+						</div>
+					<div class="form-group form-group-sm">
+					<label for="endDate" class="col-sm-2 control-label"><span class="text-inverse text-bold">* </span>需求日期</label>
+					<div class="col-sm-3">
+						<div class="input-group">
+							<input ng-model="item.delivery" type="text" class="form-control" id="endDate" 
+								placeholder="点击右侧图标选择时间" datepicker-popup="yyyy-MM-dd" is-open="item.$endDateOpen"
+								min-date="getMinDate()" ng-required="true"
+								current-text="今天" clear-text="清除" close-text="关闭"
+								datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+								ng-focus="openDatePicker($event, item.$endDateOpen)" readonly="readonly">
+							<span class="input-group-btn">
+								<button type="button" class="btn btn-default btn-sm" 
+									ng-click="openDatePicker($event, item.$endDateOpen, $index)">
+									<i class="fa fa-calendar"></i>
+								</button>
+							</span>
+						</div>
+					</div>
+				</div>
+				<div class="form-group form-group-sm">
+					<label for="remark" class="col-sm-2 control-label">备注</label>
+					<div class="col-sm-4">
+						<textarea ng-model="item.remark" class="form-control" rows="3" cols="3" id="remark" 
+							placeholder="备注" >
+						</textarea>
+					</div>
+				</div>
+				<div class="form-group form-group-sm">
+					<label for="remark" class="col-sm-2 control-label"></label>
+					<div class="col-sm-2">
+						<button class="btn btn-primary btn-sm" style="width: 100%;" ng-click="addProduct()">增加</button>
+					</div>
+					<div class="col-sm-2"><button class="btn btn-warning btn-sm" style="width: 100%;" ng-click="deleteProduct($index)" ng-if="!$first">删除</button></div>
+				</div>
+				</div>
+			</div>
+				<div class="form-group form-group-sm">
+					<div class="col-sm-2"></div>
+					<div class="col-sm-3">
+						<button class="btn btn-success btn-sm" style="width: 100%;" ng-click="save(order)" ng-disabled="orderForm.$invalid">提交</button>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>

+ 3 - 0
src/main/webapp/resources/tpl/index/purc/left.html

@@ -19,6 +19,9 @@
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="purc.order">采购订单</a></li>
 	</ul>
+	<ul class="list-unstyled">
+		<li ui-sref-active="active"><a ui-sref="purc.newOrder">新增采购订单</a></li>
+	</ul>
 </div>
 <div class="left-nav">
 	<ul class="list-unstyled">

+ 36 - 0
src/main/webapp/resources/tpl/index/purc/modal/purc_order_cust.html

@@ -0,0 +1,36 @@
+<div class="modal-body" style="min-height: 500px;">
+	<div class="headerline">
+		<span class="content"><i class="fa fa-fw fa-edit text-primary"></i>采购订单 - 选择供应商</span>
+	</div>
+	<!-- <form class="form-horizontal">
+		<div class="form-group">
+			<label class="col-md-2 col-sm-2 control-label">筛选:</label>
+			<div class="col-md-8 col-sm-8">
+				<input type="text" class="form-control input-sm" 
+					required placeholder="输入客户名称关键字查询" autofocus>
+			</div>
+		</div>
+	</form> -->
+	<table class="block table table-default table-striped table-bordered"
+		ng-table="tableParams">
+		<thead>
+			<tr class="header">
+				<th>UU</th>
+				<th>客户名称</th>
+				<th>地址</th>
+				<th>选择</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr ng-repeat="customer in $data">
+				<td class="text-center" ng-bind="::customer.myEnterprise.uu"></td>
+				<td class="text-center" ng-bind="::customer.myEnterprise.enName"></td>
+				<td class="text-center" ng-bind="::customer.myEnterprise.enAddress"></td>
+				<td class="text-center"><a title="选择" href="javascript:void(0)" ng-click="check(customer)"><i class="fa fa-check-square-o"></i></a></td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+<div class="modal-footer">
+	<button class="btn btn-default" ng-click="cancel()" type="button">取消</button>
+</div>

+ 38 - 0
src/main/webapp/resources/tpl/index/purc/modal/purc_order_custProd.html

@@ -0,0 +1,38 @@
+<div class="modal-body" style="min-height: 500px;">
+	<div class="headerline">
+		<span class="content"><i class="fa fa-fw fa-edit text-primary"></i>采购订单 - 选择客户物料</span>
+	</div>
+	<form class="form-horizontal">
+		<div class="form-group">
+			<label class="col-md-2 col-sm-2 control-label">筛选:</label>
+			<div class="col-md-8 col-sm-8">
+				<input ng-model="keyword" type="text" class="form-control input-sm" 
+					required placeholder="输入客户物料关键字查询" autofocus ng-search="onSearch()">
+			</div>
+		</div>
+	</form>
+	<table class="block table table-default table-striped table-bordered"
+		ng-table="tableParams">
+		<thead>
+			<tr class="header">
+				<th width="160px">编号</th>
+				<th width="160px">名称</th>
+				<th>规格</th>
+				<th width="80px">单位</th>
+				<th width="50px">选择</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr ng-repeat="product in $data">
+				<td class="text-center" ng-bind="::product.code"></td>
+				<td class="text-center" ng-bind="::product.title"></td>
+				<td class="text-left f12" ng-bind="::product.spec"></td>
+				<td class="text-center" ng-bind="::product.unit"></td>
+				<td class="text-center"><a title="选择" href="javascript:void(0)" ng-click="check(product)"><i class="fa fa-check-square-o"></i></a></td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+<div class="modal-footer">
+	<button class="btn btn-default" ng-click="cancel()" type="button">取消</button>
+</div>

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

@@ -208,4 +208,5 @@
 		</div>
 	</div>
 </div>
+</div>
 <!-- right static-bar End -->