Browse Source

Merge branch 'dev-mysql' into liusw-seekpurchase-v3.0.1.23

# Conflicts:
#	src/main/webapp/resources/css/common.css
liusw 8 years ago
parent
commit
3e895a3eab
60 changed files with 1396 additions and 640 deletions
  1. 3 0
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  2. 2 7
      src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java
  3. 12 3
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserQuestionServiceImpl.java
  4. 5 0
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java
  5. 18 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  6. 2 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  7. 31 28
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java
  8. 3 2
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  9. 50 0
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  10. 2 2
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  11. 27 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/MatchModelDao.java
  12. 21 3
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java
  13. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPersonDao.java
  14. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java
  15. 1 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  16. 102 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/MatchModel.java
  17. 166 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductReplace.java
  18. 5 3
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  19. 8 124
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPerson.java
  20. 0 117
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java
  21. 29 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  22. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java
  23. 31 46
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  24. 187 47
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  25. 56 9
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  26. 54 6
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentGoodsServiceImpl.java
  27. 1 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java
  28. 23 5
      src/main/java/com/uas/platform/b2c/prod/store/api/CommodityController.java
  29. 3 1
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java
  30. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/dao/PurchaseDao.java
  31. 1 0
      src/main/resources/dev/account.properties
  32. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  33. 1 0
      src/main/resources/prod/account.properties
  34. 1 0
      src/main/resources/test/account.properties
  35. 0 13
      src/main/webapp/resources/css/common.css
  36. 26 0
      src/main/webapp/resources/js/common/query/material.js
  37. 3 4
      src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
  38. 2 3
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_account_management_ctrl.js
  39. 178 54
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js
  40. 1 9
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialPersonCtrl.js
  41. 1 2
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js
  42. 68 51
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js
  43. 2 2
      src/main/webapp/resources/view/admin/ads/ads_brand.html
  44. 0 2
      src/main/webapp/resources/view/common/modal/delivery_rule_modal.html
  45. 1 1
      src/main/webapp/resources/view/common/sidebar.html
  46. 6 0
      src/main/webapp/resources/view/prod/modal/edit-invoice-modal.html
  47. 1 1
      src/main/webapp/resources/view/usercenter/forstore/browsing_history.html
  48. 4 3
      src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html
  49. 2 2
      src/main/webapp/resources/view/usercenter/forstore/buyer_order.html
  50. 1 1
      src/main/webapp/resources/view/usercenter/forstore/home_center.html
  51. 2 2
      src/main/webapp/resources/view/usercenter/forstore/order_detail.html
  52. 2 2
      src/main/webapp/resources/view/usercenter/forstore/order_pay.html
  53. 2 2
      src/main/webapp/resources/view/vendor/forstore/purchase_detail.html
  54. 166 61
      src/main/webapp/resources/view/vendor/forstore/vendor_material.html
  55. 14 8
      src/main/webapp/resources/view/vendor/forstore/vendor_material_person.html
  56. 2 2
      src/main/webapp/resources/view/vendor/forstore/vendor_onSale.html
  57. 2 2
      src/main/webapp/resources/view/vendor/forstore/vendor_order.html
  58. 1 1
      src/main/webapp/resources/view/vendor/forstore/vendor_undercarriage.html
  59. 51 3
      src/main/webapp/resources/view/vendor/forstore/vendor_upload.html
  60. 2 2
      src/main/webapp/resources/view/vendor/left_nav.html

+ 3 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -228,6 +228,9 @@ public class SecurityController {
 					request.setAttribute("sso_cookie_maxage", maxage);
 				}
 				SSOHelper.setSSOCookie(request, response, tk, true);
+				response.setHeader("P3P","CP='IDCDSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");
+
+				response.setHeader("P3P","CP=\"CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR\"");
 				User user = getUserByToken(tk);
 				if (user != null) {
 					if (!user.getUserPwd().equals(FlexJsonUtils.fromJson(tk.getData(), com.uas.account.entity.User.class).getPassword())){

+ 2 - 7
src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java

@@ -527,13 +527,8 @@ public class UserController {
 	 * @return
 	 */
 	@RequestMapping(value = "/getUserQuestion", method = RequestMethod.GET)
-	public List<UserQuestion> getUserQuestion() {
-		User sysUser = SystemSession.getUser();
-		HttpHeaders headers = new HttpHeaders();
-		headers.add("Content-Type", "application/json; charset=utf-8");
-		List<UserQuestion> questions = uqService.findUserQuestionByUserUUOrderBySortAsc(sysUser.getUserUU());
-		Map<String, List<UserQuestion>> result = new HashMap<String, List<UserQuestion>>();
-		result.put("questions", questions);
+	public List<UserQuestion> getUserQuestion(Long userUU) {
+		List<UserQuestion> questions = uqService.findUserQuestionByUserUUOrderBySortAsc(userUU);
 		return questions;
 	}
 

+ 12 - 3
src/main/java/com/uas/platform/b2c/common/account/service/impl/UserQuestionServiceImpl.java

@@ -1,20 +1,25 @@
 package com.uas.platform.b2c.common.account.service.impl;
 
 import com.uas.account.util.AccountUtils;
+import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.dao.UserQuestionDao;
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserQuestion;
 import com.uas.platform.b2c.common.account.service.UserQuestionService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-
 @Service
 public class UserQuestionServiceImpl implements UserQuestionService {
 
     @Autowired
     private UserQuestionDao userQuestionDao;
 
+    @Autowired
+    private UserDao userDao;
+
     @Override
     public UserQuestion save(UserQuestion userQuestion){
         postToAccountCenter(userQuestion);
@@ -23,7 +28,11 @@ public class UserQuestionServiceImpl implements UserQuestionService {
 
     @Override
     public List<UserQuestion> findUserQuestionByUserUUOrderBySortAsc(Long userUU) {
-        return userQuestionDao.findUserQuestionByUserUUOrderBySortAsc(userUU);
+        User user = userDao.findOne(userUU);
+        if (user == null) {
+            throw new IllegalOperatorException("找不到用户...");
+        }
+        return userQuestionDao.findUserQuestionByUserUUOrderBySortAsc(user.getUserUU());
     }
 
     private void postToAccountCenter(UserQuestion question) {

+ 5 - 0
src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java

@@ -104,6 +104,11 @@ public class SearchUrl {
      */
     public static final String GOODIS_URL= "/search/goodsIds?keyword={keyword}&params={params}";
 
+    /**
+     * 搜索库存信息(类目)
+     */
+    public static final String GOODIS_URL_KIND= "/search/goodsIds?params={params}";
+
 
     /**
      * 搜索库存

+ 18 - 0
src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java

@@ -363,6 +363,24 @@ public class SearchServiceImpl implements SearchService{
         }
     }
 
+    @Override
+    public Map<String, Object> getGoodsIdsForKinds(PageParams var2) throws SearchException {
+        Map<String, Object> map = new HashedMap();
+        map.put("params", FlexJsonUtils.toJsonDeep(var2));
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.GOODIS_URL_KIND, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        }else {
+            try {
+                Map<String, Object> reMap = FastjsonUtils.fromJson(str, Map.class);
+                return reMap;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
+
     @Override
     public List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters) {
         Map<String, Object> map = new HashedMap();

+ 2 - 0
src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java

@@ -49,5 +49,7 @@ public interface SearchService {
 
     Map<String, Object> getGoodsIds(String keyword, PageParams var2) throws SearchException;
 
+    Map<String, Object> getGoodsIdsForKinds(PageParams var2) throws SearchException;
+
     List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters);
 }

+ 31 - 28
src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java

@@ -106,43 +106,46 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
                     Double b2cReserve = goodsDao.getSumReserveByEnUUAndUuidAndStatus(enuu, products.get(0).getCmpUuId(), Status.AVAILABLE.value());
                     b2cReserve = b2cReserve == null ? 0 : b2cReserve;
                     Double erpReserve = productDetailERP.getReserve();
-                    if (Double.compare(b2cReserve, erpReserve) > 0) {// 如果商城已上架数量大于erp空闲库存,下架部分在售商品
-                        BigDecimal b2cDecimal = BigDecimal.valueOf(b2cReserve);
-                        BigDecimal erpDecimal = BigDecimal.valueOf(erpReserve);
-                        BigDecimal subtractDecimal = b2cDecimal.subtract(erpDecimal);// 商城已上架数量、erp库存差值
-                        List<Goods> goods = goodsDao.findByEnUUAndUuidOrderByReserveAsc(enuu, products.get(0).getCmpUuId());// 获取该企业此物料上架商品信息(按库存从小到大排序)
-                        if (!CollectionUtils.isEmpty(goods)) {
-                            for (Goods good : goods) {
-                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) == 0) {// 差值等于此批次数量,直接下架此批次
-                                    goodsService.offShelfGoodsByProvider(good.getBatchCode());
-                                    break;
-                                }
-
-                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) < 0) {// 差值小于此批次数量,下架部分库存
-                                    Goods nowGood = goodsDao.findOne(good.getId());
-                                    good.setReserve(BigDecimal.valueOf(good.getReserve()).subtract(subtractDecimal).doubleValue());
-                                    good.setSelfSale(sysConf.getStoreid().equals(good.getStoreid())? IntegerConstant.B2C_SALE.toString() : IntegerConstant.SELF_SALE.toString());// 设置自营寄售
-                                    loggerInfo.info(SystemSession.getUser().getEnterprise().getEnName() + "更新库存: " + products.get(0).getProdNum() + ",self is" + good.getSelfSale());
-                                    // 如果调整后的库存小于最小起订量直接下架
-                                    if (good.getReserve() < good.getMinBuyQty()) {
+                    if (null != erpReserve) {
+                        if (Double.compare(b2cReserve, erpReserve) > 0) {// 如果商城已上架数量大于erp空闲库存,下架部分在售商品
+                            BigDecimal b2cDecimal = BigDecimal.valueOf(b2cReserve);
+                            BigDecimal erpDecimal = BigDecimal.valueOf(erpReserve);
+                            BigDecimal subtractDecimal = b2cDecimal.subtract(erpDecimal);// 商城已上架数量、erp库存差值
+                            List<Goods> goods = goodsDao.findByEnUUAndUuidOrderByReserveAsc(enuu, products.get(0).getCmpUuId());// 获取该企业此物料上架商品信息(按库存从小到大排序)
+                            if (!CollectionUtils.isEmpty(goods)) {
+                                for (Goods good : goods) {
+                                    if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) == 0) {// 差值等于此批次数量,直接下架此批次
                                         goodsService.offShelfGoodsByProvider(good.getBatchCode());
-                                    } else {
-                                        goodsService.updateGoods(nowGood, good);
-                                        goodsService.updateComponentTradeInfos(nowGood.getUuid());
+                                        break;
+                                    }
+
+                                    if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) < 0) {// 差值小于此批次数量,下架部分库存
+                                        Goods nowGood = goodsDao.findOne(good.getId());
+                                        good.setReserve(BigDecimal.valueOf(good.getReserve()).subtract(subtractDecimal).doubleValue());
+                                        good.setSelfSale(sysConf.getStoreid().equals(good.getStoreid())? IntegerConstant.B2C_SALE.toString() : IntegerConstant.SELF_SALE.toString());// 设置自营寄售
+                                        loggerInfo.info(SystemSession.getUser().getEnterprise().getEnName() + "更新库存: " + products.get(0).getProdNum() + ",self is" + good.getSelfSale());
+                                        // 如果调整后的库存小于最小起订量直接下架
+                                        if (good.getReserve() < good.getMinBuyQty()) {
+                                            goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                        } else {
+                                            goodsService.updateGoods(nowGood, good);
+                                            goodsService.updateComponentTradeInfos(nowGood.getUuid());
+                                        }
+                                        break;
                                     }
-                                    break;
-                                }
 
-                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) > 0) {// 差值大于此批次数量,下架次批次,并继续下一批次调整
-                                    goodsService.offShelfGoodsByProvider(good.getBatchCode());
-                                    subtractDecimal = subtractDecimal.subtract(BigDecimal.valueOf(good.getReserve()));
+                                    if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) > 0) {// 差值大于此批次数量,下架次批次,并继续下一批次调整
+                                        goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                        subtractDecimal = subtractDecimal.subtract(BigDecimal.valueOf(good.getReserve()));
+                                    }
                                 }
                             }
                         }
                     }
+
                 }
 
-                products.get(0).setErpReserve(productDetailERP.getReserve());
+                products.get(0).setErpReserve(productDetailERP.getReserve() == null ? 0 : productDetailERP.getReserve());
                 products.get(0).setProduceDate(productDetailERP.getProduceDate());
                 products.get(0).setPrice(productDetailERP.getPrice());
                 productList.add(products.get(0));

+ 3 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java

@@ -6,7 +6,7 @@ package com.uas.platform.b2c.prod.commodity.constant;
  * @author hulh
  */
 public enum  ErrorInfoConstant {
-    REPEAT_INFO("产品库已存在产品"),
+    REPEAT_INFO("产品库已存在相同的产品"),
     CODE_PATTERN_INFO("A列:请勿输入中文或中文特殊字符"),
     CODE_LENGTH_INFO("A列:产品型号不能超过100字符"),
     CODE_EMPTY_INFO("A列:产品型号不能为空"),
@@ -22,7 +22,8 @@ public enum  ErrorInfoConstant {
     DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
     DELIVERY_VALUE_INFO("G-H列:交期只能填写1-31之间的整数值"),
     PRICE_INFO("K列:单价必须是小于1万的正数"),
-    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符");
+    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符"),
+    REPEAT_IN_EXCEL("表格中已存在相同的产品");
 
     /**
      * 错误提示

+ 50 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.prod.commodity.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.core.constant.SplitChar;
+import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
 import com.uas.platform.b2c.prod.commodity.model.*;
@@ -89,6 +90,17 @@ public class ProductController {
 		return productService.getAllProductsByPerson(info, keyword, type);
 	}
 
+	/**
+	 * 根据ids绑定至个人产品库
+	 * @param ids
+	 * @param isAll 是否将该企业下的所有添加至个人下
+	 */
+	@RequestMapping(value = "/person", method = RequestMethod.POST)
+	ResultMap setAllProductsByPerson(@RequestBody String ids, Integer isAll, Integer isStardand) {
+		productService.setAllProductsByProductIds(ids,isAll,isStardand);
+		return ResultMap.success("success");
+	}
+
     /**
      * 批量导出产品表
      *
@@ -127,6 +139,21 @@ public class ProductController {
 		return modelAndView;
 	}
 
+	/**
+	 * 根据选中的id列表导出数据
+	 *
+	 * @param idList	id列表
+	 * @return
+	 */
+	@RequestMapping(value = "/template/selected/data", method = RequestMethod.GET)
+	public ModelAndView exportSelectedProduct(String idList) {
+		ModelAndView modelAndView = new ModelAndView();
+		List<Goods> productsGoods = productService.getSelectedProducts(idList);
+		modelAndView.addObject("data", productsGoods);
+		modelAndView.addObject("goodsService", goodsService);
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/products", "优软商城--产品库列表"));
+		return modelAndView;
+	}
 
     /**
      * 批量删除产品
@@ -253,6 +280,29 @@ public class ProductController {
 		return productService.matchNonStandardProduct();
 	}
 
+	/**
+	 * 匹配选中的列表
+	 * @param idList
+	 * @return
+	 */
+	@RequestMapping(value = "/match/selected", method = RequestMethod.POST)
+	public ResultMap matchSelected(@RequestBody List<Long> idList) {
+		Long enuu = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
+		logger.info("选中的产品进行匹配,enuu " + enuu);
+		return productService.matchSelected(idList);
+	}
+
+	/**
+	 * 根据批次号获取未匹配成功的非标数据
+	 * @param batch
+	 * @return
+	 */
+	@RequestMapping(value = "/match/batch", method = RequestMethod.GET)
+	public List<Product> getDataByBatch(String batch) {
+		logger.info("获取指定批次的非标数据,批次 " + batch);
+		return productService.getDataByBatch(batch);
+	}
+
 	/**
 	 * 保存匹配的信息,非标上架版本
 	 * @param json

+ 2 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java

@@ -203,7 +203,7 @@ public class ReleaseProductByBatchController {
      * @return model map
      */
     @RequestMapping(value = "/release/excel", method = RequestMethod.POST)
-    public ModelMap releaseByExcel(FileUpload uploadItem, @RequestParam("selfSale") Boolean selfSale, String currency, Integer isPerson) {
+    public ModelMap releaseByExcel(FileUpload uploadItem, @RequestParam("selfSale") Boolean selfSale, String currency, Integer isPerson, Integer repeatImport) {
         ModelMap map = new ModelMap();
         String fileName = uploadItem.getFile().getOriginalFilename();
         String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
@@ -218,7 +218,7 @@ public class ReleaseProductByBatchController {
             } else {
                 throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
             }
-            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson);
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson, repeatImport);
         } catch (IOException e) {
             e.printStackTrace();
         }

+ 27 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/MatchModelDao.java

@@ -0,0 +1,27 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.MatchModel;
+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;
+
+/**
+ * 匹配结果类操作层
+ * @author hulh
+ */
+@Repository
+public interface MatchModelDao extends JpaRepository<MatchModel, Long>, JpaSpecificationExecutor<MatchModel> {
+
+    /**
+     * 根据以下信息获取产品id列表
+     * @param batch
+     * @param standard
+     * @return
+     */
+    @Query(value = "select productId from MatchModel where batch = :batch and standard = :standard")
+    List<Long> findNonProductByBatch(@Param("batch") String batch, @Param("standard") Short standard);
+}

+ 21 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java

@@ -55,7 +55,7 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * @return count by enuu and status
      */
     @Query(value = "select count(1) from products p left join product$private pp on pp.pr_id = p.pr_id where " +
-            "p.pr_enuu=:enuu and p.pr_standard = :standard and pp.pr_b2cenabled = :enabled", nativeQuery = true)
+            "p.pr_enuu=:enuu and p.pr_pcmpcode is not null and p.pr_pbranden is not null and p.pr_standard = :standard and pp.pr_b2cenabled = :enabled", nativeQuery = true)
     Integer getCountByEnuuAndStatusAndEnabled(@Param("enuu") Long enuu, @Param("standard") Short standard, @Param("enabled") Integer enabled);
 
     /**
@@ -137,8 +137,9 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * @param standard 是否是标准的信息
      * @return 返回所属该公司的产品信息
      */
-    @Query(value = "select p from Product p where p.enUU = :enuu and p.standard = :standard")
-    List<Product> findProductByEnuuAndStandard(@Param("enuu") Long enuu, @Param("standard") Integer standard);
+    @Query(value = "select p.* from products p left join product$private pp on pp.pr_id = p.pr_id where " +
+            "p.pr_enuu=:enuu and p.pr_pcmpcode is not null and p.pr_pbranden is not null and p.pr_standard = :standard and pp.pr_b2cenabled = :enabled", nativeQuery = true)
+    List<Product> findProductByEnuuAndStandardAndEnabled(@Param("enuu") Long enuu, @Param("standard") Integer standard, @Param("enabled") Integer enabled);
 
 
     /**
@@ -160,4 +161,21 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Query(value = "select p from Product p where p.id in (:ids) order by p.id desc")
     List<Product> findProductInIds(@Param("ids") List<Long> ids);
 
+    /**
+     * 获取指定id列表的产品
+     * @param idList
+     * @return
+     */
+    @Query(value = "select p from Product p where id in :idList")
+    List<Product> findProductInId(@Param("idList") List<Long> idList);
+
+    /**
+     * 根据enuu查询所有的prids
+     * @param enuu
+     * @return
+     */
+    @Query(value = "select p.id from Product p where p.enUU = :enuu and p.standard = :standard")
+    List<Long> findPridsByEnuuAndStardand(@Param("enuu") Long enuu, @Param("standard") Integer standard);
+
+
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPersonDao.java

@@ -17,7 +17,7 @@ public interface V_ProductPersonDao extends JpaRepository<V_ProductPerson, V_Pro
      * @param standard the standard 标准状态
      * @return count by enuu and status
      */
-    @Query(value = "select count(1) from v$person$product where pr_enuu =:enuu and user_uu = :userUU and pr_standard =:standard and pr_b2cenabled =:enabled", nativeQuery = true)
+    @Query(value = "select count(1) from v$person$product where pr_enuu =:enuu and pr_pcmpcode is not null and pr_pbranden is not null and user_uu = :userUU and pr_standard =:standard and pr_b2cenabled =:enabled", nativeQuery = true)
     Integer getCountByEnuuAndUserUUAndStatusAndEnabled(@Param("enuu") Long enuu, @Param("userUU") Long userUU, @Param("standard") Short standard, @Param("enabled") Integer enabled);
 
 }

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java

@@ -24,4 +24,12 @@ public interface V_ProductPrivateDao extends JpaRepository<V_ProductPrivate, Lon
     @Query(value = "select p from V_ProductPrivate p where p.pcmpcode=:pcmpcode and p.pbranden=:pbranden and p.enUU=:enUU and p.standard=:standard and p.b2cEnabled=:enabled")
     List<V_ProductPrivate> findProductByPcmpcodeAndPbrandenAndEnUUAndStandard(@Param("pcmpcode") String pcmpcode, @Param("pbranden") String pbranden,
                                                                               @Param("enUU") Long enUU, @Param("standard") Integer standard, @Param("enabled") Integer enabled);
+
+    /**
+     * 获取指定id列表的产品
+     * @param idList
+     * @return
+     */
+    @Query(value = "select p from V_ProductPrivate p where id in :idList")
+    List<V_ProductPrivate> findProductInId(@Param("idList") List<Long> idList);
 }

+ 1 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -1572,6 +1572,7 @@ public class Goods implements Serializable {
 		g.setCode(product.getPcmpcode());
 		g.setEncapsulation(product.getEncapsulation());
 		g.setPackaging(product.getPackaging());
+		g.setProduceDate(product.getProduceDate());
 		g.setUuid(product.getCmpUuId());
 		return g;
 	}

+ 102 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/MatchModel.java

@@ -0,0 +1,102 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 记录勾选匹配的id
+ * @author hulh
+ */
+@Entity
+@Table(name = "product$match")
+public class MatchModel {
+
+    /**
+     * 主键
+     */
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * 批次号,唯一标识
+     */
+    @Column(name = "ma_batch")
+    private String batch;
+
+    /**
+     * uu
+     */
+    @Column(name = "ma_useruu")
+    private Long useruu;
+
+    /**
+     * 企业enuu
+     */
+    @Column(name = "ma_enuu")
+    private Long enuu;
+
+    /**
+     * 对应的产品id
+     */
+    @Column(name = "ma_product_id")
+    private Long productId;
+
+    /**
+     * 匹配后结果
+     */
+    @Column(name = "ma_standard")
+    private Short standard;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getBatch() {
+        return batch;
+    }
+
+    public void setBatch(String batch) {
+        this.batch = batch;
+    }
+
+    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 getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public Short getStandard() {
+        return standard;
+    }
+
+    public void setStandard(Short standard) {
+        this.standard = standard;
+    }
+}

+ 166 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductReplace.java

@@ -0,0 +1,166 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 存贮商城替代物料
+ */
+@Entity
+@Table(name = "product$replace")
+public class ProductReplace {
+
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * 用户uu
+     */
+    @Column(name = "ptr_useruu")
+    private Long userUU;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "ptr_prid")
+    private Long productId;
+
+    /**
+     * 原型号型号
+     */
+    @Column(name = "p_cmpcode" ,length = 800)
+    private String pCmpcode;
+
+    /**
+     * 原品牌品牌
+     */
+    @Column(name = "p_pbranden")
+    private String pBranden;
+
+    /**
+     * 可替代型号
+     */
+    @Column(name = "ptr_cmpcode" ,length = 800)
+    private String ptrCmpcode;
+
+    /**
+     * 可替代品牌
+     */
+    @Column(name = "ptr_pbranden")
+    private String ptrBranden;
+
+    /**
+     * UUID 标准料号
+     * @return
+     */
+    @Column(name = "ptr_cmpuuid")
+    private String ptrCmpUuId;
+
+    /**
+     * 可替代品牌(uuid)
+     */
+    @Column(name = "ptr_pbranduuid")
+    private String ptrBrandUuid;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "ptr_createtime")
+    private Date time;
+
+    /**
+     * 序号
+     */
+    @Column(name = "ptr_detno")
+    private Short detno;
+
+    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 getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public String getpCmpcode() {
+        return pCmpcode;
+    }
+
+    public void setpCmpcode(String pCmpcode) {
+        this.pCmpcode = pCmpcode;
+    }
+
+    public String getpBranden() {
+        return pBranden;
+    }
+
+    public void setpBranden(String pBranden) {
+        this.pBranden = pBranden;
+    }
+
+    public String getPtrCmpcode() {
+        return ptrCmpcode;
+    }
+
+    public void setPtrCmpcode(String ptrCmpcode) {
+        this.ptrCmpcode = ptrCmpcode;
+    }
+
+    public String getPtrBranden() {
+        return ptrBranden;
+    }
+
+    public void setPtrBranden(String ptrBranden) {
+        this.ptrBranden = ptrBranden;
+    }
+
+    public String getPtrCmpUuId() {
+        return ptrCmpUuId;
+    }
+
+    public void setPtrCmpUuId(String ptrCmpUuId) {
+        this.ptrCmpUuId = ptrCmpUuId;
+    }
+
+    public String getPtrBrandUuid() {
+        return ptrBrandUuid;
+    }
+
+    public void setPtrBrandUuid(String ptrBrandUuid) {
+        this.ptrBrandUuid = ptrBrandUuid;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    public Short getDetno() {
+        return detno;
+    }
+
+    public void setDetno(Short detno) {
+        this.detno = detno;
+    }
+}

+ 5 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -473,6 +473,8 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_storename")
 	private String storeName;
 
+//	private Short repeat;
+
 	@Override
 	public boolean equals(Object o) {
 		if (this == o) return true;
@@ -487,9 +489,9 @@ public class ReleaseProductByBatch implements Serializable {
 		if (!minPackageStr.equals(that.minPackageStr)) return false;
 		if (!packaging.equals(that.packaging)) return false;
 		if (!selfMaxDeliveryStr.equals(that.selfMaxDeliveryStr)) return false;
-		if (!selfMinDeliveryStr.equals(that.selfMinDeliveryStr)) return false;
-		return GoodsUtil.compareWithQtyPrice(prices, that.getPrices(), that.getCurrency());
-
+//		if (!selfMinDeliveryStr.equals(that.selfMinDeliveryStr)) return false;
+//		return GoodsUtil.compareWithQtyPrice(prices, that.getPrices(), that.getCurrency());
+		return selfMinDeliveryStr.equals(that.selfMinDeliveryStr);
 	}
 
 	public void setBrandEnByExcel(Object value) {

+ 8 - 124
src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPerson.java

@@ -66,12 +66,6 @@ public class V_ProductPerson implements Serializable{
     @Column(name = "pr_minpack")
     private Double minPackQty;
 
-    /**
-     * 库存数 erp的库存数
-     */
-    @Column(name = "pr_stock")
-    private Double stock;
-
     /**
      * ERP空闲库存
      */
@@ -189,22 +183,6 @@ public class V_ProductPerson implements Serializable{
     @Column(name = "pr_standard")
     private Integer standard;
 
-    /**
-     * 对应Goods是否已在售
-     * 1.YES<br>
-     * 0.NO
-     */
-    @Column(name = "pr_sold")
-    private Integer sold;
-
-    /**
-     * 是否可上架,是否有对应的Good信息
-     * 1.YES<br>
-     * 0.NO
-     */
-    @Column(name = "pr_can_sell")
-    private Integer canSell;
-
     /**
      * 匹配状态(记录匹配状态,方便下次查看)
      * 111 匹配成功 ->变为标准
@@ -243,36 +221,6 @@ public class V_ProductPerson implements Serializable{
     @Column(name = "pr_manufacturedate")
     private String produceDate;
 
-    /**
-     * 企业的币别信息
-     */
-    @Column(name = "pr_currency")
-    private String currency;
-
-    /**
-     * 在售数量
-     */
-    @Column(name = "pro_onsale")
-    private Double onSaleQty;
-
-    /**
-     * 锁库数
-     */
-    @Column(name = "pr_lockqty")
-    private Double lockQty;
-
-    /**
-     * 可上架数量
-     */
-    @Column(name = "pr_availableonsale")
-    private Double availableOnSale;
-
-    /**
-     * 仓库数量
-     */
-    @Column(name = "pr_repositoryqty")
-    private Double repositoryQty;
-
     /**
      * 器件的图片
      */
@@ -325,6 +273,14 @@ public class V_ProductPerson implements Serializable{
     @Column(name = "user_uu")
     private Long ppUserUU;
 
+    public Long getPpId() {
+        return ppId;
+    }
+
+    public void setPpId(Long ppId) {
+        this.ppId = ppId;
+    }
+
     public Long getId() {
         return id;
     }
@@ -381,14 +337,6 @@ public class V_ProductPerson implements Serializable{
         this.minPackQty = minPackQty;
     }
 
-    public Double getStock() {
-        return stock;
-    }
-
-    public void setStock(Double stock) {
-        this.stock = stock;
-    }
-
     public Double getErpReserve() {
         return erpReserve;
     }
@@ -533,22 +481,6 @@ public class V_ProductPerson implements Serializable{
         this.standard = standard;
     }
 
-    public Integer getSold() {
-        return sold;
-    }
-
-    public void setSold(Integer sold) {
-        this.sold = sold;
-    }
-
-    public Integer getCanSell() {
-        return canSell;
-    }
-
-    public void setCanSell(Integer canSell) {
-        this.canSell = canSell;
-    }
-
     public Integer getMatchstatus() {
         return matchstatus;
     }
@@ -597,46 +529,6 @@ public class V_ProductPerson implements Serializable{
         this.produceDate = produceDate;
     }
 
-    public String getCurrency() {
-        return currency;
-    }
-
-    public void setCurrency(String currency) {
-        this.currency = currency;
-    }
-
-    public Double getOnSaleQty() {
-        return onSaleQty;
-    }
-
-    public void setOnSaleQty(Double onSaleQty) {
-        this.onSaleQty = onSaleQty;
-    }
-
-    public Double getLockQty() {
-        return lockQty;
-    }
-
-    public void setLockQty(Double lockQty) {
-        this.lockQty = lockQty;
-    }
-
-    public Double getAvailableOnSale() {
-        return availableOnSale;
-    }
-
-    public void setAvailableOnSale(Double availableOnSale) {
-        this.availableOnSale = availableOnSale;
-    }
-
-    public Double getRepositoryQty() {
-        return repositoryQty;
-    }
-
-    public void setRepositoryQty(Double repositoryQty) {
-        this.repositoryQty = repositoryQty;
-    }
-
     public String getCmpImg() {
         return cmpImg;
     }
@@ -700,12 +592,4 @@ public class V_ProductPerson implements Serializable{
     public void setPpUserUU(Long ppUserUU) {
         this.ppUserUU = ppUserUU;
     }
-
-    public Long getPpId() {
-        return ppId;
-    }
-
-    public void setPpId(Long ppId) {
-        this.ppId = ppId;
-    }
 }

+ 0 - 117
src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java

@@ -59,12 +59,6 @@ public class V_ProductPrivate implements Serializable {
     @Column(name = "pr_minpack")
     private Double minPackQty;
 
-    /**
-     * 库存数 erp的库存数
-     */
-    @Column(name = "pr_stock")
-    private Double stock;
-
     /**
      * ERP空闲库存
      */
@@ -182,22 +176,6 @@ public class V_ProductPrivate implements Serializable {
     @Column(name = "pr_standard")
     private Integer standard;
 
-    /**
-     * 对应Goods是否已在售
-     * 1.YES<br>
-     * 0.NO
-     */
-    @Column(name = "pr_sold")
-    private Integer sold;
-
-    /**
-     * 是否可上架,是否有对应的Good信息
-     * 1.YES<br>
-     * 0.NO
-     */
-    @Column(name = "pr_can_sell")
-    private Integer canSell;
-
     /**
      * 匹配状态(记录匹配状态,方便下次查看)
      * 111 匹配成功 ->变为标准
@@ -236,36 +214,6 @@ public class V_ProductPrivate implements Serializable {
     @Column(name = "pr_manufacturedate")
     private String produceDate;
 
-    /**
-     * 企业的币别信息
-     */
-    @Column(name = "pr_currency")
-    private String currency;
-
-    /**
-     * 在售数量
-     */
-    @Column(name = "pro_onsale")
-    private Double onSaleQty;
-
-    /**
-     * 锁库数
-     */
-    @Column(name = "pr_lockqty")
-    private Double lockQty;
-
-    /**
-     * 可上架数量
-     */
-    @Column(name = "pr_availableonsale")
-    private Double availableOnSale;
-
-    /**
-     * 仓库数量
-     */
-    @Column(name = "pr_repositoryqty")
-    private Double repositoryQty;
-
     /**
      * 器件的图片
      */
@@ -312,7 +260,6 @@ public class V_ProductPrivate implements Serializable {
     @Column(name = "pr_batchcount")
     private Integer batchCount;
 
-
     public Long getId() {
         return id;
     }
@@ -369,14 +316,6 @@ public class V_ProductPrivate implements Serializable {
         this.minPackQty = minPackQty;
     }
 
-    public Double getStock() {
-        return stock;
-    }
-
-    public void setStock(Double stock) {
-        this.stock = stock;
-    }
-
     public Double getErpReserve() {
         return erpReserve;
     }
@@ -521,22 +460,6 @@ public class V_ProductPrivate implements Serializable {
         this.standard = standard;
     }
 
-    public Integer getSold() {
-        return sold;
-    }
-
-    public void setSold(Integer sold) {
-        this.sold = sold;
-    }
-
-    public Integer getCanSell() {
-        return canSell;
-    }
-
-    public void setCanSell(Integer canSell) {
-        this.canSell = canSell;
-    }
-
     public Integer getMatchstatus() {
         return matchstatus;
     }
@@ -585,46 +508,6 @@ public class V_ProductPrivate implements Serializable {
         this.produceDate = produceDate;
     }
 
-    public String getCurrency() {
-        return currency;
-    }
-
-    public void setCurrency(String currency) {
-        this.currency = currency;
-    }
-
-    public Double getOnSaleQty() {
-        return onSaleQty;
-    }
-
-    public void setOnSaleQty(Double onSaleQty) {
-        this.onSaleQty = onSaleQty;
-    }
-
-    public Double getLockQty() {
-        return lockQty;
-    }
-
-    public void setLockQty(Double lockQty) {
-        this.lockQty = lockQty;
-    }
-
-    public Double getAvailableOnSale() {
-        return availableOnSale;
-    }
-
-    public void setAvailableOnSale(Double availableOnSale) {
-        this.availableOnSale = availableOnSale;
-    }
-
-    public Double getRepositoryQty() {
-        return repositoryQty;
-    }
-
-    public void setRepositoryQty(Double repositoryQty) {
-        this.repositoryQty = repositoryQty;
-    }
-
     public String getCmpImg() {
         return cmpImg;
     }

+ 29 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -36,6 +36,13 @@ public interface ProductService {
      */
     Page<V_ProductPerson> getAllProductsByPerson(PageInfo page, String keyword, String type);
 
+    /**
+     * 绑定至个人产品库
+     * @return all products
+     */
+    boolean setAllProductsByProductIds(String ids, Integer isAll, Integer isStardand);
+
+
     /**
      * 下载产品资料
      *
@@ -45,6 +52,14 @@ public interface ProductService {
      */
     List<Goods> getProductsGoods(String type, String keyword);
 
+    /**
+     * 根据id字符串获取对应的产品列表
+     *
+     * @param idList
+     * @return  List<Goods>
+     */
+    List<Goods> getSelectedProducts(String idList);
+
     /**
      * 批量删除产品
      *
@@ -140,6 +155,20 @@ public interface ProductService {
      */
     ResultMap matchNonStandardProduct();
 
+    /**
+     * 匹配选中的列表
+     * @param idList
+     * @return
+     */
+    ResultMap matchSelected(List<Long> idList);
+
+    /**
+     * 获取该批次的非标数据
+     * @param batch 批次号
+     * @return
+     */
+    List<Product> getDataByBatch(String batch);
+
     /**
      * 保存匹配信息
      * @param json

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java

@@ -33,7 +33,7 @@ public interface ReleaseProductByBatchService {
      * @param currency
      * @return model map
      */
-    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson);
+    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport);
 
     /**
      * 根据发布者UU获取一组产品的信息

+ 31 - 46
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java

@@ -724,7 +724,7 @@ public class GoodsServiceImpl implements GoodsService {
         goodsHistoryDao.save(goodsHistory);
         // TODO huxz 添加或修改商品价格信息
         if (goods.getUuid() != null) {
-            saveOrUpdatePriceInfos(goods, deviceInfo);
+//            saveOrUpdatePriceInfos(goods, deviceInfo);
             updateComponentTradeInfos(goods.getUuid());
         }
         return backGoods;
@@ -2928,16 +2928,18 @@ public class GoodsServiceImpl implements GoodsService {
         orderService.save(orders);
 
         Boolean aBoolean = floorsService.updateHomeInfo(goods.getBatchCode());
-        //先做下架记录
-        goods.setStatus(Status.REMOVED.value());
-        GoodsHistory goodsHistoryRemoved = goodsHistoryService.converTGoodsHist(goods, OperateType.Down.getPhrase());
+        List<GoodsHistory> histories = new ArrayList<>();
+        if (goods.getStatus().equals(Status.AVAILABLE.value()) || goods.getStatus().equals(Status.UNAVAILABLE.value())) {
+            //先做下架记录
+            goods.setStatus(Status.REMOVED.value());
+            GoodsHistory goodsHistoryRemoved = goodsHistoryService.converTGoodsHist(goods, OperateType.Down.getPhrase());
+            histories.add(goodsHistoryRemoved);
+        }
 
         goods.setStatus(Status.GOODS_DELETE.value());
         //删除库存信息
         GoodsHistory goodsHistoryDelete = goodsHistoryService.converTGoodsHist(goods, OperateType.DELETE.getPhrase());
-        List<GoodsHistory> histories = new ArrayList<>();
-        histories.add(goodsHistoryRemoved);
-        histories.add(goodsHistoryRemoved);
+        histories.add(goodsHistoryDelete);
         goodsHistoryService.save(histories);
 
         goodsDao.deleteByBatchCode(goods.getBatchCode());
@@ -2999,12 +3001,14 @@ public class GoodsServiceImpl implements GoodsService {
 
             Boolean aBoolean = floorsService.updateHomeInfo(goods.getBatchCode());
 
-            goods.setStatus(Status.REMOVED.value());
-            GoodsHistory goodsHistoryRemoved = goodsHistoryService.converTGoodsHist(goods, OperateType.Down.getPhrase());
+            if (goods.getStatus().equals(Status.AVAILABLE.value()) || goods.getStatus().equals(Status.UNAVAILABLE.value())) {
+                goods.setStatus(Status.REMOVED.value());
+                GoodsHistory goodsHistoryRemoved = goodsHistoryService.converTGoodsHist(goods, OperateType.Down.getPhrase());
+                histories.add(goodsHistoryRemoved);
+            }
             //删除库存信息
             goods.setStatus(Status.GOODS_DELETE.value());
             GoodsHistory goodsHistoryDelete = goodsHistoryService.converTGoodsHist(goods, OperateType.DELETE.getPhrase());
-            histories.add(goodsHistoryRemoved);
             histories.add(goodsHistoryDelete);
             goodses1.add(goods);
             gids.add(goods.getId());
@@ -3159,35 +3163,24 @@ public class GoodsServiceImpl implements GoodsService {
      */
     @Override
     public ResultMap getDeleteProductMessage(Long productid) {
-        if(productid == null) {
-            throw new IllegalOperatorException
-                    ("传入的信息为空");
+        if (productid == null) {
+            throw new IllegalOperatorException("传入的信息为空");
         }
-        Integer homeCount = 0, recommentCount =
-                0, onSaleCount = 0;
+        Integer homeCount = 0, recommentCount = 0, onSaleCount = 0;
         List<Goods> goodsList = goodsDao.findByProductId(productid);
         for (Goods goods : goodsList) {
             List<OrderDetail> orderDetails = orderDetailDao.findByBatchCode
                     (goods.getBatchCode());
             for (OrderDetail orderDetail : orderDetails) {
                 Order order = orderDetail.getOrder();
-                if((order.getStatus().intValue()
-                 != Status.TOBECONFIRMED.value
-                        ()) && (
-                        OrderStatus.UNAVAILABLE
-                                .getCodes()
-                                .indexOf(order.getStatus
-                                        ()
-                                        .intValue())) > -1) {
-                    return new ResultMap
-                            (CodeType
-                                    .NOT_PERMIT, "已存在订单信息,不能删除");
+                if((order.getStatus() != Status.TOBECONFIRMED.value())
+                        && (OrderStatus.UNAVAILABLE.getCodes().indexOf(order.getStatus())) > -1) {
+                    return new ResultMap(CodeType.NOT_PERMIT, "已存在订单信息,不能删除");
                 }
             }
 
-            JSONObject jsonObject = floorsService.isInHome(goods
-                    .getBatchCode());
-            if(jsonObject != null) {
+            JSONObject jsonObject = floorsService.isInHome(goods.getBatchCode());
+            if (jsonObject != null) {
                 homeCount ++;
             }
 
@@ -3200,29 +3193,21 @@ public class GoodsServiceImpl implements GoodsService {
                     recommentCount++;
                 }
             }
-            int status = goods.getStatus()
-                    .intValue();
-            if( status ==
-                    Status.AVAILABLE.value() ||
-                    status == Status
-                            .UNAVAILABLE.value()) {
+            int status = goods.getStatus();
+            if ( status == Status.AVAILABLE.value() ||
+                    status == Status.UNAVAILABLE.value()) {
                 onSaleCount ++;
             }
 
         }
-        if(homeCount != 0) {
-            return new ResultMap(CodeType
-                    .OK, "存在被推荐到商城首页的信息");
+        if (homeCount != 0) {
+            return new ResultMap(CodeType.OK, "存在被推荐到商城首页的信息");
         }
-        if(recommentCount != 0) {
-            return new ResultMap
-                    (CodeType.OK,
-                            "存在已被推荐到店铺首页的信息");
+        if (recommentCount != 0) {
+            return new ResultMap(CodeType.OK, "存在已被推荐到店铺首页的信息");
         }
-        if(onSaleCount != 0) {
-            return new ResultMap
-                    (CodeType.OK,
-                            "存在已上架信息");
+        if (onSaleCount != 0) {
+            return new ResultMap(CodeType.OK, "存在已上架信息");
         }
 
         return ResultMap.success(null);

+ 187 - 47
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java

@@ -1,14 +1,17 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
@@ -21,6 +24,7 @@ import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
+import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentSubmitDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
@@ -40,6 +44,7 @@ import com.uas.platform.b2c.trade.order.status.OrderStatus;
 import com.uas.platform.b2c.trade.presale.dao.CartDao;
 import com.uas.platform.b2c.trade.presale.dao.GoodsBrowsingHistoryDao;
 import com.uas.platform.b2c.trade.presale.model.Cart;
+import com.uas.platform.b2c.trade.presale.model.Collection;
 import com.uas.platform.b2c.trade.presale.model.GoodsBrowsingHistory;
 import com.uas.platform.b2c.trade.presale.service.CartService;
 import com.uas.platform.b2c.trade.support.CodeType;
@@ -187,6 +192,12 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private UASBatchPutOnPropertyService uasBatchPutOnPropertyService;
 
+    @Autowired
+    private CreateNumberService createNumberService;
+
+    @Autowired
+    private MatchModelDao matchModelDao;
+
     @Value("#{sys.productServiceIp}")
     private String productServiceIp;
 
@@ -257,6 +268,8 @@ public class ProductServiceImpl implements ProductService {
     public Page<V_ProductPerson> getAllProductsByPerson(final PageInfo page, String keyword, String type) {
         page.expression(PredicateUtils.eq("enUU", SystemSession.getUser().getEnterprise().getUu(), true));
         page.expression(PredicateUtils.eq("ppUserUU", SystemSession.getUser().getUserUU(), true));
+        page.expression(PredicateUtils.isNotNull("pcmpcode"));
+        page.expression(PredicateUtils.isNotNull("pbranden"));
         if (StringUtils.isEmpty(type)) {
             type = "nStandard";
         }
@@ -316,6 +329,31 @@ public class ProductServiceImpl implements ProductService {
         return new PageImpl<V_ProductPerson>(productList, page, productPage.getTotalElements());
     }
 
+    @Override
+    public boolean setAllProductsByProductIds(String ids, Integer isAll, Integer isStardand) {
+        List<Long> prIds;
+        try {
+            prIds = JSON.parseArray(ids,Long.class);
+        } catch (RuntimeException e){prIds = new ArrayList<>();}
+        Long useruu = SystemSession.getUser().getUserUU();
+        if (isAll != null && isAll.equals(IntegerConstant.YES_SHORT)) {
+            prIds = productDao.findPridsByEnuuAndStardand(SystemSession.getUser().getEnterprise().getUu(), isStardand);
+        }
+        if (!CollectionUtils.isEmpty(prIds)) {
+            for (Long prId : prIds) {
+                List<ProductPerson> p = productPersonDao.findByProductIdAndUserUU(prId,useruu);
+                if (CollectionUtils.isEmpty(p)) {
+                    ProductPerson productPerson = new ProductPerson();
+                    productPerson.setUserUU(useruu);
+                    productPerson.setProductId(prId);
+                    productPerson.setTime(new Date(System.currentTimeMillis()));
+                    productPersonDao.save(productPerson);
+                }
+            }
+        }
+        return true;
+    }
+
     @Override
     public List<Goods> getProductsGoods(String type, String keyword) {
         final PageInfo page = new PageInfo();
@@ -326,23 +364,19 @@ public class ProductServiceImpl implements ProductService {
         page.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
         page.filter("b2cEnabled", com.uas.platform.b2c.prod.commodity.constant.IntegerConstant.YES_INT);
         page.sorting(Sort.Direction.DESC, "standard", "id");
-        //产品部要求导出是非标和标准全部导出,先注释这条代码
-//        if(StringUtils.isEmpty(type)) {
-//            type = "all";
-//        }
-//        if(type.contains("standard")) {
-//            page.filter("standard", (short)1);
-//        }else if(type.contains("nStandard")){
-//            page.filter("standard", (short)0);
-//        }
-//        if(StringUtils.hasText(keyword)) {
-//            SimpleExpression code = PredicateUtils.like("kind", keyword, true);
-//            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
-//            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
-//            SimpleExpression[] expressions2 = new SimpleExpression[] {code, brandEn, cmpCode};
-//            LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
-//            page.expression(logicalExpression2);
-//        }
+        if (type.contains("standard")) {
+            page.filter("standard", IntegerConstant.YES_SHORT);
+        } else if (type.contains("nStandard")) {
+            page.filter("standard", IntegerConstant.NO_SHORT);
+        }
+        if (StringUtils.hasText(keyword)) {
+            SimpleExpression code = PredicateUtils.like("kind", keyword, true);
+            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
+            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
+            SimpleExpression[] expressions2 = new SimpleExpression[] {code, brandEn, cmpCode};
+            LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
+            page.expression(logicalExpression2);
+        }
         products = v_productPrivateDao.findAll(new Specification<V_ProductPrivate>() {
             @Override
             public Predicate toPredicate(Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
@@ -350,17 +384,38 @@ public class ProductServiceImpl implements ProductService {
             return null;
             }
         }, page.getSort());
-        List<Goods> goodses = new ArrayList<>();
-        for (V_ProductPrivate product : products) {
-            List<Goods> goodses1 = goodsDao.findByProductIdOrderByGoodsId(product.getId());
-            if (goodses1.size() > 0) {
-                goodses.addAll(goodses1);
+
+        return exportGoodsByProduct(products);
+    }
+
+    /**
+     * 将获取的product转化为goods信息导出
+     * @param   productList 产品列表
+     * @return  List<Goods>
+     */
+    private List<Goods> exportGoodsByProduct(List<V_ProductPrivate> productList) {
+        List<Goods> resultList = new ArrayList<>();
+        for (V_ProductPrivate product : productList) {
+            List<Goods> goodsList = goodsDao.findByProductIdOrderByGoodsId(product.getId());
+            if (!CollectionUtils.isEmpty(goodsList)) {
+                resultList.addAll(goodsList);
             } else {
                 Goods g = Goods.productConvertGoods(product);
-                goodses.add(g);
+                resultList.add(g);
             }
         }
-        return goodses;
+        return resultList;
+    }
+
+    @Override
+    public List<Goods> getSelectedProducts(String idList) {
+        String[] idArray = idList.split(SplitChar.COMMA);
+        List<Long> longList = new ArrayList<>();
+        for (String id : idArray) {
+            longList.add(Long.valueOf(id));
+        }
+        List<V_ProductPrivate> productList = v_productPrivateDao.findProductInId(longList);
+        return exportGoodsByProduct(productList);
     }
 
     @Override
@@ -443,12 +498,12 @@ public class ProductServiceImpl implements ProductService {
         Integer success = 0;
         Integer isHave = 0;
         Long uu = SystemSession.getUser().getEnterprise().getUu();
-        if(ProductConstant.STANDARD.equals(type)) {
+        if (ProductConstant.STANDARD.equals(type)) {
             standard = IntegerConstant.YES_SHORT;
-        }else {
+        } else {
             standard = IntegerConstant.NO_SHORT;
         }
-        List<Product> products = productDao.findProductByEnuuAndStandard(uu, standard);
+        List<Product> products = productDao.findProductByEnuuAndStandardAndEnabled(uu, standard, IntegerConstant.YES_SHORT);
         Set<String> uuids = new HashSet<>();
         for (Product product : products) {
             if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
@@ -474,7 +529,7 @@ public class ProductServiceImpl implements ProductService {
                     for (OrderDetail detail : orderList) {
                         Order order = detail.getOrder();
                         Integer status = order.getStatus() == null ? detail.getStatus() : order.getStatus();
-                        if(codes.indexOf(String.valueOf(status)) < 0) {
+                        if (!codes.contains(String.valueOf(status))) {
                             //防止虚拟单据
                             if (StringUtils.isEmpty(order.getOrderids())) {
                                 isExistOrder = true;
@@ -483,12 +538,12 @@ public class ProductServiceImpl implements ProductService {
 
                         }
                     }
-                    if(isExistOrder) {
+                    if (isExistOrder) {
                         break;
                     }
                 }
-                if(!isExistOrder) {
-                    //删除外键关联的匹配结果列表,不然删除product失败
+                if (!isExistOrder) {
+                    // 删除外键关联的匹配结果列表,不然删除product失败
                     Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
                     productMatchResultDao.delete(productMatchResultSet);
                     goodsService.deleteGoods(goodses);
@@ -505,7 +560,7 @@ public class ProductServiceImpl implements ProductService {
                     if (!StringUtils.isEmpty(product.getCmpUuId())) {
                         uuids.add(product.getCmpUuId());
                     }
-                }else {
+                } else {
                     fail++;
                 }
             } catch (Exception e) {
@@ -515,17 +570,17 @@ public class ProductServiceImpl implements ProductService {
 
         Integer status = CodeType.OK.code();
         String message = "";
-        if(success != 0) {
+        if (success != 0) {
             message += "成功删除" + success + "条";
         }
-        if(fail != 0) {
+        if (fail != 0) {
             if(success != 0) {
                 message += ",";
             }
             message += "删除失败" + (fail-isHave) + "条,原因:该产品可能已经被其他单据或个人物料库引用,无法删除";
         }
-        //如果是全部都不能删除,才能设置失败的状态码
-        if((products.size() != 0) && (products.size() ==  fail.intValue())) {
+        // 如果是全部都不能删除,才能设置失败的状态码
+        if ((products.size() != 0) && (products.size() ==  fail)) {
             status = CodeType.ERROR_STATE.code();
         }
         for (String uuid : uuids) {
@@ -740,15 +795,7 @@ public class ProductServiceImpl implements ProductService {
         return "success";
     }
 
-    /**
-     * 一键匹配非标产品,并带出该型号匹配的器件信息
-     * @return
-     */
-    @Override
-    public ResultMap matchNonStandardProduct() {
-        Map<String, Object> map = new HashMap<>();
-        final Long uu = SystemSession.getUser().getUserUU();
-        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+    private ResultMap validateProductStatus(Long enUU) {
         ProductStoreStatus status = productStoreStatusDao.findByEnuu(enUU);
         if (status != null) {
             // 有人正在操作这张单据,不能进行操作
@@ -772,6 +819,23 @@ public class ProductServiceImpl implements ProductService {
             storeStatus.setStatus(Status.RUNNING.value());
             status = productStoreStatusDao.save(storeStatus);
         }
+        return ResultMap.success(status);
+    }
+
+    /**
+     * 一键匹配非标产品,并带出该型号匹配的器件信息
+     * @return
+     */
+    @Override
+    public ResultMap matchNonStandardProduct() {
+        Map<String, Object> map = new HashMap<>();
+        final Long uu = SystemSession.getUser().getUserUU();
+        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        ResultMap statusResult = validateProductStatus(enUU);
+        if (statusResult.getCode() != CodeType.OK.code()) {
+            return statusResult;
+        }
+        ProductStoreStatus status = (ProductStoreStatus) statusResult.getData();
 
         int total = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
         int success = 0;
@@ -802,6 +866,82 @@ public class ProductServiceImpl implements ProductService {
         return ResultMap.success(map);
     }
 
+    @Override
+    public ResultMap matchSelected(List<Long> idList) {
+        Map<String, Object> map = new HashMap<>();
+        Enterprise enterprise = SystemSession.getUser().getEnterprise();
+        Long enUU = enterprise != null ? enterprise.getUu() : null;
+        Long uu = SystemSession.getUser().getUserUU();
+        if (enUU == null) {
+            return new ResultMap(CodeType.NO_INFO, "企业或EnUU信息丢失");
+        }
+        ResultMap statusResult = validateProductStatus(enUU);
+        if (statusResult.getCode() != CodeType.OK.code()) {
+            return statusResult;
+        }
+        ProductStoreStatus status = (ProductStoreStatus) statusResult.getData();
+        String batch = createNumberService.getTimeNumber("product$match", 8);
+        // 保存要匹配的id数据
+        createMatchModel(idList, batch);
+        int success = 0;
+        int fail = 0;
+
+        String sql = "/*#mycat:db_type=master*/ call PRODUCT_MATCHES_SELECT_V1(%s, %s, %s, @out); select @out";
+        final String formatSql = String.format(sql, batch, enUU, uu);
+        success = jdbcTemplate.execute(new StatementCallback<Integer>() {
+            @Override
+            public Integer doInStatement(Statement statement) throws SQLException, DataAccessException {
+                statement.execute(formatSql);
+                ResultSet rs = statement.getResultSet();
+                if (null != rs) {
+                    rs.next();
+                    return rs.getInt(1);
+                }
+                return 0;
+            }
+        });
+        fail = idList.size() - success;
+
+        status.setStatus(Status.FINISH.value());
+        productStoreStatusDao.save(status);
+        map.put("total", idList.size());
+        map.put("fail", fail);
+        map.put("success", success);
+        map.put("batch", batch);
+
+        return ResultMap.success(map);
+    }
+
+    /**
+     * 根据id列表生成匹配信息
+     * @param idList 产品id列表
+     * @param batch 批次号标识
+     */
+    private void createMatchModel(List<Long> idList, String batch) {
+        Long uu = SystemSession.getUser().getUserUU();
+        Long enUU = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
+        List<MatchModel> resultList = new ArrayList<>(idList.size());
+        for (Long id : idList) {
+            MatchModel matchModel = new MatchModel();
+            matchModel.setBatch(batch);
+            matchModel.setProductId(id);
+            matchModel.setUseruu(uu);
+            matchModel.setEnuu(enUU);
+            matchModel.setStandard(ShortConstant.NO_SHORT);
+            resultList.add(matchModel);
+        }
+        matchModelDao.save(resultList);
+    }
+
+    @Override
+    public List<Product> getDataByBatch(String batch) {
+        List<Long> idList = matchModelDao.findNonProductByBatch(batch, ShortConstant.NO_SHORT);
+        if (!CollectionUtils.isEmpty(idList)) {
+            return productDao.findProductInId(idList);
+        }
+        return Collections.emptyList();
+    }
+
     /**
      * 根据标准上架信息 保存对产品包装,包装数量,生产日期的修改
      *
@@ -1142,9 +1282,9 @@ public class ProductServiceImpl implements ProductService {
                         if (productPrivate == null) {
                             productPrivate = new ProductPrivate();
                         }
-                        if(CollectionUtils.isEmpty(products)) {
+                        if (CollectionUtils.isEmpty(products)) {
                             productPrivate.setB2cEnabled(1);
-                        }else {
+                        } else {
                             productPrivate.setB2cEnabled(0);
                             i++;
                         }

+ 56 - 9
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java

@@ -2,7 +2,6 @@ package com.uas.platform.b2c.prod.commodity.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.account.model.Enterprise;
-import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
 import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.core.config.SysConf;
@@ -16,7 +15,11 @@ import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ShortConstant;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
-import com.uas.platform.b2c.prod.commodity.dao.*;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ReleaseProductByBatchDao;
 import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
@@ -26,7 +29,6 @@ import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import com.uas.platform.b2c.trade.order.StringConstant.Currency;
-import com.uas.platform.b2c.trade.presale.model.Collection;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
@@ -123,15 +125,18 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @author hejq
 	 */
 	@Override
-	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson) {
+	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport) {
 		// 是否上传个人物料
 		boolean isAPerson = false;
+		boolean isImport = false;
 		if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
 			isAPerson = true;
 			selfSale = false;
 		}
+		if (null != repeatImport && IntegerConstant.YES_SHORT.equals(repeatImport)) {
+			isImport = true;
+		}
 		ModelMap modelMap = new ModelMap();
-		Set<ReleaseProductByBatch> releaseProductByBatchs = new HashSet<>();
 		// 获取第一个工作表
 		Sheet sheet = workbook.getSheetAt(0);
 		int colNum = sheet.getRow(0).getPhysicalNumberOfCells();
@@ -149,6 +154,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			throw new IllegalOperatorException
 					("您上传的信息超过2000条,请拆分成2000以再在上传");
 		}
+		List<ReleaseProductByBatch> releaseProductByBatchs = new ArrayList<>(rowNum);
 		String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
 		StoreIn storeIn = getStoreInfo(selfSale);
 		Row headerRow = sheet.getRow(0);
@@ -191,6 +197,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 								releaseProductByBatch.setTag(null);
 							}
 						}
+						validateRepeatInExcel(releaseProductByBatchs, releaseProductByBatch, isImport);
 					}
 					// 简单验证数据,防止空行保存的情况
 					if (blankNum != 3) {
@@ -204,7 +211,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		List<ReleaseProductByBatch> addList = new ArrayList<>(releaseProductByBatchs.size());
 		addList.addAll(releaseProductByBatchs);
-		resetRepeatData(addList, isAPerson);
+		resetRepeatData(addList, isImport, isAPerson);
 		if (isAPerson) {
 			for (ReleaseProductByBatch releaseProductByBatch : addList) {
 				List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(enUU,releaseProductByBatch.getB2cCode(),
@@ -234,16 +241,49 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		return modelMap;
 	}
 
+	/**
+	 * 验证Excel中数据是否重复
+	 *
+	 * @param 	batchList
+	 * @param 	aBatch
+	 * @param 	isImport
+	 */
+	private void validateRepeatInExcel(List<ReleaseProductByBatch> batchList, ReleaseProductByBatch aBatch, Boolean isImport) {
+		if (CollectionUtils.isEmpty(batchList) || !StringUtils.isEmpty(aBatch.getErrmsg()))
+			return ;
+		for (ReleaseProductByBatch each : batchList) {
+			if (StringUtils.isEmpty(each.getErrmsg()) && each.equals(aBatch)) {
+				if (!isImport) {
+					aBatch.setErrmsg(ErrorInfoConstant.REPEAT_IN_EXCEL.getInfo());
+					aBatch.setReleaseCode(ReleaseStatus.had_exists.value());
+					aBatch.setReleaseStatus(ReleaseStatus.had_exists.getPhrase());
+					break;
+				} else {
+					if (GoodsUtil.compareWithQtyPrice(each.getPrices(), aBatch.getPrices(), each.getCurrency())) {
+						aBatch.setErrmsg(ErrorInfoConstant.REPEAT_IN_EXCEL.getInfo());
+						aBatch.setReleaseCode(ReleaseStatus.had_exists.value());
+						aBatch.setReleaseStatus(ReleaseStatus.had_exists.getPhrase());
+						break;
+					}
+				}
+			}
+		}
+	}
+
 	/**
 	 * 判断是否重复,重复则重设状态
-	 * @param data
+	 * @param 	data
+	 * @param 	isImport
 	 */
-	private void resetRepeatData(List<ReleaseProductByBatch> data, boolean isAPerson) {
+	private void resetRepeatData(List<ReleaseProductByBatch> data, Boolean isImport, boolean isAPerson) {
 		Long enuu = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
 		if (enuu == null) {
 			throw new IllegalOperatorException("企业enuu丢失");
 		}
 		for (ReleaseProductByBatch each : data) {
+			if (StringUtils.hasText(each.getErrmsg())) {
+				continue;
+			}
 			List<Product> standardList = productDao.findMatchStandard(enuu, each.getBrandNameEn(), each.getCode(), IntegerConstant.YES_SHORT);
 			if (!CollectionUtils.isEmpty(standardList)) {
 				each.setB2cBranden(standardList.get(0).getPbranden());
@@ -256,6 +296,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (!CollectionUtils.isEmpty(productList)) {
 				List<Goods> goodsList = goodsDao.findRepeatGoodsInProductId(productList.get(0).getId(), each.getProductDate(), each.getPackaging(), each.getMinPackage(), each.getMinBuyQty(), each.getSelfMaxDelivery(), each.getSelfMinDelivery(), each.getUnit());
 				if (!CollectionUtils.isEmpty(goodsList)) {
+					if (!isImport) {
+						each.setErrmsg(ErrorInfoConstant.REPEAT_INFO.getInfo());
+						each.setReleaseCode(ReleaseStatus.had_exists.value());
+						each.setReleaseStatus(ReleaseStatus.had_exists.getPhrase());
+						continue;
+					}
 					for (Goods goods1 : goodsList) {
 						if (GoodsUtil.compareWithQtyPrice(each.getPrices(), goods1.getPrices(), each.getCurrency())) {
 							each.setErrmsg(ErrorInfoConstant.REPEAT_INFO.getInfo());
@@ -274,7 +320,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param aProduct 单个产品
 	 * @param productSet 产品列表
 	 */
-	private Boolean validateTagInfo(ReleaseProductByBatch aProduct, Set<ReleaseProductByBatch> productSet) {
+	private Boolean validateTagInfo(ReleaseProductByBatch aProduct, List<ReleaseProductByBatch> productSet) {
 		for (ReleaseProductByBatch each : productSet) {
 			if (aProduct.getBrandNameEn().equals(each.getBrandNameEn()) && aProduct.getCode().equals(each.getCode())
 					&& aProduct.getTag().equals(each.getTag())) {
@@ -1172,6 +1218,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
                 product.setpBrandUuid(releaseProductByBatch.getBranduuid());
                 product.setStandard(releaseProductByBatch.getComponentUuId() == null ? (short)0 : (short)1);
                 product.setCmpUuid(releaseProductByBatch.getComponentUuId());
+                product.setCreateTime(new Date(System.currentTimeMillis()));
                 if (isAPerson) {
                     product.setSpec(releaseProductByBatch.getPackaging());
                 }

+ 54 - 6
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentGoodsServiceImpl.java

@@ -2,6 +2,8 @@ package com.uas.platform.b2c.prod.product.component.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentGoodsDao;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
 import com.uas.platform.b2c.prod.product.component.service.ComponentGoodsService;
@@ -14,17 +16,18 @@ import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class ComponentGoodsServiceImpl implements ComponentGoodsService {
@@ -37,6 +40,10 @@ public class ComponentGoodsServiceImpl implements ComponentGoodsService {
 	
 	@Autowired
 	private KindService kindService;
+
+	@Autowired
+	private GoodsDao goodsDao;
+
 	
 	@Override
 	public Page<ComponentGoods> getCompGoodsByKindid(final PageInfo info) {
@@ -47,7 +54,7 @@ public class ComponentGoodsServiceImpl implements ComponentGoodsService {
 			info.setPageNumber(Constant.PAGEMAX);
 		}
 		//将有库存的先排序
-		String [] properties = {"cmpReserve", "cmpId", "reserve"};
+		String [] properties = {"goId", "cmpId", "reserve"};
 		info.sorting(Direction.DESC, properties);
 		if(filter != null) {
 			if(filter.get("properties") != null) {
@@ -90,7 +97,48 @@ public class ComponentGoodsServiceImpl implements ComponentGoodsService {
 				Long kindid = Long.parseLong(filter.get("kindid").toString());
 				List<Long> ids = kindService.getLeafChildrenIdList(kindid);
 				info.expression(PredicateUtils.in("kindid", ids, false));
-				filter.remove("kindid");
+				// 该用搜索方式获取数据
+				com.uas.platform.b2c.common.search.util.PageParams pageParams = new com.uas.platform.b2c.common.search.util.PageParams();
+				pageParams.setPage(info.getPageNumber());
+				pageParams.setSize(info.getPageSize());
+				pageParams.filter(FilterField.GOODS_KINDID,ids);
+				pageParams.setSort(new com.uas.platform.b2c.common.search.util.Sort(com.uas.platform.b2c.common.search.util.Sort.Field.RESERVE,true));
+				Map<String,Object> results = searchService.getGoodsIdsForKinds(pageParams);
+				//为了反爬虫,最多只展示前Constant.PAGEMAX的数据,
+				int maxExposeInfo = Constant.PAGEMAX * info.getPageSize();
+				long totalElements = Long.parseLong(results.get("total").toString());
+				if(totalElements > new Long(maxExposeInfo).longValue()) {
+					totalElements = maxExposeInfo;
+				}
+				System.out.println(JSON.toJSON(info));
+				List<Integer> componentIds = (List<Integer>)results.get("componentIds");
+				List<Integer> goodsIds = (List<Integer>)results.get("goodsIds");
+				List<ComponentGoods> components = new ArrayList<>();
+				if (!CollectionUtils.isEmpty(componentIds)) {
+					for (int i = 0 ;i < componentIds.size() ; i++){
+						Long cid = null;
+						if(!StringUtils.isEmpty
+								(componentIds.get(i)))  {
+							cid = Long.valueOf(componentIds.get(i).toString());
+						}
+						Long gid = goodsIds.get(i) == null ? 0L : Long.valueOf(goodsIds.get(i).toString());
+						if((cid == null) && (gid != 0L)) {
+							Goods goods = goodsDao.findOne(gid);
+							if(goods != null) {
+								components.add(new ComponentGoods(goods));
+							}
+						}else if(cid != null){
+							ComponentGoods componentGoods = componentGoodsDao.findByCmpIdAndGoId(cid, gid);
+							if (componentGoods != null){
+								components.add(componentGoods);
+							}
+						}
+					}
+				}
+
+				Page page = new PageImpl<>(components, info, totalElements);
+				return page;
+				//filter.remove("kindid");
 			}
 		}
 		Page<ComponentGoods> page = componentGoodsDao.findAll(new Specification<ComponentGoods>() {
@@ -111,5 +159,5 @@ public class ComponentGoodsServiceImpl implements ComponentGoodsService {
 		page = new PageImpl<>(page.getContent(), info, totalElements);
 		return page;
 	}
-	
+
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java

@@ -157,7 +157,7 @@ public class KindInfo {
 					otherKind = new KindInfo();
 					otherKind.setId(-10L); //默认一个不会存在的id
 					otherKind.setIsLeaf((short) 1);
-					otherKind.setNameCn("其");
+					otherKind.setNameCn("其");
 					otherKind.setLevel((short)1);
 					otherKind.setParentid(0L);
 					otherKind.setChildren(Collections.<KindInfo>emptySet());

+ 23 - 5
src/main/java/com/uas/platform/b2c/prod/store/api/CommodityController.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.store.api;
 
+import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
@@ -10,18 +11,16 @@ import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.facade.CommodityFacade;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -60,6 +59,25 @@ public class CommodityController {
 		return goodsService.findGoodsByBatchCode(batchCode);
 	}
 
+	/**
+	 * 根据批次号数组查看产品详情
+	 *
+	 * @param batchCodeList		商品批次号
+	 */
+	@RequestMapping(value = "/detail", method = RequestMethod.POST)
+	public List<Goods> findByBatchCodeList(@RequestBody String batchCodeList) {
+		logger.info(String.format("Find GoodsList by batchCodeList "));
+		List<String> batchCodes = JSON.parseArray(batchCodeList,String.class);
+		List<Goods> goodsList = new ArrayList<>();
+		if (!CollectionUtils.isEmpty(batchCodes)) {
+			for (String batch : batchCodes) {
+				Goods g = goodsService.findGoodsByBatchCode(batch);
+				goodsList.add(g);
+			}
+		}
+		return goodsList;
+	}
+
 	/**
 	 * 根据器件UUID获取器件信息
 	 *

+ 3 - 1
src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java

@@ -205,7 +205,9 @@ public class StoreInServiceImpl implements StoreInService {
 			}
 
 		});
-		qualifications.addAll(store.getQualifications());
+		if (!CollectionUtils.isEmpty(store.getQualifications())) {
+			qualifications.addAll(store.getQualifications());
+		}
 		store.setQualifications(qualifications);
 		logger.info(String.format("Start to execute find %s", store != null ? store.toString() : null));
 		return store;

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/dao/PurchaseDao.java

@@ -36,7 +36,7 @@ public interface PurchaseDao extends JpaSpecificationExecutor<Purchase>, JpaRepo
 	 */
 	@Query(nativeQuery = true, value=" select o.* from trade$purchase o " +
 			" left join b2c$rate$buyer v " +
-			" on o.or_id = v.order_id left join trade$order t on o.or_id = t.or_orderid where locate('405',t.or_statushistory)>0  and v.id is null;")
+			" on o.or_orderid = v.order_id left join trade$order t on o.or_orderid = t.or_id where locate('405',t.or_statushistory)>0  and v.id is null;")
 	List<Purchase> findByNotRate();
 
 	/**

+ 1 - 0
src/main/resources/dev/account.properties

@@ -7,6 +7,7 @@ sso.app=mall
 # token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
+sso.cookie.browser=false
 sso.login.url=http://113.105.74.135:8001/sso/login
 sso.logout.url=http://113.105.74.135:8001/sso/logout
 sso.register.url=http://113.105.74.135:8001/sso/register_p

BIN
src/main/resources/jxls-tpl/trade/products.xls


+ 1 - 0
src/main/resources/prod/account.properties

@@ -9,6 +9,7 @@ sso.cookie.domain=usoftmall.com
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=true
 sso.cookie.httponly=true
+sso.cookie.browser=false
 sso.login.url=https://account.ubtob.com/sso/login
 sso.logout.url=https://account.ubtob.com/sso/logout
 sso.register.url=https://account.ubtob.com/sso/register_p

+ 1 - 0
src/main/resources/test/account.properties

@@ -7,6 +7,7 @@ sso.app=mall
 # token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
+sso.cookie.browser=false
 sso.login.url=http://113.105.74.135:8001/sso/login
 sso.logout.url=http://113.105.74.135:8001/sso/logout
 sso.register.url=http://113.105.74.135:8001/sso/register_p

+ 0 - 13
src/main/webapp/resources/css/common.css

@@ -951,19 +951,6 @@ input::-webkit-input-safebox-button{
 /*去除textarea默认右下角可自由放大样式*/
 textarea{resize:none}
 
-input[type="number"]{
-	-moz-appearance: textfield !important;
-}
-select {
-	-moz-appearance: none;
-}
-
-.modal-content {
-	overflow-y: auto;
-	max-height: 520px;
-	overflow-x: hidden;
-	height: auto !important;
-}
 .form-control:focus {
 	border: 1px solid #4272d3;
 	-webkit-box-shadow: none;

+ 26 - 0
src/main/webapp/resources/js/common/query/material.js

@@ -22,6 +22,16 @@ define([ 'ngResource' ], function() {
                 url: 'trade/products/:ids',
                 method: 'DELETE'
             },
+            // 绑定个人物料
+            setAllProductsByPerson: {
+                url: 'trade/products/person',
+                method: 'POST'
+            },
+            // 批量保存个人替代物料信息
+            setProductReplacesByPerson: {
+                url: 'trade/products/productReplace',
+                method: 'POST'
+            },
             // 删除所有非标的信息
             deleteUnstandardAll: {
                 url: 'trade/products/unstandard',
@@ -52,6 +62,17 @@ define([ 'ngResource' ], function() {
                 url: 'trade/products/match/nonProduct',
                 method: 'GET'
             },
+            // 多选匹配,非标上架版本
+            matchSelected : {
+                url: 'trade/products/match/selected',
+                method: 'POST'
+            },
+            // 根据批次获取产品列表
+            getDataByBatch : {
+                url: 'trade/products/match/batch',
+                method: 'GET',
+                isArray: true
+            },
             updateProduct : {
                 url: 'trade/products/update',
                 method: 'POST'
@@ -85,6 +106,11 @@ define([ 'ngResource' ], function() {
                 url: 'trade/products/update/goods',
                 method: 'POST'
             },
+            // 导出选择的列表
+            exportSelectedProduct: {
+                url: 'trade/products/template/selected/data',
+                method: 'POST'
+            },
             //批量上架信息
             batchPutOn: {
                 url: 'trade/products/batch',

+ 3 - 4
src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js

@@ -819,10 +819,9 @@ define(['app/app'], function (app) {
           $scope.checkFailed1 = false;
           $scope.checkFailed1_1 = false;
           $scope.emailEnable = function (newUserEmail) {
-            //邮箱不可用
+            //邮箱不可用 /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
             if ((newUserEmail == null || newUserEmail.length > 30)
-                || !/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(
-                    newUserEmail)) {
+                || newUserEmail.indexOf("@") == -1 || newUserEmail.indexOf(".") == -1) {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
               $scope.checkFailed1_1 = false;
@@ -1363,7 +1362,7 @@ define(['app/app'], function (app) {
           User.getAllSecQuestion($scope.pageInfo, function (data) {
             $scope.secQuestions = data.content;
             //查询当前用户密保问题
-            User.getUserQuestion(function (data) {
+            User.getUserQuestion({userUU: $scope.userInfo.userUU},function (data) {
               $scope.uq[0] = data[0];
               $scope.uq[1] = data[1];
             });

+ 2 - 3
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_account_management_ctrl.js

@@ -760,8 +760,7 @@ define(['app/app'], function(app) {
           $scope.emailEnable = function (newUserEmail) {
             //邮箱不可用
             if ((newUserEmail == null || newUserEmail.length > 30)
-                || !(/^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g).test(
-                    newUserEmail)) {
+                || newUserEmail.indexOf("@") == -1 || newUserEmail.indexOf(".") == -1) {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
               $scope.checkFailed1_1 = false;
@@ -1302,7 +1301,7 @@ define(['app/app'], function(app) {
           User.getAllSecQuestion($scope.pageInfo, function (data) {
             $scope.secQuestions = data.content;
             //查询当前用户密保问题
-            User.getUserQuestion(function (data) {
+            User.getUserQuestion({userUU: $scope.userInfo.userUU},function (data) {
               $scope.uq[0] = data[0];
               $scope.uq[1] = data[1];
             });

+ 178 - 54
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js

@@ -213,12 +213,12 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
             if (data && typeof data.fluctuateRate != 'undefined') {
                 $scope.uasBatchPutOnProperty = data;
                 $scope.uasBatchPutOnProperty.editFluctuateRate = NumberService.mul($scope.uasBatchPutOnProperty.fluctuateRate, 100) || 100;
-                $scope.uasBatchPutOnProperty.editMaxDelivery = $scope.uasBatchPutOnProperty.maxDelivery || 1;
+                $scope.uasBatchPutOnProperty.editMaxDelivery = $scope.uasBatchPutOnProperty.maxDelivery || 10;
                 $scope.uasBatchPutOnProperty.editMinDelivery = $scope.uasBatchPutOnProperty.minDelivery || 1;
             } else {
 				$scope.uasBatchPutOnProperty = {};
                 $scope.uasBatchPutOnProperty.editFluctuateRate = 100;
-                $scope.uasBatchPutOnProperty.editMaxDelivery = 1;
+                $scope.uasBatchPutOnProperty.editMaxDelivery = 10;
                 $scope.uasBatchPutOnProperty.editMinDelivery = 1;
             }
         }, function (response) {
@@ -230,8 +230,14 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		 * @param isStandard
 		 */
 		$scope.toggleStandard = function (isStandard) {
+			if ($scope.standard_tab == 'matchResult') {
+				$scope.lastMaterial = $scope.currenctMaterial;
+			}
 			$scope.standard_tab = isStandard;
 			$scope.param.keyword = '';
+			if ($scope.chooseAllPage) {
+				$scope.chooseAllPage = false;
+			}
 			if (isStandard == 'standard')
 				$scope.param.type = "standard";
 			if (isStandard == 'unstandard')
@@ -270,21 +276,41 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		};
 
 		// 全选
-		$scope.chooseAll = function () {
-			$scope.isChoosedAll = !$scope.isChoosedAll;
+		$scope.chooseAllItem = function () {
+			$scope.chooseAll = !$scope.chooseAll;
+			angular.forEach($scope.currenctMaterial, function (material) {
+				material.isChoosed = $scope.chooseAll;
+			});
+			if (!$scope.chooseAll) {
+				$scope.chooseAllPage = false;
+			}
+		};
+
+		$scope.turnAllPage = function () {
+			if ($scope.chooseAll) {
+				$scope.chooseAllPage = true;
+			}
+		};
+
+		$scope.cancelAllPage = function () {
+			$scope.chooseAllPage = false;
+			$scope.chooseAll = false;
 			angular.forEach($scope.currenctMaterial, function (material) {
-				material.isChoosed = $scope.isChoosedAll;
+				material.isChoosed = false;
 			});
 		};
 
 		// 检查是否全选
 		var checkChoosedAll = function () {
-			$scope.isChoosedAll = true;
+			$scope.chooseAll = true;
 			angular.forEach($scope.currenctMaterial, function (material) {
 				if (!material.isChoosed) {
-					$scope.isChoosedAll = false;
+					$scope.chooseAll = false;
 				}
 			});
+			if (!$scope.chooseAll) {
+				$scope.chooseAllPage = false;
+			}
 		};
 
 		// 单选
@@ -309,6 +335,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 
 		//获取选中之后的信息
 		$scope.getChoosedInfo = function () {
+			$scope.choosedIds = [];
 			angular.forEach($scope.currenctMaterial, function (material) {
 				if (material.isChoosed) {
 					$scope.choosedIds.push(material.id);
@@ -400,7 +427,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		// 批量删除
 		$scope.deleteBatch = function () {
             $scope.getChoosedInfo();
-            if(!$scope.choosedIds || $scope.choosedIds.length == 0) {
+            if (!$scope.choosedIds || $scope.choosedIds.length == 0) {
                 toaster.pop('warning', '提示','请选择要删除的信息');
                 return ;
             }
@@ -414,19 +441,19 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 
 		// 单个删除
 		$scope.deleteMaterial = function(material) {
-			if(!material || !material.id) {
+			if (!material || !material.id) {
 				return ;
 			}
 			Goods.getDeleteProductMessage({productid: material.id}, function (data) {
 				console.log(data);
-				if(data.code == 1) {
+				if (data.code == 1) {
 					$scope.$$nonProduct.deleteMessage = data.message;
 					$scope.choosedIds = [];
 					$scope.choosedIds.push(material.id);
 					$scope.$$nonProduct.deleteGoods = false;
 					$scope.$$nonProduct.deleteMaterial = true;
 					$scope.opendeleteModal();
-				}else {
+				} else {
 					toaster.pop('warning', '提示', data.message);
 				}
 			}, function (response) {
@@ -453,7 +480,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 						return $scope.$$nonProduct.deleteGoods;
 					},
 					selectAll : function () {
-						return $scope.isChoosedAll;
+						return $scope.chooseAllPage;
 					},
 					standard_tab : function () {
 						return $scope.standard_tab;
@@ -800,50 +827,113 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		$scope.toggleTab = function (status) {
 			$scope.param.type = 'nStandard';
 			$scope.param.count = $scope.$$nonProduct.count;
-			loadData();
+			if (status == 'matchResult') {
+				$scope.currenctMaterial = $scope.lastMaterial;
+				$scope.materialAll = {};
+			} else {
+				loadData();
+			}
 			$scope.standard_tab = status;
 		};
 
 		$scope.closeResultFrame = function (status) {
 			$scope.standard_tab = status;
 			$scope.resultFrame = false;
+			$scope.param.type = 'nStandard';
+			loadData();
 		};
 
 		$scope.closeTip = function () {
 			$scope.resultTip = false;
 		};
 
+		var loadSelectedData = function () {
+			$scope.materialAll = {};
+			Material.getDataByBatch({batch:$scope.batch}, function (data) {
+				$scope.currenctMaterial = data;
+			});
+		};
+
 		// 一键匹配
 		$scope.matchAll = function () {
-			Material.matchNonProduct({}, {}, function (data) {
-				if (data.success){
-					$scope.resultFrame = true;
-					$scope.matchTotal = data.data.total;
-					$scope.matchSuccess = data.data.success;
-					$scope.matchFail = data.data.fail;
-					$scope.standard_tab = 'matchResult';
-					$scope.param.type = "nStandard";
-					loadData();
-				}else {
-					toaster.pop("info", data.message);
+			if ($scope.chooseAllPage) {
+				Material.matchNonProduct({}, {}, function (data) {
+					if (data.success) {
+						$scope.resultFrame = true;
+						$scope.matchTotal = data.data.total;
+						$scope.matchSuccess = data.data.success;
+						$scope.matchFail = data.data.fail;
+						$scope.standard_tab = 'matchResult';
+						$scope.param.type = "nStandard";
+						loadData();
+					} else {
+						toaster.pop("info", data.message);
+					}
+				}, function (error) {
+					toaster.pop("error", "匹配操作失败!")
+				});
+			} else {
+				$scope.getChoosedInfo();
+				if (!$scope.choosedIds || $scope.choosedIds.length == 0) {
+					toaster.pop("info", "您尚未选中任何产品");
+					return ;
 				}
-			}, function (error) {
-				toaster.pop("error", "匹配操作失败!")
-			});
+				Material.matchSelected({}, $scope.choosedIds, function (data) {
+					if (data.success) {
+						$scope.resultFrame = true;
+						$scope.matchTotal = data.data.total;
+						$scope.matchSuccess = data.data.success;
+						$scope.matchFail = data.data.fail;
+						$scope.standard_tab = 'matchResult';
+						$scope.batch = data.data.batch;
+						$scope.currenctMaterial = [];
+						loadSelectedData();
+					} else {
+						toaster.pop("error", data.message);
+					}
+				}, function (error) {
 
-			// Material.matchAll({}, function (data) {
-			// 	if (data.updateCount > 0) {
-			// 		toaster.pop('success', '匹配完成, 本次匹配成功 ' + data.updateCount +' 个,可前往“标准产品”中 , 编辑上架。');
-			// 	}
-			// 	else {
-			// 		toaster.pop('success', '匹配完成, 暂无匹配成功产品,可前往“品牌申请/器件申请”中 , 提出申请。');
-			// 	}
-			// 	loadDataReload();
-			// }, function (response) {
-			// 	toaster.pop('info', response.data);
-			// });
+				})
+			}
 		};
 
+        // 一键添加到个人产品库
+        $scope.setAllInPerson = function () {
+            if ($scope.chooseAllPage) {
+                if ('standard' == $scope.standard_tab) {
+                	$scope.setPrArg = {isAll : 1, isStardand : 1};
+				} else {
+                    $scope.setPrArg = {isAll : 1, isStardand : 0};
+				}
+                Material.setAllProductsByPerson( $scope.setPrArg ,{}, function (data) {
+                    if (data.success) {
+                        toaster.pop("info", "绑定成功!");
+                        loadData();
+                    } else {
+                        toaster.pop("info", data.message);
+                    }
+                }, function (error) {
+                    toaster.pop("error", "绑定失败!")
+                });
+            } else {
+                $scope.getChoosedInfo();
+                if (!$scope.choosedIds || $scope.choosedIds.length == 0) {
+                    toaster.pop("info", "您尚未选中任何产品");
+                    return ;
+                }
+                Material.setAllProductsByPerson({},$scope.choosedIds,function (data) {
+                    if (data.success) {
+                        toaster.pop("info", "绑定成功!");
+                        loadData();
+                    } else {
+                        toaster.pop("error", data.message);
+                    }
+                }, function (error) {
+                    toaster.pop("error", "绑定失败!")
+                })
+            }
+        };
+
 		function downloadByJs(url, keyword, type) {
 			var form = $("<form>");   //定义一个form表单
 			form.attr('style', 'display:none');   //在form表单中添加查询参数
@@ -867,16 +957,43 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			form.submit();
 		}
 
+		function downloadSelectedByJs(url, idList) {
+			var form = $("<form>");   //定义一个form表单
+			form.attr('style', 'display:none');   //在form表单中添加查询参数
+			form.attr('target', '');
+			form.attr('method', 'get');
+			form.attr('action', url);
+
+			var input1 = $('<input>');
+			input1.attr('type', 'hidden');
+			input1.attr('name', 'idList');
+			input1.attr('value', idList);
+
+			$('body').append(form);  //将表单放置在web中
+			form.append(input1);   //将查询参数控件提交到表单上
+			form.submit();
+		}
+
 		// 下载模板
 		$scope.download = function() {
 			if ($scope.currenctMaterial && $scope.currenctMaterial.length == 0) {
 				toaster.pop('info', '当前产品列表为空,无法下载');
 				return;
 			}
-			if ('standard' == $scope.standard_tab)
-				downloadByJs('trade/products/template/download/type', $scope.param.keyword, 'standard');
-			if ('unstandard' == $scope.standard_tab)
-				downloadByJs('trade/products/template/download/type', $scope.param.keyword, 'nStandard');
+			if ($scope.chooseAllPage) {
+				if ('standard' == $scope.standard_tab)
+					downloadByJs('trade/products/template/download/type', $scope.param.keyword, 'standard');
+				if ('unstandard' == $scope.standard_tab)
+					downloadByJs('trade/products/template/download/type', $scope.param.keyword, 'nStandard');
+			} else {
+				$scope.getChoosedInfo();
+				if (!$scope.choosedIds || $scope.choosedIds.length == 0) {
+					toaster.pop("info", "您尚未选中任何产品");
+					return ;
+				}
+				var idStr = $scope.choosedIds.join(',');
+				downloadSelectedByJs('trade/products/template/selected/data', idStr);
+			}
 		};
 
 		//初始化页数信息
@@ -1071,8 +1188,15 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 				$scope.materialAll = data;
 				$scope.currenctMaterial = data.content;
 				updateTagCount();
+				if ($scope.currenctMaterial.length == 0) {
+					$scope.chooseAllPage = false;
+				}
 				angular.forEach($scope.currenctMaterial, function (material, index) {
-					material.isChoosed = false;
+					if ($scope.chooseAllPage) {
+						material.isChoosed = true;
+					} else {
+						material.isChoosed = false;
+					}
 					material.submitProduct = {
 						brand: {},
 						commponent: {},
@@ -1087,8 +1211,8 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 				});
 				$scope.param.currentPage = data.number;
 				$scope.acculatePages(data.number, data.totalPages);
-				$scope.isChoosedAll = false;
 				$scope.choosedIds = [];
+				$scope.chooseAll = false;
 			}, function (response) {
 
 			})
@@ -1731,7 +1855,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			$scope.goods.editPackaging = (data && data.packaging) || product.packaging || '无';
 			$scope.goods.editProduceDate = (data && data.produceDate) || product.produceDate;
 			$scope.goods.editMinPackQty = (data && data.minPackQty) || product.minPackQty || $scope.goods.minBuyQty || 1;
-			$scope.goods.editMinBuyQty = (data && data.minBuyQty) || $scope.goods.minPackQty;
+			$scope.goods.editMinBuyQty = (data && data.minBuyQty) || $scope.goods.minPackQty || $scope.goods.editMinPackQty;
 			$scope.goods.editMinBuyQty = $scope.goods.editMinBuyQty - ($scope.goods.editMinBuyQty % $scope.goods.editMinPackQty);
 			if ($scope.goods.editMinBuyQty < $scope.goods.editMinPackQty) {
 				$scope.goods.editMinBuyQty = $scope.goods.editMinPackQty;
@@ -2777,13 +2901,13 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 
         // 确认删除
         $scope.confirmDelete = function () {
-            if(deleteMaterial) {
-                if(selectAll) {
-                    if(standard_tab == 'standard') {
+            if (deleteMaterial) {
+                if (selectAll) {
+                    if (standard_tab == 'standard') {
                         Material.deleteStandardAll(null, null, function (data) {
-                            if(data.code != 1) {
+                            if (data.code != 1) {
                                 toaster.pop('error','错误' ,data.message);
-                            }else {
+                            } else {
                                 toaster.pop('success', '删除成功');
 								$scope.deleteModal = false;
                                 $modalInstance.close(data);
@@ -2791,7 +2915,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
                         }, function (response) {
                             toaster.pop('error', '错误', response.data);
                         });
-                    }else {
+                    } else {
                         Material.deleteUnstandardAll(null, null, function (data) {
                             if(data.code != 1) {
                                 toaster.pop('error', '错误', data.message);
@@ -2804,7 +2928,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
                             toaster.pop('error', '错误', response.data);
                         });
                     }
-                }else {
+                } else {
                     if(!$scope.ids || $scope.ids.length == 0) {
                         toaster.pop('warning', '提示','请选择要删除的信息');
                         return ;
@@ -2818,8 +2942,8 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
                         toaster.pop('error', response.data);
                     });
                 }
-            }else if(deleteGoods){
-                if(!$scope.ids || $scope.ids.length < 1) {
+            } else if (deleteGoods) {
+                if (!$scope.ids || $scope.ids.length < 1) {
                     return ;
                 }
                 Goods.deleteGoodsById({id: $scope.ids[0]}, function (data) {

+ 1 - 9
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialPersonCtrl.js

@@ -1,7 +1,7 @@
 define([ 'app/app', 'jquery-uploadify' ], function(app) {
 	'use strict';
 	app.register.controller('vendor_materialPersonCtrl', ['$scope', '$rootScope', 'Material', 'toaster', 'ComponentActive', 'Enterprise', '$q', 'NumberService', '$location', '$stateParams', 'Search', '$modal', 'ComponentActiveAPI', 'BrandSubmit', 'BrandActiveAPI', 'DistributionRule', 'prodRepositoryService', 'AuthenticationService', 'StoreInfo', 'ProductServiceQuery', 'StoreCms', 'ByteCountService', 'Goods', function ($scope, $rootScope, Material, toaster, ComponentActive, Enterprise, $q, NumberService, $location, $stateParams, Search, $modal, ComponentActiveAPI, BrandSubmit, BrandActiveAPI, DistributionRule, prodRepositoryService, AuthenticationService, StoreInfo, ProductServiceQuery, StoreCms, ByteCountService, Goods) {
-		$rootScope.active = 'vendor_material_person';
+		$rootScope.active = 'vendor_material';
 		document.title = '卖家产品库-优软商城';
 		$scope.tab = 'material_person';
 		$scope.standard_tab = $stateParams.standardParam ? $stateParams.standardParam : 'unstandard';
@@ -62,14 +62,6 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			loadData();
 		}
 
-		if ($location.$$path.endsWith('vendor_material_unstandard_erp')) {
-			$scope.tab = 'unstandard_material';
-			// $scope.standard_tab = 'unstandard';
-            $scope.param.type = "nStandard";
-            // $scope.param.sorting = {code : 'ASC'};
-            $scope.isBatch = false;
-		}
-
 		$scope.goods = { breakUp: 1, isSelfSupport: 1, prices: [{}] };
 		$scope.isSelfSupport = true;
 		$scope.showShelfArea = showShelfArea;

+ 1 - 2
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js

@@ -514,8 +514,7 @@ define([ 'app/app' ], function(app) {
                     tag = tag.parentElement;
                 }
             };
-            window.open("/store/"+
-                commodity.storeid+"/" + commodity.batchCode);
+            window.open("/store/productDetail/" + commodity.batchCode);
         };
 
         /**

+ 68 - 51
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js

@@ -1,6 +1,6 @@
 define([ 'app/app' ], function(app) {
 	'use strict';
-	app.register.controller('vendorUploadCtrl', ['$scope', '$rootScope', 'ngTableParams', '$upload', '$q', 'AuthenticationService', 'BaseService', 'StoreInfo', 'SessionService', '$modal', 'toaster', 'ReleaseProductByBatch', 'Loading', 'Enterprise', 'DistributionRule', '$state', function ($scope, $rootScope, ngTableParams, $upload, $q, AuthenticationService, BaseService, StoreInfo, SessionService, $modal, toaster, ReleaseProductByBatch, Loading, Enterprise, DistributionRule, $state) {
+	app.register.controller('vendorUploadCtrl', ['$scope', '$rootScope', 'ngTableParams', '$upload', '$q', 'AuthenticationService', 'BaseService', 'StoreInfo', 'SessionService', '$modal', 'toaster', 'ReleaseProductByBatch', 'Loading', 'Enterprise', 'DistributionRule', '$state', '$location', function ($scope, $rootScope, ngTableParams, $upload, $q, AuthenticationService, BaseService, StoreInfo, SessionService, $modal, toaster, ReleaseProductByBatch, Loading, Enterprise, DistributionRule, $state, $location) {
 	    if (!$rootScope.$$productOn) {
             $rootScope.$$productOn = {};
             $rootScope.$$productOn.leadIn = 'bathOn';
@@ -15,12 +15,23 @@ define([ 'app/app' ], function(app) {
                 $state.reload();
             }
         };
+        if ($location.$$search.type && $location.$$search.type == 'self') {
+            $rootScope.$$productOn.tab = 'bathOnPerson';
+        } else if ($location.$$search.type && $location.$$search.type == 'company'){
+            $rootScope.$$productOn.tab = 'bathOn';
+        }
         $scope.deletePop = false;
         $scope.personMedol =false;
         $scope.setPersonMedol = function () {
             $scope.personMedol =false;
         };
 
+        $scope.showTip = true;
+
+        $scope.closeTip = function () {
+            $scope.showTip = false;
+        }
+
         //获取币别信息
         Enterprise.getCurrencyByRegisterAddress(null, function (data) {
             if(data.code == 1) {
@@ -38,6 +49,12 @@ define([ 'app/app' ], function(app) {
         //批量发布的类型
         $scope.batch.sellType = null;
 
+
+        $scope.repeatImport = 0;
+		$scope.switchImport = function (type) {
+			$scope.repeatImport = type;
+		};
+
         //翻页的信息
         $scope.pageParams = {};
 
@@ -199,56 +216,56 @@ define([ 'app/app' ], function(app) {
             }
         };
 
-        // 上传Excel批量发布(大量)
-        $scope.upload = function() {
-            if(($scope.batch.myFiles == null) || ($scope.batch.myFiles.length == 0)) {
-                return ;
-            }
-            var file = $scope.batch.myFiles[0];
-            if(!file) {
-                toaster.pop('info', '请选择需要上传的文件');
-                return;
-            }
-            if ($rootScope.$$productOn.tab === 'bathOnPerson') {
-                var param = {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency, isPerson : 1};
-            } else {
-                var param = {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency};
-            }
-            $upload.upload({
-                url: 'release/product/release/excel',
-                file: file,
-                method: 'POST',
-                params : param
-            }).success(function(data) {
-                $scope.selectFile(' ');
-                $scope.batch.myFiles = [];
-                $scope.proInfo = data.info;
-                $scope.result = data;
-                $scope.hadImport = false;
-                // var message = "";
-                // if($scope.result.success) {
-                // 	message = '标准产品' + $scope.result.success + '个';
-                // }
-                // if($scope.result.failure) {
-                // 	if(message) {
-                // 		message = message + ',非标产品' + $scope.result.failure +  '个';
-                // 	}else {
-                // 		message = '非标产品' + $scope.result.failure +  '个';
-                // 	}
-                // }
-                // if($scope.result.filter) {
-                // 	if(message) {
-                // 		message = message + ',过滤' + $scope.result.filter +  '条';
-                // 	}else {
-                // 		message = '过滤' + $scope.result.filter +  '条';
-                // 	}
-                // }
-                // if(!message) {
-                // 	message = '没有提交任何信息'
-                // }
-                toaster.pop('info', '提示', '上传完成');
-                $scope.relTableParams.page(1);
-                $scope.relTableParams.reload();
+		// 上传Excel批量发布(大量)
+		$scope.upload = function() {
+			if(($scope.batch.myFiles == null) || ($scope.batch.myFiles.length == 0)) {
+				return ;
+			}
+			var file = $scope.batch.myFiles[0];
+			if(!file) {
+				toaster.pop('info', '请选择需要上传的文件');
+				return;
+			}
+			if ($rootScope.$$productOn.tab === 'bathOnPerson') {
+				var param = {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency, isPerson : 1};
+			} else {
+                var param = {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency, repeatImport : $scope.repeatImport};
+			}
+			$upload.upload({
+				url: 'release/product/release/excel',
+				file: file,
+				method: 'POST',
+				params : param
+			}).success(function(data) {
+				$scope.selectFile(' ');
+				$scope.batch.myFiles = [];
+				$scope.proInfo = data.info;
+				$scope.result = data;
+				$scope.hadImport = false;
+				// var message = "";
+				// if($scope.result.success) {
+				// 	message = '标准产品' + $scope.result.success + '个';
+				// }
+				// if($scope.result.failure) {
+				// 	if(message) {
+				// 		message = message + ',非标产品' + $scope.result.failure +  '个';
+				// 	}else {
+				// 		message = '非标产品' + $scope.result.failure +  '个';
+				// 	}
+				// }
+				// if($scope.result.filter) {
+				// 	if(message) {
+				// 		message = message + ',过滤' + $scope.result.filter +  '条';
+				// 	}else {
+				// 		message = '过滤' + $scope.result.filter +  '条';
+				// 	}
+				// }
+				// if(!message) {
+				// 	message = '没有提交任何信息'
+				// }
+				toaster.pop('info', '提示', '上传完成');
+				$scope.relTableParams.page(1);
+				$scope.relTableParams.reload();
                 if ($rootScope.$$productOn.tab === 'bathOnPerson') {
                     publicPersonProduct();
                 }

+ 2 - 2
src/main/webapp/resources/view/admin/ads/ads_brand.html

@@ -8,8 +8,8 @@
             <div class="fullscreen" style="padding: 10px;overflow-y:auto;">
                 <table ng-table="brandsTableParams" class="table table-condensed table-bordered table-striped">
                     <tr ng-repeat="brand in $data">
-                        <td data-title="'品牌名'" filter="{nameCn: 'text'}">{{brand.nameCn}}</td>
-                        <td data-title="'厂商'" filter="{nameCn: 'text'}">{{brand.nameCn}}</td>
+                        <td data-title="'英文品牌名'" filter="{nameCn: 'text'}">{{brand.nameEn}}</td>
+                        <td data-title="'中文品牌名'" filter="{nameCn: 'text'}">{{brand.nameCn}}</td>
                         <td data-title="'权重'" >{{brand.weight}}</td>
                         <td data-title="'操作'">
                             <button ng-click="updateweight(brand)" class="btn btn-danger btn-sm" ng-if="!brand.weight"><i class="fa fa-check"></i> 推广</button>

+ 0 - 2
src/main/webapp/resources/view/common/modal/delivery_rule_modal.html

@@ -7,8 +7,6 @@
         background-color: white;
         top: 55%;
         left: 50%;
-        height: 155px;
-        width: 290px;
         margin: -145px 0 0 -77px;
     }
     .com-del-box{

+ 1 - 1
src/main/webapp/resources/view/common/sidebar.html

@@ -409,7 +409,7 @@
 						</div>
 					</dd>-->
 					<dd ng-repeat="item in history | limitTo : 8">
-						<a ng-show="item.status== 1" href="{{'store/' + item.storeid + '/' + item.batchCode}}" target="_blank"><span title="{{item.code}}" ng-bind="item.code"></span></a>
+						<a ng-show="item.status== 1" href="{{'store/productDetail/' + item.batchCode}}" target="_blank"><span title="{{item.code}}" ng-bind="item.code"></span></a>
 						<a ng-show="item.status== 0" disabled="disabled"><span sytle="color:#999;" title="{{item.code}}" ng-bind="item.code"></span></a>
 						<div class="hover-shows">
 							<em ng-class="{ 'off' : item.status== 0}"></em>

+ 6 - 0
src/main/webapp/resources/view/prod/modal/edit-invoice-modal.html

@@ -607,6 +607,12 @@
     .modal-lg {
         width: 914px;
     }
+    .modal-content {
+        overflow-y: auto;
+        max-height: 520px;
+        overflow-x: hidden;
+        height: auto !important;
+    }
 </style>
 
 <div id="bill-info">

+ 1 - 1
src/main/webapp/resources/view/usercenter/forstore/browsing_history.html

@@ -423,7 +423,7 @@
         <ul>
             <li ng-class="{'select': isBatch&& !item.active ,'isselect': isBatch&& item.active }" ng-repeat="item in his.dateList" ng-click="setActive(item)">
                 <div class="img">
-                    <a name="detail" href="{{'store/' + item.storeid + '/' + item.batchCode}}">
+                    <a name="detail" href="{{'store/productDetail/' + item.batchCode}}">
                         <img ng-src="{{item.img || '/static/img/store/common/default.png'}}"/></a>
                 </div>
                 <div class="content">

+ 4 - 3
src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html

@@ -538,6 +538,7 @@
 	.com-del-box {
 		top: 101%!important ;
 		left: 24%!important ;
+		background: #fff !important;
 	}
 	.com-del-box .title{
 		width: 100%!important ;
@@ -620,12 +621,12 @@
 							</span>
 							<span  class="wid24">
 								<div class="pro_xq">
-									<a href="store/{{store.arr[0].storeUuid}}/{{::cart.batchCode}}" target="_blank">
+									<a href="store/productDetail/{{::cart.batchCode}}" target="_blank">
                                         <img ng-src="{{cart.img || 'static/img/store/common/default.png'}}" width="60" height="60"/></a>
 									<div class="car_pro_xq">
 									    <i class="text-hidden" ng-if="!cart.uuid">类目:<a ng-bind="::cart.kiName || '-'" title="{{::cart.kiName}}" class="unstand"></a></i>
 									    <i class="text-hidden" ng-if="cart.uuid">类目:<a href="product/kind/{{cart.goods.kindUuid}}" target="_blank" ng-bind="::cart.kiName" title="{{::cart.kiName}}"></a></i>
-									    <i class="text-hidden">型号:<a href="store/{{store.arr[0].storeUuid}}/{{::cart.batchCode}}" target="_blank" ng-bind="::cart.code || '-'" title="{{::cart.code}}"></a></i>
+									    <i class="text-hidden">型号:<a href="store/productDetail/{{::cart.batchCode}}" target="_blank" ng-bind="::cart.code || '-'" title="{{::cart.code}}"></a></i>
 									   <i class="text-hidden" ng-if="!cart.uuid">品牌:<a ng-bind="::cart.goods.brandNameEn || '-'" title="{{::cart.goods.brandNameEn}}" class="unstand"></a></i>
 									   <i class="text-hidden" ng-if="cart.uuid">品牌:<a href="product/brand/{{::cart.goods.branduuid}}/" target="_blank" ng-bind="::cart.goods.brandNameEn" title="{{::cart.goods.brandNameEn}}"></a></i>
 									</div>
@@ -710,7 +711,7 @@
 											<ul>
 												<li ng-repeat="similar in cart.similarities">
 													<div class="img">
-														<a href="store/{{similar.storeid}}/{{::similar.batchCode}}"><img ng-src="{{similar.img || 'static/img/store/common/default.png'}}" alt="" /></a>
+														<a href="store/productDetail/{{::similar.batchCode}}"><img ng-src="{{similar.img || 'static/img/store/common/default.png'}}" alt="" /></a>
 													</div>
 													<div class="content">
 														<p class="red" ng-if="similar.minPriceRMB">

+ 2 - 2
src/main/webapp/resources/view/usercenter/forstore/buyer_order.html

@@ -842,11 +842,11 @@
 						</span>
 						<span class="wd02" ng-class="{true : 'order-border-bottom-solid',false : 'order-border-bottom-dashed'}[$index == order.orderDetails.length - 1 || $index == 2]">
 							<div class="pro_xq">
-								<a href="store/{{::order.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
+								<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
 								<p>
 									类目:<a href="product/kind/{{::detail.kindUuid}}" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="detail.uuid"/>
 									<a class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="!detail.uuid"/>
-									型号:<a href="store/{{::order.storeid}}/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
+									型号:<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
 									品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.brName || '-'" title="{{::detail.brName}}"></em></a>
 									<a  class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.brName || '-'" title="{{::detail.brName}}"></em></a>
 								</p>

+ 1 - 1
src/main/webapp/resources/view/usercenter/forstore/home_center.html

@@ -137,7 +137,7 @@
                         <p title="{{commodity.code}}">{{commodity.code}}</p>
                         <p>产品数量:{{commodity.reserve}}</p>
                         <p title="{{commodity.kindNameCn}}">品牌名称:{{commodity.kindNameCn}}</p>
-                        <a ng-href="{{'store/' + commodity.storeid + '/' + commodity.batchCode}}" class="click_bt01 bg_red" target="_blank">点击进入</a>
+                        <a ng-href="{{'store/productDetail/' + commodity.batchCode}}" class="click_bt01 bg_red" target="_blank">点击进入</a>
                     </dd>
                 </dl>
             </div>

+ 2 - 2
src/main/webapp/resources/view/usercenter/forstore/order_detail.html

@@ -439,7 +439,7 @@
 					<div ng-class="{'limit-3': !open}" style="width: 100%; margin: 0 auto; overflow: hidden;">
 						<dd class="oder_l" ng-repeat="detail in order.orderDetails">
                         <span class="wd02">
-                            <a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank">
+                            <a href="store/productDetail/{{::detail.batchCode}}" target="_blank">
 								<img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/>
 							</a>
                             <p class="style01" style="margin-top: 10px;" ng-if="detail.uuid">类目:
@@ -449,7 +449,7 @@
 								<a ng-bind="detail.kiName || '-'"  title="{{detail.kiName}}" class="unstand"></a>
 							</p>
 							<p class="style01">型号:
-								<a ng-bind="detail.cmpCode || '-'" href="store/{{::detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+								<a ng-bind="detail.cmpCode || '-'" href="store/productDetail/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
 							<p class="style01" ng-if="detail.uuid">品牌:
 								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>

+ 2 - 2
src/main/webapp/resources/view/usercenter/forstore/order_pay.html

@@ -721,11 +721,11 @@
 						</dd>
 						<dd class="oder_l" ng-repeat="detail in details">
                         <span class="wd02">
-                            <a  href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" href="javascript:void(0)"> <img ng-src="{{detail.img || 'static/img/store/common/default.png'}}"/></a>
+                            <a  href="store/productDetail/{{::detail.batchCode}}" target="_blank" href="javascript:void(0)"> <img ng-src="{{detail.img || 'static/img/store/common/default.png'}}"/></a>
 							<div class="style-type">
 								<p title="{{detail.kiName}}" ng-if="detail.uuid"><a href="product/kind/{{detail.goodsHistory.kindUuid}}" target="_blank" style="color: #323232">类目:<b ng-bind="detail.kiName || '-'"></b></a></p>
 								<p title="{{detail.kiName}}" ng-if="!detail.uuid"><a style="color: #323232" class="unstand">类目:<b ng-bind="detail.kiName || '-'"></b></a></p>
-								<p><a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode || '-'" title="{{detail.cmpCode}}"></b></a></p>
+								<p><a href="store/productDetail/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode || '-'" title="{{detail.cmpCode}}"></b></a></p>
 								<p  ng-if="detail.uuid"><a href="product/brand/{{detail.branduuid}}/" target="_blank" style="color: #323232">品牌:<b ng-bind="detail.brName || '-'" style="color: #323232" title="{{detail.brName}}"></b></a></p>
 								<p ng-if="!detail.uuid"><a style="color: #323232" class="unstand">品牌:<b ng-bind="detail.brName || '-'" style="color: #323232" title="{{detail.brName}}"></b></a></p>
 							</div>

+ 2 - 2
src/main/webapp/resources/view/vendor/forstore/purchase_detail.html

@@ -491,7 +491,7 @@
 					<div ng-class="{'limit-3': !open}" style="width: 100%; margin: 0 auto; overflow: hidden;">
 						<dd class="oder_l" ng-repeat="detail in purchase.purchaseDetails">
 						<span class="wd02">
-							<a href="store/{{::detail.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/></a>
+							<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/></a>
 							<p class="style01" style="margin-top: 10px;" ng-if="detail.uuid">类目:
 								<a ng-bind="detail.kiName || '-'" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
 							</p>
@@ -499,7 +499,7 @@
 								<a ng-bind="detail.kiName || '-'" title="{{detail.kiName}}" class="unstand"></a>
 							</p>
 							<p class="style01">型号:
-								<a ng-bind="detail.cmpCode || '-'" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+								<a ng-bind="detail.cmpCode || '-'" href="store/productDetail/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
 							<p class="style01" ng-if="detail.uuid">品牌:
 								<a ng-bind="detail.brName || '-'" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>

+ 166 - 61
src/main/webapp/resources/view/vendor/forstore/vendor_material.html

@@ -177,7 +177,7 @@
 		margin-bottom: 16px;
 	}
 	.search-check .search{
-		width: 550px;
+		width: 532px;
 		margin-left: 150px;
 	}
 	.search-check .search .form-control{
@@ -215,26 +215,57 @@
 		font-size: 14px;
 		line-height: 35px;
 	}
-	.search-check .check a{
+	.search-check .check > .operate-btn{
 		font-size: 14px;
 		margin-right: 20px;
+		color: #fff !important;
+		background: #5078cb;
+		position: relative;
+		display: inline-block;
+		height: 30px;
+		line-height: 30px;
+		padding: 0 10px;
+		cursor: pointer;
+	}
+	.search-check .check > .operate-btn .expander {
+		position: absolute;
 		color: #333;
+		right: 0;
+		display: none;
+		height: 57px;
+		line-height: 26px;
+		text-align: center;
+		background: #fff;
+		bottom: -57px;
+		width: 98px;
+		z-index: 10;
+		border: 1px solid #e4e5e5;
 	}
-	.search-check .check a:hover{
-		color: #5078cb;
+	.search-check .check > .operate-btn.more-operate {
+		padding: 0;
+		width: 98px;
+		height: 30px;
+		line-height: 30px;
+		text-align: center;
+		display: inline-block;
 	}
-	.search-check .check .check-active{
-		margin-right: 15px;
+	.search-check .check > .operate-btn.more-operate:hover .expander {
+		display: block;
 	}
-	.search-check .check .check-active span{
-		font-weight: normal;
-		color: #333;
+	.search-check .check > .operate-btn.more-operate .expander span {
+		display: block;
 	}
-	.search-check .check .check-active span:hover{
+	.search-check .check > .operate-btn.more-operate .expander span:hover {
 		color: #5078cb;
-		cursor: pointer;
 	}
-	.search-check .check .check-active label{
+	.pro_management .table .check-active {
+		margin-right: 15px;
+		user-select: none;
+	}
+	.pro_management .table .check-active span {
+		color: #333 !important;
+	}
+	.pro_management .table .check-active label {
 		margin-right: 0 !important;
 	}
 	.check-input input{
@@ -1487,14 +1518,40 @@
 		position: absolute;
 		top: 45px;
 	}
+
+	.no-hover:hover {
+		background: none !important;
+	}
+	.standard-tab.table > tbody > tr.batch-tr {
+		height: 40px;
+	}
+	.standard-tab.table > tbody > tr.batch-tr.active {
+		position: fixed;
+		bottom: 0;
+		z-index: 2000;
+	}
+	.standard-tab.table > tbody > tr.batch-tr.active td {
+		width: 1029px;
+		border-top: 0;
+	}
+	.standard-tab.table > tbody > tr.batch-tr td {
+		padding: 0;
+		border-top: #dff3fd 1px solid;
+	}
+	.standard-tab.table>tbody>tr>td .batch-line {
+		width: 100%;
+		height: 40px;
+		background: #dff3fd;
+		line-height: 40px;
+	}
 </style>
 <div class="user_right fr">
 	<!--货品管理-->
 	<div class="pro_management device">
 		<div class="com_tab">
 			<ul class="fl" style="width: 100%">
-				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'material'}"><a ui-sref="vendor_material">企业产品库</a></li>
+				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
 				<li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
 			</ul>
@@ -1518,19 +1575,21 @@
 				<div class="search fl">
 					<input type="text" class="form-control" ng-model="param.keyword" ng-search="onSearch()" placeholder="类目/型号/品牌"/>
 					<button ng-click="onSearch()">搜索</button>
-					<a ng-click="download()">批量导出</a>
+					<!--<a ng-click="download()">批量导出</a>-->
 				</div>
 				<div class="check fr">
-					<a ng-show="!isBatch && standard_tab == 'unstandard'" ng-click="matchAll()"><span ng-show="!isBatch && standard_tab == 'unstandard'">一键匹配</span></a>
-					<a ng-show="!isBatch" ng-click="enterBatch()"><span ng-show="!isBatch">批量操作</span></a>
+					<div class="operate-btn" ng-click="setAllInPerson()"><span>加入个人产品库</span></div>
+					<div class="operate-btn" ng-show="standard_tab == 'unstandard'" ng-click="matchAll()"><span ng-show="standard_tab == 'unstandard'">匹配</span></div>
+					<div class="operate-btn more-operate">
+						<span>更多操作</span>
+						<span class="expander">
+							<span ng-click="download()">导出选中</span>
+							<span ng-click="deleteBatch()" name="delete-material">删除选中</span>
+						</span>
+					</div>
+					<!--<a ng-show="!isBatch" ng-click="enterBatch()"><span ng-show="!isBatch">批量操作</span></a>-->
 					<span class="check-btn" ng-show="isBatch">
-						<label class="check-active">
-							<input type="checkbox"  ng-click="chooseAll()" ng-checked="isChoosedAll" id="AllChoose"/>
-							<label for="AllChoose"></label>
-							<span>全选</span>
-						</label>
-						<a
-								ng-click="deleteBatch()" name="delete-material">删除</a>
+						<a ng-click="deleteBatch()" name="delete-material">删除</a>
 						<a ng-click="exitBatch()">取消</a>
 					</span>
 				</div>
@@ -1538,15 +1597,22 @@
 			<div class="wanted_list01">
 			<!--在售产品-->
 			<div class="tab">
-				<table class="public-tab table">
+				<table class="public-tab standard-tab table">
 					<thead>
 					<tr>
+						<th width="80">
+							<label class="check-active">
+								<input ng-disabled="currenctMaterial.length == 0" type="checkbox"  ng-click="chooseAllItem()" ng-checked="chooseAll || chooseAllPage" id="AllChoose"/>
+								<label for="AllChoose"></label>
+								<span>全选</span>
+							</label>
+						</th>
 						<th width="80">序号</th>
 						<th width="180">产品名称(类目)</th>
 						<th width="200">产品型号</th>
 						<th width="150">品牌</th>
 						<th width="100">单位</th>
-						<th width="80">封装</th>
+						<!--<th width="80">封装</th>-->
 						<th width="180">操作</th>
 					</tr>
 					</thead>
@@ -1557,19 +1623,21 @@
 					</tr>
 					</tbody>
 					<tbody>
-					<tr style="height: 14px;" ng-show="currenctMaterial.length > 0 && standard_tab == 'unstandard' && showTip">
-						<td colspan="7" class="hei17">
-							<span>*匹配成为标准产品方可通过器件选型、参数搜索展示</span><a ng-click="cancelTip()">&times;</a>
-						</td>
-					</tr>
+						<tr style="height: 14px;" ng-show="currenctMaterial.length > 0 && standard_tab == 'unstandard' && showTip">
+							<td colspan="7" class="hei17">
+								<span>*匹配成为标准产品方可通过器件选型、参数搜索展示</span><a ng-click="cancelTip()">&times;</a>
+							</td>
+						</tr>
 					</tbody>
 					<tbody ng-repeat="material in currenctMaterial">
 					<!--<tr ng-class="{ 'active': material.selected }" class="gre-bg">-->
 					<tr ng-class="{ 'active': material.selected, 'gre-bg' : material.exPandOper}">
 						<td class="check-input">
-							<span ng-show="isBatch"><input type="checkbox" ng-checked="material.isChoosed"  ng-click="chooseOne(material)"  id="{{$index+1}}"/><label for="{{$index+1}}"></label><br/></span>
-							<span
-									ng-show="!isBatch" ng-bind="(param.page - 1) * 10 + $index + 1"></span>
+							<span><input type="checkbox" ng-checked="material.isChoosed"  ng-click="chooseOne(material)"  id="{{$index+1}}"/><label for="{{$index+1}}"></label><br/></span>
+						</td>
+						<td>
+							<!--<span ng-show="isBatch"><input type="checkbox" ng-checked="material.isChoosed"  ng-click="chooseOne(material)"  id="{{$index+1}}"/><label for="{{$index+1}}"></label><br/></span>-->
+							<span ng-show="!isBatch" ng-bind="(param.page - 1) * 10 + $index + 1"></span>
 						</td>
 						<td>
 							<span ng-if="material.kind" ng-bind="material.kind" title="{{material.kind}}"></span>
@@ -1584,12 +1652,15 @@
 							<div class="ellipsis-div" ng-if="!material.pbranden" ng-bind="material.pbrand" title="{{material.pbrand}}"></div>
 						</td>
 						<td ng-bind="material.unit || 'PCS'" title="{{material.unit  || 'PCS'}}"></td>
-						<td>
-							<span ng-bind="material.encapsulation || '-'" title="{{material.encapsulation || '-'}}"></span>
-						</td>
+						<!--<td>-->
+							<!--<span ng-bind="material.encapsulation || '-'" title="{{material.encapsulation || '-'}}"></span>-->
+						<!--</td>-->
 						<td class="edit">
 							<span name="delete-material" ng-show="!isBatch && !material.exPandOper && !material.addGoodsOper" ng-click="deleteMaterial(material)"><span>删除</span></span>
-							<span ng-show="!isBatch && !material.exPandOper && !material.addGoodsOper" ng-click="showShelfArea(material)"><span>添加产品</span></span>
+							<span ng-show="!isBatch && !material.exPandOper && !material.addGoodsOper" ng-click="showShelfArea(material)">
+								<span ng-if="material.batchCount">添加产品</span>
+								<span ng-if="!material.batchCount">编辑上架</span>
+							</span>
 							<span ng-if="material.batchCount" ng-show="!isBatch && !material.exPandOper && !material.addGoodsOper" ng-click="expandGoods(material)"><span>展开<i class="fa fa-angle-down" style="margin-left:2px;"></i></span></span>
 							<!--收起-->
 							<span ng-show="!isBatch && material.exPandOper" ng-click="disExpandGoods(material)" class="packUp"><span>收起<i class="fa fa-angle-up" style="margin-left:2px;"></i></span></span>
@@ -1747,7 +1818,7 @@
 													<div class="content width140">
 														<p class="title"><span>包装:</span><span ng-bind="goods.packaging">盘装</span></p>
 														<p class="title"><span>生产日期:</span><span ng-bind="goods.produceDate">20160123</span></p>
-														<p class="title" ng-class="{'noBreak' : !goods.breakUp}" ng-bind="goods.breakUp ? '可拆卖' : '不可拆卖'">不可拆卖</p>
+														<p class="title" ng-class="{'noBreak' : !goods.breakUp}" ng-if="goods.breakUp" ng-bind="goods.breakUp ? '可拆卖' : '不可拆卖'">不可拆卖</p>
 													</div>
 													<div class="content width130">
 														<p class="title"><span>库存:</span><span ng-bind="goods.reserve">9023492</span></p>
@@ -1777,9 +1848,7 @@
 														<div class="input-list">
 															<button class="off" ng-click="editGoods(material, goods)">编辑</button>
 															<button ng-if="goods.status != 601 && goods.status != 602" class="ok" ng-click="putOn(material, goods)">上架</button>
-															<button class="ok" ng-click="isRecommendGoods(goods)" name =
-																	"delete-goods">删除
-															</button>
+															<button class="ok" ng-click="isRecommendGoods(goods)" name ="delete-goods">删除</button>
 														</div>
 													</div>
 												</div>
@@ -1805,8 +1874,7 @@
 														<a><img ng-src="{{goods.editPic || 'static/img/store/common/default.png'}}" alt="img"/></a>
 														<div class="edit-img">
 															<a ng-if="goods.editPic" ng-click="deleteImg(goods)" class="delete-img" title="删除"><i class="fa fa-trash"></i></a>
-															<a
-																	ng-click="editGoodsPicture(goods.editPic || 'static/img/store/common/default.png', goods)" title="修改图片"><img ng-src="static/img/icon/update-img.png" /></a>
+															<a ng-click="editGoodsPicture(goods.editPic || 'static/img/store/common/default.png', goods)" title="修改图片"><img ng-src="static/img/icon/update-img.png" /></a>
 														</div>
 													</div>
 													<div class="content margin10">
@@ -1940,6 +2008,23 @@
 						</td>
 					</tr>
 					</tbody>
+					<tbody>
+					<tr class="no-hover batch-tr" ng-if="(chooseAll || chooseAllPage) && currenctMaterial.length != 0">
+						<td colspan="7">
+							<div class="batch-line" ng-if="chooseAll && !chooseAllPage">
+								已选中当前页
+								<em class="red" ng-bind="materialAll.numberOfElements"></em>个产品,
+								<a ng-click="turnAllPage()" class="blue">点击此处</a>切换选中所有页面<em class="red" ng-bind="materialAll.totalElements"></em>个产品
+							</div>
+							<div class="batch-line" ng-if="chooseAllPage">
+								已选中所有页面
+								<em class="red" ng-bind="materialAll.totalElements"></em>个产品,
+								<a ng-click="cancelAllPage()" class="blue">点击此处</a>全部取消选中
+							</div>
+						</td>
+					</tr>
+					<!--<tr class="no-hover batch-tr" ng-if="chooseAll && !chooseAllPage" ng-class="{'active': $data.length > 10}">-->
+					</tbody>
 				</table>
 				<div class="empty" ng-if="currenctMaterial.length == 0">
 					<p class="empty-img">
@@ -1947,7 +2032,7 @@
 					</p>
 					<div class="empty-info">
 						<p class="grey"> 暂无产品信息,赶快上传让更多人看到你的产品吧 </p>
-						<a href="/vendor#/vendor_upload"><i></i>马上去上传</a>
+						<a href="vendor#/vendor_upload?type=company"><i></i>马上去上传</a>
 					</div>
 				</div>
 				<div class="record-line text-right" ng-if="currenctMaterial.length != 0">
@@ -2035,7 +2120,7 @@
 							<th width="120">产品名称(类目)</th>
 							<th width="120">品牌</th>
 							<th width="100">型号</th>
-							<th width="100">封装</th>
+							<!--<th width="100">封装</th>-->
 							<th width="80"></th>
 						</tr>
 						</thead>
@@ -2057,30 +2142,31 @@
                                 </select>
 							</td>
 							<td title="{{product.pcmpcode}}" ng-bind="product.pcmpcode || '-'">Lhhjhj-3</td>
-							<td title="{{product.encapsulation}}" ng-bind="product.encapsulation  || '-'">BGA</td>
+							<!--<td title="{{product.encapsulation}}" ng-bind="product.encapsulation  || '-'">BGA</td>-->
 							<td class="confirm"><span ng-if="product.matchresults.length != 0 && product.canMatch" ng-click="updateNStandardOne(product)">确认</span></td>
 						</tr>
 						</tbody>
 						<tr style="height: 40px;" class="no-hover">
 							<td colspan="7" style="border-bottom: none; padding: 0;">
-								<div class="record-line text-right">
-								<span class="set-count">
-									每页显示:
-									<!--<input type="text" value="10" class="form-control">-->
-									<!--<ul>-->
-									<!--<li>15</li>-->
-									<!--</ul>-->
-									<select ng-model="$$nonProduct.count" ng-change="fitCountToTable($$nonProduct.count)">
-										<option value="10">10</option>
-										<option value="15">15</option>
-										<option value="20">20</option>
-									</select>
-								</span>
+								<div class="record-line text-right" ng-if="chooseAllPage">
+									<span class="set-count">
+										每页显示:
+										<select ng-model="$$nonProduct.count" ng-change="fitCountToTable($$nonProduct.count)">
+											<option value="10">10</option>
+											<option value="15">15</option>
+											<option value="20">20</option>
+										</select>
+									</span>
 									显示<span>{{(param.currentPage - 1) * param.count + 1}}</span>-
 									<span ng-if="param.currentPage != materialAll.totalPages">{{param.currentPage * param.count}}</span>
 									<span ng-if="param.currentPage == materialAll.totalPages">{{materialAll.totalElements}}</span>
 									,共:<span style="color: #5078cb;">{{materialAll.totalElements}}</span>个
 								</div>
+								<div class="record-line text-right" ng-if="!chooseAllPage">
+									显示<span>1</span>-
+									<span ng-bind="currenctMaterial.length"></span>
+									,共:<span style="color: #5078cb;">{{currenctMaterial.length}}</span>个
+								</div>
 							</td>
 						</tr>
 						</tbody>
@@ -2141,7 +2227,7 @@
 							</div>
 							<div class="detail">
 								<div class="detail-title">销售方式:<span ng-bind="goods.selfSale">寄售</span></div>
-								<div class="detail-title" ng-bind="goods.breakUp ? '可拆卖':'不可拆卖'">不可拆卖</div>
+								<div class="detail-title" ng-bind="goods.breakUp ? '可拆卖':'不可拆卖'"></div>
 							</div>
 							<div class="detail width100">
 								<div class="title-price"><span>梯度/pcs</span><span>单价(<i ng-bind="goods.currencyName == 'RMB' ? '¥':'$'"></i>)</span></div>
@@ -2196,4 +2282,23 @@
         position: relative;
         top: 7px;
     }
-</style>
+</style>
+
+<script>
+	$(function(){
+		$(document).on('click', function () {
+			if ($(document).scrollTop() + $(window).height() < $('.record-line').offset().top + $('.record-line').height()) {
+				$('.standard-tab.table>tbody>tr.batch-tr').addClass('active')
+			} else {
+				$('.standard-tab.table>tbody>tr.batch-tr').removeClass('active')
+			}
+		})
+		$(window).bind("scroll",function() {
+			if ($(document).scrollTop() + $(window).height() < $('.record-line').offset().top + $('.record-line').height()) {
+				$('.standard-tab.table>tbody>tr.batch-tr').addClass('active')
+			} else {
+				$('.standard-tab.table>tbody>tr.batch-tr').removeClass('active')
+			}
+		});
+	})
+</script>

+ 14 - 8
src/main/webapp/resources/view/vendor/forstore/vendor_material_person.html

@@ -677,13 +677,16 @@
 		font-size: 14px;
 		color: #f15601;
 	}
-	.result a{
+	.result a.fr{
 		padding-right: 10px;
-		float: right;
 		font-size: 20px;
 		font-weight: bold;
 		color: #ef1d1d;
 	}
+    .result .operate-introduce {
+        font-size: 14px;
+        color: #5078cb;
+    }
 	.tab-head{
 		width: 100%;
 		height: 40px;
@@ -1493,8 +1496,8 @@
 	<div class="pro_management device">
 		<div class="com_tab">
 			<ul class="fl" style="width: 100%">
-				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'material'}"><a ui-sref="vendor_material">企业产品库</a></li>
+				<li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
 				<li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
 				<li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
 			</ul>
@@ -1525,12 +1528,11 @@
 					<a ng-show="!isBatch" ng-click="enterBatch()"><span ng-show="!isBatch">批量操作</span></a>
 					<span class="check-btn" ng-show="isBatch">
 						<label class="check-active">
-							<input type="checkbox"  ng-click="chooseAll()" ng-checked="isChoosedAll" id="AllChoose"/>
+							<input type="checkbox"  ng-click="chooseAll()" ng-checked="isChoosedAll" ng-disabled="currenctMaterial.length == 0" id="AllChoose"/>
 							<label for="AllChoose"></label>
 							<span>全选</span>
 						</label>
-						<a
-								ng-click="deleteBatch()" name="delete-material">删除</a>
+						<a ng-click="deleteBatch()" name="delete-material">删除</a>
 						<a ng-click="exitBatch()">取消</a>
 					</span>
 				</div>
@@ -1551,6 +1553,10 @@
 					</tr>
 					</thead>
 					<tbody class="bg-show">
+                    <div class="result" ng-if="resultTip"><span class="fl"><em>*</em>导入企业库的产品同时会进行上架销售并展示在店铺</span>
+                        <a href="help/helpDetail/56" target="_blank" class="operate-introduce">操作说明</a>
+                        <a ng-click="closeTip()" class="fr">&times;</a>
+                    </div>
 					<!--<tr style="height: 14px;" ng-show="!isBatch && standard_tab == 'standard'">-->
 					<tr style="height: 14px;">
 						<td colspan="6" class="hei18"></td>
@@ -1946,8 +1952,8 @@
 						<img src="static/img/all/empty-cart.png">
 					</p>
 					<div class="empty-info">
-						<p class="grey"> 暂无产品信息,赶快上传让更多人看到你的产品吧 </p>
-						<a href="/vendor#/vendor_upload"><i></i>马上去上传</a>
+						<p class="grey"> 创建您的个人产品库,可为您精准推送客户需求 </p>
+						<a href="vendor#/vendor_upload?type=self"><i></i>马上去上传</a>
 					</div>
 				</div>
 				<div class="record-line text-right" ng-if="currenctMaterial.length != 0">

+ 2 - 2
src/main/webapp/resources/view/vendor/forstore/vendor_onSale.html

@@ -728,8 +728,8 @@
     <div class="pro_management device">
         <div class="com_tab">
             <ul class="fl" style="width: 100%">
-                <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'material'}"><a ui-sref="vendor_material">企业产品库</a></li>
+                <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
                 <li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
                 <li class="down-goods">
@@ -866,7 +866,7 @@
                                 <span ng-bind="commodity.produceDate || '-'" title="{{commodity.produceDate}}" class="marginL5"></span>
                             </div>
                             <div class="margin0">
-                                <span ng-bind="commodity.breakUp ? '可拆卖' : '不可拆卖'" class="marginL5">可拆卖</span>
+                                <span ng-if="commodity.breakUp" class="marginL5">可拆卖</span>
                             </div>
                         </td>
                         <td>

+ 2 - 2
src/main/webapp/resources/view/vendor/forstore/vendor_order.html

@@ -1292,11 +1292,11 @@
 						<span class="wid01">&nbsp;</span>
 						<span class="wid02">
                             <div class="pro_xq">
-                               <a href="store/{{::purchase.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
+                               <a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
                                 <p class="componet-info">
                                     类目:<a href="product/kind/{{::detail.kindUuid}}" target="_blank" ng-if="detail.uuid"><em ng-bind="detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="detail.uuid"/>
                                     <a ng-if="!detail.uuid" class="unstand"><em ng-bind="detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="!detail.uuid"/>
-                                    型号:<a href="store/{{::purchase.storeid}}/{{::detail.batchCode}}" target="_blank"><em ng-bind="detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
+                                    型号:<a href="store/productDetail/{{::detail.batchCode}}" target="_blank"><em ng-bind="detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
                                     品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank" ng-if="detail.uuid"><em ng-bind="detail.brName || '-'" title="{{::detail.brName}}"></em></a>
                                     <a ng-if="!detail.uuid" class="unstand"><em ng-bind="detail.brName || '-'" title="{{::detail.brName}}"></em></a>
                                 </p>

+ 1 - 1
src/main/webapp/resources/view/vendor/forstore/vendor_undercarriage.html

@@ -553,8 +553,8 @@
     <div class="pro_management device">
         <div class="com_tab">
             <ul class="fl" style="width: 100%">
-                <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'vendor_material'}"><a ui-sref="vendor_material">企业产品库</a></li>
+                <li ng-class="{'active': tab == 'material_person'}"><a ui-sref="vendor_material_person">个人产品库</a></li>
                 <li ng-class="{'active': tab == 'onSale'}"><a ui-sref="vendor_onSale">在售产品</a></li>
                 <li ng-class="{'active': tab == 'undercarriage'}"><a ui-sref="vendor_undercarriage">上下架历史</a></li>
             </ul>

+ 51 - 3
src/main/webapp/resources/view/vendor/forstore/vendor_upload.html

@@ -461,16 +461,51 @@
         border-bottom: 1px solid #5078cb !important;
         color: #5078cb !important;
     }
+    .remind-line{
+        width: 100%;
+        height: 30px;
+        line-height: 30px;
+        text-align: center;
+        background: #fef6f2;
+        border: 1px solid #ec854d;
+        overflow: hidden ;
+    }
+    .remind-line span{
+        margin-left: 330px;
+        height: 30px;
+        font-size: 14px;
+        color: #f15601;
+    }
+    .remind-line a.fr{
+        padding-right: 10px;
+        font-size: 20px;
+        font-weight: bold;
+        color: #ef1d1d;
+    }
+    .remind-line .operate-introduce {
+        font-size: 14px;
+        color: #5078cb;
+    }
+    .device .wanted_list01 .pagination > li > a:hover {
+        border-bottom: 1px solid #ddd !important;
+        z-index: 0;
+    }
+    .device .wanted_list01 .pagination > li.active:hover > a {
+        border: 1px solid #337ab7 !important;
+        border-bottom: none !important;
+    }
 </style>
 <div class="user_right fr">
     <!--货品管理-->
     <div class="pro_management device">
         <div class="com_tab">
             <ul class="fl" style="width: 100%">
-                <li ng-class="{'active': $$productOn.tab == 'bathOn'}" ng-click="toggleActive('bathOn')"><a href="">批量发布</a></li>
-                <li ng-class="{'active': $$productOn.tab == 'bathOnPerson'}" ng-click="toggleActive('bathOnPerson')"><a href="">导入我的产品</a></li>
+                <li ng-class="{'active': $$productOn.tab == 'bathOn'}" ng-click="toggleActive('bathOn')"><a href="">导入企业库</a></li>
+                <li ng-class="{'active': $$productOn.tab == 'bathOnPerson'}" ng-click="toggleActive('bathOnPerson')"><a href="">导入个人库</a></li>
             </ul>
         </div>
+        <div class="remind-line" ng-show="$$productOn.tab == 'bathOn' && showTip"><span class="fl">导入企业库的产品同时会进行上架销售并展示在店铺</span><a ng-click="closeTip()" class="fr">&times;</a></div>
+        <div class="remind-line" ng-show="$$productOn.tab == 'bathOnPerson' && showTip"><span class="fl">创建您的个人产品库,可为您精准推送客户需求</span><a href="help/helpDetail/56" target="_blank" class="operate-introduce">操作说明</a><a ng-click="closeTip()" class="fr">&times;</a></div>
         <div class="wanted_list01">
             <div class="tab" ng-if="$$productOn.leadIn == 'bathOn'" ng-class="{'active': leadIn == 'bathOn'}" >
                 <div class="load_next" ng-class="{'border-none':open01}">
@@ -510,7 +545,20 @@
                                 <img ng-hide="batch.sellType == 'UAS'" src="static/img/upload/ziying-active.png" alt="">
                             </span>
                         </div>
-                        <div><span ng-if="$$productOn.tab == 'bathOn'">2、</span>请上传已经编辑好的库存表格,选择好上传的文件之后,点击确认上传</div>
+                        <div ng-if="$$productOn.tab == 'bathOn'">2、若存在属性完全相同但价格不一致的产品:</div>
+                        <div class="sale-label" style="margin-top: -10px;" ng-if="$$productOn.tab == 'bathOn'">
+                            <label class="sellType">
+                                <input type="radio" name="import" id="forIgnore" ng-model="repeatImport" value="0" ng-click="switchImport(0)">
+                                <label for="forIgnore"></label>
+                                <span>忽略不导入</span>
+                            </label>
+                            <label class="sellType">
+                                <input type="radio" name="import" id="forImport" ng-model="repeatImport" value="1" ng-click="switchImport(1)">
+                                <label for="forImport"></label>
+                                <span>作为新产品继续导入</span>
+                            </label>
+                        </div>
+                        <div><span ng-if="$$productOn.tab == 'bathOn'">3、</span>请上传已经编辑好的库存表格,选择好上传的文件之后,点击确认上传</div>
                         <div class="upload">
                             <div class="upload-content">
                                 <input type="text" name="txt" id="upload_text" />

+ 2 - 2
src/main/webapp/resources/view/vendor/left_nav.html

@@ -58,7 +58,7 @@
 	<!--	<li ng-class="{'active' : active == 'vendor_productOn'}"><span  ui-sref="vendor_productOn">产品导入</span></li>-->
 		<li ng-class="{'active' : active == 'vendor_productOn'}"><span  ui-sref="vendor_upload">产品导入</span></li>
 		<!--<li ng-class="{'active' : active == 'vendor_repository'}"><span  ui-sref="vendor_repository">仓库管理</span></li>-->
-		<li ng-class="{'active' : active == 'vendor_material_person'}"><span  ui-sref="vendor_material_person">产品管理</span></li>
+		<li ng-class="{'active' : active == 'vendor_material'}"><span  ui-sref="vendor_material">产品管理</span></li>
 		<!--<li ng-class="{'active' : active == 'vendor_after_sale'}" class="undo">-->
 		<!--&lt;!&ndash;<span  ui-sref="vendor_after_sale">售后处理</span>&ndash;&gt;-->
 		<!--售后处理-->
@@ -88,7 +88,7 @@
 			<!--	<li ng-class="{'active' : active == 'vendor_productOn'}"><span  ui-sref="vendor_productOn">产品导入</span></li>-->
 			<li ng-class="{'active' : active == 'vendor_productOn'}"><span ng-click="promptUpdate()" class="disabled" >产品导入</span></li>
 			<!--<li ng-class="{'active' : active == 'vendor_repository'}"><span  ui-sref="vendor_repository">仓库管理</span></li>-->
-			<li ng-class="{'active' : active == 'vendor_material_person'}"><span ng-click="promptUpdate()" class="disabled" >产品管理</span></li>
+			<li ng-class="{'active' : active == 'vendor_material'}"><span ng-click="promptUpdate()" class="disabled" >产品管理</span></li>
 			<!--<li ng-class="{'active' : active == 'vendor_after_sale'}" class="undo">-->
 			<!--&lt;!&ndash;<span  ui-sref="vendor_after_sale">售后处理</span>&ndash;&gt;-->
 			<!--售后处理-->