Browse Source

新增我的个人产品库功能

hejq 8 years ago
parent
commit
26a38e89d0

+ 154 - 0
src/main/java/com/uas/platform/b2b/controller/ProductUsersController.java

@@ -0,0 +1,154 @@
+package com.uas.platform.b2b.controller;
+
+import com.uas.platform.b2b.model.FileUpload;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.ProductUsers;
+import com.uas.platform.b2b.search.SearchService;
+import com.uas.platform.b2b.service.ProductUsersService;
+import com.uas.platform.b2b.support.JxlsExcelView;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.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.search.b2b.model.SPage;
+import com.uas.search.b2b.model.Sort;
+import com.uas.search.b2b.util.SearchConstants;
+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.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用户个人产品库
+ *
+ * Created by hejq on 2017-11-08.
+ */
+@RequestMapping(value = "/productuser")
+@RestController
+public class ProductUsersController {
+
+    private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private ProductUsersService productUsersService;
+
+    /**
+     * 所有的物料信息(不做查询)
+     *
+     * @param params
+     * @param keyword
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET)
+    public SPage<ProductUsers> getProductInfo(PageParams params, String keyword) {
+        logger.log("查看个人物料", SystemSession.getUser().getUserName() + "查看了个人物料信息");
+        PageInfo pageInfo = new PageInfo(params);
+        return productUsersService.findProductInfoByPageInfo(pageInfo);
+    }
+
+    /**
+     * 查看自己的所有物料资料
+     */
+    @RequestMapping(value = "/info", method = RequestMethod.GET)
+    public SPage<ProductUsers> getAllProductInfo(PageParams params, String keyword) {
+        logger.log("查看个人物料", SystemSession.getUser().getUserName() + "查看了个人物料信息");
+        com.uas.search.b2b.model.PageParams pageParams = searchService.convertPageParams(params, null);
+        pageParams.getFilters().put("pu_enuu", SystemSession.getUser().getEnterprise().getUu());
+        pageParams.getFilters().put("pu_useruu", SystemSession.getUser().getUserUU());
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("pu_id", false, Sort.Type.LONG, new Long(1)));
+        pageParams.getFilters().put(SearchConstants.SORT_KEY, sortList);
+        return searchService.searchProductUsersCheckIds(keyword, pageParams);
+    }
+
+    /**
+     * 获取批量上传物料的模板
+     *
+     * @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 uploadItem
+     * @return
+     */
+    @RequestMapping(value = "/edit/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 = productUsersService.releaseByWorkbook(workbook);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        logger.log("商品批次", "[" + SystemSession.getUser().getUserName() + "]通过excel导入了物料,数量为" + map.size());
+        return map;
+    }
+
+    /**
+     * 新增物料
+     *
+     * @param prodInfo
+     * @return
+     */
+    @RequestMapping(value = "/edit/addNewProduct", method = RequestMethod.POST)
+    public ModelMap addNewProduct(@RequestBody Product prodInfo) throws Exception {
+        return productUsersService.addNewProduct(prodInfo);
+    }
+
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "/edit/delete", method = RequestMethod.POST)
+    public ModelMap deleteById(@RequestBody Long id) throws Exception {
+        ModelMap map = new ModelMap();
+        try {
+            productUsersService.deleteById(id);
+            logger.log("删除物料", "[" + SystemSession.getUser().getUserName() + "]删除了id为 [" + id + "]的物料");
+        } catch (Exception e) {
+            map.put("error", "该物料可能已经被其他单据引用,无法删除");
+        }
+        return map;
+    }
+}

+ 12 - 0
src/main/java/com/uas/platform/b2b/dao/ProductDao.java

@@ -181,6 +181,17 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
 	 */
 	public List<Product> findByEnUUAndSourceAppAndDownloadstatus(Long enuu, String app, Integer status);
 
+    /**
+     * 通过企业UU,物料名称、规格、品牌
+     *
+     * @param enUU
+     * @param titile
+     * @param spec
+     * @param brand
+     * @return
+     */
+    public List<Product> findByTitleAndSpecAndBrandAndEnUU(String title, String spec, String brand, Long enUU);
+
 	/**
 	 * 通过uu查询非标准器件进行存储
 	 * 
@@ -237,4 +248,5 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
 	@Modifying
 	@Query("update Product p set p.b2benabled = :b2benabled where p.enUU = :enUU and p.code = :code")
 	public int updateB2bEnabled(@Param("enUU") Long enUU, @Param("code") String code, @Param("b2benabled") Short b2benabled);
+
 }

+ 30 - 0
src/main/java/com/uas/platform/b2b/dao/ProductUsersDao.java

@@ -0,0 +1,30 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.ProductUsers;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Created by hejq on 2017-11-08.
+ */
+@Repository
+public interface ProductUsersDao extends JpaSpecificationExecutor<ProductUsers>, JpaRepository<ProductUsers, Long> {
+
+    /**
+     * 通过个人,企业和物料名称、规格、品牌查询个人产品是否存在
+     *
+     * @param enuu
+     * @param useruu
+     * @param title
+     * @param spec
+     * @param brand
+     * @return
+     */
+    @Query("select p from ProductUsers p where p.enuu = :enuu and p.useruu = :useruu and p.product.title = :title and p.product.spec = :spec and p.product.brand = :brand")
+    List<ProductUsers> findByEnuuAndUseruuAndTitleAndSpecAndBrand(@Param("enuu") Long enuu, @Param("useruu") Long useruu, @Param("title") String title, @Param("spec") String spec, @Param("brand") String brand);
+}

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

@@ -70,4 +70,5 @@ public interface RoleDao extends JpaRepository<Role, Long> {
 	 */
 	@Query(value = "select * from sec$roles r where r.role_desc = :description and r.isdefault = 1 and r.role_enuu is null and rownum <= 1",nativeQuery = true)
     Role findDefaultRoleByDesc(@Param("description")String desc);
+
 }

+ 108 - 0
src/main/java/com/uas/platform/b2b/model/ProductUsers.java

@@ -0,0 +1,108 @@
+package com.uas.platform.b2b.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户个人产品库
+ *
+ * Created by hejq on 2017-11-08.
+ */
+@Table(name = "product$users")
+@Entity
+public class ProductUsers implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product$users_gen")
+    @SequenceGenerator(name = "product$users_gen", sequenceName = "product$users_seq", allocationSize = 1)
+    @Column(name = "pu_id")
+    private Long id;
+
+    /**
+     * 用户uu
+     */
+    @Column(name = "pu_useruu")
+    private Long useruu;
+
+    /**
+     * 企业uu,方便统计处理
+     */
+    @Column(name = "pu_enuu")
+    private Long enuu;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "pu_prid")
+    private Long prid;
+
+    /**
+     * 产品
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "pu_prid", insertable = false, updatable = false)
+    private Product product;
+
+    /**
+     * 日期
+     */
+    @Column(name = "pu_date")
+    private Date date;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUseruu() {
+        return useruu;
+    }
+
+    public void setUseruu(Long useruu) {
+        this.useruu = useruu;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public void setEnuu(Long enuu) {
+        this.enuu = enuu;
+    }
+
+    public Long getPrid() {
+        return prid;
+    }
+
+    public void setPrid(Long prid) {
+        this.prid = prid;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+}

+ 9 - 0
src/main/java/com/uas/platform/b2b/search/SearchService.java

@@ -520,4 +520,13 @@ public interface SearchService {
 	 * @return
 	 */
 	SPage<VendorPerformanceAssess> searchVendorPerformanceAssesss(String keyword, PageParams pageParams);
+
+    /**
+     * 个人物料库
+     *
+     * @param keyword
+     * @param pageParams
+     * @return
+     */
+    SPage<ProductUsers> searchProductUsersCheckIds(String keyword, PageParams pageParams);
 }

+ 11 - 0
src/main/java/com/uas/platform/b2b/search/SearchServiceImpl.java

@@ -189,6 +189,9 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 	@Autowired
 	private VendorPerformanceAssessDao vpaDao;
 
+	@Autowired
+    private ProductUsersDao productUsersDao;
+
 	/**
 	 * 联想词size
 	 */
@@ -1369,4 +1372,12 @@ public class SearchServiceImpl implements com.uas.platform.b2b.search.SearchServ
 		sortByProperty(content, VendorPerformanceAssess.class, "id", idsPage.getContent());
 		return toSPage(idsPage, content);
 	}
+
+    @Override
+    public SPage<ProductUsers> searchProductUsersCheckIds(String keyword, PageParams pageParams) {
+        SPage<Long> idsPage = searchService.searchIds(keyword, Table_name.PRODUCT$USERS, pageParams);
+        List<ProductUsers> content = productUsersDao.findAll(idsPage.getContent());
+        sortByProperty(content, ProductUsers.class, "id", idsPage.getContent());
+        return toSPage(idsPage, content);
+    }
 }

+ 46 - 0
src/main/java/com/uas/platform/b2b/service/ProductUsersService.java

@@ -0,0 +1,46 @@
+package com.uas.platform.b2b.service;
+
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.ProductUsers;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.search.b2b.model.SPage;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.ui.ModelMap;
+
+/**
+ * Created by hejq on 2017-11-08.
+ */
+public interface ProductUsersService {
+
+    /**
+     * 通过分页信息展示所有个人的物料(不搜索)
+     *
+     * @param pageInfo
+     * @param keyword
+     * @return
+     */
+    SPage<ProductUsers> findProductInfoByPageInfo(PageInfo pageInfo);
+
+    /**
+     * 新增个人物料信息
+     *
+     * @param prodInfo
+     * @return
+     */
+    ModelMap addNewProduct(Product prodInfo);
+
+    /**
+     * 通过id解除物料绑定关系
+     *
+     * @param id
+     */
+    void deleteById(Long id);
+
+    /**
+     * 批量导入物料信息
+     *
+     * @param workbook
+     * @return
+     */
+    ModelMap releaseByWorkbook(Workbook workbook);
+}

+ 2 - 0
src/main/java/com/uas/platform/b2b/service/PurchaseOrderService.java

@@ -396,4 +396,6 @@ public interface PurchaseOrderService {
      * @param useruu
      */
     public void replyByBatch(String idString, String username, String userip, Long enuu, Long useruu);
+
+    SPage<SaleOrderForProd> findOrderItemsByPageInfo(PageInfo pageInfo, SearchFilter filter);
 }

+ 9 - 0
src/main/java/com/uas/platform/b2b/service/RoleService.java

@@ -78,4 +78,13 @@ public interface RoleService {
 	ModelMap isUser();
 
     ModelMap updateDefault(String desc, Set<ResourceItem> resourceItems);
+
+    /**
+     * 通过enUU和userUU查询角色信息
+     *
+     * @param enUU
+     * @param userUU
+     * @return
+     */
+    List<Role> findByEnUUAndUserUU(Long enUU, Long userUU);
 }

+ 296 - 0
src/main/java/com/uas/platform/b2b/service/impl/ProductUsersServiceImpl.java

@@ -0,0 +1,296 @@
+package com.uas.platform.b2b.service.impl;
+
+import com.alibaba.dubbo.common.utils.CollectionUtils;
+import com.uas.platform.b2b.dao.ProductDao;
+import com.uas.platform.b2b.dao.ProductUsersDao;
+import com.uas.platform.b2b.dao.RoleDao;
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.ProductUsers;
+import com.uas.platform.b2b.model.Role;
+import com.uas.platform.b2b.service.ProductUsersService;
+import com.uas.platform.b2b.service.RoleService;
+import com.uas.platform.b2b.support.SystemSession;
+import com.uas.platform.b2b.support.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.search.b2b.model.SPage;
+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.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.ModelMap;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by hejq on 2017-11-08.
+ */
+@Service
+public class ProductUsersServiceImpl implements ProductUsersService {
+
+    @Autowired
+    private ProductUsersDao productUsersDao;
+
+    @Autowired
+    private ProductDao productDao;
+
+    private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    @Autowired
+    private RoleService roleService;
+
+    @Override
+    public SPage<ProductUsers> findProductInfoByPageInfo(PageInfo pageInfo) {
+        Page<ProductUsers> products = findAllProudctByPageInfo(pageInfo);
+        SPage<ProductUsers> prods = new SPage<ProductUsers>();
+        prods.setContent(products.getContent());
+        prods.setPage(products.getNumber());
+        prods.setSize(products.getSize());
+        prods.setTotalElement(products.getTotalElements());
+        prods.setTotalPage(products.getTotalPages());
+        return prods;
+    }
+
+    private Page<ProductUsers> findAllProudctByPageInfo(final PageInfo pageInfo) {
+        return productUsersDao.findAll(new Specification<ProductUsers>() {
+            public Predicate toPredicate(Root<ProductUsers> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+                pageInfo.filter("enuu", SystemSession.getUser().getEnterprise().getUu());
+                pageInfo.filter("useruu", SystemSession.getUser().getUserUU());
+                query.where(pageInfo.getPredicates(root, query, builder));
+                return null;
+            }
+        }, pageInfo);
+    }
+
+    @Override
+    public ModelMap addNewProduct(Product prodInfo) {
+        ModelMap map = new ModelMap();
+        // 先查找以前的个人物料是否存在
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        Long useruu =  SystemSession.getUser().getUserUU();
+        List<ProductUsers> productUsers = productUsersDao.findByEnuuAndUseruuAndTitleAndSpecAndBrand(enuu, useruu, prodInfo.getTitle(), prodInfo.getSpec(), prodInfo.getBrand());
+        if(CollectionUtils.isEmpty(productUsers)) {// 如果不存在则进行其他操作,存在不处理
+            List<Product> productList = productDao.findByTitleAndSpecAndBrandAndEnUU(prodInfo.getTitle(), prodInfo.getSpec(), prodInfo.getBrand(), SystemSession.getUser().getEnterprise().getUu());
+            if(!CollectionUtils.isEmpty(productList)) { // 如果存在,找出其中一个进行绑定
+                ProductUsers prod = new ProductUsers();
+                prod.setDate(new Date());
+                prod.setEnuu(enuu);
+                prod.setPrid(productList.get(0).getId());
+                prod.setUseruu(useruu);
+                productUsersDao.save(prod);
+                logger.log("个人产品库增加产品", "关联:" + productList.get(0).getId());
+                map.put("success", "新增成功");
+            } else {// 不存在的话新增再绑定
+                SimpleDateFormat sdf = new SimpleDateFormat("mmsssss");
+                if(null == prodInfo.getCode()) {
+                    String code = SystemSession.getUser().getEnterprise().getUu() + sdf.format(new Date());
+                    prodInfo.setCode(code);
+                } else {
+                    List<Product> products = productDao.findByEnUUAndCode(enuu, prodInfo.getCode());
+                    String code = SystemSession.getUser().getEnterprise().getUu() + sdf.format(new Date());
+                    if(products.size() != 0) // 如果该企业下该编号的物料存在,重新赋值
+                        prodInfo.setCode(code);
+
+                }
+                List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
+                if(!CollectionUtils.isEmpty(roles)) {
+                    for(Role role : roles) {
+                        if(role.getName().equals("业务员") || role.getName().equals("销售经理")) {
+                            prodInfo.setIsSale(Constant.YES);
+                        } else  if(role.getName().equals("采购员")) {
+                            prodInfo.setIsPurchase(Constant.YES);
+                        }
+                    }
+                }
+                prodInfo.setEnUU(enuu);
+                if (null == prodInfo.getUnit())
+                    prodInfo.setUnit("PCS");
+                prodInfo.setSourceApp("B2B");
+                prodInfo.setIsPubsale(Constant.NO);
+                prodInfo.setIsShow(Constant.NO);
+                prodInfo.setStandard(Constant.NO);
+                prodInfo.setErpDate(new Date());
+                prodInfo = productDao.save(prodInfo);
+                ProductUsers prod = new ProductUsers();
+                prod.setDate(new Date());
+                prod.setEnuu(enuu);
+                prod.setPrid(prodInfo.getId());
+                prod.setUseruu(useruu);
+                productUsersDao.save(prod);
+                logger.log("个人产品库增加产品", "关联:" + prodInfo.getId());
+                map.put("success", "新增成功");
+            }
+        } else {
+            map.put("success", "新增成功");
+        }
+        return null;
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        productUsersDao.delete(id);
+    }
+
+    @Override
+    public ModelMap releaseByWorkbook(Workbook workbook) {
+        ModelMap modelMap = new ModelMap();
+        List<ProductUsers> productUsers = new ArrayList<ProductUsers>();
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        Long useruu = SystemSession.getUser().getUserUU();
+        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(0).getCellType() != Cell.CELL_TYPE_BLANK) {
+                    total++;
+                    Product product = new Product();
+                    ProductUsers prod = new ProductUsers();
+                    // 物料编号
+                    if (row.getCell(0) != null) {
+                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+                        product.setCode(row.getCell(0).getStringCellValue().trim());
+                    }
+
+                    // 物料名称
+                    if (row.getCell(1) != null) {
+                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+                        product.setTitle(row.getCell(1).getStringCellValue().trim());
+                    }
+
+                    // 原厂型号
+                    if (row.getCell(2) != null) {
+                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+                        product.setCmpCode(row.getCell(2).getStringCellValue().trim());
+                        product.setSpec(row.getCell(2).getStringCellValue().trim());
+                    }
+
+                    // 品牌
+                    if (row.getCell(3) != null) {
+                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+                        product.setBrand(row.getCell(3).getStringCellValue().trim());
+                    }
+
+                    // 单位
+                    if (row.getCell(4) != null) {
+                        row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+                        product.setUnit(row.getCell(4).getStringCellValue().trim());
+                    }
+
+                    // 最小包装量
+                    if (row.getCell(5) != null) {
+                        row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(5).getStringCellValue()
+                                && !row.getCell(5).getStringCellValue().trim().equals("")) {
+                            product.setMinPack(Double.valueOf(row.getCell(5).getStringCellValue()));
+                        }
+                    }
+                    // 最小订购量
+                    if (row.getCell(6) != null) {
+                        row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(6).getStringCellValue().trim()
+                                && !row.getCell(6).getStringCellValue().trim().equals("")) {
+                            product.setMinOrder(Double.valueOf(row.getCell(6).getStringCellValue()));
+                        }
+                    }
+                    // 交货周期
+                    if (row.getCell(7) != null) {
+                        row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(7).getStringCellValue().trim()
+                                && !row.getCell(7).getStringCellValue().trim().equals("")) {
+                            product.setLeadtime(Double.valueOf(row.getCell(7).getStringCellValue()));
+                        }
+                    }
+                    // 交货提前期
+                    if (row.getCell(8) != null) {
+                        row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(8).getStringCellValue().trim()
+                                && !row.getCell(8).getStringCellValue().trim().equals("")) {
+                            product.setLtinstock(Double.valueOf(row.getCell(8).getStringCellValue()));
+                        }
+                    }
+                    // 判断物料编号是否存在
+                    if(product.getCode() != null ) {
+                        List<Product> prods = productDao.findByEnUUAndCode(enuu, product.getCode());
+                        if(prods.size() > 0) {
+                            // 生成随机物料编码
+                            SimpleDateFormat sdf = new SimpleDateFormat("mmsssss");
+                            String code = SystemSession.getUser().getEnterprise().getUu() + sdf.format(new Date());
+                            product.setCode(code);
+                        }
+
+                    } else {
+                        // 生成随机物料编码
+                        SimpleDateFormat sdf = new SimpleDateFormat("mmsssss");
+                        String code = SystemSession.getUser().getEnterprise().getUu() + sdf.format(new Date());
+                        product.setCode(code);
+                    }
+                    List<ProductUsers> existProds = productUsersDao.findByEnuuAndUseruuAndTitleAndSpecAndBrand
+                            (enuu, useruu, product.getTitle(), product.getSpec(), product.getBrand());
+                    if(CollectionUtils.isEmpty(existProds)) {
+                        List<Product> prods = productDao.findByTitleAndSpecAndBrandAndEnUU(
+                                product.getTitle(), product.getSpec(), product.getBrand(), enuu);
+                        if (CollectionUtils.isEmpty(prods)) {
+                            // 如果物料不存在,先生成物料信息
+                            product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+                            product.setUserUU(SystemSession.getUser().getUserUU());
+                            product.setSourceApp("B2B");
+                            product.setIsPubsale(Constant.NO);
+                            product.setIsShow(Constant.NO);
+                            product.setStandard(Constant.NO);
+                            product.setErpDate(new Date());
+                            List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
+                            if(!CollectionUtils.isEmpty(roles)) {
+                                for(Role role : roles) {
+                                    if(role.getName().equals("业务员") || role.getName().equals("销售经理")) {
+                                        product.setIsSale(Constant.YES);
+                                    } else  if(role.getName().equals("采购员")) {
+                                        product.setIsPurchase(Constant.YES);
+                                    }
+                                }
+                            }
+                            product = productDao.save(product);
+                            prod.setDate(new Date());
+                            prod.setEnuu(enuu);
+                            prod.setPrid(product.getId());
+                            prod.setUseruu(useruu);
+                        } else {
+                            Product oldProd = prods.get(0);
+                            prod.setDate(new Date());
+                            prod.setEnuu(enuu);
+                            prod.setPrid(oldProd.getId());
+                            prod.setUseruu(useruu);
+                        }
+                        productUsers.add(prod);
+                    }
+                }
+            }
+            modelMap.put("total", total);
+            if (!CollectionUtils.isEmpty(productUsers)) {
+                try {
+                    productUsers = productUsersDao.save(productUsers);
+                    modelMap.put("success", productUsers.size());
+                } catch (Exception e) {
+                    modelMap.put("error", "物料添加失败");
+                }
+            } else {
+                modelMap.put("success", 0);
+            }
+        }
+        return modelMap;
+    }
+}

+ 11 - 1
src/main/java/com/uas/platform/b2b/service/impl/RoleServiceImpl.java

@@ -38,6 +38,8 @@ public class RoleServiceImpl implements RoleService {
 	@Autowired
 	private ResourceDao resourceDao;
 
+	@Autowired
+    private CommonDao commonDao;
 
 	@Override
 	public List<Role> findAll() {
@@ -132,7 +134,15 @@ public class RoleServiceImpl implements RoleService {
 		}
     }
 
-	/**
+    @Override
+    public List<Role> findByEnUUAndUserUU(Long enUU, Long userUU) {
+	    String sql = "select s.role_enuu enUU,s.role_name name,s.role_id id from sec$roles s left join sec$userrole r " +
+                "on s.role_id = r.role_id where s.role_enuu = " + enUU +" and r.user_uu = " + userUU;
+	    List<Role> roles = commonDao.query(sql, Role.class);
+        return roles;
+    }
+
+    /**
 	 * 恢复默认权限
 	 *
 	 * @param roleId

+ 172 - 2
src/main/webapp/resources/js/index/app.js

@@ -1,6 +1,6 @@
-define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token'], function () {
+define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives', 'service/Purc', 'service/Make', 'service/Fa', 'service/Account', 'service/Alert', 'service/CheckTel', 'ui.router', 'ui.bootstrap', 'file-upload', 'ngSanitize', 'service/BaseInfo', 'service/Cart', 'service/ApprovalFlow', 'service/DeputyOrder', 'service/Product', 'service/Token', 'service/ProductUsers'], function () {
     'use strict';
-    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService']);
+    var app = angular.module('myApp', ['toaster', 'angularCharts', 'ngTable', 'ui.router', 'common.services', 'common.directives', 'PurcServices', 'MakeServices', 'FaServices', 'AccountServices', 'AlertServices', 'ui.bootstrap', 'angularFileUpload', 'ngSanitize', 'CheckTelModule', 'ProductServices', 'CartServices', 'ApprvoalFlowService', 'DeputyOrderService', 'ProductInfoServices', 'TokenService', 'ProductUserService']);
     app.init = function () {
         angular.bootstrap(document, ['myApp']);
     };
@@ -722,6 +722,10 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
             url: "/product",
             templateUrl: "static/tpl/index/approvalFlow/prodList.html",
             controller: 'ProductAllCtrl'
+        }).state('approvalflow.userProduct', {
+            url: "/userProduct",
+            templateUrl: "static/tpl/index/approvalFlow/userProduct.html",
+            controller: 'UserProductCtrl'
         }).state('approvalflow.productmatches', {
             url: "/productmatches",
             templateUrl: "static/tpl/index/approvalFlow/productmatches.html",
@@ -22184,5 +22188,171 @@ define(['toaster', 'charts', 'ngTable', 'common/services', 'common/directives',
     }]);
 
 
+    /**
+     * 个人产库
+     */
+    app.controller('UserProductCtrl', ['$scope', 'prodUser', 'ngTableParams', '$filter', 'BaseService', 'toaster', '$timeout', '$modal', function ($scope, prodUser, ngTableParams, $filter, BaseService, toaster, $timeout, $modal) {
+        BaseService.scrollBackToTop();
+        $scope.searchMethod = false;
+        var getService = function () {
+            return $scope.searchMethod ? prodUser.getInfo : prodUser.info;
+        };
+
+        $scope.tableParams = new ngTableParams({ // ng-Table参数
+            page: 1,
+            count: 20,
+            sorting: {
+                'date': 'desc',
+                'id': 'desc'
+            }
+        }, {
+            total: 0,
+            counts: [],
+            getData: function ($defer, params) { // 获取数据的方法
+                $scope.loading = true;
+                var pageParams = params.url();
+                pageParams.keyword = $scope.keyword;
+                $scope.tip = $scope.keyword;
+                getService().call(null, BaseService.parseParams(pageParams), function (page) {
+                    $scope.loading = false;
+                    if (page) {
+                        params.total(page.totalElement);
+                        $defer.resolve(page.content);
+                    }
+                }, function (response) {
+                    $scope.loading = false;
+                    toaster.pop('error', '数据加载失败', response.data);
+                });
+            }
+        });
+
+        // 搜索框回车
+        $scope.onSearch = function (keyword) {
+            // 每次搜索重置获取数据方法
+            $scope.searchMethod = false;
+            if(keyword != null && keyword != '') {
+                $scope.searchMethod = true;
+            }
+            $scope.tableParams.page(1);
+            $scope.tableParams.reload();
+        };
+
+        // 新增产品信息
+        $scope.addProduct = function() {
+            $modal.open({
+                animation: true,
+                size: 'lg',
+                templateUrl: 'static/tpl/index/approvalFlow/modal/userprod_new_modal.html',
+                controller: 'UserProductNewCtrl',
+            }).result.then(function (data) {
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            }, function () {
+
+            });
+        }
+
+        // 导入商品信息
+        $scope.uploadByBatch = function () {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/tpl/index/approvalFlow/modal/uplodaByBatch.html',
+                controller: 'UserProdUploadCtrl',
+                size: 'lg',
+                resolve: {}
+            });
+
+            modalInstance.result.then(function (data) {
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            }, function () {
+
+            });
+        }
+
+        // 删除
+        $scope.deleteById = function(id) {
+            prodUser.deleteById({}, id, function(data) {
+                toaster.pop('success', '提示', '删除成功');
+                $scope.tableParams.page(1);
+                $scope.tableParams.reload();
+            }, function(res) {
+                toaster.pop('error', '提示', '删除失败');
+            });
+        }
+
+    }]);
+
+    /**
+     * 用户产品新增产品
+     */
+    app.controller('UserProductNewCtrl', ['$scope', 'toaster', 'prodUser', '$modalInstance', function($scope, toaster, prodUser, $modalInstance) {
+        // 确定
+        $scope.submit = function(prodInfo) {
+            prodUser.addProduct({}, prodInfo, function(data) {
+                toaster.pop('success', '提示', '添加成功');
+                $modalInstance.close('success');
+            }, function(res) {
+                toaster.pop('error', '提示', '添加失败');
+            });
+        }
+
+        // 取消
+        $scope.cancel = function() {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    /**
+     * 用户产品批量导入产品
+     */
+    app.controller('UserProdUploadCtrl', ['$scope', 'toaster', 'prodUser', '$modalInstance', '$upload', function($scope, toaster, prodUser, $modalInstance, $upload) {
+        // 通过excel批量上传物料
+        $scope.upload = function () {
+            $scope.loading = true;
+            if ($scope.myFiles) {
+                var file = $scope.myFiles[0];
+                if (file.name) {
+                    $upload.upload({
+                        url: 'productuser/edit/release/excel',
+                        file: file,
+                        method: 'POST'
+                    }).success(function (data) {
+                        $scope.loading = false;
+                        if (data.error) {
+                            toaster.pop('error', '提示', data.error);
+                        }
+                        $scope.result = data;
+                        $scope.success = $scope.result.success;
+                        $scope.total = $scope.result.total;
+                        $scope.myFiles[0] = "";
+                        $scope.fileName = "";
+                    }).error(function (response) {
+                        $scope.loading = false;
+                        toaster.pop('error', response.data || response);
+                    });
+                } else {
+                    $scope.loading = false;
+                    toaster.pop('info', '提示', '当前文件不存在,请重新选择');
+                }
+            } else {
+                $scope.loading = false;
+            }
+        };
+
+        // 取消
+        $scope.cancel = function() {
+            $modalInstance.dismiss();
+        }
+
+        // 下载模板
+        $scope.download = function () {
+            window.location.href = 'productuser/upload/template';
+        };
+
+        // 确定
+        $scope.enSure = function() {
+            $modalInstance.close('success');
+        }
+    }]);
     return app;
 });

+ 37 - 0
src/main/webapp/resources/js/index/services/ProductUsers.js

@@ -0,0 +1,37 @@
+/**
+ * 个人产品的接口
+ */
+define([ 'ngResource'], function() {
+    angular.module('ProductUserService', [ 'ngResource']).factory('prodUser', ['$resource', function($resource) {
+        return $resource('productuser', {}, {
+            /**
+             *  获取个人产品信息(不搜索)
+             */
+            info: {
+                url: 'productuser',
+                mehtod: 'GET'
+            },
+            /**
+             * 获取个人产品信息(搜索)
+             */
+            getInfo: {
+                url: 'productuser/info',
+                method: 'GET'
+            },
+            /**
+             * 新增个人产品
+             */
+            addProduct: {
+                url: 'productuser/edit/addNewProduct',
+                method: 'POST'
+            },
+            /**
+             * 删除个人产品(不删除产品数据)
+             */
+            deleteById: {
+                url: 'productuser/edit/delete',
+                method: 'POST'
+            }
+        })
+    }])
+});

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

@@ -10,6 +10,9 @@
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="approvalflow.product">物料信息</a></li>
 	</ul>
+    <ul class="list-unstyled">
+        <li ui-sref-active="active"><a ui-sref="approvalflow.userProduct">个人产品库</a></li>
+    </ul>
 	<ul class="list-unstyled">
 		<li ui-sref-active="active"><a ui-sref="approvalflow.user">人员信息</a></li>
 	</ul>

+ 69 - 0
src/main/webapp/resources/tpl/index/approvalFlow/modal/uplodaByBatch.html

@@ -0,0 +1,69 @@
+<style>
+.Deputy button {
+	border-radius: 0px;
+}
+
+.Deputy div {
+	margin-left: 6px;
+	padding-top: 6px;
+}
+</style>
+<div class="modal-header Deputy" style="min-height: 50px;">
+	<div class="content f16 text-bold">批量导入 
+		<a style="padding-left: 780px;" ng-click="cancel()"><i class="fa fa-close"></i></a>
+	</div>
+</div>
+<div class="modal-body Deputy" style="min-height: 200px;">
+	<div class="content f14 text-bold">第一步、下载Excel模板</div>
+	<div class="box-item">
+		<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>
+	</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="content f14 text-bold">第二步、上传已经填好的Excel文件</div>
+	<div class="box-item">
+		<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 >
+			</div>
+			<div>
+			</div>
+			<!-- 分页 Start -->
+		</form>
+	</div>
+	<div class="content f14 text-bold">第三步、信息提示</div>
+	<div class="box-item">
+		<p ng-if="result.total">
+			<span>总共上传{{result.total}}个,成功{{result.success}}个</span>
+		</p>
+	</div>
+</div>
+<div class="modal-footer Deputy">
+	<div class="text-center">
+		<button class="btn btn-success btn-sm" ng-click="enSure()" type="button">确定</button>
+		<button class="btn btn-danger btn-sm" ng-click="cancel()" type="button">取消</button>
+	</div>
+</div>
+<!-- block end -->

+ 130 - 0
src/main/webapp/resources/tpl/index/approvalFlow/modal/userprod_new_modal.html

@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8"/>
+	<title>产品导入新增</title>
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+	<meta name="Keywords" content=""/>
+	<meta name="Description" content=""/>
+	<link rel="stylesheet" href="static/css/add.css "/>
+</head>
+<body>
+<style>
+.productSpec textarea {
+	width: 276.656px;
+	height: auto;
+}
+
+.well{
+	width: 240px;
+	background: #fff;
+	border-radius: 0;
+}
+.pro-list-tab{
+    font-size: 14px;
+    margin:10px 0;
+    line-height: 34px;
+}
+.pro-list-tab .col-md-2{
+    width: 120px;
+    margin-left: 5px;
+}
+.pro-list-tab .col-md-4 input{
+    border: #bfbfbf 1px solid !important;
+    padding-left: 10px;
+    height: 34px;
+    line-height: 34px;
+    border: none;
+    position: relative;
+    font-size: 14px;
+    width: 190px;
+}
+.pro-add-tab .upload-pro{
+    min-height: 140px;
+}
+.upload-pro p{
+    width: 100%;
+    display: inline-block;
+    line-height: 20px;
+}
+</style>
+<div class="wrap">
+	<div class="content">
+		<!--产品资料新增-->
+        <form class="pro-add-tab pro-add-data clearfix" name="productInfo">
+            <div class="com_title01 sty01" style="margin-bottom: 15px;"><span>产品信息<em>*</em></span></div>
+            <div class="pro-list-tab row">
+                <div class="col-md-2">产品编号:</div>
+                <div class="col-md-4"><input type="text" ng-model="prodInfo.code" style="cursor: pointer;"></div>
+                <div class="col-md-2"><em class="text-inverse">*</em>产品名称:</div>
+                <div class="col-md-4">
+                	<input type="text"  ng-model="prodInfo.title" style="cursor: pointer;" required="true"
+                		ng-change="getSimilarKinds(prodInfo.title)" name="title" ng-focus="onFocus('title')"
+                		typeahead="kind.kindName for kind in getSimilarKinds($viewValue)"
+						autocomplete="off" typeahead-on-select="onAssociateKindClick($item, prodInfo)"
+						spellcheck="false">
+				</div>
+            </div>
+            <div class="pro-list-tab row">
+                <div class="col-md-2"><em class="text-inverse">*</em>产品型号:</div>
+                <div class="col-md-4">
+                    <input type="text"  ng-model="prodInfo.spec" style="cursor: pointer;" required="true"
+                		ng-change="getSimilarComponents(prodInfo.cmpCode)" name="title" ng-focus="onFocus('cmpCode')"
+                		typeahead="cmp.code for cmp in getSimilarComponents($viewValue)"
+						autocomplete="off" typeahead-on-select="onAssociateComponentClick($item, prodInfo)"
+						spellcheck="false">
+                </div>
+                <div class="col-md-2"><em class="text-inverse">*</em>产品品牌:</div>
+                <div class="col-md-4">
+                    <input type="text"  ng-model="prodInfo.brand" style="cursor: pointer;" required="true"
+                		ng-change="getSimilarBrands(prodInfo.brand)" name="title" ng-focus="onFocus('brand')"
+                		typeahead="brand.brandName for brand in getSimilarBrands($viewValue)"
+						autocomplete="off" typeahead-on-select="onAssociateBrandClick($item, prodInfo)"
+						spellcheck="false">
+                </div>
+            </div>
+            <div class="pro-list-tab row">
+                <div class="col-md-2">单位:</div>
+                <div class="col-md-4">
+                    <input type="text"  ng-model="prodInfo.unit" style="cursor: pointer;" list="unit">
+                    <datalist id="unit">
+                        <option value="PCS">
+                        <option value="KG">
+                        <option value="L">
+                        <option value="M">
+                    </datalist>
+                </div>
+                <div class="col-md-2">最小包装量:</div>
+                <div class="col-md-4">
+                    <input type="text" ng-model="prodInfo.minPack" style="cursor: pointer;" ng-pattern="/^\+?[1-9]\d*$/">
+                </div>
+            </div>
+            <div class="pro-list-tab row">
+                <div class="col-md-2">最小订货量:</div>
+                <div class="col-md-4">
+                    <input type="text" ng-model="prodInfo.minOrder" style="cursor: pointer;" ng-pattern="/^\+?[1-9]\d*$/">
+                </div>
+                <div class="col-md-2">交货周期:</div>
+                <div class="col-md-4">
+                    <input type="text" ng-model="prodInfo.leadtime" style="cursor: pointer;" ng-pattern="/^\+?[1-9]\d*$/">
+                </div>
+            </div>
+            <div class="many-file-btn">
+                <button class="btn01" ng-click="submit(prodInfo)" ng-disabled="productInfo.$invalid">保存</button>
+                <a ng-click="cancel()" class="btn02">取消</a>
+            </div>
+        </form>
+	</div>
+</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>
+</body>
+</html>

+ 246 - 0
src/main/webapp/resources/tpl/index/approvalFlow/userProduct.html

@@ -0,0 +1,246 @@
+<style>
+.order-table .header>th {
+	height: 40px;
+	text-align: center;
+	border-bottom: 1px solid #e8e8e8;
+}
+
+.order-table .header:hover th {
+	border: none !important;
+}
+
+.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: 60px;
+	line-height: 60px;
+	font-size: 14px;
+}
+
+.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-top: #e8e8e8 1px solid;
+}
+
+.order-table {
+	border-bottom: #e8e8e8 1px solid;
+}
+
+.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-hd {
+	border-bottom: 1px solid #e6e6e6;
+}
+
+.order-table .order-bd>td {
+	padding: 10px 5px;
+	vertical-align: top;
+	position: relative;
+}
+
+.order-table .order-bd .user.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;
+}
+
+.condition {
+	padding: 10px 0;
+}
+
+.order-hd td {
+	line-height: 25px;
+	word-break: break-word;
+	padding: 10px 5px !important;
+}
+
+.toolbar td a {
+	margin-left: 18px;
+}
+
+#public .com_title {
+	margin-bottom: 10px;
+}
+
+.order-hd td a {
+	margin: 0 8px;
+}
+
+.checkbox {
+	margin-bottom: 5px;
+}
+
+.checkbox span {
+	top: 5px;
+}
+
+.edit a.btn {
+	border: none;
+	font-size: 14px;
+	color: #5078cb;
+	line-height: 26px;
+}
+
+.edit a.btn:hover {
+	background: none;
+}
+
+#match {
+	width: 80px;
+	height: 24px;
+	line-height: 24px;
+	background: #327ebe;
+	color: #fff !important;
+	border-radius: 5px;
+	padding: 0;
+	margin-left: 15px;
+}
+#public .menu .btn-group .btn#match:hover{
+	background: #327ebe;
+    color: #fff !important;
+  }
+</style>
+<link rel="stylesheet" href="static/css/public.css">
+<div class="block" id="public">
+    <div class="loading in" ng-class="{'in': loading}">
+        <i></i>
+    </div>
+    <div class="pub-com_head">
+        <span>产品库</span>
+        <div class="p-right">
+            <a ng-click="addProduct()">新增</a>
+            <a ng-click="uploadByBatch()" title="批量导入">批量导入</a>
+        </div>
+    </div>
+    <div class="condition block" style="padding: 10px 15px;">
+        <div class="search-bg condition block"  style="padding: 20px 15px 0 15px;">
+            <div class="row">
+                <div id="topSearch" style="float: left">
+                    <span class="text-muted"><i class="fa fa-search fa-lg"></i> 搜索"",为您找到结果:</span>
+                  	  单据{{tableParams.total()}}条
+                </div>
+                <div class="col-xs-6" style="float: right;">
+                    <div class="search">
+                        <div class="form-group form-group-sm has-feedback" dropdown auto-close="outsideClick" on-toggle="searchAdvance=open">
+                            <input type="search" class="form-control input-sm" ng-model="keyword" ng-search="onSearch(keyword)" placeholder="输入物料名称、编号或规格搜索" />
+                            <a class="btn input-group-addon" ng-click="onSearch(keyword)">搜索</a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="condition block" style="padding-top: 0;">
+        <table class="order-table block " ng-table="tableParams">
+            <thead>
+            <tr class="header">
+                <th width="140">产品编号</th>
+                <th>产品名称(类目)</th>
+                <th width="160">产品型号</th>
+                <th width="140">品牌</th>
+                <th width="70">单位</th>
+                <th width ="150">操作</th>
+            </tr>
+            </thead>
+            <tbody ng-repeat="user in $data">
+            <tr class="order-hd">
+                <td class="text-center" title="{{user.product.code}}" ng-bind="::user.product.code"></td>
+                <td class="line-h20 first text-center">
+                    <div class="order-main">
+                        <span ng-bind="::user.product.title"  ng-if="user.product.standard != 1"></span>
+                        <span ng-bind="::user.product.kind" ng-if="user.product.standard == 1"></span>
+                    </div>
+                </td>
+                <td class="hover-show text-center">
+                	<span title="产品型号" ng-bind="::user.product.spec"></span>
+                </td>
+               <td class="text-center" title="{{user.product.brand}}" ng-bind="::user.product.brand" ng-if="user.product.standard != 1"></td>
+                <td class="text-center" title="{{user.product.pbranden}}" ng-bind="::user.product.pbranden" ng-if="user.product.standard == 1"></td>
+                <td class="text-center" title="单位" ng-bind="::user.product.unit"></td>
+                <td class="text-center">
+             	      <a ng-click="deleteById(user.id)">删除</a>
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+