Browse Source

Merge branch 'liusw-seekpurchae-v2.0.1.13' into liusw-seekpurchase-v3.0.1.23

# Conflicts:
#	pom.xml
#	src/main/webapp/resources/css/common.css
yangc 8 years ago
parent
commit
be0028ad91
73 changed files with 2320 additions and 344 deletions
  1. 2 2
      pom.xml
  2. 6 3
      src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java
  3. 1 1
      src/main/java/com/uas/platform/b2c/common/account/dao/EnterpriseDao.java
  4. 1 1
      src/main/java/com/uas/platform/b2c/common/account/service/EnterpriseService.java
  5. 1 1
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  6. 5 0
      src/main/java/com/uas/platform/b2c/core/constant/IntegerConstant.java
  7. 79 8
      src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java
  8. 16 16
      src/main/java/com/uas/platform/b2c/logistics/service/impl/AddressServiceImpl.java
  9. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java
  10. 1 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  11. 40 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/GoodStatusEnum.java
  12. 20 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  13. 15 11
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  14. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  15. 55 0
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/UASBatchPutOnPropertyController.java
  16. 20 3
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  17. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsHistoryDao.java
  18. 20 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java
  19. 14 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDetailDao.java
  20. 15 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductPrivateDao.java
  21. 21 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/UASBatchPutOnPropertyDao.java
  22. 13 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/UASBatchPutOnPropertyHistoryDao.java
  23. 15 2
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java
  24. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductDetail.java
  25. 67 28
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductPerson.java
  26. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductPrivate.java
  27. 17 5
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  28. 145 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/UASBatchPutOnProperty.java
  29. 154 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/UASBatchPutOnPropertyHistory.java
  30. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  31. 12 2
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  32. 9 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java
  33. 17 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/UASBatchPutOnPropertyHistoryService.java
  34. 27 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/UASBatchPutOnPropertyService.java
  35. 132 10
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  36. 287 41
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  37. 69 40
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  38. 34 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/UASBatchPutOnPropertyHistoryServiceImpl.java
  39. 127 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/UASBatchPutOnPropertyServiceImpl.java
  40. 3 0
      src/main/java/com/uas/platform/b2c/prod/commodity/util/GoodsUtil.java
  41. 2 0
      src/main/resources/dev/sys.properties
  42. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-person.xls
  43. 2 0
      src/main/resources/prod/sys.properties
  44. 2 0
      src/main/resources/test/sys.properties
  45. 10 1
      src/main/webapp/resources/css/common.css
  46. 11 11
      src/main/webapp/resources/css/commonComponent.css
  47. 69 1
      src/main/webapp/resources/css/erp/align.css
  48. 1 2
      src/main/webapp/resources/css/pay.css
  49. 10 0
      src/main/webapp/resources/js/common/query/UASBatchPutOnProperty.js
  50. 5 0
      src/main/webapp/resources/js/common/query/material.js
  51. 2 2
      src/main/webapp/resources/js/usercenter/app.js
  52. 19 12
      src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
  53. 3 2
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_ctrl.js
  54. 73 13
      src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js
  55. 2 2
      src/main/webapp/resources/js/vendor/app.js
  56. 17 10
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_account_management_ctrl.js
  57. 250 49
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js
  58. 4 4
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialPersonCtrl.js
  59. 1 0
      src/main/webapp/resources/view/common/modal/delete_modal.html
  60. 1 1
      src/main/webapp/resources/view/common/modal/delivery_rule_modal.html
  61. 2 2
      src/main/webapp/resources/view/usercenter/forstore/account_manager.html
  62. 5 0
      src/main/webapp/resources/view/usercenter/forstore/home_center.html
  63. 1 1
      src/main/webapp/resources/view/usercenter/forstore/pay_center.html
  64. 45 10
      src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html
  65. 1 1
      src/main/webapp/resources/view/usercenter/left_nav.html
  66. 127 10
      src/main/webapp/resources/view/vendor/forstore/erp/vendor_material_erp.html
  67. 146 16
      src/main/webapp/resources/view/vendor/forstore/erp/vendor_material_unstandard_erp.html
  68. 2 2
      src/main/webapp/resources/view/vendor/forstore/vendor_account_management.html
  69. 2 2
      src/main/webapp/resources/view/vendor/forstore/vendor_material.html
  70. 1 1
      src/main/webapp/resources/view/vendor/forstore/vendor_material_person.html
  71. 6 1
      src/main/webapp/resources/view/vendor/forstore/vendor_upload.html
  72. 6 4
      src/main/webapp/resources/view/vendor/modal/updateUserEmail.html
  73. 8 5
      src/main/webapp/resources/view/vendor/modal/updateUserTel.html

+ 2 - 2
pom.xml

@@ -449,12 +449,12 @@
 		</dependency>
 		<dependency>
 			<groupId>com.uas.ps</groupId>
-			<artifactId>ps-entity</artifactId>
+			<artifactId>ps-core</artifactId>
 			<version>0.0.1-SNAPSHOT</version>
 		</dependency>
 		<dependency>
 			<groupId>com.uas.ps</groupId>
-			<artifactId>ps-core</artifactId>
+			<artifactId>ps-entity</artifactId>
 			<version>0.0.1-SNAPSHOT</version>
 		</dependency>
 		<!--Hutool POI工具类(对MS Office操作)-->

+ 6 - 3
src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java

@@ -214,10 +214,13 @@ public class EnterpriseController {
 			if (!CollectionUtils.isEmpty(applyUserSpacePage.getContent())) {
 				List<ApplyUserSpace> applyUserSpaceList = applyUserSpacePage.getContent();
 				for (ApplyUserSpace applyUserSpace : applyUserSpaceList) {
-					Enterprise e = enterpriseService.findByEnBussinessCode(applyUserSpace.getBusinessCode());
-					User admin = userService.findUserByUserUU(e.getEnAdminuu());
+					List<Enterprise> e = enterpriseService.findByEnBussinessCode(applyUserSpace.getBusinessCode());
+					User admin = null;
+					if (!CollectionUtils.isEmpty(e) && e.get(0).getEnAdminuu() != null) {
+						admin = userService.findUserByUserUU(e.get(0).getEnAdminuu());
+					}
 					Map<String,Object> map = new HashMap<>();
-					map.put("enName", e.getEnName());
+					map.put("enName", CollectionUtils.isEmpty(e) ? "" : e.get(0).getEnName());
 					map.put("date",applyUserSpace.getSubmitDate());
 					map.put("adminName",admin == null ? null : admin.getUserName());
 					map.put("status",applyUserSpace.getStatus());

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/dao/EnterpriseDao.java

@@ -25,5 +25,5 @@ public interface EnterpriseDao extends JpaSpecificationExecutor<Enterprise>, Jpa
 	 * @param bussinessCode
 	 * @return
 	 */
-	public Enterprise findByEnBussinessCode(String bussinessCode);
+	public List<Enterprise> findByEnBussinessCode(String bussinessCode);
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/service/EnterpriseService.java

@@ -44,7 +44,7 @@ public interface EnterpriseService {
 	 * @param bussinessCode
 	 * @return
 	 */
-	Enterprise findByEnBussinessCode(String bussinessCode);
+	List<Enterprise> findByEnBussinessCode(String bussinessCode);
 
 	/**
 	 * 个人用户注册企业信息

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java

@@ -57,7 +57,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 	}
 
 	@Override
-	public Enterprise findByEnBussinessCode(String bussinessCode) {
+	public List<Enterprise> findByEnBussinessCode(String bussinessCode) {
 		return enterpriseDao.findByEnBussinessCode(bussinessCode);
 	}
 

+ 5 - 0
src/main/java/com/uas/platform/b2c/core/constant/IntegerConstant.java

@@ -19,4 +19,9 @@ public class IntegerConstant {
      * 否Integer 类型
      */
     public static final Integer NO_SHORT = 0;
+
+    /**
+     * 默认单价的精确小数
+     */
+    public static final Integer PRICE_FRACTION = 6;
 }

+ 79 - 8
src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java

@@ -2,13 +2,18 @@ package com.uas.platform.b2c.external.erp.prod.service.impl;
 
 import com.uas.api.b2c_erp.seller.model.Prod;
 import com.uas.api.b2c_erp.seller.service.ProdService;
+import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.ErpB2cBufferedLogger;
 import com.uas.platform.b2c.external.erp.product.util.ModelConverter;
+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.ProductPrivateDao;
 import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.core.logging.BufferedLoggerManager;
@@ -16,6 +21,7 @@ import org.apache.log4j.Logger;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -37,6 +43,15 @@ public class ProdServiceImpl implements ProdService {
     @Autowired
     private StoreInDao storeInDao;
 
+    @Autowired
+    private GoodsDao goodsDao;
+
+    @Autowired
+    private ProductPrivateDao productPrivateDao;
+
+    @Autowired
+    private ReleaseProductByBatchService releaseProductByBatchService;
+
     private static final ErpB2cBufferedLogger logger = BufferedLoggerManager.getLogger(ErpB2cBufferedLogger.class);
 
     private final Logger loggerOut = Logger.getLogger(getClass());
@@ -46,16 +61,48 @@ public class ProdServiceImpl implements ProdService {
         List<Product> products = new ArrayList<Product>();
         Long enuu = SystemSession.getUser().getEnterprise().getUu();
         for (Prod prod : prods) {
-            List<Product> productExists = productDao.getProductByEnUUAndProdNum(enuu, prod.getPr_code());
-            Product product = ModelConverter.convert(prod);
-            if (!CollectionUtils.isEmpty(productExists)) {
-                Product existProduct = productExists.get(0);
-                BeanUtils.copyProperties(product, productExists.get(0), "id");
-                existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
-                products.add(existProduct);
+            if (StringUtils.isEmpty(prod.getPr_orispeccode()) || StringUtils.isEmpty(prod.getPr_brand())) {
+                List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(enuu,prod.getPr_orispeccode(),prod.getPr_brand(),IntegerConstant.YES_SHORT);
+                if (!CollectionUtils.isEmpty(productList)) {
+                    Product product = ModelConverter.convert(prod);
+                    Product existProduct = productList.get(0);
+                    BeanUtils.copyProperties(product, productList.get(0), "id");
+                    existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                    products.add(existProduct);
+                } else {
+                    List<Product> productExists = productDao.getProductByEnUUAndProdNum(enuu, prod.getPr_code());
+                    Product product = ModelConverter.convert(prod);
+                    if (!CollectionUtils.isEmpty(productExists)) {
+                        Product existProduct = productExists.get(0);
+                        BeanUtils.copyProperties(product, productExists.get(0), "id");
+                        existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                        products.add(existProduct);
+                    } else {
+                        products.add(product);
+                    }
+                }
             } else {
-                products.add(product);
+                List<Product> productExists = productDao.getProductByEnUUAndProdNum(enuu, prod.getPr_code());
+                Product product = ModelConverter.convert(prod);
+                if (!CollectionUtils.isEmpty(productExists)) {
+                    Product existProduct = productExists.get(0);
+                    BeanUtils.copyProperties(product, productExists.get(0), "id");
+                    existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                    products.add(existProduct);
+                } else {
+                    products.add(product);
+                }
+            }
+            ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(prod.getPr_id());
+            if (null == productPrivate) {
+                productPrivate = new ProductPrivate();
+                productPrivate.setPrId(prod.getPr_id());
             }
+            productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+            // 统计现在有多少在售信息
+            int batchCount = goodsDao.findCountByProductid(prod.getPr_id());
+            productPrivate.setBatchCount(batchCount);
+            productPrivateDao.save(productPrivate);
         }
         productDao.save(products);// 保存上传的物料
 
@@ -112,4 +159,28 @@ public class ProdServiceImpl implements ProdService {
         logger.log("物料资料", "ERP获取店铺路径,企业:" + SystemSession.getUser().getEnterprise().getEnName());
         return url;
     }
+
+    @Override
+    public String setB2cEnable(String pr_code, Integer isEnable) {
+        List<Product> productList = productDao.getProductByEnUUAndProdNum(SystemSession.getUser().getEnterprise().getUu(),pr_code);
+        if (!CollectionUtils.isEmpty(productList)) {
+            for (Product product : productList) {
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
+                if (null == productPrivate) {
+                    productPrivate = new ProductPrivate();
+                    productPrivate.setPrId(product.getId());
+                }
+                if (isEnable.equals(IntegerConstant.YES_SHORT)) {
+                    productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+                } else {
+                    productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
+                }
+                // 统计现在有多少在售信息
+                int batchCount = goodsDao.findCountByProductid(product.getId());
+                productPrivate.setBatchCount(batchCount);
+                productPrivateDao.save(productPrivate);
+            }
+        }
+        return "success";
+    }
 }

+ 16 - 16
src/main/java/com/uas/platform/b2c/logistics/service/impl/AddressServiceImpl.java

@@ -75,48 +75,48 @@ public class AddressServiceImpl implements AddressService {
 		Long useruu = address.getUseruu();
 		int type = address.getType();
 		List<Address> addresses = null;
-		if(useruu != null) {
+		if (Type.Address_Shipping_Code.value() == address.getType()) {
 			addresses = addressDao.findByUseruuAndEnuuAndTypeAndUsetypeOrderByNumAsc(useruu, address.getEnuu(), type, (short)1);
-		}else {
+		} else {
 			addresses = addressDao.findByEnuuAndTypeAndUsetypeOrderByNumAsc(address.getEnuu(), type, (short)2);
 		}
 		int num = 1;
-		long modifyId = address.getId().longValue();
-		int modifyNum = address.getNum().intValue();
-		if (setTop){
+		long modifyId = address.getId();
+		int modifyNum = address.getNum();
+		if (setTop) {
 			for (Address add : addresses) {
-				if (add.getId().longValue() == modifyId) {
+				if (add.getId() == modifyId) {
 					add.setNum(1);
 				} else {
 					// 这里拿到的已经是排序了的,直接依次设置num即可
 					add.setNum(++num);
 				}
 			}
-		}else {
-			if (modifyNum == 1){ //取消默认地址
+		} else {
+			if (modifyNum == 1) { //取消默认地址
 				for (Address add : addresses) { //空出默认地址位置
 					add.setNum(++num);
 				}
-			}else {
+			} else {
 				int firstNum = addresses.get(0).getNum();
-				if (firstNum == 1){ //有默认地址情况
+				if (firstNum == 1) { //有默认地址情况
 					num++; //空出默认地址位置
 					for (Address add : addresses) {
-						if (add.getNum() != 1){
-							if (add.getId().longValue() != modifyId){
+						if (add.getNum() != 1) {
+							if (add.getId() != modifyId) {
 								//不是修改的地址或者默认地址,则重新排序
 								add.setNum(++num);
-							}else {
+							} else {
 								add.setNum(2);
 							}
 						}
 					}
-				}else { //没有默认地址情况
+				} else { //没有默认地址情况
 					num++; //空出默认地址位置
 					for (Address add : addresses) {
-						if (add.getId().longValue() != modifyId){
+						if (add.getId() != modifyId) {
 							add.setNum(++num);
-						}else {
+						} else {
 							add.setNum(2);
 						}
 					}

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java

@@ -36,4 +36,14 @@ public class DoubleConstant {
      * 最大价格
      */
     public static final Double maxPrice = 10000d;
+
+    /**
+     * 最小的浮动率 值
+     */
+    public static final Double minFluctuateRate = 0.01d;
+
+    /**
+     * 最大的浮动率 值
+     */
+    public static final Double maxFluctuateRate = 2d;
 }

+ 1 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java

@@ -18,6 +18,7 @@ public enum  ErrorInfoConstant {
     PRODUCE_DATE_INFO("E列:生产日期不能为空"),
     PACKAGE_METHOD_INFO("F列:包装方式只能填写中英文"),
     PACKAGE_EMPTY_INFO("F列:包装方式不能为空"),
+    PERSON_PACKAGE_EMPTY_INFO("C列:规格信息不能为空"),
     DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
     DELIVERY_VALUE_INFO("G-H列:交期只能填写1-31之间的整数值"),
     PRICE_INFO("K列:单价必须是小于1万的正数"),

+ 40 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/GoodStatusEnum.java

@@ -0,0 +1,40 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * goods 的一些状态
+ *
+ * Created by yujia on 2018/1/20.
+ */
+public enum GoodStatusEnum {
+
+    discard("612-614", "废弃"),
+
+    IN_USE("601-602-613", "正在使用");
+
+    private String status;
+
+    private String message;
+
+    GoodStatusEnum(String status, String message) {
+        this.status = status;
+        this.message = message;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public GoodStatusEnum setStatus(String status) {
+        this.status = status;
+        return this;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public GoodStatusEnum setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}

+ 20 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java

@@ -11,8 +11,28 @@ public class StringConstant {
      */
     public static final String SELF_TAG = "类型";
 
+    /**
+     * 初始的标签
+     */
+    public static final String INIT_TAG = "类型1";
+
     /**
      * 商城单位
      */
     public static final String UNIT = "PCS";
+
+    /**
+     * erp 标识
+     */
+    public static final String ERP = "ERP";
+
+    /**
+     * 币别
+     */
+    public static final String RMB = "RMB";
+
+    /**
+     * 无物料
+     */
+    public static final String DEFAULTPACKAGING = "无";
 }

+ 15 - 11
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -1,17 +1,11 @@
 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.view.JxlsExcelView;
-import com.uas.platform.b2c.core.constant.SplitChar;
-import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.core.constant.SplitChar;
 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.*;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.trade.support.ResultMap;
@@ -238,16 +232,16 @@ public class ProductController {
 	 * 批量删除所有的非标的产品
 	 */
 	@RequestMapping(value = "/unstandard", method = RequestMethod.DELETE)
-	private ResultMap deleteUnstandardByBatch() {
-		 return productService.deleteBatch(ProductConstant.NSTANDARD);
+	private ResultMap deleteUnstandardByBatch(Integer isPerson) {
+		 return productService.deleteBatch(ProductConstant.NSTANDARD, isPerson);
 	}
 
 	/**
 	 * 批量删除所有的标准的产品
 	 */
 	@RequestMapping(value = "/standard", method = RequestMethod.DELETE)
-	private ResultMap deleteStandardByBatch() {
-		return productService.deleteBatch(ProductConstant.STANDARD);
+	private ResultMap deleteStandardByBatch(Integer isPerson) {
+		return productService.deleteBatch(ProductConstant.STANDARD, isPerson);
 	}
 
 	/**
@@ -296,7 +290,7 @@ public class ProductController {
 	 * @return
 	 */
 	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
-	public Product getProducts(@PathVariable("id") Long id) {
+	public V_ProductPrivate getProducts(@PathVariable("id") Long id) {
 		return productService.getProductById(id);
 	}
 
@@ -330,4 +324,14 @@ public class ProductController {
 	public ProductDetail saveDetail(@PathVariable("productId") Long productId, @RequestBody Goods goods) {
 		return productService.saveDetail(productId, goods);
 	}
+
+	/**
+	 * 用户批量上架
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/batch", method = RequestMethod.PUT)
+	public ResultMap batchPutOn(Integer standard, String ids) {
+		return productService.batchPutOn(standard, ids);
+	}
 }

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

@@ -296,7 +296,7 @@ public class ReleaseProductByBatchController {
         ModelAndView modelAndView = new ModelAndView();
         logger.log("商品批次", "下载批量上架商品的Excel模板");
         if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
-            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasebyBatch-person", "个人产品导入模板-优软商城"));
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releaseByBatch-person", "个人产品导入模板-优软商城"));
             return modelAndView;
         }
         if (Currency.USD.equals(currency)) {

+ 55 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/controller/UASBatchPutOnPropertyController.java

@@ -0,0 +1,55 @@
+package com.uas.platform.b2c.prod.commodity.controller;
+
+import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * UAS批量上架的参数设置
+ *
+ * @author yuj 2018-01-19 14:05
+ */
+@RestController
+@RequestMapping(value = "/UASBatchPutOnProperty")
+public class UASBatchPutOnPropertyController {
+
+    private final UASBatchPutOnPropertyService uasBatchPutOnPropertyService;
+
+    private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    @Autowired
+    public UASBatchPutOnPropertyController(UASBatchPutOnPropertyService uasBatchPutOnPropertyService) {
+        this.uasBatchPutOnPropertyService = uasBatchPutOnPropertyService;
+    }
+
+    /**
+     * 保存用户配置的信息
+     *
+     * @param property 传入的数据
+     * @return
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public ResultMap save(@RequestBody UASBatchPutOnProperty property) {
+        ResultMap resultMap = uasBatchPutOnPropertyService.save(property);
+        logger.log("UAS批量上架", "保存批量上架的配置信息");
+        return resultMap;
+    }
+
+    /**
+     * 获取的商城的配置信息
+     *
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET)
+    public UASBatchPutOnProperty getUASBatchPutOnProperty() {
+        logger.log("UAS批量上架", "获取配置信息");
+        return uasBatchPutOnPropertyService.get();
+    }
+}

+ 20 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java

@@ -470,6 +470,16 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Query(value = "select g from Goods g where g.sourceId =:sourceId")
 	List<Goods> findBySourceId(@Param("sourceId") Long id);
 
+    /**
+     * 查询物料id和指定状态的商品
+     *
+     * @param id
+     * @param statusList
+     * @return
+     */
+    @Query(value = "select g from Goods g where g.productid =:productId and g.status in :status order by g.id desc")
+    List<Goods> findByProductIdInStatus(@Param("productId") Long id, @Param("status") List<Integer> statusList);
+
 	/**
 	 * 根据productId 获取goods
 	 *
@@ -560,11 +570,18 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      * @param tag
      * @return
      */
-    @Query(value = "select g from Goods g where" +
-            " g.productid =:productid and g.tag " +
-            "=:tag")
+    @Query(value = "select g from Goods g where g.productid =:productid and g.tag =:tag")
     List<Goods> findGoodsByProductidAndTag(@Param("productid") Long productid, @Param("tag") String tag);
 
+    /**
+     * 根据productid 获取已经存在标签
+     *
+     * @param productid
+     * @return
+     */
+    @Query(value = "select g.tag from Goods g where g.productid =:productid")
+    List<String> findTagByProductid(@Param("productid") Long productid);
+
     /**
      *
      * @param length 长度

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

@@ -48,7 +48,7 @@ public interface GoodsHistoryDao extends JpaSpecificationExecutor<GoodsHistory>,
      * @param batchCode the batch code 批次号
      * @return the goods history
      */
-    @Query(value = "select g from GoodsHistory g where g.batchCode = :batchCode and g.id = (select max(c.id) from GoodsHistory c where c.batchCode = :batchCode)")
+    @Query(value = "select * from trade$goods_history where go_batchcode = :batchCode order by log_operate_date desc LIMIT 0, 1", nativeQuery = true)
 	GoodsHistory findNewByBatchCode(@Param("batchCode") String batchCode);
 
     /**

+ 20 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java

@@ -80,6 +80,18 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
             "p.pr_enuu=:enUU and p.pr_pcmpcode = :pcmpcode and p.pr_pbranden = :pbranden and pp.pr_b2cenabled = :b2cEnabled")
     List<Product> findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(@Param("enUU")Long enUU, @Param("pcmpcode")String pcmpcode, @Param("pbranden")String pbranden, @Param("b2cEnabled")Integer b2cEnabled);
 
+    /**
+     *
+     * @param enUU 企业enuu
+     * @param pcmpcode 型号
+     * @param pbranden 品牌
+     * @param b2cEnabled 启用
+     * @return
+     */
+    @Query(nativeQuery = true, 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 = :pcmpcode and p.pr_pbranden = :pbranden and pp.pr_b2cenabled = :b2cEnabled and p.pr_sourceapp <> :sourceApp")
+    List<Product> findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabledAndSourceApp(@Param("enUU")Long enUU, @Param("pcmpcode")String pcmpcode, @Param("pbranden")String pbranden, @Param("b2cEnabled")Integer b2cEnabled, @Param("sourceApp")String sourceApp);
+
 
     /**
      * 根据器件型号,品牌 、enuu
@@ -140,4 +152,12 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Query(value = "select p from Product p where p.enUU = :enuu and p.brand = :brand and p.cmpCode = :code and p.standard = :standard")
     List<Product> findMatchStandard(@Param("enuu") Long enuu, @Param("brand") String brand, @Param("code") String code, @Param("standard") Integer standard);
 
+    /**
+     * 根据数组查询 products 数组
+     * @param ids
+     * @return
+     */
+    @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);
+
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDetailDao.java

@@ -3,6 +3,10 @@ package com.uas.platform.b2c.prod.commodity.dao;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
 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 java.util.List;
 
 /**
  * Created by wangyc on 2017/10/28.
@@ -17,4 +21,14 @@ public interface ProductDetailDao extends JpaRepository<ProductDetail, Long>, Jp
      * @return
      */
     public ProductDetail findByProductId(Long productId);
+
+
+    /**
+     * 根据productids  找 ProductDetail
+     *
+     * @param pids productids
+     * @return
+     */
+    @Query(value = "select d from ProductDetail d where d.productId in (:pids) order by d.productId desc")
+    List<ProductDetail>  findByProductIds(@Param("pids") List<Long> pids);
 }

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

@@ -3,8 +3,22 @@ package com.uas.platform.b2c.prod.commodity.dao;
 import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
 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 java.util.List;
 
 public interface ProductPrivateDao  extends JpaRepository<ProductPrivate, Long>, JpaSpecificationExecutor<ProductPrivate> {
 
-    public ProductPrivate findByPrId(Long prId);
+    public List<ProductPrivate> findByPrId(Long prId);
+
+
+    /**
+     * 根据物料的id 获取私有信息
+     *
+     * @param prids
+     * @return
+     */
+    @Query(value = "select p from ProductPrivate p where p.prId in (:prids)")
+    List<ProductPrivate> findByPrIds(@Param("prids") List<Long> prids);
 }

+ 21 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/UASBatchPutOnPropertyDao.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by yujia on 2018/1/19.
+ */
+@Repository
+public interface UASBatchPutOnPropertyDao extends JpaRepository<UASBatchPutOnProperty, Long>, JpaSpecificationExecutor<UASBatchPutOnProperty> {
+
+    /**
+     * 根据企业enuu  获取配置信息
+     *
+     * @param enuu
+     * @return
+     */
+    UASBatchPutOnProperty findUASBatchPutOnPropertyByEnuu(Long enuu);
+}

+ 13 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/UASBatchPutOnPropertyHistoryDao.java

@@ -0,0 +1,13 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnPropertyHistory;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by yujia on 2018/1/19.
+ */
+@Repository
+public interface UASBatchPutOnPropertyHistoryDao extends JpaRepository<UASBatchPutOnPropertyHistory, Long>, JpaSpecificationExecutor<UASBatchPutOnPropertyHistory> {
+}

+ 15 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/dao/V_ProductPrivateDao.java

@@ -1,7 +1,5 @@
 package com.uas.platform.b2c.prod.commodity.dao;
 
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
-import com.uas.platform.b2c.prod.commodity.model.V_ProductPersonId;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -9,6 +7,21 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface V_ProductPrivateDao extends JpaRepository<V_ProductPrivate, Long>, JpaSpecificationExecutor<V_ProductPrivate> {
+
+    /**
+     * 根据器件型号,品牌 、enuu
+     *
+     * @param pcmpcode the pcmpcode 器件型号
+     * @param pbranden the pbranden 器件品牌
+     * @param enUU     the en uu enuu
+     * @param standard the standard 标准状态
+     * @return list
+     */
+    @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);
 }

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

@@ -86,7 +86,7 @@ public class ProductDetail implements Serializable{
     private String packaging;
 
     /**
-     * 单价
+     * 销售月单价
      */
     @Column(name = "prd_price")
     private Double price;

+ 67 - 28
src/main/java/com/uas/platform/b2c/prod/commodity/model/ProductPerson.java

@@ -1,47 +1,78 @@
 package com.uas.platform.b2c.prod.commodity.model;
 
-import com.uas.platform.b2c.common.account.model.UserBaseInfo;
-
 import javax.persistence.*;
+import java.io.Serializable;
 import java.util.Date;
 
 /**
- * 个人物料库
- * @author wangdy
+ * 用户个人产品库
  *
+ * Created by hejq on 2017-11-08.
  */
+@Table(name = "product$users")
 @Entity
-@Table(name = "products_person")
-public class ProductPerson {
+public class ProductPerson implements Serializable {
 
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
     @Id
-    @GeneratedValue
-    @Column(name = "pp_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "pu_id")
     private Long id;
 
-    @Column(name = "user_uu")
+    /**
+     * 用户uu
+     */
+    @Column(name = "pu_useruu")
     private Long userUU;
 
-    @Column(name = "pr_id")
-    private Long productId;
-
-    @Column(name = "up_time")
-    private Date time;
+    /**
+     * 企业uu,方便统计处理
+     */
+    @Column(name = "pu_enuu")
+    private Long enuu;
 
     /**
-     * 物料拥有者
+     * 物料id
      */
-    @OneToOne(cascade = { CascadeType.REFRESH })
-    @JoinColumn(name = "user_uu", insertable = false, updatable = false)
-    private UserBaseInfo user;
+    @Column(name = "pu_prid")
+    private Long productId;
 
     /**
-     * 物料明细
+     * 产品
      */
     @OneToOne(cascade = { CascadeType.REFRESH })
-    @JoinColumn(name = "pr_id", insertable = false, updatable = false)
+    @JoinColumn(name = "pu_prid", insertable = false, updatable = false)
     private Product product;
 
+    /**
+     * 日期
+     */
+    @Column(name = "pu_date")
+    private Date time;
+
+    /**
+     * 存在ERP同步过来数据的情况,记录id
+     */
+    @Column(name = "pu_erpid")
+    private Long erpid;
+
+    public ProductPerson() {
+
+    }
+
+    public ProductPerson(Long enUU, Long userUU, Long productId) {
+        this.setEnuu(enUU);
+        this.setUserUU(userUU);
+        this.setProductId(productId);
+    }
+
     public Long getId() {
         return id;
     }
@@ -58,20 +89,20 @@ public class ProductPerson {
         this.userUU = userUU;
     }
 
-    public Long getProductId() {
-        return productId;
+    public Long getEnuu() {
+        return enuu;
     }
 
-    public void setProductId(Long productId) {
-        this.productId = productId;
+    public void setEnuu(Long enuu) {
+        this.enuu = enuu;
     }
 
-    public UserBaseInfo getUser() {
-        return user;
+    public Long getProductId() {
+        return productId;
     }
 
-    public void setUser(UserBaseInfo user) {
-        this.user = user;
+    public void setProductId(Long productId) {
+        this.productId = productId;
     }
 
     public Product getProduct() {
@@ -89,4 +120,12 @@ public class ProductPerson {
     public void setTime(Date time) {
         this.time = time;
     }
+
+    public Long getErpid() {
+        return erpid;
+    }
+
+    public void setErpid(Long erpid) {
+        this.erpid = erpid;
+    }
 }

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

@@ -17,7 +17,7 @@ public class ProductPrivate {
     /**
      * 物料主键
      */
-    @Column(name = "pr_id", unique = true)
+    @Column(name = "pr_id" ,unique = true)
     private Long prId;
 
     /**

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

@@ -584,13 +584,25 @@ public class ReleaseProductByBatch implements Serializable {
 				}
 			}
 		} else {
-			addErrmsg(ErrorInfoConstant.PACKAGE_EMPTY_INFO.getInfo());
+			if (!isAPerson) {
+				addErrmsg(ErrorInfoConstant.PACKAGE_EMPTY_INFO.getInfo());
+			} else {
+				addErrmsg(ErrorInfoConstant.PERSON_PACKAGE_EMPTY_INFO.getInfo());
+			}
 		}
 		String packagingData = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(value));
-		try {
-			packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 10);
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e + "指定字符集不支持");
+		if (!isAPerson) {
+			try {
+				packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 10);
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		} else {
+			try {
+				packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 150);
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
 		}
 		setPackaging(packagingData);
 	}

+ 145 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/UASBatchPutOnProperty.java

@@ -0,0 +1,145 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * 批量上架设置
+ *
+ * @author yuj 2018-01-19 11:48
+ */
+@Entity
+@Table(name = "trade$uasbatchputonproperty")
+public class UASBatchPutOnProperty implements Serializable{
+
+
+    private static final long serialVersionUID = -8754103388134435773L;
+
+    @Id
+    @Column(name = "ubpp_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 最长交期
+     */
+    @Column(name = "ubpp_maxdelivery")
+    private Short maxDelivery;
+
+    /**
+     * 最短交期
+     */
+    @Column(name = "ubpp_mindelivery")
+    private Short minDelivery;
+
+    /**
+     * 上下浮动率
+     */
+    @Column(name = "ubpp_fluctuaterate")
+    private Double fluctuateRate;
+
+    /**
+     * 所属企业
+     */
+    @Column(name = "ubpp_enuu", unique = true)
+    private Long enuu;
+
+    /**
+     * 上架的企业
+     */
+    @Column(name = "ubpp_enname")
+    private String enName;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "ubpp_updatetime")
+    private Date updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public UASBatchPutOnProperty setId(Long id) {
+        this.id = id;
+        return this;
+    }
+
+    public Short getMaxDelivery() {
+        return maxDelivery;
+    }
+
+    public UASBatchPutOnProperty setMaxDelivery(Short maxDelivery) {
+        this.maxDelivery = maxDelivery;
+        return this;
+    }
+
+    public Short getMinDelivery() {
+        return minDelivery;
+    }
+
+    public UASBatchPutOnProperty setMinDelivery(Short minDelivery) {
+        this.minDelivery = minDelivery;
+        return this;
+    }
+
+    public Double getFluctuateRate() {
+        return fluctuateRate;
+    }
+
+    public UASBatchPutOnProperty setFluctuateRate(Double fluctuateRate) {
+        this.fluctuateRate = fluctuateRate;
+        return this;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public UASBatchPutOnProperty setEnuu(Long enuu) {
+        this.enuu = enuu;
+        return this;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public UASBatchPutOnProperty setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+        return this;
+    }
+
+    public String getEnName() {
+        return enName;
+    }
+
+    public UASBatchPutOnProperty setEnName(String enName) {
+        this.enName = enName;
+        return this;
+    }
+
+    public UASBatchPutOnProperty() {
+    }
+
+    public UASBatchPutOnProperty(Short maxDelivery, Short minDelivery, Double fluctuateRate, Long enuu, Date updateTime) {
+        this.maxDelivery = maxDelivery;
+        this.minDelivery = minDelivery;
+        this.fluctuateRate = fluctuateRate;
+        this.enuu = enuu;
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        return "UASBatchPutOnProperty{" +
+                "id=" + id +
+                ", maxDelivery=" + maxDelivery +
+                ", minDelivery=" + minDelivery +
+                ", fluctuateRate=" + fluctuateRate +
+                ", enuu=" + enuu +
+                ", updateTime=" + updateTime +
+                '}';
+    }
+}

+ 154 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/UASBatchPutOnPropertyHistory.java

@@ -0,0 +1,154 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * uas 上架配置记录
+ *
+ * @author yuj 2018-01-19 11:53
+ */
+@Entity
+@Table(name = "trade$uasbatchputonpropertyhist")
+public class UASBatchPutOnPropertyHistory implements Serializable {
+
+    private static final long serialVersionUID = 931368136734539832L;
+
+    @Id
+    @Column(name = "ubpph_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 最长交期
+     */
+    @Column(name = "ubpph_maxdelivery")
+    private Short maxDelivery;
+
+    /**
+     * 最短交期
+     */
+    @Column(name = "ubpph_mindelivery")
+    private Short minDelivery;
+
+    /**
+     * 上下浮动率
+     */
+    @Column(name = "ubpph_fluctuaterate")
+    private Double fluctuateRate;
+
+    /**
+     * 所属企业
+     */
+    @Column(name = "ubpph_enuu")
+    private Long enuu;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "ubpph_updatetime")
+    private Date updateTime;
+
+    /**
+     * 上架的企业
+     */
+    @Column(name = "ubpph_enname")
+    private String enName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public UASBatchPutOnPropertyHistory setId(Long id) {
+        this.id = id;
+        return this;
+    }
+
+    public Short getMaxDelivery() {
+        return maxDelivery;
+    }
+
+    public UASBatchPutOnPropertyHistory setMaxDelivery(Short maxDelivery) {
+        this.maxDelivery = maxDelivery;
+        return this;
+    }
+
+    public Short getMinDelivery() {
+        return minDelivery;
+    }
+
+    public UASBatchPutOnPropertyHistory setMinDelivery(Short minDelivery) {
+        this.minDelivery = minDelivery;
+        return this;
+    }
+
+    public Double getFluctuateRate() {
+        return fluctuateRate;
+    }
+
+    public UASBatchPutOnPropertyHistory setFluctuateRate(Double fluctuateRate) {
+        this.fluctuateRate = fluctuateRate;
+        return this;
+    }
+
+    public String getEnName() {
+        return enName;
+    }
+
+    public UASBatchPutOnPropertyHistory setEnName(String enName) {
+        this.enName = enName;
+        return this;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public UASBatchPutOnPropertyHistory setEnuu(Long enuu) {
+        this.enuu = enuu;
+        return this;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public UASBatchPutOnPropertyHistory setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+        return this;
+    }
+
+    public UASBatchPutOnPropertyHistory() {
+    }
+
+    public UASBatchPutOnPropertyHistory(UASBatchPutOnProperty property) {
+        this.maxDelivery = property.getMaxDelivery();
+        this.minDelivery = property.getMinDelivery();
+        this.fluctuateRate = property.getFluctuateRate();
+        this.updateTime = property.getUpdateTime();
+        this.enName = property.getEnName();
+        this.enuu = property.getEnuu();
+    }
+
+
+    public UASBatchPutOnPropertyHistory(Short maxDelivery, Short minDelivery, Double fluctuateRate, Long enuu, Date updateTime) {
+        this.maxDelivery = maxDelivery;
+        this.minDelivery = minDelivery;
+        this.fluctuateRate = fluctuateRate;
+        this.enuu = enuu;
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        return "UASBatchPutOnPropertyHistory{" +
+                "id=" + id +
+                ", maxDelivery=" + maxDelivery +
+                ", minDelivery=" + minDelivery +
+                ", fluctuateRate=" + fluctuateRate +
+                ", enuu=" + enuu +
+                ", updateTime=" + updateTime +
+                '}';
+    }
+}

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java

@@ -293,6 +293,16 @@ public interface GoodsService {
      */
     void publishByBatch(List<Goods> goodses, Set<String> uuids, List<Goods> list);
 
+
+    /**
+     * 批量保存ERP库存信息
+     *
+     * @param goodses the goodses goodes信息
+     * @param uuids   the uuids 器件uuids
+     * @param list    the list
+     */
+    void publishERPProductByBatch(List<Goods> goodses, Set<String> uuids, List<Goods> list);
+
     /**
      * 更新库存的信息,加上事务
      *

+ 12 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -57,7 +57,7 @@ public interface ProductService {
      *
      * @param type 批量删除的类型
      */
-    ResultMap deleteBatch(String type);
+    ResultMap deleteBatch(String type, Integer isPerson);
 
     /**
      * 单个匹配
@@ -168,7 +168,7 @@ public interface ProductService {
      * @param id
      * @return
      */
-    Product getProductById(Long id);
+    V_ProductPrivate getProductById(Long id);
 
     /**
      * 通过product id获取物料交易详情
@@ -190,4 +190,14 @@ public interface ProductService {
      * @return
      */
     ProductDetail saveDetail(Long productId, Goods goods);
+
+
+    /**
+     * 用户批量上架
+     *
+     * @param standard 是否是标准
+     * @param ids 操作的主键
+     * @return
+     */
+    ResultMap batchPutOn(Integer standard, String ids);
 }

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

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.commodity.service;
 
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
 import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.core.model.PageInfo;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -94,4 +95,12 @@ public interface ReleaseProductByBatchService {
      */
     public List<ReleaseProductByBatch> findFailureReleaseProductByBatch(String batch);
 
+
+    /**
+     * 查找私有字段根据pr_id
+     * @param prId
+     * @return
+     */
+    public ProductPrivate findByPrId(Long prId);
+
 }

+ 17 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/UASBatchPutOnPropertyHistoryService.java

@@ -0,0 +1,17 @@
+package com.uas.platform.b2c.prod.commodity.service;
+
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnPropertyHistory;
+
+/**
+ * Created by yujia on 2018/1/19.
+ */
+public interface UASBatchPutOnPropertyHistoryService {
+
+    /**
+     * 保存历史信息
+     *
+     * @param propertyHistory
+     * @return
+     */
+    UASBatchPutOnPropertyHistory save(UASBatchPutOnPropertyHistory propertyHistory);
+}

+ 27 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/UASBatchPutOnPropertyService.java

@@ -0,0 +1,27 @@
+package com.uas.platform.b2c.prod.commodity.service;
+
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import com.uas.platform.b2c.trade.support.ResultMap;
+
+/**
+ * UAS 批量上架的配置
+ *
+ * Created by yujia on 2018/1/19.
+ */
+public interface UASBatchPutOnPropertyService {
+
+    /**
+     * 保存用户配置的信息
+     *
+     * @param property 传入的数据
+     * @return
+     */
+    ResultMap save(UASBatchPutOnProperty property);
+
+    /**
+     * 获取该企业的批量上架的信息
+     *
+     * @return
+     */
+    UASBatchPutOnProperty get();
+}

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

@@ -135,6 +135,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private CreateNumberService createNumberService;
 
+    @Autowired
+    private ReleaseProductByBatchService releaseProductByBatchService;
+
     @Autowired
     private ComponentDao componentDao;
 
@@ -658,6 +661,51 @@ public class GoodsServiceImpl implements GoodsService {
         }
     }
 
+
+    /**
+     * 设置上架商品基本属性
+     *
+     * @param goods
+     */
+    private void batchSetGoodsDefaultFromErp(Goods goods, Goods baseGoods) {
+        if (StringUtils.isEmpty(goods.getBatchCode())) {
+            String batchCode = EncodingRulesConstant.BATCH.replace("_TIMESTAP_NUMBER",
+                    createNumberService.getTimeNumber("product$goods", 8));
+            goods.setBatchCode(batchCode);
+        }
+        goods.setCreatedDate(new Date());
+        goods.setUpdateDate(goods.getCreatedDate());
+        goods.setReserve(goods);
+        goods.setPerQty();
+        goods.setEnUU(baseGoods.getEnUU());
+        goods.setEnterpriseName(baseGoods.getEnterpriseName());
+        goods.setPublisherName(baseGoods.getPublisherName());
+        goods.setPublisherUU(baseGoods.getPublisherUU());
+        goods.setPublishPhone(baseGoods.getPublishPhone());
+        if (NumberUtil.compare(goods.getReserve(), goods.getMinBuyQty()) == -1) {
+            goods.setStatus(Status.UNAVAILABLE.value());
+        } else {
+            goods.setStatus(Status.AVAILABLE.value());
+        }
+        goods.setB2cMaxDelivery(baseGoods.getB2cMaxDelivery());
+        goods.setB2cMinDelivery(baseGoods.getB2cMinDelivery());
+        // 设置默认税率
+        goods.setTaxRate();
+
+        if (goods.getReturnInWeek() == null) {
+            // 若无设置,默认不支持7天无理由退货
+            goods.setReturnInWeek((short) 0);
+        }
+        // 计算未税价格
+        goods.setWithOutTaxRMBPrice();
+        goods.setWithOutTaxUSDPrice();
+        // 计算本批最小价格
+        goods.setMinPriceRMB(GoodsUtil.getMinPriceRMB(goods.getPrices()));
+        goods.setMaxPriceRMB(GoodsUtil.getMaxPriceRMB(goods.getPrices()));
+        goods.setMinPriceUSD(GoodsUtil.getMinPriceUSD(goods.getPrices()));
+        goods.setMaxPriceUSD(GoodsUtil.getMaxPriceUSD(goods.getPrices()));
+    }
+
     @Override
     @Transactional
     public Goods publish(Goods goods, String deviceInfo) {
@@ -711,9 +759,9 @@ public class GoodsServiceImpl implements GoodsService {
 		for (String uuid : uuids) {
 			updateComponentTradeInfos(uuid);
 		}
-		for (Goods goods : list) {// 更新价格库用到了线程,所以要单独提出来
-			saveOrUpdatePriceInfos(goods, deviceInfo);
-		}
+//		for (Goods goods : list) {// 更新价格库用到了线程,所以要单独提出来
+//			saveOrUpdatePriceInfos(goods, deviceInfo);
+//		}
 		return list;
 	}
 
@@ -731,11 +779,45 @@ public class GoodsServiceImpl implements GoodsService {
             if (resultMap.getCode() != CodeType.OK.code()) {
                 continue;
             }
-            updateGoodTransactional(goods);
             GoodsHistory g = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.Publish.getPhrase());
             goodsHistorys.add(g);
             list.add(goods);
-            uuids.add(goods.getUuid());
+            if (goods.getUuid() != null) {
+                uuids.add(goods.getUuid());
+            }
+        }
+        goodsDao.save(goodses);
+        goodsHistoryDao.save(goodsHistorys);
+        Date timeNow = new Date();
+        System.out.println("goods保存到数据库" + (timeNow.getTime() - time.getTime()));
+    }
+
+
+    /**
+     * 批量保存ERP库存信息, 区别与商城自有的批量上架
+     *
+     * @param goodses the goodses goodes信息
+     * @param uuids   the uuids 器件uuids
+     * @param list    the list
+     */
+    @Override
+    public void publishERPProductByBatch(List<Goods> goodses, Set<String> uuids, List<Goods> list) {
+        Date time = new Date();
+        List<GoodsHistory> goodsHistorys = new ArrayList<GoodsHistory>();
+        Goods goods1 = goodses.get(0);
+        setGoodsDefault(goods1);
+        for (Goods goods : goodses) {
+            batchSetGoodsDefaultFromErp(goods, goods1);
+            ResultMap resultMap = checkGoods(goods);
+            if (resultMap.getCode() != CodeType.OK.code()) {
+                continue;
+            }
+            GoodsHistory g = goodsHistoryService.converTGoodsHist(goods, GoodsHistory.OperateType.Publish.getPhrase());
+            goodsHistorys.add(g);
+            list.add(goods);
+            if (goods.getUuid() != null) {
+                uuids.add(goods.getUuid());
+            }
         }
         goodsDao.save(goodses);
         goodsHistoryDao.save(goodsHistorys);
@@ -1276,6 +1358,10 @@ public class GoodsServiceImpl implements GoodsService {
     @Override
     public ResultMap putOn(Long id) {
         Goods goods = goodsDao.findOne(id);
+        return putOnGoods(goods);
+    }
+
+    private ResultMap putOnGoods(Goods goods) {
         if (goods != null) {
             setGoodsDefault(goods);
             ResultMap resultMap = checkGoods(goods);
@@ -1336,7 +1422,7 @@ public class GoodsServiceImpl implements GoodsService {
         if(persistGoods.getProductid() != null) {
             Product product = productDao.findOne(persistGoods.getProductid());
             if(product != null) {
-                ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                 if (productPrivate == null) {
                     productPrivate = new ProductPrivate();
                 }
@@ -2821,7 +2907,7 @@ public class GoodsServiceImpl implements GoodsService {
         if(goods.getProductid() != null) {
             Product product = productDao.findOne(goods.getProductid());
             if(product != null) {
-                ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                 if (productPrivate == null) {
                     productPrivate = new ProductPrivate();
                 }
@@ -2891,12 +2977,16 @@ public class GoodsServiceImpl implements GoodsService {
             if (goods.getProductid() != null) {
                 Product product = productDao.findOne(goods.getProductid());
                 if (product != null) {
-                    ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                    ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                     if (productPrivate == null) {
                         productPrivate = new ProductPrivate();
                     }
                     Integer count = productPrivate.getBatchCount();
-                    productPrivate.setBatchCount(--count);
+                    if (null == count){
+                        productPrivate.setBatchCount(0);
+                    }else {
+                        productPrivate.setBatchCount(--count);
+                    }
                     productPrivateDao.save(productPrivate);
                     products.add(product);
                 }
@@ -2994,7 +3084,7 @@ public class GoodsServiceImpl implements GoodsService {
                 }
                 goodsDao.save(tagEmptyGoods);
                 goodsDao.save(goods);
-                ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                 if (productPrivate == null) {
                     productPrivate = new ProductPrivate();
                 }
@@ -3146,4 +3236,36 @@ public class GoodsServiceImpl implements GoodsService {
         goodsDao.save(goodses);
         return String.valueOf(goodses.size());
     }
+
+    public ResultMap batchOnSale(List<Long> idList) {
+        Map<String, Object> result = new HashMap<>();
+        List<Integer> statusList = Arrays.asList(Status.AVAILABLE.value(), Status.UNAVAILABLE.value());
+        for (Long id : idList) {
+            Product aProduct = productDao.findOne(id);
+            if (aProduct == null) {
+                continue;
+            }
+            ProductDetail detail = productDetailDao.findByProductId(id);
+            if (detail != null) {
+                // 判断是否已有上架商品
+                List<Goods> goodsList = goodsDao.findByProductIdInStatus(id, statusList);
+                if (CollectionUtils.isEmpty(goodsList)) {
+                    // 生成Goods信息
+                    Goods goods = fillDataInGoods(detail);
+                    ResultMap resultMap = putOnGoods(goods);
+                }
+            }
+        }
+        return ResultMap.success(result);
+    }
+
+    /**
+     * 填充相应字段
+     * @param detail
+     * @return
+     */
+    private Goods fillDataInGoods(ProductDetail detail) {
+        Goods goods = new Goods();
+        return goods;
+    }
 }

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

@@ -7,14 +7,15 @@ 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.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
 import com.uas.platform.b2c.prod.commodity.dao.*;
 import com.uas.platform.b2c.prod.commodity.model.*;
-import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
-import com.uas.platform.b2c.prod.commodity.service.GoodsService;
-import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.*;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
@@ -23,6 +24,9 @@ import com.uas.platform.b2c.prod.product.component.dao.ComponentSubmitDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentSubmit;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
+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.dao.OrderDetailDao;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.model.OrderDetail;
@@ -46,22 +50,21 @@ import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
-import oracle.jdbc.oracore.OracleType;
+import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
-import org.springframework.jdbc.core.CallableStatementCallback;
-import org.springframework.jdbc.core.CallableStatementCreator;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.StatementCallback;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
@@ -70,7 +73,6 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.lang.reflect.Field;
-import java.sql.CallableStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -121,6 +123,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private ProductModifyHistoryDao productModifyHistoryDao;
 
+    @Autowired
+    private ReleaseProductByBatchService releaseProductByBatchService;
+
     @Autowired
     private GoodsHistoryService goodsHistoryService;
 
@@ -172,11 +177,25 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private GoodsService goodsService;
 
+    @Autowired
+    private StoreInService storeInService;
+
+    @Autowired
+    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+    @Autowired
+    private UASBatchPutOnPropertyService uasBatchPutOnPropertyService;
+
+    @Value("#{sys.productServiceIp}")
+    private String productServiceIp;
+
     private ConcurrentHashMap<String, Field> sortFields = new ConcurrentHashMap<String, Field>();
 
     @Override
     public Page<V_ProductPrivate> getAllProducts(final PageInfo page, String keyword, String type) {
         page.expression(PredicateUtils.eq("enUU", SystemSession.getUser().getEnterprise().getUu(), true));
+        page.expression(PredicateUtils.isNotNull("pcmpcode"));
+        page.expression(PredicateUtils.isNotNull("pbranden"));
         if (StringUtils.isEmpty(type)) {
             type = "nStandard";
         }
@@ -223,7 +242,7 @@ public class ProductServiceImpl implements ProductService {
                 }
             }
             // 拿私有物料信息
-            ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+            ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
             if (null != productPrivate) {
                 product.setB2cEnabled(productPrivate.getB2cEnabled());
                 product.setBatchCount(productPrivate.getBatchCount());
@@ -349,12 +368,12 @@ public class ProductServiceImpl implements ProductService {
             if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
                 List<ProductPerson> productPersonList = productPersonDao.findByProductIdAndUserUU(id,SystemSession.getUser().getUserUU());
                 if (!CollectionUtils.isEmpty(productPersonList)) {
-                    Map<String,Object> requestMap = new HashMap<>();
-                    requestMap.put("userUU",productPersonList.get(0).getUserUU());
-                    requestMap.put("productId",productPersonList.get(0).getProductId());
-                    String res  = restTemplate.postForEntity("http://192.168.253.12:24000/product/assign/delete", null, String.class, requestMap).getBody();
-//                    Long ppid = productPersonList.get(0).getId();
-//                    productPersonDao.delete(ppid);
+//                    Map<String,Object> requestMap = new HashMap<>();
+//                    requestMap.put("userUU",productPersonList.get(0).getUserUU());
+//                    requestMap.put("productId",productPersonList.get(0).getProductId());
+//                    String res  = restTemplate.postForEntity( productServiceIp+"/product/assign/delete", null, String.class, requestMap).getBody();
+                    Long ppid = productPersonList.get(0).getId();
+                    productPersonDao.delete(ppid);
                 }
                 continue;
             }
@@ -392,8 +411,10 @@ public class ProductServiceImpl implements ProductService {
                     //删除外键关联的匹配结果列表,不然删除product失败
                     Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
                     productMatchResultDao.delete(productMatchResultSet);
-                    goodsService.deleteGoods(goodses);
-                    ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                    if (CollectionUtils.isNotEmpty(goodses)) {
+                        goodsService.deleteGoods(goodses);
+                    }
+                    ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                     if (productPrivate == null) {
                         productPrivate = new ProductPrivate();
                     }
@@ -414,11 +435,12 @@ public class ProductServiceImpl implements ProductService {
      * @param type 批量删除的类型
      */
     @Override
-    public ResultMap deleteBatch(String type) {
+    public ResultMap deleteBatch(String type, Integer isPerson) {
         Integer standard = null;
         List<ProductPerson> personList = new ArrayList<>();
         Integer fail = 0;
         Integer success = 0;
+        Integer isHave = 0;
         Long uu = SystemSession.getUser().getEnterprise().getUu();
         if(ProductConstant.STANDARD.equals(type)) {
             standard = IntegerConstant.YES_SHORT;
@@ -428,6 +450,14 @@ public class ProductServiceImpl implements ProductService {
         List<Product> products = productDao.findProductByEnuuAndStandard(uu, standard);
         Set<String> uuids = new HashSet<>();
         for (Product product : products) {
+            if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
+                List<ProductPerson> productPersonList = productPersonDao.findByProductIdAndUserUU(product.getId(),SystemSession.getUser().getUserUU());
+                if (!CollectionUtils.isEmpty(productPersonList)) {
+                    Long ppid = productPersonList.get(0).getId();
+                    productPersonDao.delete(ppid);
+                }
+                continue;
+            }
             try {
                 personList = productPersonDao.findByProductId(product.getId());
                 if (CollectionUtils.isNotEmpty(personList)) {
@@ -461,11 +491,19 @@ public class ProductServiceImpl implements ProductService {
                     Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
                     productMatchResultDao.delete(productMatchResultSet);
                     goodsService.deleteGoods(goodses);
-                    productDao.delete(product.getId());
+                    //productDao.delete(product.getId());
+                    ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
+                    if (productPrivate.getB2cEnabled().equals(IntegerConstant.NO_SHORT)) {
+                        fail++;
+                        isHave++;
+                    } else {
+                        success++;
+                    }
+                    productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
+                    productPrivateDao.save(productPrivate);
                     if (!StringUtils.isEmpty(product.getCmpUuId())) {
                         uuids.add(product.getCmpUuId());
                     }
-                    success++;
                 }else {
                     fail++;
                 }
@@ -483,7 +521,7 @@ public class ProductServiceImpl implements ProductService {
             if(success != 0) {
                 message += ",";
             }
-            message += "删除失败" + fail + "条,原因:该产品可能已经被其他单据引用,无法删除";
+            message += "删除失败" + (fail-isHave) + "条,原因:该产品可能已经被其他单据或个人物料库引用,无法删除";
         }
         //如果是全部都不能删除,才能设置失败的状态码
         if((products.size() != 0) && (products.size() ==  fail.intValue())) {
@@ -707,6 +745,7 @@ public class ProductServiceImpl implements ProductService {
      */
     @Override
     public ResultMap matchNonStandardProduct() {
+        Map<String, Object> map = new HashMap<>();
         final Long uu = SystemSession.getUser().getUserUU();
         final Long enUU = SystemSession.getUser().getEnterprise().getUu();
         ProductStoreStatus status = productStoreStatusDao.findByEnuu(enUU);
@@ -733,16 +772,25 @@ public class ProductServiceImpl implements ProductService {
             status = productStoreStatusDao.save(storeStatus);
         }
 
-//        int total = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
-        int total = productDao.getCountByEnuuAndStatus(enUU, ShortConstant.NO_SHORT);
+        int total = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
         int success = 0;
         int fail = 0;
-        Map<String, Long> queryMap = new HashMap<>();
-        queryMap.put("enUU", enUU);
-        String successUrl = "http://192.168.253.129:8099/product/match/nonProduct";
-        String result = restTemplate.postForEntity(successUrl, queryMap, String.class).getBody();
-        ModelMap map = FastjsonUtils.fromJson(result, ModelMap.class);
-        fail = total - (int) map.get("success");
+
+        String sql = "/*#mycat:db_type=master*/ call PRODUCT_MATCHES_V1(%s, %s, @out); select @out";
+        final String formatSql = String.format(sql, 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 = total - success;
 
         status.setStatus(Status.FINISH.value());
         productStoreStatusDao.save(status);
@@ -801,10 +849,10 @@ public class ProductServiceImpl implements ProductService {
         if (result == null) {
             return new ResultMap(CodeType.NO_INFO, "匹配结果信息丢失");
         }
-        List<Product> standardList = productDao.findProductByPcmpcodeAndPbrandenAndEnUUAndStandard(result.getCmpcode(), result.getBranden(), enUU, IntegerConstant.YES_SHORT);
+        List<V_ProductPrivate> standardList = v_productPrivateDao.findProductByPcmpcodeAndPbrandenAndEnUUAndStandard(result.getCmpcode(), result.getBranden(), enUU, IntegerConstant.YES_SHORT, IntegerConstant.YES_SHORT);
         Product standardProduct = null;
         if (!CollectionUtils.isEmpty(standardList)) {
-            standardProduct = standardList.get(0);
+            standardProduct = productDao.findOne(standardList.get(0).getId());
         }
         List<List<Goods>> repeatList = new ArrayList<>();
         // 已有对应标准信息,需要判断在售商品是否重复
@@ -838,7 +886,7 @@ public class ProductServiceImpl implements ProductService {
         if (standardProduct == null) {
             standardProduct = afterProduct;
         } else {
-            ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+            ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
             if (productPrivate == null) {
                 productPrivate = new ProductPrivate();
             }
@@ -846,7 +894,8 @@ public class ProductServiceImpl implements ProductService {
             productPrivate.setBatchCount(0);
             productPrivateDao.save(productPrivate);
         }
-        restTemplate.postForEntity("http://192.168.253.129:8099/product/update", afterProduct, String.class);
+//        restTemplate.postForEntity(productServiceIp + "/product/update", afterProduct, String.class);
+        productDao.save(afterProduct);
         updateInfoAfterTurnStandard(matchId, standardProduct);
         return ResultMap.success(null);
     }
@@ -865,7 +914,7 @@ public class ProductServiceImpl implements ProductService {
         }
         goodsHistoryDao.save(goodsHistoryList);
         Product beforeProduct = productDao.findOne(beforeId);
-        ProductPrivate productPrivate = productPrivateDao.findByPrId(beforeProduct.getId());
+        ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(beforeProduct.getId());
         if (productPrivate == null) {
             productPrivate = new ProductPrivate();
         }
@@ -877,7 +926,8 @@ public class ProductServiceImpl implements ProductService {
             return new ResultMap(CodeType.NO_INFO, "匹配结果信息丢失");
         }
         Product standardProduct = updateProductAfterMatch(beforeProduct, result);
-        restTemplate.postForEntity("http://192.168.253.129:8099/product/update", standardProduct, String.class);
+//        restTemplate.postForEntity(productServiceIp + "/product/update", standardProduct, String.class);
+        productDao.save(standardProduct);
 
         Product afterProduct = productDao.findOne(afterId);
         updateInfoAfterTurnStandard(beforeId, afterProduct);
@@ -938,7 +988,7 @@ public class ProductServiceImpl implements ProductService {
             }
         }
         goodsDao.save(saveList);
-        ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+        ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
         if (productPrivate == null) {
             productPrivate = new ProductPrivate();
         }
@@ -1087,7 +1137,7 @@ public class ProductServiceImpl implements ProductService {
                         product.setKinden(matchResult.getKinden());
                         product.setKindid(matchResult.getKindid());
                         List<Product> products = productDao.findProductByPcmpcodeAndPbrandenAndEnUUAndStandard(product.getPcmpcode(), product.getPbranden(), product.getEnUU(), IntegerConstant.YES_SHORT);
-                        ProductPrivate productPrivate = productPrivateDao.findByPrId(product.getId());
+                        ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                         if (productPrivate == null) {
                             productPrivate = new ProductPrivate();
                         }
@@ -1305,12 +1355,208 @@ public class ProductServiceImpl implements ProductService {
      * @return
      */
     @Override
-    public Product getProductById(Long id) {
-        if(id == null) {
+    public V_ProductPrivate getProductById(Long id) {
+        if (id == null) {
             return null;
-        }else {
-            return productDao.findOne(id);
+        } else {
+            return v_productPrivateDao.findOne(id);
+        }
+    }
+
+    /**
+     * 用户批量上架
+     *
+     * @return
+     */
+    @Override
+    public ResultMap batchPutOn(Integer standard, String ids) {
+        List<Long> prIdLong = null;
+        if (StringUtils.isEmpty(ids) && StringUtils.isEmpty(standard)) {
+            return new ResultMap(CodeType.PARAMETER_ERROR.code(), "没有选择需要操作的信息", null);
+        } else {
+            if (!StringUtils.isEmpty(ids)) {
+                Long[] idArray = (Long[]) ConvertUtils.convert(ids.split(SplitChar.COMMA), Long.class);
+                prIdLong = Arrays.asList(idArray);
+            }
+        }
+        Long uu = SystemSession.getUser().getEnterprise().getUu();
+        ResultMap registerAddress = enterpriseService.getCurrencyByRegisterAddress();
+        String currency = null;
+        List<Goods> goodsList = new ArrayList<>();
+        Set<String> uuids = new HashSet<>();
+        if (registerAddress.getCode() != CodeType.OK.code()) {
+            currency = StringConstant.RMB;
+        } else {
+            currency = registerAddress.getData().toString();
+        }
+        StoreIn storeIn = storeInService.findByEnUU(uu);
+        String storeName = null, storeid = null;
+        if (storeIn == null || storeIn.getStatus() != StoreStatus.OPENED) {
+            storeName = sysConf.getEnName();
+            storeid = sysConf.getStoreid();
+        } else {
+            storeName = storeIn.getStoreName();
+            storeid = storeIn.getUuid();
+        }
+        UASBatchPutOnProperty property = uasBatchPutOnPropertyService.get();
+        if (property == null) {
+            return new ResultMap(CodeType.NOT_COMPLETE_INFO.code(), "请先设置上架参数", null);
+        }
+        String sql = null;
+        Map<String, Object> map = new HashMap<>();
+        if ((prIdLong != null) && (prIdLong.size() != 0)) {
+            sql = "select p.pr_id from products p left join product$private pp on pp.pr_id = p.pr_id where ifnull(pp.pr_batchcount, 0) = 0 and p.pr_sourceapp = 'ERP' and p.pr_reserve <> 0 and ifnull(pp.pr_b2cenabled, 0) = 1 and p.pr_id in (:ids) and p.pr_id not in (select DISTINCT go_productid from trade$goods where  go_productid is not null and go_status != 612);";
+            map.put("ids", prIdLong);
+        } else {
+            // 暂时不会进入当前循环,速度比较低
+            sql = "select p.pr_id from products p left join product$private pp on pp.pr_id = p.pr_id where ifnull(pp.pr_batchcount, 0) = 0 and p.pr_sourceapp = 'ERP' and p.pr_reserve <> 0 and ifnull(pp.pr_b2cenabled,0) = 1 and if(p.pr_standard, 0) = (:standard) and p.pr_enuu = (:enuu) and p.pr_id not in (select DISTINCT go_productid from trade$goods where  go_productid is not null and go_status != 612);";
+            map.put("enuu", uu);
+            map.put("standard", standard);
+        }
+
+        List<Long> longList = namedParameterJdbcTemplate.queryForList(sql, map, Long.class);
+         if (longList.size() == 0) {
+            return new ResultMap(CodeType.OK.code(), "没有可上架的信息", null);
+        }
+        List<Product> sourceAppNotPutOn = productDao.findProductInIds(longList);
+        List<ProductDetail> productDetails = productDetailDao.findByProductIds(longList);
+        for (Product product : sourceAppNotPutOn) {
+            for (ProductDetail detail : productDetails) {
+                if (product.getId().longValue() == detail.getProductId().longValue()) {
+                    product.setProductDetail(detail);
+                    break;
+                }
+            }
+        }
+        List<Goods> goodses = productDetailPutOn(sourceAppNotPutOn, storeName, storeid, currency, property);
+        goodsList.addAll(goodses);
+        List<Goods> result = new ArrayList<Goods>();
+        goodsService.publishERPProductByBatch(goodsList, uuids, result);
+        List<Long> prids = new ArrayList<>();
+        for (Goods goods : result) {
+            prids.add(goods.getProductid());
+        }
+        List<ProductPrivate> productPrivates = productPrivateDao.findByPrIds(prids);
+        for (ProductPrivate productPrivate : productPrivates) {
+            productPrivate.setBatchCount(IntegerConstant.YES_SHORT);
+        }
+        productPrivateDao.save(productPrivates);
+        for (String uuid : uuids) {
+            goodsService.updateComponentTradeInfos(uuid);
+        }
+        String message = "";
+        if (result.size() != 0) {
+            message = "成功上架" + result.size() + "个";
+        }
+        if ((sourceAppNotPutOn.size() - result.size()) != 0) {
+            if (!StringUtils.isEmpty(message)) {
+                message = message +  " ,";
+            }
+            message = "失败" + (sourceAppNotPutOn.size()-  result.size()) + "个, 失败原因:产品上架必填字段为空, 请完善";
+        }
+        return new ResultMap(CodeType.OK.code(), message);
+    }
+
+
+    /**
+     * 产品信息转  库存信息
+     *
+     * @param products 上架的产品
+     * @param storeName 店铺名称
+     * @param storeid 店铺id
+     * @param currency 币别信息
+     * @param property 批量上架的配置信息
+     * @return
+     */
+    private List<Goods> productDetailPutOn(List<Product> products, String storeName, String storeid, String currency, UASBatchPutOnProperty property) {
+        List<Goods> goodses = new ArrayList<>();
+        for (Product product : products) {
+            ResultMap resultMap = productsConvertGoods(product, storeName, storeid, currency, property);
+            if (resultMap.getCode() == CodeType.OK.code()) {
+                goodses.add((Goods) resultMap.getData());
+            }
+        }
+        return goodses;
+    }
+
+    /**
+     * 物料转 goods 信息
+     *
+     * @param product
+     * @return
+     */
+    private ResultMap productsConvertGoods(Product product, String storeName, String storeid, String currency, UASBatchPutOnProperty property) {
+        ProductDetail detail = product.getProductDetail();
+        Goods g = new Goods();
+        g.setProductid(product.getId());
+        g.setUnit(product.getUnit());
+        g.setImg(product.getCmpImg());
+        g.setUuid(product.getCmpUuId());
+        g.setCode(product.getPcmpcode());
+        g.setBrandNameCn(product.getPbrand() == null ? product.getPbranden() :  product.getPbrand());
+        g.setBrandid(product.getPbrandid());
+        g.setBranduuid(product.getPbranduuid());
+        g.setBrandNameEn(product.getPbranden() ==  null ? product.getPbrand() : product.getPbranden());
+        g.setKindNameCn(product.getKind());
+        g.setKindUuid(product.getKindid());
+        g.setCurrencyName(currency);
+        g.setStoreName(storeName);
+        g.setStoreid(storeid);
+        g.setMaxDelivery(property.getMaxDelivery());
+        g.setMinDelivery(property.getMinDelivery());
+        g.setProdNum(product.getProdNum());
+        List<String> tags = goodsDao.findTagByProductid(product.getId());
+        Integer i = 1;
+        String tag = StringConstant.SELF_TAG;
+        while(tags.contains(tag + i)) {
+            i++;
+        }
+        g.setTag(tag + i);
+        g.setBreakUp(Boolean.FALSE);
+        g.setReserve(product.getErpReserve());
+        String packaging = (detail == null || detail.getPackaging() == null) ? product.getPackaging(): detail.getPackaging();
+        if (packaging == null) {
+            packaging = StringConstant.DEFAULTPACKAGING;
+        }
+        g.setPackaging(packaging);
+
+        String produceDate = (detail == null || detail.getProduceDate() == null) ? product.getProduceDate() : detail.getProduceDate();
+        g.setProduceDate(produceDate);
+
+        Double minPackQty = (detail == null || detail.getMinPackQty() == null) ? product.getMinPackQty() : detail.getMinPackQty();
+        Double minBuyQty = detail != null ? detail.getMinBuyQty() : null;
+        int minPackQtyCom = NumberUtil.compare(minPackQty, DoubleConstant.zero);
+        int minBuyQtyCom = NumberUtil.compare(minBuyQty, DoubleConstant.zero);
+        if (minPackQtyCom == 0 && minBuyQtyCom == 0) {
+            return new ResultMap(CodeType.NOT_COMPLETE_INFO, "上架必填信息缺失");
+        } else {
+            if (minPackQtyCom == 0 || minBuyQtyCom == 0) {
+                minPackQty = minBuyQtyCom == 0 ? minPackQty : minBuyQty;
+                minBuyQty = minPackQty;
+            }
+            double remainder = minBuyQty % minPackQty;
+            minBuyQty = NumberUtil.sub(minBuyQty, remainder);
+            int k = NumberUtil.compare(minBuyQty, minPackQty);
+            if (k < 0) {
+                minBuyQty = minPackQty;
+            }
+        }
+        g.setMinPackQty(minPackQty);
+        g.setMinBuyQty(minBuyQty);
+        double price = NumberUtil.mul(detail.getPrice(), property.getFluctuateRate());
+        price = NumberUtil.fractionNumCeil(price, IntegerConstant.PRICE_FRACTION);
+        List<GoodsQtyPrice> list = new ArrayList<>();
+        GoodsQtyPrice price1 = new GoodsQtyPrice();
+        price1.setStart(g.getMinBuyQty());
+        price1.setEnd(DoubleConstant.maxReserve);
+        if (currency.equals(StringConstant.RMB)) {
+            price1.setRMBPrice(price);
+        } else {
+            price1.setUSDPrice(price);
         }
+        list.add(price1);
+        g.setPrices(list);
+        return new ResultMap(CodeType.OK.code(), "成功", g);
     }
 }
 

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

@@ -29,6 +29,7 @@ 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;
@@ -39,6 +40,7 @@ import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
@@ -104,6 +106,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	@Autowired
 	private ProductPrivateDao productPrivateDao;
 
+	@Value("#{sys.productServiceIp}")
+	private String productServiceIp;
+
 	@Override
 	public ReleaseProductByBatch save(ReleaseProductByBatch releaseProductByBatch) {
 		return releaseProductByBatch;
@@ -345,6 +350,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 */
 	private void setProductDefaultInfo(ReleaseProductByBatch aProduct, String batch, String currency, StoreIn storeIn) {
 		// 设置初始状态
+		aProduct.setMinBuyQtyStr("");
+		aProduct.setProductDate("");
+		aProduct.setMinPackageStr("");
+		aProduct.setSelfMaxDeliveryStr("");
+		aProduct.setSelfMinDeliveryStr("");
 		aProduct.setReleaseCode(ReleaseStatus.success.value());
 		aProduct.setReleaseStatus(ReleaseStatus.success.getPhrase());
 		aProduct.setRelbatchid(batch);
@@ -1038,28 +1048,26 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 		List<ReleaseProductByBatch> releaseProductByBatchList =
 				releaseProductByBatchDao.findByRelbatchid(batch);
+		List<Long> productIds = null;
+		List<ProductPrivate> productPrivateList = null;
 		if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
 			List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,false);
 			// TODO 什么接口
-			String result = restTemplate.postForEntity("http://192.168.253.12:24000/product/update", products, String.class).getBody();
-			List<Long> productIds = JSON.parseArray(result, Long.class);
-			// 默认为b2c Enable开启
+			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
+			productIds = JSON.parseArray(result, Long.class);
+			Set<Long> idSet = new HashSet<>(productIds);
 			List<ProductPrivate> productPrivates = new ArrayList<>();
-			for (Long prId : productIds) {
-				ProductPrivate productPrivate = productPrivateDao.findByPrId(prId);
+			for (Long prId : idSet) {
+				ProductPrivate productPrivate = findByPrId(prId);
 				if (null == productPrivate) {
 					productPrivate = new ProductPrivate();
 					productPrivate.setPrId(prId);
 				}
 				productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
-				// 统计现在有多少在售信息
-                int batchCount = goodsDao.findCountByProductid(prId);
-                productPrivate.setBatchCount(batchCount);
-                productPrivates.add(productPrivate);
+				productPrivates.add(productPrivate);
 			}
-			productPrivateDao.save(productPrivates);
+			productPrivateList = productPrivateDao.save(productPrivates);
 		}
-
 		Enterprise enterprise = SystemSession.getUser().getEnterprise();
 		final Object[] obj = new Object[]{enterprise.getUu(), enterprise.getEnName(), batch};
 		String sql = "/*#mycat:db_type=master*/ set @enuu = %s; set @enName = '%s'; set @batch = '%s'; call RELEASE_TO_GOODS_V2(@enuu, @enName, @batch, @out); select @out";
@@ -1078,6 +1086,14 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 		});
 
+		if (null != productIds) {
+			for (ProductPrivate productPrivate : productPrivateList) {
+				// 统计现在有多少在售信息
+				int batchCount = goodsDao.findCountByProductid(productPrivate.getPrId());
+				productPrivate.setBatchCount(batchCount);
+			}
+			productPrivateDao.save(productPrivateList);
+		}
 
 //		Enterprise enterprise = SystemSession.getUser().getEnterprise();
 //		final Object[] obj = new Object[]{enterprise.getUu(), enterprise.getEnName(), batch};
@@ -1120,29 +1136,32 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		}
 		List<com.uas.ps.entity.Product> products = new ArrayList<>();
 		for (ReleaseProductByBatch releaseProductByBatch : releaseProductByBatchList) {
-			com.uas.ps.entity.Product product = new com.uas.ps.entity.Product();
-			// releaseProductByBatch.getCode(); 在公有库生成
-			product.setMinPack(releaseProductByBatch.getMinPackage());
-			product.setCmpImg(releaseProductByBatch.getImg());
-			product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-			product.setBrand(releaseProductByBatch.getBrandNameEn());
-			product.setCmpCode(releaseProductByBatch.getCode());
-			product.setCmpUuid(releaseProductByBatch.getComponentUuId());
-			product.setKind(releaseProductByBatch.getKindName());
-			product.setKindId(releaseProductByBatch.getKindUuid());
-			product.setpCmpCode(releaseProductByBatch.getB2cCode());
-			product.setpBrand(releaseProductByBatch.getB2cBrandcn());
-			product.setpBrandEn(releaseProductByBatch.getB2cBranden());
-			product.setpBrandId(releaseProductByBatch.getBrandId());
-			product.setpBrandUuid(releaseProductByBatch.getBranduuid());
-			product.setStandard(releaseProductByBatch.getComponentUuId() == null ? (short)0 : (short)1);
-			product.setCmpUuid(releaseProductByBatch.getComponentUuId());
-			if (isAPerson) {
-				product.setSpec(releaseProductByBatch.getPackaging());
-			}
-			String batchCode = "PNUM" + createNumberService.getTimeNumber("trade$product_import_num", 8);
-			product.setCode(batchCode);
-			products.add(product);
+		    if (releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.failure.value()) ||
+                    releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.success.value())) {
+                com.uas.ps.entity.Product product = new com.uas.ps.entity.Product();
+                // releaseProductByBatch.getCode(); 在公有库生成
+                product.setMinPack(releaseProductByBatch.getMinPackage());
+                product.setCmpImg(releaseProductByBatch.getImg());
+                product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+                product.setBrand(releaseProductByBatch.getBrandNameEn());
+                product.setCmpCode(releaseProductByBatch.getCode());
+                product.setCmpUuid(releaseProductByBatch.getComponentUuId());
+                product.setKind(releaseProductByBatch.getKindName());
+                product.setKindId(releaseProductByBatch.getKindUuid());
+                product.setpCmpCode(releaseProductByBatch.getB2cCode());
+                product.setpBrand(releaseProductByBatch.getB2cBrandcn());
+                product.setpBrandEn(releaseProductByBatch.getB2cBranden());
+                product.setpBrandId(releaseProductByBatch.getBrandId());
+                product.setpBrandUuid(releaseProductByBatch.getBranduuid());
+                product.setStandard(releaseProductByBatch.getComponentUuId() == null ? (short)0 : (short)1);
+                product.setCmpUuid(releaseProductByBatch.getComponentUuId());
+                if (isAPerson) {
+                    product.setSpec(releaseProductByBatch.getPackaging());
+                }
+                String batchCode = "PNUM" + createNumberService.getTimeNumber("trade$product_import_num", 8);
+                product.setCode(batchCode);
+                products.add(product);
+            }
 		}
 		return products;
 	}
@@ -1154,16 +1173,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
         if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
             List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,true);
             // TODO 什么接口
-			String result = restTemplate.postForEntity("http://192.168.253.12:24000/product/update", products, String.class).getBody();
+			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
             List<Long> productIds = JSON.parseArray(result, Long.class);
-            Map<String,Object> requestMap = new HashMap<>();
-            requestMap.put("userUU",SystemSession.getUser().getUserUU());
             //添加个人关系
-            String res  = restTemplate.postForEntity("http://192.168.253.12:24000/product/assign/batch", productIds, String.class, requestMap).getBody();
+            String res  = restTemplate.postForEntity(productServiceIp + "/product/assign/batch?userUU=" + SystemSession.getUser().getUserUU(), productIds, String.class).getBody();
             // 默认为b2c Enable开启
             List<ProductPrivate> productPrivates = new ArrayList<>();
-            for (Long prId : productIds) {
-                ProductPrivate productPrivate = productPrivateDao.findByPrId(prId);
+			Set<Long> idSet = new HashSet<>(productIds);
+            for (Long prId : idSet) {
+                ProductPrivate productPrivate = findByPrId(prId);
                 if (null == productPrivate) {
                     productPrivate = new ProductPrivate();
 					productPrivate.setPrId(prId);
@@ -1197,4 +1215,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 //		});
 		return null;
 	}
+
+	@Override
+	public ProductPrivate findByPrId(Long prId) {
+		List<ProductPrivate> productPrivates = productPrivateDao.findByPrId(prId);
+		if (!CollectionUtils.isEmpty(productPrivates)) {
+			ProductPrivate productPrivate = productPrivates.get(0);
+			return productPrivate;
+		} else {
+			return null;
+		}
+	}
 }

+ 34 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/UASBatchPutOnPropertyHistoryServiceImpl.java

@@ -0,0 +1,34 @@
+package com.uas.platform.b2c.prod.commodity.service.impl;
+
+import com.uas.platform.b2c.prod.commodity.dao.UASBatchPutOnPropertyHistoryDao;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnPropertyHistory;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyHistoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * UAS批量上架的配置属性
+ *
+ * @author yuj 2018-01-19 14:04
+ */
+@Service
+public class UASBatchPutOnPropertyHistoryServiceImpl implements UASBatchPutOnPropertyHistoryService {
+
+    private final UASBatchPutOnPropertyHistoryDao uasBatchPutOnPropertyHistoryDao;
+
+    @Autowired
+    public UASBatchPutOnPropertyHistoryServiceImpl(UASBatchPutOnPropertyHistoryDao uasBatchPutOnPropertyHistoryDao) {
+        this.uasBatchPutOnPropertyHistoryDao = uasBatchPutOnPropertyHistoryDao;
+    }
+
+    /**
+     * 保存历史信息
+     *
+     * @param propertyHistory
+     * @return
+     */
+    @Override
+    public UASBatchPutOnPropertyHistory save(UASBatchPutOnPropertyHistory propertyHistory) {
+        return uasBatchPutOnPropertyHistoryDao.save(propertyHistory);
+    }
+}

+ 127 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/UASBatchPutOnPropertyServiceImpl.java

@@ -0,0 +1,127 @@
+package com.uas.platform.b2c.prod.commodity.service.impl;
+
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.dao.UASBatchPutOnPropertyDao;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnPropertyHistory;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.sql.Date;
+
+/**
+ * UAS 批量上架的配置
+ *
+ * @author yuj 2018-01-19 14:07
+ */
+@Service
+public class UASBatchPutOnPropertyServiceImpl implements UASBatchPutOnPropertyService {
+
+    private final UASBatchPutOnPropertyDao uasBatchPutOnPropertyDao;
+
+    private final UASBatchPutOnPropertyHistoryService uasBatchPutOnPropertyHistoryService;
+
+    @Autowired
+    public UASBatchPutOnPropertyServiceImpl(UASBatchPutOnPropertyDao uasBatchPutOnPropertyDao, UASBatchPutOnPropertyHistoryService uasBatchPutOnPropertyHistoryService) {
+        this.uasBatchPutOnPropertyDao = uasBatchPutOnPropertyDao;
+        this.uasBatchPutOnPropertyHistoryService = uasBatchPutOnPropertyHistoryService;
+    }
+
+    /**
+     * 保存用户配置的信息
+     *
+     * @param property 传入的数据
+     * @return
+     */
+    @Override
+    public ResultMap save(UASBatchPutOnProperty property) {
+        if (property == null) {
+            return new ResultMap(CodeType.NO_INFO.code(), "传入的数据为空", null);
+        }
+        ResultMap resultMap = validateProperty(property);
+        if (resultMap.getCode() != CodeType.OK.code()) {
+            return resultMap;
+        }
+        Enterprise enterprise = SystemSession.getUser().getEnterprise();
+        property.setEnName(enterprise.getEnName());
+        property.setEnuu(enterprise.getUu());
+        property.setUpdateTime(new Date(System.currentTimeMillis()));
+        UASBatchPutOnProperty putOnProperty = uasBatchPutOnPropertyDao.save(property);
+        UASBatchPutOnPropertyHistory putOnPropertyHistory = new UASBatchPutOnPropertyHistory(putOnProperty);
+        uasBatchPutOnPropertyHistoryService.save(putOnPropertyHistory);
+        return new ResultMap(CodeType.OK.code(), "成功", putOnProperty);
+    }
+
+    /**
+     * 验证传入的数据的合理
+     *
+     * @param property 传入的数据
+     * @return
+     */
+    private ResultMap validateProperty(UASBatchPutOnProperty property) {
+        Short maxDelivery = property.getMaxDelivery();
+        Short minDelivery = property.getMinDelivery();
+        Double fluctuateRate = property.getFluctuateRate();
+        if (maxDelivery == null && minDelivery == null) {
+            return new ResultMap(CodeType.NO_INFO.code(), "设置的交期为空", null);
+        } else {
+            if (maxDelivery == null || minDelivery == null) {
+                if (maxDelivery == null) {
+                    maxDelivery = minDelivery;
+                } else {
+                    minDelivery = maxDelivery;
+                }
+            }
+            // 如果 最小值大于最大值
+            int i = maxDelivery.compareTo(minDelivery);
+            if (i < 0) {
+                Short  k = maxDelivery;
+                maxDelivery = minDelivery;
+                minDelivery = k;
+            }
+            int i1 = minDelivery.compareTo(com.uas.platform.b2c.core.constant.ShortConstant.YES_SHORT);
+            if (i1 < 0) {
+                return new ResultMap(CodeType.ERROR_STATE.code(), "交期必须大于0", null);
+            }
+            property.setMinDelivery(minDelivery);
+            property.setMaxDelivery(maxDelivery);
+        }
+
+        // 浮动率
+        if (fluctuateRate == null) {
+            fluctuateRate = 1D;
+        } else {
+            int i = NumberUtil.compare(fluctuateRate, DoubleConstant.minFluctuateRate);
+            if (i < 0) {
+                fluctuateRate = DoubleConstant.minFluctuateRate;
+            }
+
+            // 是否大于最大的浮动率值
+            int j = NumberUtil.compare(fluctuateRate, DoubleConstant.maxFluctuateRate);
+            if (j > 0) {
+                fluctuateRate = DoubleConstant.maxFluctuateRate;
+            }
+        }
+        property.setFluctuateRate(fluctuateRate);
+        return new ResultMap(CodeType.OK.code(), "成功", null);
+    }
+
+    /**
+     * 获取该企业的批量上架的信息
+     *
+     * @return
+     */
+    @Override
+    public UASBatchPutOnProperty get() {
+        Enterprise enterprise = SystemSession.getUser().getEnterprise();
+        UASBatchPutOnProperty onPropertyByEnuu = uasBatchPutOnPropertyDao.findUASBatchPutOnPropertyByEnuu(enterprise.getUu());
+        return onPropertyByEnuu;
+    }
+}

+ 3 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/util/GoodsUtil.java

@@ -104,6 +104,9 @@ public class GoodsUtil {
 	 * @return
 	 */
 	public static Boolean compareWithQtyPrice(List<GoodsQtyPrice> qtyPriceList, List<GoodsQtyPrice> targetList, String currency) {
+		if (CollectionUtils.isEmpty(qtyPriceList) || CollectionUtils.isEmpty(targetList)) {
+			return false;
+		}
 		if (qtyPriceList.size() != targetList.size()) {
 			return false;
 		}

+ 2 - 0
src/main/resources/dev/sys.properties

@@ -39,6 +39,8 @@ uploadFileUrl = http://10.10.100.200:9999
 searchUrl = http://10.10.100.191:8092
 # message ip
 messageServiceIp=http://message.ubtob.com/
+# product public ip
+productServiceIp=http://192.168.253.12:24000
 
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

BIN
src/main/resources/jxls-tpl/trade/releaseByBatch-person.xls


+ 2 - 0
src/main/resources/prod/sys.properties

@@ -41,6 +41,8 @@ searchUrl=http://10.10.0.76:8081
 
 # message ip
 messageServiceIp=http://message.ubtob.com/
+# product public ip
+productServiceIp=http://192.168.253.12:24000
 
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

+ 2 - 0
src/main/resources/test/sys.properties

@@ -40,6 +40,8 @@ searchUrl = http://10.10.100.191:8092
 
 # message ip
 messageServiceIp=http://message.ubtob.com/
+# product public ip
+productServiceIp=http://192.168.253.12:24000
 
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

+ 10 - 1
src/main/webapp/resources/css/common.css

@@ -951,9 +951,18 @@ 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: 500px;
+	max-height: 520px;
+	overflow-x: hidden;
+	height: auto !important;
 }
 .form-control:focus {
 	border: 1px solid #4272d3;

+ 11 - 11
src/main/webapp/resources/css/commonComponent.css

@@ -13,7 +13,7 @@
     </div>
 </div>
 */
-.com-del-box{
+.com-mall-del-box{
     position: fixed;
     z-index: 10;
     min-height: 152px;
@@ -26,14 +26,14 @@
     top: 55%;
     left: 50%;
 }
-.com-del-box .title{
+.com-mall-del-box .title{
     height: 30px;
     background-color: #5078cb;
     text-align: right;
     padding-right: 15px;
     line-height: 30px;
 }
-.com-del-box .title i{
+.com-mall-del-box .title i{
     background: url(../img/icon/close.png) no-repeat;
     display: inline-block;
     width: 9px;
@@ -41,27 +41,27 @@
     cursor: pointer;
     margin: 0;
 }
-.com-del-box .content{
+.com-mall-del-box .content{
     width: 100%;
     text-align: center;
     margin: 0 auto;
 }
-.com-del-box .content p{
+.com-mall-del-box .content p{
     line-height: 50px;
     font-size: 14px;
     padding-top: 10px;
 }
-.com-del-box .content p i{
+.com-mall-del-box .content p i{
     color: #5078cb;
     font-size: 16px;
     margin-right: 10px;
 }
-.com-del-box .content div{
+.com-mall-del-box .content div{
     width: 100%;
     text-align: center;
     margin: 0 auto;
 }
-.com-del-box .content div a{
+.com-mall-del-box .content div a{
     width: 55px;
     height: 26px;
     line-height: 26px;
@@ -70,16 +70,16 @@
     font-size: 14px;
     cursor: pointer;
 }
-.com-del-box .content div a:first-child{
+.com-mall-del-box .content div a:first-child{
     background: #b4b5b9;
     color: #333;
     margin-right: 10px;
 }
-.com-del-box .content div a:last-child{
+.com-mall-del-box .content div a:last-child{
     background: #5078cb;
     color: #fff;
 }
-/*.com-del-box .content div a:hover{
+/*.com-mall-del-box .content div a:hover{
     background: #3f7ae3;
     color: #fff;
 }*/

+ 69 - 1
src/main/webapp/resources/css/erp/align.css

@@ -4,4 +4,72 @@
 }
 .wrap {
     width: 100%;
-}
+}
+
+/*---------------------btn样式 start---------------------*/
+/*示例(size+type):
+<span class="com-btn-level1 com-btn-submit"></span>
+*/
+/*btnSize*/
+.com-btn-level1 {
+    display: inline-block;
+    padding: 0 17px;
+    text-align: center;
+    line-height: 25px;
+    font-size: 14px;
+    cursor: pointer;
+    vertical-align: middle;
+}
+.com-btn-level1[disabled] {
+    cursor: not-allowed;
+}
+.com-btn-level2 {
+    display: inline-block;
+    padding: 0 11px;
+    height: 25px;
+    line-height: 23px;
+    border-radius: 2px;
+    font-size: 12px;
+    cursor: pointer;
+    vertical-align: middle;
+}
+.com-btn-level2[disabled] {
+    cursor: not-allowed;
+}
+/*btnType*/
+.com-btn-submit {
+    color: #fff;
+    background: #5078cb;
+    border: 1px solid #5078cb;
+}
+.com-btn-cancel {
+    background: #c8c6c6;
+    color: #fff;
+    border: 1px solid #c8c6c6;
+}
+.com-btn-detail {
+    color: #fff;
+    background: #ff8522;
+    border: 1px solid #ff8522;
+}
+.com-btn-detail-border {
+    color: #ff8522;
+    background: #fff;
+    border: 1px solid #ff8522;
+}
+.com-btn-red {
+    background: #f15601;
+    color: #fff;
+    border: 1px solid #f15601;
+}
+.com-btn-green {
+    background: #33b401;
+    color: #fff;
+    border: 1px solid #33b401;
+}
+.com-btn-submit-border {
+    border: 1px solid #5078cb;
+    background: #fff;
+    color: #5078cb;
+}
+/*---------------------btn样式 end-----------------------*/

+ 1 - 2
src/main/webapp/resources/css/pay.css

@@ -315,8 +315,7 @@
     margin-top: 0;
 }
 .down-payment .pay-price div.stage .content{
-    width: 250px;
-    float: right;
+    text-align: right;
     border: none;
     margin-top: 0;
     padding-bottom: 0;

+ 10 - 0
src/main/webapp/resources/js/common/query/UASBatchPutOnProperty.js

@@ -0,0 +1,10 @@
+define([ 'ngResource'], function() {
+    angular.module('UASBatchPutOnPropertyModule', [ 'ngResource']).factory('UASBatchPutOnPropertyServices', ['$resource' , function($resource) {
+        return $resource('UASBatchPutOnProperty', {}, {
+            save: {
+                url : 'UASBatchPutOnProperty/save',
+                method : 'POST'
+            }
+        });
+    }]);
+});

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

@@ -84,6 +84,11 @@ define([ 'ngResource' ], function() {
             updateInfoAfterChoose : {
                 url: 'trade/products/update/goods',
                 method: 'POST'
+            },
+            //批量上架信息
+            batchPutOn: {
+                url: 'trade/products/batch',
+                method: 'PUT'
             }
         });
     }]);

+ 2 - 2
src/main/webapp/resources/js/usercenter/app.js

@@ -1,7 +1,7 @@
 
-define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'common/services', 'common/directives','common/query/kind', 'common/query/brand', 'common/query/component', 'common/query/order', 'common/query/cart', 'common/query/goods', 'common/query/return' ,'angular-toaster', 'common/query/urlencryption', 'ui-jquery', 'common/query/bankTransfer', 'common/query/bankInfo', 'common/query/change', 'common/query/rate', 'common/query/logistics', 'common/query/address' ,'angular-toaster','common/query/collection', 'common/query/proofing', 'common/query/bill', 'common/query/user','file-upload', 'file-upload-shim', 'common/query/bankInfo' , 'common/query/responseLogistics', 'common/query/payment', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/importDeclaration', 'common/query/enterprise', 'common/query/invoice', 'common/query/refund', 'common/query/recommendation', 'common/query/logisticsPort', 'common/query/storeInfo', 'common/query/tradeMessageNotice', 'common/query/tradeBasicProperties', 'common/query/browsingHistory', 'common/query/internalMessage', 'common/module/chat_web_module', 'angular-filter', 'common/query/vendor','common/query/seekPurchase'], function(angularAMD) {
+define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'common/services', 'common/directives','common/query/kind', 'common/query/brand', 'common/query/component', 'common/query/order', 'common/query/cart', 'common/query/goods', 'common/query/return' ,'angular-toaster', 'common/query/urlencryption', 'ui-jquery', 'common/query/bankTransfer', 'common/query/bankInfo', 'common/query/change', 'common/query/rate', 'common/query/logistics', 'common/query/address' ,'angular-toaster','common/query/collection', 'common/query/proofing', 'common/query/bill', 'common/query/user','file-upload', 'file-upload-shim', 'common/query/bankInfo' , 'common/query/responseLogistics', 'common/query/payment', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/importDeclaration', 'common/query/enterprise', 'common/query/invoice', 'common/query/refund', 'common/query/recommendation', 'common/query/logisticsPort', 'common/query/storeInfo', 'common/query/tradeMessageNotice', 'common/query/tradeBasicProperties', 'common/query/browsingHistory', 'common/query/internalMessage', 'common/module/chat_web_module', 'angular-filter', 'common/query/vendor','common/query/seekPurchase', 'common/query/search'], function(angularAMD) {
 	'use strict';
-	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ngTable', 'common.services', 'common.directives', 'tool.directives', 'common.query.kind', 'brandServices', 'componentServices', 'orderServices', 'cartServices', 'goodsServices', 'returnServices' , 'toaster', 'urlencryptionServices', 'ui.jquery', 'bankTransfer', 'bankInfo', 'changeServices','rateServices', 'logisticsServices', 'addressServices', 'toaster','collection','proofingServices', 'billServices', 'common.query.user', 'angularFileUpload', 'bankInfo', 'responseLogisticsService', 'PaymentService', 'afterSaleService', 'messageBoardServices', 'table.directives', 'importDeclaration', 'common.query.enterprise', 'invoiceServices', 'refundModule', 'recommendation','logisticsPortService', 'storeInfoServices', 'tradeMessageNoticeModule', 'tradeBasicPropertiesServices', 'BrowsingHistory', 'internalMessageServices', 'WebChatModule', 'angular.filter', 'vendorServices','seekPurchaseServices']);
+	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ngTable', 'common.services', 'common.directives', 'tool.directives', 'common.query.kind', 'brandServices', 'componentServices', 'orderServices', 'cartServices', 'goodsServices', 'returnServices' , 'toaster', 'urlencryptionServices', 'ui.jquery', 'bankTransfer', 'bankInfo', 'changeServices','rateServices', 'logisticsServices', 'addressServices', 'toaster','collection','proofingServices', 'billServices', 'common.query.user', 'angularFileUpload', 'bankInfo', 'responseLogisticsService', 'PaymentService', 'afterSaleService', 'messageBoardServices', 'table.directives', 'importDeclaration', 'common.query.enterprise', 'invoiceServices', 'refundModule', 'recommendation','logisticsPortService', 'storeInfoServices', 'tradeMessageNoticeModule', 'tradeBasicPropertiesServices', 'BrowsingHistory', 'internalMessageServices', 'WebChatModule', 'angular.filter', 'vendorServices','seekPurchaseServices', 'searchService']);
 	app.init = function() {
 		angularAMD.bootstrap(app);
 	};

+ 19 - 12
src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js

@@ -810,7 +810,7 @@ define(['app/app'], function (app) {
             });
           };
           //如果之前未绑定
-          if($scope.userInfo.userEmail==null?true:false){
+          if($scope.userInfo.userEmail==null ? true:false){
             $scope.checkSuccess = true;
           }
 
@@ -825,7 +825,6 @@ define(['app/app'], function (app) {
                     newUserEmail)) {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
               return false;
             }
@@ -833,25 +832,29 @@ define(['app/app'], function (app) {
               if (data.data == "true") {//邮箱可用
                 $scope.checkSuccess1 = true;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = true;
                 $scope.checkFailed1_1 = false;
               } else {//邮箱不可用
                 $scope.checkSuccess1 = false;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = false;
                 $scope.checkFailed1_1 = true;
               }
             }, function () {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
             });
           };
 
           $scope.codeSuccess = false;
+          $scope.sendSuccess = true;
           //发送验证码
           $scope.sendCheckCode = function (newUserEmail) {
+            if (!$scope.checkSuccess1 || ($scope.userInfo.userEmail!=null && !$scope.checkSuccess)) {
+                if ($scope.userInfo.userEmail!=null && !$scope.checkSuccess) {
+                    $scope.checkFailed = true;
+                }
+              return;
+						}
             $scope.sendSuccess = false;
             User.sendCheckCode({newUserEmail: newUserEmail}, function () {
               $scope.codeSuccess = true;
@@ -872,6 +875,7 @@ define(['app/app'], function (app) {
                   }, 1000, 60);
             }, function (response) {
               toaster.pop('error', '错误', response.data);
+              $scope.sendSuccess = true;
             });
           };
 
@@ -938,7 +942,6 @@ define(['app/app'], function (app) {
               $scope.validSuccess = false;
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = false;
-              $scope.sendSuccess = false;
               window.location.href = "user#/accountManager/sec";
               window.location.reload();
               $modalInstance.close();
@@ -983,7 +986,6 @@ define(['app/app'], function (app) {
           };
 
           //新手机号是否可用
-          $scope.sendSuccess = false;
           $scope.checkFailed1 = false;
           $scope.checkFailed1_1 = false;
           $scope.checkSuccess1 = false;
@@ -991,7 +993,6 @@ define(['app/app'], function (app) {
             if (newUserTel == null || !/^[0-9]{8,11}$/.test(newUserTel)) {
               $scope.checkFailed1 = true;
               $scope.checkSuccess1 = false;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
               return false;
             }
@@ -1002,13 +1003,11 @@ define(['app/app'], function (app) {
               if (data.data == "true") {//手机可用
                 $scope.checkSuccess1 = true;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = true;
                 $scope.checkFailed1_1 = false;
               } else {//手机不可用
                 $scope.checkFailed1_1 = true;
                 $scope.checking1 = false;
                 $scope.checkSuccess1 = false;
-                $scope.sendSuccess = false;
               }
             }, function () {
               $scope.checkFailed1 = true;
@@ -1018,10 +1017,17 @@ define(['app/app'], function (app) {
             });
           };
 
-          //发送验证码
+          // 发送验证码
           $scope.codeSuccess = false;
-          //发送验证码
+          $scope.sendSuccess = true;
+          // 发送验证码
           $scope.sendTelCheckCode = function (newUserTel) {
+              if (!$scope.checkSuccess1 || ($scope.userInfo.userTel!=null && !$scope.checkSuccess)) {
+                  if ($scope.userInfo.userTel!=null && !$scope.checkSuccess) {
+                      $scope.checkFailed = true;
+                  }
+                  return;
+              }
             $scope.sendSuccess = false;
             User.sendTelCheckCode({newUserTel: newUserTel}, function () {
               $scope.codeSuccess = true;
@@ -1042,6 +1048,7 @@ define(['app/app'], function (app) {
                   }, 1000, 60);
             }, function (response) {
               toaster.pop('error', '错误', response.data);
+              $scope.sendSuccess = true;
             });
           };
 

+ 3 - 2
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_invoice_ctrl.js

@@ -91,8 +91,9 @@ define(['app/app'], function(app) {
         //上传发票许可证
         $scope.onUploadPermission = function () {
             $scope.isDoUpload = true;
-            if (event.target.files[0].size < 3*1024*1024) {
-                $scope.bill.attachUrl = event.target.files[0].name;
+            // console.log($scope.bill.billInfo);
+            if ($scope.bill.billInfo[0].size < 3*1024*1024) {
+                $scope.bill.attachUrl = $scope.bill.billInfo[0].name;
             } else {
                 $scope.bill.attachUrl = '';
             }

+ 73 - 13
src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js

@@ -6,9 +6,9 @@ define(['app/app'], function (app) {
   'use strict';
   app.register.controller('seekPurchaseCtrl',
       ['$scope', '$rootScope', 'seekPurchase', 'toaster', 'BaseService',
-        'ngTableParams', 'Order', 'SessionService', '$filter', '$upload', '$stateParams',
+        'ngTableParams', 'Order', 'SessionService', '$filter', '$upload', '$stateParams', 'Search',
         function ($scope, $rootScope, seekPurchase, toaster, BaseService,
-            ngTableParams, Order, SessionService, $filter, $upload, $stateParams) {
+            ngTableParams, Order, SessionService, $filter, $upload, $stateParams, Search) {
           $rootScope.active = 'seek_purchase';
           document.title = '我的求购-优软商城';
           $scope.activeType = $stateParams.type ? $stateParams.type :'seekManage';
@@ -63,6 +63,7 @@ define(['app/app'], function (app) {
           $scope.deadDate.setMonth($scope.deadDate.getMonth() + 3);
 
           $scope.checkCode = function () {
+            $scope.setShowSimilarCodeList($scope.isInCodeList);
             $scope.validObj.code = $scope.applyObj.code && $scope.applyObj.code !== '';
             if (!$scope.validObj.code) {
               toaster.pop('error', '型号不能为空');
@@ -70,6 +71,7 @@ define(['app/app'], function (app) {
             return this.validObj.code;
           }
           $scope.checkBrand = function () {
+            $scope.setShowSimilarBrandList($scope.isInBrandList);
             $scope.validObj.brand = $scope.applyObj.brand
                 && $scope.applyObj.brand !== '';
             if (!$scope.validObj.brand) {
@@ -81,8 +83,8 @@ define(['app/app'], function (app) {
             $scope.validObj.unitPrice = ($scope.applyObj.unitPrice === '' || !$scope.applyObj.unitPrice ) ? true
                 : $scope.applyObj.unitPrice > 0 && $scope.applyObj.unitPrice
                 < 100000000;
-            if (!$scope.validObj.unitPrice) {
-              toaster.pop('error', '请输入正确的数值');
+            if (!$scope.validObj.unitPrice || $scope.validObj.unitPrice <= 0) {
+              toaster.pop('error', '单价必须是大于0的数字');
             }
             return $scope.validObj.unitPrice;
           }
@@ -133,6 +135,12 @@ define(['app/app'], function (app) {
               $scope.applyObj.code = cutOutString($scope.applyObj.code, chineseIndex);
             } else if ($scope.applyObj.code && getRealLen($scope.applyObj.code) > 100) {
               $scope.applyObj.code = cutOutString($scope.applyObj.code, 100);
+            } else {
+              if ($scope.applyObj.code) {
+                $scope.getSimilarCode();
+              } else {
+                $scope.showSimilarCodeList = false;
+              }
             }
           }
           $scope.onBrandChange = function () {
@@ -150,6 +158,12 @@ define(['app/app'], function (app) {
               }
             } else if ($scope.applyObj.brand && getRealLen($scope.applyObj.brand) > 50) {
               $scope.applyObj.brand = cutOutString($scope.applyObj.brand, 50);
+            } else {
+              if ($scope.applyObj.brand) {
+                $scope.getSimilarBrand();
+              } else {
+                $scope.showSimilarBrandList = false;
+              }
             }
           }
           $scope.onProduceDateChange = function () {
@@ -164,9 +178,8 @@ define(['app/app'], function (app) {
             return $scope.validObj.amount;
           }
           $scope.checkAll = function () {
-            return $scope.checkCode() && $scope.checkBrand()
-                && $scope.checkUnitPrice() && $scope.checkAmount()
-                && $scope.checkDeadline();
+            return $scope.checkCode() && $scope.checkBrand() && $scope.checkDeadline()
+                && $scope.checkUnitPrice() && $scope.checkAmount();
           }
           $scope.checkDeadline = function () {
             $scope.validObj.deadline = $scope.applyObj.deadline
@@ -219,13 +232,15 @@ define(['app/app'], function (app) {
                     toaster.pop('error', res.data);
                   });
             } else {
-              if (!$scope.validObj.code) {
-                toaster.pop('error', '型号不能为空');
-              } else if (!$scope.validObj.brand) {
-                toaster.pop('error', '品牌不能为空');
-              } else if (!$scope.validObj.deadline) {
+              // if (!$scope.validObj.code) {
+              //   // toaster.pop('error', '型号不能为空');
+              // } else if (!$scope.validObj.brand) {
+              //   // toaster.pop('error', '品牌不能为空');
+              if (!$scope.validObj.deadline) {
                 toaster.pop('error', '截止日期不能为空');
-              } else if (!$scope.validObj.amount || !$scope.validObj.unitPrice) {
+              } else if (!$scope.validObj.unitPrice) {
+                // toaster.pop('error', '单价必须是大于0的数字');
+              } else if (!$scope.validObj.amount) {
                 toaster.pop('error', '请输入正确的数值');
               }
             }
@@ -738,5 +753,50 @@ define(['app/app'], function (app) {
             $scope.bomTableParams.reload();
           }
 
+          $scope.showSimilarCodeList = false;
+          $scope.isInCodeList = false;
+          $scope.showSimilarBrandList = false;
+          $scope.isInBrandList = false;
+
+          $scope.getSimilarCode = function () {
+            if ($scope.applyObj.code) {
+              Search.getSimilarComponents({keyword : $scope.applyObj.code}, function (data) {
+                $scope.similarCode = data || [];
+                $scope.setShowSimilarCodeList(data && data.length);
+              }, function (error) {
+                toaster.pop('error', '系统错误');
+              })
+            }
+          }
+
+          $scope.getSimilarBrand = function () {
+            if ($scope.applyObj.brand) {
+              Search.getSimilarBrands({keyword : $scope.applyObj.brand}, function (data) {
+                $scope.similarBrand = data || [];
+                $scope.setShowSimilarBrandList(data && data.length);
+              }, function (error) {
+                toaster.pop('error', '系统错误');
+              })
+            }
+          }
+          
+          $scope.setCode = function (code) {
+            $scope.applyObj.code = code;
+            $scope.setShowSimilarCodeList(false);
+          }
+
+          $scope.setShowSimilarCodeList = function (flag) {
+            $scope.showSimilarCodeList = flag;
+          }
+
+          $scope.setBrand = function (brand) {
+            $scope.applyObj.brand = brand;
+            $scope.setShowSimilarBrandList(false);
+          }
+
+          $scope.setShowSimilarBrandList = function (flag) {
+            $scope.showSimilarBrandList = flag;
+          }
+          
         }]);
 });

+ 2 - 2
src/main/webapp/resources/js/vendor/app.js

@@ -1,4 +1,4 @@
-define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'common/query/brand', 'common/query/kind', 'common/query/component', 'common/query/goods', 'common/query/rate','common/query/cart', 'common/query/order', 'common/query/address', 'common/query/invoice', 'common/query/property', 'common/query/kindAdvice', 'common/query/propertyAdvice', 'common/query/return' , 'common/query/change', 'common/query/logistics', 'ui.router', 'ui-bootstrap', 'ui-form', 'ui-jquery','angular-toaster', 'ngDraggable', 'angular-sanitize', 'ngTable', 'dynamicInput', 'jquery-imagezoom', 'file-upload', 'file-upload-shim', 'common/query/urlencryption' , 'common/query/purchase', 'common/query/vendor', 'common/query/goods', 'common/query/bankTransfer', 'common/query/enterprise', 'common/query/bill', 'common/query/receipt', 'common/query/collection', 'common/query/express', 'common/query/bankInfo','common/query/charge', 'common/query/statistics', 'common/query/currency', 'jquery-chart', 'common/query/responseLogistics', 'common/query/goodsPrice', 'common/query/address' , 'common/query/search', 'common/query/urlencryption', 'common/query/releaseProInfo', 'common/query/makerDemand', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/logistics', 'common/query/storeInfo', 'common/query/recommendation', 'common/query/user', 'common/query/logisticsPort', 'common/query/cms', 'common/query/material', 'common/query/storeCms', 'common/query/productImport', 'common/query/stockInOut', 'common/module/store_recommend_product', 'common/module/chat_web_module', 'common/query/standardPutOnAdmin', 'common/query/storeViolations', 'common/query/internalMessage', 'common/query/installments','common/query/product','common/query/seekPurchase'], function(angularAMD) {
+define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'common/query/brand', 'common/query/kind', 'common/query/component', 'common/query/goods', 'common/query/rate','common/query/cart', 'common/query/order', 'common/query/address', 'common/query/invoice', 'common/query/property', 'common/query/kindAdvice', 'common/query/propertyAdvice', 'common/query/return' , 'common/query/change', 'common/query/logistics', 'ui.router', 'ui-bootstrap', 'ui-form', 'ui-jquery','angular-toaster', 'ngDraggable', 'angular-sanitize', 'ngTable', 'dynamicInput', 'jquery-imagezoom', 'file-upload', 'file-upload-shim', 'common/query/urlencryption' , 'common/query/purchase', 'common/query/vendor', 'common/query/goods', 'common/query/bankTransfer', 'common/query/enterprise', 'common/query/bill', 'common/query/receipt', 'common/query/collection', 'common/query/express', 'common/query/bankInfo','common/query/charge', 'common/query/statistics', 'common/query/currency', 'jquery-chart', 'common/query/responseLogistics', 'common/query/goodsPrice', 'common/query/address' , 'common/query/search', 'common/query/urlencryption', 'common/query/releaseProInfo', 'common/query/makerDemand', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/logistics', 'common/query/storeInfo', 'common/query/recommendation', 'common/query/user', 'common/query/logisticsPort', 'common/query/cms', 'common/query/material', 'common/query/storeCms', 'common/query/productImport', 'common/query/stockInOut', 'common/module/store_recommend_product', 'common/module/chat_web_module', 'common/query/standardPutOnAdmin', 'common/query/storeViolations', 'common/query/internalMessage', 'common/query/installments','common/query/product','common/query/seekPurchase','common/query/UASBatchPutOnProperty'], function(angularAMD) {
 	'use strict';
 	/**
 	 * 自定义Array对象的属性last 方法
@@ -8,7 +8,7 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 		return this.length > 0 ? this[this.length - 1] : null;
 	};
 
-	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ui.form', 'ui.jquery', 'toaster', 'ngDraggable', 'tool.directives', 'ngSanitize', 'common.query.kind', 'common.services', 'brandServices', 'componentServices', 'goodsServices',  'rateServices','cartServices', 'orderServices', 'addressServices', 'invoiceServices', 'common.query.propertyAdvice', 'propertyServices', 'returnServices' , 'changeServices',  'logisticsServices', 'common.query.kindAdvice', 'ngTable', 'ngDynamicInput', 'common.directives', 'angularFileUpload', 'urlencryptionServices', 'purchaseServices', 'vendorServices', 'goodsServices', 'bankTransfer', 'common.query.enterprise', 'billServices', 'receiptServices', 'collection', 'expressServices', 'bankInfo','Charge', 'statisticsServices', 'currencyService', 'responseLogisticsService', 'PriceServices', 'addressServices', 'searchService', 'urlencryptionServices', 'ReleaseProductByBatchService', 'makerDemand', 'afterSaleService', 'messageBoardServices', 'logisticsServices', 'table.directives', 'storeInfoServices', 'recommendation', 'common.query.user', 'logisticsPortService', 'cmsService', 'materialServices', 'StoreCmsServices', 'productImportModule', 'stockInOutModule', 'StoreCmsModule', 'WebChatModule', 'StandardPutOnAdminModule', 'StoreViolationsServices', 'internalMessageServices', 'installmentServices','common.query.product', 'ui.tour', 'seekPurchaseServices']);
+	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ui.form', 'ui.jquery', 'toaster', 'ngDraggable', 'tool.directives', 'ngSanitize', 'common.query.kind', 'common.services', 'brandServices', 'componentServices', 'goodsServices',  'rateServices','cartServices', 'orderServices', 'addressServices', 'invoiceServices', 'common.query.propertyAdvice', 'propertyServices', 'returnServices' , 'changeServices',  'logisticsServices', 'common.query.kindAdvice', 'ngTable', 'ngDynamicInput', 'common.directives', 'angularFileUpload', 'urlencryptionServices', 'purchaseServices', 'vendorServices', 'goodsServices', 'bankTransfer', 'common.query.enterprise', 'billServices', 'receiptServices', 'collection', 'expressServices', 'bankInfo','Charge', 'statisticsServices', 'currencyService', 'responseLogisticsService', 'PriceServices', 'addressServices', 'searchService', 'urlencryptionServices', 'ReleaseProductByBatchService', 'makerDemand', 'afterSaleService', 'messageBoardServices', 'logisticsServices', 'table.directives', 'storeInfoServices', 'recommendation', 'common.query.user', 'logisticsPortService', 'cmsService', 'materialServices', 'StoreCmsServices', 'productImportModule', 'stockInOutModule', 'StoreCmsModule', 'WebChatModule', 'StandardPutOnAdminModule', 'StoreViolationsServices', 'internalMessageServices', 'installmentServices','common.query.product', 'ui.tour', 'seekPurchaseServices', 'UASBatchPutOnPropertyModule']);
 	//初始化,启动时载入app
 	app.init = function() {
 		angularAMD.bootstrap(app);

+ 17 - 10
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_account_management_ctrl.js

@@ -760,11 +760,10 @@ define(['app/app'], function(app) {
           $scope.emailEnable = function (newUserEmail) {
             //邮箱不可用
             if ((newUserEmail == null || newUserEmail.length > 30)
-                || !/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(
+                || !(/^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g).test(
                     newUserEmail)) {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
               return false;
             }
@@ -772,25 +771,29 @@ define(['app/app'], function(app) {
               if (data.data == "true") {//邮箱可用
                 $scope.checkSuccess1 = true;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = true;
                 $scope.checkFailed1_1 = false;
               } else {//邮箱不可用
                 $scope.checkSuccess1 = false;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = false;
                 $scope.checkFailed1_1 = true;
               }
             }, function () {
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
             });
           };
 
           $scope.codeSuccess = false;
+          $scope.sendSuccess = true;
           //发送验证码
           $scope.sendCheckCode = function (newUserEmail) {
+            if (!$scope.checkSuccess1 || ($scope.userInfo.userEmail!=null && !$scope.checkSuccess)) {
+                if ($scope.userInfo.userEmail!=null && !$scope.checkSuccess) {
+                    $scope.checkFailed = true;
+                }
+              return;
+            }
             $scope.sendSuccess = false;
             User.sendCheckCode({newUserEmail: newUserEmail}, function () {
               $scope.codeSuccess = true;
@@ -811,6 +814,7 @@ define(['app/app'], function(app) {
                   }, 1000, 60);
             }, function (response) {
               toaster.pop('error', '错误', response.data);
+              $scope.sendSuccess = true;
             });
           };
 
@@ -877,7 +881,6 @@ define(['app/app'], function(app) {
               $scope.validSuccess = false;
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = false;
-              $scope.sendSuccess = false;
               window.location.href = "vendor#/account/management/sec";
               window.location.reload();
               $modalInstance.close();
@@ -922,7 +925,6 @@ define(['app/app'], function(app) {
           };
 
           //新手机号是否可用
-          $scope.sendSuccess = false;
           $scope.checkFailed1 = false;
           $scope.checkFailed1_1 = false;
           $scope.checkSuccess1 = false;
@@ -930,7 +932,6 @@ define(['app/app'], function(app) {
             if (newUserTel == null || !/^[0-9]{8,11}$/.test(newUserTel)) {
               $scope.checkFailed1 = true;
               $scope.checkSuccess1 = false;
-              $scope.sendSuccess = false;
               $scope.checkFailed1_1 = false;
               return false;
             }
@@ -941,13 +942,11 @@ define(['app/app'], function(app) {
               if (data.data == "true") {//手机可用
                 $scope.checkSuccess1 = true;
                 $scope.checkFailed1 = false;
-                $scope.sendSuccess = true;
                 $scope.checkFailed1_1 = false;
               } else {//手机不可用
                 $scope.checkFailed1_1 = true;
                 $scope.checking1 = false;
                 $scope.checkSuccess1 = false;
-                $scope.sendSuccess = false;
               }
             }, function () {
               $scope.checkFailed1 = true;
@@ -959,8 +958,15 @@ define(['app/app'], function(app) {
 
           //发送验证码
           $scope.codeSuccess = false;
+          $scope.sendSuccess = true;
           //发送验证码
           $scope.sendTelCheckCode = function (newUserTel) {
+            if (!$scope.checkSuccess1 || ($scope.userInfo.userTel!=null && !$scope.checkSuccess)) {
+                if ($scope.userInfo.userTel!=null && !$scope.checkSuccess) {
+                    $scope.checkFailed = true;
+                }
+                return;
+            }
             $scope.sendSuccess = false;
             User.sendTelCheckCode({newUserTel: newUserTel}, function () {
               $scope.codeSuccess = true;
@@ -981,6 +987,7 @@ define(['app/app'], function(app) {
                   }, 1000, 60);
             }, function (response) {
               toaster.pop('error', '错误', response.data);
+              $scope.sendSuccess = true;
             });
           };
 

+ 250 - 49
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js

@@ -1,6 +1,6 @@
 define([ 'app/app', 'jquery-uploadify' ], function(app) {
 	'use strict';
-	app.register.controller('vendor_materialCtrl', ['$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) {
+	app.register.controller('vendor_materialCtrl', ['$scope', '$rootScope', 'Material', 'toaster', 'ComponentActive', 'Enterprise', '$q', 'NumberService', '$location', '$stateParams', 'Search', '$modal', 'ComponentActiveAPI', 'BrandSubmit', 'BrandActiveAPI', 'DistributionRule', 'prodRepositoryService', 'AuthenticationService', 'StoreInfo', 'ProductServiceQuery', 'StoreCms', 'ByteCountService', 'Goods', 'UASBatchPutOnPropertyServices', '$filter', function ($scope, $rootScope, Material, toaster, ComponentActive, Enterprise, $q, NumberService, $location, $stateParams, Search, $modal, ComponentActiveAPI, BrandSubmit, BrandActiveAPI, DistributionRule, prodRepositoryService, AuthenticationService, StoreInfo, ProductServiceQuery, StoreCms, ByteCountService, Goods, UASBatchPutOnPropertyServices, $filter) {
 		$rootScope.active = 'vendor_material';
 		document.title = '卖家产品库-优软商城';
 		$scope.tab = 'material';
@@ -16,6 +16,23 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		$scope.$$nonProduct.count = 10;
 
 		$scope.$$nonProduct.enterSaveButton = false;
+
+		$scope.$$nonProduct.enterBatchPutOnPropertySaveButton = false;
+
+		// $scope.salePrice = 0;
+
+		$scope.setSalePrice = function (price) {
+			$scope.uasBatchPutOnProperty.editFluctuateRate = price;
+		}
+
+		$scope.onSalePriceChange = function (salePrice) {
+			if ($scope.uasBatchPutOnProperty.editFluctuateRate < 1) {
+				$scope.uasBatchPutOnProperty.editFluctuateRate = 1;
+			} else if ($scope.uasBatchPutOnProperty.editFluctuateRate > 200) {
+				$scope.uasBatchPutOnProperty.editFluctuateRate = 200;
+			}
+		}
+
 		/**
 		 * 最大
 		 * @type {number}
@@ -136,7 +153,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
             //获取店铺的信息
             StoreInfo.getStoreInfoByEnuu({enUU : $rootScope.userInfo.enterprise.uu}, function(data) {
                 $scope.storeInfo = data;
-				if (!$scope.storeInfo || $scope.storeInfo.status != 'OPENED' || $scope.storeInfo.storeName.indexOf('优软测试二') > 0 || $scope.storeInfo.storeName.indexOf('优软商城') > 0) {
+				if (!$scope.storeInfo || $scope.storeInfo.status != 'OPENED' || $scope.storeInfo.storeName.indexOf('优软测试二') > -1 || $scope.storeInfo.storeName.indexOf('优软商城') > -1) {
 					$scope.$$nonProduct.canSelfSale = false;
 				} else {
 					$scope.$$nonProduct.canSelfSale = true;
@@ -189,6 +206,25 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			}
 		});
 
+        /**
+         * 获取批量上架的配置信息
+         */
+        UASBatchPutOnPropertyServices.get(null, function (data) {
+            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.editMinDelivery = $scope.uasBatchPutOnProperty.minDelivery || 1;
+            } else {
+				$scope.uasBatchPutOnProperty = {};
+                $scope.uasBatchPutOnProperty.editFluctuateRate = 100;
+                $scope.uasBatchPutOnProperty.editMaxDelivery = 1;
+                $scope.uasBatchPutOnProperty.editMinDelivery = 1;
+            }
+        }, function (response) {
+            console.log(response);
+        });
+
 		/**
 		 * 切换标准/非标准
 		 * @param isStandard
@@ -438,12 +474,16 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 					}
 					for(var i = 0; i < $scope.currenctMaterial.length; i++) {
 						if($scope.currenctMaterial[i].id == response.id) {
-							$scope.currenctMaterial.splice(i, 1, response);
-							if(response.batchCount > 0) {
-								$scope.expandGoods($scope.currenctMaterial[i]);
-							}else {
-								$scope.currenctMaterial[i].exPandOper = false;
-							}
+                            $scope.currenctMaterial[i].batchCount--;
+                            if ($scope.currenctMaterial[i].batchCount < 1) {
+                                $scope.currenctMaterial[i].exPandOper = false;
+                            }
+                            for(var j = 0; j < $scope.currenctMaterial[i].goodsArr.length; j++) {
+                                if ($scope.choosedIds[0] == $scope.currenctMaterial[i].goodsArr[j].id) {
+                                    $scope.currenctMaterial[i].goodsArr.splice(j, 1);
+                                }
+                            }
+							// $scope.currenctMaterial.splice(i, 1, response);
 						}
 					}
 				}
@@ -464,6 +504,21 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 					}
 					material.exPandOper = false;
 					material.addGoodsOper = false;
+				});
+				$scope.goods.editReserve = material.erpReserve;
+				if ('ERP' == material.sourceApp) {
+					angular.forEach(material.goodsArr, function (goods) {
+						if (goods.status != 612) {
+							$scope.goods.editReserve = $scope.goods.editReserve - goods.reserve;
+						}
+					});
+					$scope.goods.editReserve = $scope.goods.editReserve < 0 ? 0 : $scope.goods.editReserve;
+					$scope.goods.maxReserve = $scope.goods.editReserve;
+					$scope.goods.sourceApp = 'ERP';
+				}
+
+				angular.forEach(material.goodsArr, function (goods) {
+
 				});
 				material.exPandOper = true;
 				material.selected = true;
@@ -660,6 +715,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 
 		$scope.deleteIdArray = [];
 		$scope.ensureDeleteRepeat = function () {
+			$scope.deleteIdArray = [];
 			for (var i = 0; i < $scope.repeatList.length; i++) {
 				if (!$scope.repeatList[i].selected) {
 					toaster.pop("info", "请选择要保留的产品信息");
@@ -1354,12 +1410,17 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
                         }
                         for(var i = 0; i < $scope.currenctMaterial.length; i++) {
                             if($scope.currenctMaterial[i].id == response.id) {
-                                $scope.currenctMaterial.splice(i, 1, response);
-                                if(response.batchCount > 0) {
-                                    $scope.expandGoods($scope.currenctMaterial[i]);
-                                }else {
-                                    $scope.currenctMaterial[i].exPandOper = false;
-                                }
+								if (!$scope.currenctMaterial[i].batchCount) {
+									$scope.currenctMaterial[i].batchCount = 1;
+								} else {
+									$scope.currenctMaterial[i].batchCount++;
+								}
+                                // if(response.batchCount > 0) {
+                                //     $scope.expandGoods($scope.currenctMaterial[i]);
+                                // }else {
+                                //     $scope.currenctMaterial[i].exPandOper = false;
+                                // }
+								$scope.expandGoods($scope.currenctMaterial[i]);
                             }
                         }
                     }, function (response) {
@@ -1663,22 +1724,30 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 		 */
 		var getProductDetail = function (product) {
 			Material.getProductDetail({id : product.id}, function (data) {
-				// $scope.goods.erpReserve = typeof data.reserve == 'undefined' ? 0 : data.reserve;
-				// $scope.goods.b2cReserve = typeof data.b2cReserve == 'undefined' ? 0 : data.b2cReserve;
-				// $scope.goods.packaging = data.packaging;
-				// $scope.goods.produceDate = data.produceDate;
-				// $scope.goods.minPackQty = data.minPackQty;
-				// $scope.goods.breakUp = data.breakUp;
-				// $scope.goods.minBuyQty = data.minBuyQty;
-				// $scope.goods.minDelivery = data.minDelivery;
-				// $scope.goods.maxDelivery = data.maxDelivery;
-				// $scope.goods.prices = [];
-				// product.selected = true;
-				// if ('MAINLAND' == $scope.store.enType)
-				// 	$scope.goods.prices.push({start : $scope.minReserve, end : $scope.maxReserve, rMBPrice: data.price});
-				// if ('HK' == $scope.store.enType)
-				// 	$scope.goods.prices.push({start : $scope.minReserve, end : $scope.maxReserve, uSDPrice: data.price});
-
+				$scope.goods.erpReserve = typeof data.reserve == 'undefined' ? 0 : data.reserve;
+				$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 = $scope.goods.editMinBuyQty - ($scope.goods.editMinBuyQty % $scope.goods.editMinPackQty);
+				if ($scope.goods.editMinBuyQty < $scope.goods.editMinPackQty) {
+					$scope.goods.editMinBuyQty = $scope.goods.editMinPackQty;
+				}
+				$scope.goods.editMinDelivery = (data && data.minDelivery) || $scope.uasBatchPutOnProperty.minDelivery;
+				$scope.goods.editMaxDelivery = (data && data.maxDelivery) || $scope.uasBatchPutOnProperty.maxDelivery;
+				product.selected = true;
+				product.averMonthSalePrice = (data && data.price) ? data.price : 0;
+				var goodQtyPrice = {start: $scope.goods.editMinBuyQty, end: $scope.maxReserve};
+				var price = (((data && data.price) ? data.price : 0) *
+				($scope.uasBatchPutOnProperty.fluctuateRate ? $scope.uasBatchPutOnProperty.fluctuateRate : 1));
+				if ('MAINLAND' == $scope.store.enType) {
+					goodQtyPrice.rMBPrice = $filter('formateNumber')(price, 6);
+				}
+				if ('HK' == $scope.store.enType) {
+					goodQtyPrice.uSDPrice = $filter('formateNumber')(price, 6);
+				}
+				$scope.goods.editPrices = [];
+				$scope.goods.editPrices.push(goodQtyPrice);
 			});
 		}
 
@@ -1730,25 +1799,28 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			});
 			material.addGoodsOper = true;
 			material.exPandOper = true;
+			$scope.goods = {};
+			$scope.goods.editBreakUp = false;
+			// 先保存产品id,方便去获取tag是否重复
+			$scope.goods.productid = material.id;
+			$scope.goods.prodNum = material.prodNum;
+			$scope.goods.editPrices = [];
+			if ($scope.store.enType === 'HK') {
+				$scope.goods.currencyName = 'USD';
+			} else {
+				$scope.goods.currencyName = 'RMB';
+			}
+			$scope.goods.editSelfSale = $scope.$$nonProduct.canSelfSale ? 1 : 2;
 			$scope.expandGoods(material, material.addGoodsOper);
-			// if ('ERP' == material.sourceApp) {// 如果是erp上传物料获取物料交易信息
-			// 	getProductDetail(material);
-			// } else {
-				$scope.goods = { editBreakUp: false, editSelfSale: 2};
-				if($scope.store.enType === 'HK') {
-					$scope.goods.currencyName = 'USD';
-				}else {
-					$scope.goods.currencyName = 'RMB';
-				}
-				// 先保存产品id,方便去获取tag是否重复
-				$scope.goods.productid = material.id;
-				$scope.goods.prodNum = material.prodNum;
-				$scope.goods.editPrices = [];
-				$scope.goods.editSelfSale = $scope.$$nonProduct.canSelfSale ? 1 : 2;
-				$scope.goods.editPrices.push({start : $scope.minReserve, end : $scope.maxReserve});
+			if ('ERP' == material.sourceApp) {
+				// 如果是erp上传物料获取物料交易信息
+				getProductDetail(material);
+			} else {
+				$scope.goods.editPrices.push({start: $scope.minReserve, end: $scope.maxReserve});
 				// $scope.goods.isSelfSupport = $scope.store.status == 'OPENED' ? 1 : 0;
 				material.selected = true;
-			// }
+				// }
+			}
 		}
 
 		/**
@@ -1882,6 +1954,13 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 				}
                 return false;
             }
+            if (goods.sourceApp == 'ERP') {
+				if (Number(goods.maxReserve) < goods.editReserve) {
+					goods.editReserve = goods.maxReserve;
+					toaster.pop('warning', '提示', '不能超过可用库存');
+				}
+				return false;
+			}
             goods.editReservePre = goods.editReserve;
             goods.editReserveInvalid = false;
 			if (!goods.breakUp) {
@@ -1903,6 +1982,128 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			return str;
 		};
 
+		/***
+		 * 验证交期是否正确
+		 *
+		 * @param min
+		 * @param max
+		 */
+		$scope.uasBatchChangeDeliver = function(min, max, isMax) {
+			if ($scope.$$nonProduct.enterBatchPutOnPropertySaveButton) {
+				return ;
+			}
+			var day;
+			day = isMax ? max : min;
+			if (typeof day == 'undefined') {
+				return ;
+			} else {
+				if ($scope.isInt.test(day)) {
+					if (Number(day) < 1 || Number(day) > 31) {
+						toaster.pop('warning', '提示', '交期必须是1-31的整数');
+						return ;
+					}
+				} else {
+					toaster.pop('warning', '提示', '交期必须是1-31的整数');
+					return ;
+				}
+			}
+
+			if ($scope.isInt.test(min) && $scope.isInt.test(max)) {
+				if (max < min) {
+					toaster.pop('warning', '提示', '最小交期不能大于最大交期');
+				}
+			}
+		};
+
+		/**
+		 * 鼠标移入保存的按钮
+		 */
+		$scope.enterBatchPutOnPropertySaveButton = function () {
+			$scope.$$nonProduct.enterBatchPutOnPropertySaveButton = true;
+		}
+
+		/**
+		 * 鼠标移出保存按钮
+		 */
+		$scope.leaveBatchPutOnPropertySaveButton = function () {
+			$scope.$$nonProduct.enterBatchPutOnPropertySaveButton = false;
+		}
+
+		/**
+		 * 验证配置的信息
+		 */
+		$scope.validateBatchPutOnProperty = function() {
+			if (!$scope.uasBatchPutOnProperty.editFluctuateRate || Number($scope.uasBatchPutOnProperty.editFluctuateRate) < 1 || Number($scope.uasBatchPutOnProperty.editFluctuateRate) > 200) {
+				toaster.pop('warning', '提示', '浮动率必须介于1-200');
+				return false;
+			}
+			if (!$scope.uasBatchPutOnProperty.editMinDelivery || !$scope.uasBatchPutOnProperty.editMaxDelivery) {
+				toaster.pop('warning', '提示', '交期必须是1-31的整数');
+				return false;
+			}
+			if (Number($scope.uasBatchPutOnProperty.editMinDelivery) > Number($scope.uasBatchPutOnProperty.editMaxDelivery)) {
+				toaster.pop('warning', '提示', '最小交期不能大于最大交期');
+				return false;
+			}
+
+			return true;
+		}
+
+		/**
+		 * 批量保存配置信息
+		 */
+		$scope.saveBatchPutOnProperty = function() {
+			var isPass = $scope.validateBatchPutOnProperty();
+			if (!isPass) {
+				return false;
+			}
+			$scope.uasBatchPutOnProperty.fluctuateRate = $scope.uasBatchPutOnProperty.editFluctuateRate / 100;
+			$scope.uasBatchPutOnProperty.minDelivery = $scope.uasBatchPutOnProperty.editMinDelivery;
+			$scope.uasBatchPutOnProperty.maxDelivery = $scope.uasBatchPutOnProperty.editMaxDelivery;
+			UASBatchPutOnPropertyServices.save(null, $scope.uasBatchPutOnProperty, function (data) {
+				if (data.code == 1) {
+					$scope.uasBatchPutOnProperty = data.data;
+					$scope.uasBatchPutOnProperty.editFluctuateRate =  NumberService.mul($scope.uasBatchPutOnProperty.fluctuateRate, 100);
+					$scope.uasBatchPutOnProperty.editMinDelivery = $scope.uasBatchPutOnProperty.minDelivery;
+					$scope.uasBatchPutOnProperty.editMaxDelivery = $scope.uasBatchPutOnProperty.maxDelivery;
+					toaster.pop('success', '成功', "保存成功");
+					$scope.isBatch = false;
+				} else {
+					toaster.pop('error', '失败', data.message);
+				}
+			}, function (response) {
+				toaster.pop('error', '失败', response.data);
+			});
+		};
+
+		/**
+		 * 批量上架信息
+		 */
+		$scope.batchPutOn = function () {
+			var isFluctuateRateChange = $scope.uasBatchPutOnProperty.editFluctuateRate != $scope.uasBatchPutOnProperty.fluctuateRate * 100;
+			var isMinDeliveryChange = $scope.uasBatchPutOnProperty.editMinDelivery != $scope.uasBatchPutOnProperty.minDelivery;
+			var isMaxDeliveryChange = $scope.uasBatchPutOnProperty.editMaxDelivery != $scope.uasBatchPutOnProperty.maxDelivery;
+			if (isFluctuateRateChange || isMinDeliveryChange || isMaxDeliveryChange) {
+				toaster.pop('warning', '提示', '批量上架配置信息被修改,请保存批量上架配置信息之后再上架');
+                return ;
+			}
+			$scope.choosedIds = [];
+			$scope.getChoosedInfo();
+			if(!$scope.isChoosedAll && (!$scope.choosedIds || $scope.choosedIds.length == 0)) {
+				toaster.pop('warning', '提示','请选择要删除的信息');
+				return true;
+			}
+			var idStr = ($scope.choosedIds != null) ? $scope.choosedIds.join(',') : null;
+			var std = $scope.standard_tab == 'standard' ? 1 : 0;
+			Material.batchPutOn({'standard' : std, ids : idStr}, null, function (data) {
+				loadData();
+				toaster.pop('success', '成功', data.message);
+			}, function (response) {
+				toaster.pop('error', '失败', response.data);
+			});
+
+		}
+
         /**
          * 编辑包装方式的信息
          * @param goods
@@ -1963,14 +2164,14 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 				toaster.pop('warning', '提示', '单价必须是大于0的数字');
 				return;
 			}
-			if(price.indexOf('.') > -1) {
-				var arr = price.split(".");
+			if(price.toString().indexOf('.') > -1) {
+				var arr = price.toString().split(".");
 				if(arr[0].length > 4 || arr[1].length > 6) {
 					prices[index].priceInvalid = true;
 					return ;
 				}
 			}else {
-				if(price.toString().length > 4) {
+				if(price.toString().toString().length > 4) {
 					prices[index].priceInvalid = true;
 					return ;
 				}

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

@@ -400,7 +400,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			var modalInstance = $modal.open({
 				animation: true,
 				templateUrl: 'static/view/common/modal/delete_modal.html',
-				controller: 'vendor_delete_ctrl',
+				controller: 'vendor_delete_person_ctrl',
 				resolve: {
 					ids: function() {
 						return $scope.choosedIds;
@@ -2561,7 +2561,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 
 
 	//批量删除信息
-	app.register.controller('vendor_delete_ctrl', ['$scope', 'ids', 'Goods', 'Material', 'toaster', 'deleteMaterial', 'deleteGoods', 'selectAll', 'ProductServiceQuery', 'standard_tab', '$modalInstance', 'message', function ($scope, ids, Goods, Material, toaster, deleteMaterial, deleteGoods, selectAll, ProductServiceQuery, standard_tab, $modalInstance, message) {
+	app.register.controller('vendor_delete_person_ctrl', ['$scope', 'ids', 'Goods', 'Material', 'toaster', 'deleteMaterial', 'deleteGoods', 'selectAll', 'ProductServiceQuery', 'standard_tab', '$modalInstance', 'message', function ($scope, ids, Goods, Material, toaster, deleteMaterial, deleteGoods, selectAll, ProductServiceQuery, standard_tab, $modalInstance, message) {
 		$scope.deleteModal = true;
         $scope.message = message;
 
@@ -2572,7 +2572,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
             if(deleteMaterial) {
                 if(selectAll) {
                     if(standard_tab == 'standard') {
-                        Material.deleteStandardAll(null, null, function (data) {
+                        Material.deleteStandardAll({isPerson: 1}, function (data) {
                             if(data.code != 1) {
                                 toaster.pop('error','错误' ,data.message);
                             }else {
@@ -2584,7 +2584,7 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
                             toaster.pop('error', '错误', response.data);
                         });
                     }else {
-                        Material.deleteUnstandardAll(null, null, function (data) {
+                        Material.deleteUnstandardAll({isPerson: 1}, function (data) {
                             if(data.code != 1) {
                                 toaster.pop('error', '错误', data.message);
                             }else {

+ 1 - 0
src/main/webapp/resources/view/common/modal/delete_modal.html

@@ -10,6 +10,7 @@
         width: 310px;
         border-radius: 0;
         outline: 0;
+        overflow: hidden;
     }
     .modal-dialog{
         height: 152px;

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

@@ -12,7 +12,7 @@
         margin: -145px 0 0 -77px;
     }
     .com-del-box{
-        height: 155px;
+        height: 161px;
         width: 290px;
     }
     .com-del-box .title {

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

@@ -299,7 +299,7 @@
 					<a ng-switch-when="1">审核通过</a>
 					<a ng-switch-when="2">待审核</a>
 			</li>
-			<li>
+			<!--<li>
 				<span>
 					<h5 ng-show="userInfo.havePayPwd"><img class="ok-icon" src="static/img/user/images/ok-account.png"/></h5>
 					<h5 ng-hide="userInfo.havePayPwd"><img src="static/img/user/images/safe.png"/></h5>
@@ -308,7 +308,7 @@
 				</span>
 				<a ng-hide="userInfo.havePayPwd" ng-click="updateUserPay()" class="mall-btn-default">立即设置</a>
 				<a ng-show="userInfo.havePayPwd" ng-click="updateUserPay()">修改</a>
-			</li>
+			</li>-->
 		</ul>
 	</div>
 

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

@@ -23,6 +23,11 @@
     .user_r_01 dl dd span.enName{
         max-width: 305px;
     }
+    .user_r_02 .line02 p {
+        margin: 0 !important;
+        padding-left: 22px;
+        word-break: break-all;
+    }
 </style>
 <!--右侧主体部分-->
 <div class="user_home">

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

@@ -432,7 +432,7 @@
 				<div style="text-align: right;margin-right:25px;margin-top:-30px;">
 					<span class="count-tip">显示 {{$$bankInfo.start}}-{{$$bankInfo.end}} 条,共 <em ng-bind="$$bankInfo.totalElements" style="color: #5078cb">2506</em> 条</span>
 				</div>
-				<div class="com-del-box" ng-if="showDelete">
+				<div class="com-mall-del-box" ng-if="showDelete">
 					<div class="title">
 						<i ng-click="cancelDelete()"></i>
 					</div>

+ 45 - 10
src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html

@@ -6,14 +6,15 @@
         padding-bottom: 60px;
     }
     .seek-purchase .seek-purchase-content .publish-purchase {
-        padding: 17px 40px;
+        padding: 17px 0;
     }
     .seek-purchase .seek-purchase-content .publish-purchase .fl {
-        width: 646px;
+        width: 1000px;
         height: 198px;
         padding: 0 40px 0 0;
-        margin: 0;
-        background: url('static/img/seekPurchase/user-publish-bg.png') no-repeat;
+        border: 2px dashed #fd7748;
+        margin: 0 auto;
+        float: none;
     }
     .seek-purchase .seek-purchase-content .publish-purchase .fl p {
         font-size: 18px;
@@ -22,12 +23,13 @@
         margin: 19px 0 0 0;
     }
     .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block {
-        width: 198px;
+        width: 188px;
         display: inline-block;
         margin-top: 16px;
+        position: relative;
     }
     .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block >span {
-        width: 86px;
+        width: 68px;
         height: 24px;
         line-height: 24px;
         display: inline-block;
@@ -66,6 +68,32 @@
     .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block.single-price input{
         padding-left: 37px;
     }
+    .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block ul.similar-list {
+        position: absolute;
+        top: 23px;
+        left: 68px;
+        background: #fff;
+        border: 1px solid #b5b5b5;
+        z-index: 1;
+        max-height: 112px;
+        overflow-y: auto;
+        overflow-x: hidden;
+        border-radius: 3px;
+        width: 111px;
+        font-size: 12px;
+    }
+    .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block ul.similar-list li {
+        height: 22px;
+        line-height: 22px;
+        cursor: pointer;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 5px;
+    }
+    .seek-purchase .seek-purchase-content .publish-purchase .fl .form-block ul.similar-list li:hover {
+        background: #ddd;
+    }
     .seek-purchase .seek-purchase-content .publish-purchase .fl >a {
         display: block;
         width: 142px;
@@ -75,7 +103,8 @@
         color: #fefefe;
         background: #fd7748;
         border-radius: 3px;
-        margin: 0 auto 14px;
+        margin: 14px auto;
+        font-size: 14px;
     }
     .seek-purchase .seek-purchase-content .empty-line {
         height: 20px;
@@ -234,7 +263,7 @@
         text-align: center;
         font-size: 14px;
         position: relative;
-        font-size: 12px;
+        font-weight: normal;
     }
     .seek-purchase .seek-purchase-content >table >tbody tr.expand-row table tbody tr td {
         height: 48px;
@@ -573,10 +602,16 @@
                 <div class="form-block">
                     <span><i>*</i>型号</span>
                     <input type="text" class="form-group" ng-model="applyObj.code" ng-class="{'error': !validObj.code}" ng-blur="checkCode()" ng-change="onCodeChange()" >
+                    <ul class="similar-list" ng-show="showSimilarCodeList" ng-mouseenter="isInCodeList = true;" ng-mouseleave="isInCodeList = false;">
+                        <li ng-repeat="sCode in similarCode" ng-bind="sCode.code" title="{{sCode.code}}" ng-click="setCode(sCode.code)"></li>
+                    </ul>
                 </div>
                 <div class="form-block">
                     <span><i>*</i>品牌</span>
                     <input type="text" class="form-group" ng-class="{'error': !validObj.brand}" maxlength="20" ng-model="applyObj.brand" ng-blur="checkBrand()" ng-change="onBrandChange()">
+                    <ul class="similar-list" ng-show="showSimilarBrandList" ng-mouseenter="isInBrandList = true;" ng-mouseleave="isInBrandList = false;">
+                        <li ng-repeat="sBrand in similarBrand" ng-bind="sBrand.nameEn" title="{{sBrand.nameEn}}" ng-click="setBrand(sBrand.nameEn)"></li>
+                    </ul>
                 </div>
                 <div class="form-block">
                     <span><i>*</i>截止日期</span>
@@ -781,7 +816,7 @@
                                 <tr>
                                     <th width="173">卖家</th>
                                     <th width="186">交期(天)</th>
-                                    <th width="186">价</th>
+                                    <th width="186">价格梯度</th>
                                     <th width="195">生产日期</th>
                                     <th width="221">操作</th>
                                 </tr>
@@ -796,7 +831,7 @@
                                         <td width="186"><span>{{of.currency + of.unitPrice | currencyStr}}</span></td>
                                         <td width="195" ng-bind="of.produceDate || '-'"></td>
                                         <td width="221" class="operate">
-                                            <a href = "of.user.usertTel">联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
+                                            <a>联系卖家<img src="static/img/seekPurchase/link-buyer.png" alt=""></a>
                                             <img ng-if="of.status == 202" src="static/img/seekPurchase/recieved.png" alt="" class="ng-scope">
                                             <span ng-if="seek.status != 202" ng-click="setShowUseFlag(true, of)">采纳报价</span>
                                         </td>

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

@@ -20,7 +20,7 @@
     .disabled {
         cursor: not-allowed;
     }
-    /*#toast-container {
+ /*   #toast-container {
         top: 36px;
     }
     #toast-container > .toast-info {

+ 127 - 10
src/main/webapp/resources/view/vendor/forstore/erp/vendor_material_erp.html

@@ -171,7 +171,8 @@
 	}
 	.search-check{
 		width: 100%;
-		height: 54px;
+		min-height: 54px;
+		height: auto;
 		background: #fff;
 		padding-top: 10px;
 		margin-bottom: 16px;
@@ -237,6 +238,82 @@
 	.search-check .check .check-active label{
 		margin-right: 0 !important;
 	}
+	.search-check .batch-operate {
+		clear: both;
+		background: #99FFFF;
+	}
+	.search-check .batch-operate .operate-head {
+		height: 40px;
+		line-height: 40px;
+		margin: 0 10px;
+		border-bottom: 1px solid;
+		padding: 0 20px;
+	}
+	.search-check .batch-operate .operate-head .check-active {
+		font-weight: normal;
+		height: 40px;
+	}
+	.search-check .batch-operate .operate-head .red-text {
+		color: #ee4312;
+	}
+	.search-check .batch-operate .operate-content {
+		height: 70px;
+		line-height: 30px;
+	}
+	.search-check .batch-operate .operate-content > div {
+		display: inline-block;
+	}
+	.search-check .batch-operate .operate-content > div:first-child {
+		margin-right: 111px;
+		margin-left: 28px;
+	}
+	.search-check .batch-operate .operate-content > div p {
+		font-weight: bold;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-price-title {
+		margin-right: 91px;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-progress {
+		width: 108px;
+		height: 5px;
+		background: #fff;
+		display: inline-block;
+		position: relative;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-progress i {
+		width: 5px;
+		height: 10px;
+		background: #169BD5;
+		display: inline-block;
+		position: absolute;
+		top: -3px;
+	}
+	.search-check .batch-operate .operate-content > div p em {
+		margin: 0 5px;
+	}
+	.search-check .batch-operate .operate-content > div > div input {
+		padding: 0 5px;
+		height: 25px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale input {
+		width: 60px;
+		margin-right: 10px;
+		padding-right: 12px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale div .com-btn-submit {
+		margin-right: 10px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale > div {
+		position: relative;
+	}
+	.search-check .batch-operate .operate-content .batch-sale div i {
+		position: absolute;
+		left: 234px;
+		top: 2px;
+	}
+	.search-check .batch-operate .operate-content .batch-date input {
+		width: 56px;
+	}
 	.check-input input{
 		display: none;
 	}
@@ -1252,6 +1329,13 @@
 	#define-content .labelling em{
 		color: #f00;
 	}
+	#define-content td > span {
+		float: left;
+		margin-left: 20px;
+		font-size: 13px;
+		color: #008000;
+		line-height: 24px;
+	}
 	#define-content .labelling input{
 		padding-left: 10px;
 		width: 157px;
@@ -1520,7 +1604,7 @@
 				<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>
-					<span class="check-btn" ng-show="isBatch">
+					<!--<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>
@@ -1529,7 +1613,38 @@
 						<a
 								ng-click="deleteBatch()" name="delete-material">删除</a>
 						<a ng-click="exitBatch()">取消</a>
-					</span>
+					</span>-->
+				</div>
+				<div class="batch-operate" ng-show="isBatch">
+					<div class="operate-head">
+						<label class="check-active fl">
+							<input type="checkbox"  ng-click="chooseAll()" ng-checked="isChoosedAll" id="AllChoose"/>
+							<label for="AllChoose"></label>
+							<span>全选</span>
+						</label>
+						<div class="fr">
+							<span class="red-text">批量上架仅作用于未上架的产品,已上架的不再重复上架!</span>
+							<span class="com-btn-level1 com-btn-submit" ng-click="batchPutOn()">批量上架</span>
+							<span class="com-btn-level1 com-btn-submit" ng-mouseenter="enterBatchPutOnPropertySaveButton()" ng-mouseleave="leaveBatchPutOnPropertySaveButton()" ng-click="saveBatchPutOnProperty()">保存</span>
+							<span class="com-btn-level1 com-btn-red" ng-click="deleteBatch()">删除</span>
+							<span class="com-btn-level1 com-btn-cancel" ng-click="exitBatch()">取消</span>
+						</div>
+					</div>
+					<div class="operate-content">
+						<div class="batch-sale">
+							<p><span class="batch-price-title">批量设置销售价:</span><em>1</em><span class="batch-progress"><i style="left: {{uasBatchPutOnProperty.editFluctuateRate ? uasBatchPutOnProperty.editFluctuateRate > 200 ? '100%' : uasBatchPutOnProperty.editFluctuateRate / 2 + '%' : 0}}"></i></span><em>200</em></p>
+							<div><span>销售价 = 近一个月的平均销售价 X </span><input type="number" ng-model="uasBatchPutOnProperty.editFluctuateRate" ng-change="onSalePriceChange()"><i>%</i>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(100)">100%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(120)">120%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(130)">130%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(150)">150%</span>
+							</div>
+						</div>
+						<div class="batch-date">
+							<p>批量设置交期:</p>
+							<div><span>交期(天)= </span><input type="number" ng-model="uasBatchPutOnProperty.editMinDelivery" ng-blur="uasBatchChangeDeliver(uasBatchPutOnProperty.editMinDelivery, uasBatchPutOnProperty.editMaxDelivery, false)"> - <input type="number" ng-model="uasBatchPutOnProperty.editMaxDelivery" ng-blur="uasBatchChangeDeliver(uasBatchPutOnProperty.editMinDelivery, uasBatchPutOnProperty.editMaxDelivery, true)"></div>
+						</div>
+					</div>
 				</div>
 			</div>
 			<div class="wanted_list01">
@@ -1614,6 +1729,7 @@
 													<div class="labelling">
 														<!--<em>*</em>-->
 														自定义标签 : <input maxlength="20" type="text" ng-model="goods.editTag" ng-blur="blurTag(goods)" ng-change="changeTag(goods)" placeholder="请设置产品标签"></div>
+													<span>近一个月的销售平均价:<em ng-bind="material.averMonthSalePrice |  formateNumber : 6"></em></span>
 												</td>
 											</tr>
 											<tr class="edit-content edits" >
@@ -1634,7 +1750,7 @@
 																								   ng-class="{'error' : goods.editPackagingInvalid}" ng-blur="editPackaging(goods, true)" ng-change="changePackaging(goods)"/>
 															</div>
 															<div class="input-list">
-																<span class="tit">生产日期:</span><input type="text" class="form-control" name="produceDate" ng-maxlength="11" title="生产日期" maxlength="11" placeholder="生产日期" style="width: 96px;" ng-model="goods.editProduceDate" ng-init="goods.editProduceDate = material.productDetail.produceDate"
+																<span class="tit">生产日期:</span><input type="text" class="form-control" name="produceDate" ng-maxlength="11" title="生产日期" maxlength="11" placeholder="生产日期" style="width: 96px;" ng-model="goods.editProduceDate"
 																									 ng-class="{'error' : goods.editProduceDateInvalid}"
 																									 ng-change="editProduceDateFa(goods, false)"/>
 															</div>
@@ -1652,10 +1768,10 @@
 															</div>
 															<div class="input-list">
 																<span class="tit">起订量:</span><input type="number" class="wid70 form-control" name="minBuyQty" title="起拍"  placeholder="数量"
-																									maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" ng-model="goods.editMinBuyQty" ng-init="goods.editMinBuyQty = material.productDetail.minBuyQty;updateStartNumber(goods);" ng-blur="setPriceMinAmount(goods, false)" ng-change="updateStartNumber(goods)" ng-class="{'error' : goods.editMinBuyQtyInValid}"/>
+																									maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" ng-model="goods.editMinBuyQty" ng-blur="setPriceMinAmount(goods, false)" ng-change="updateStartNumber(goods)" ng-class="{'error' : goods.editMinBuyQtyInValid}"/>
 															</div>
 															<div class="input-list">
-																<span class="tit">包装数量:</span><input type="number" maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" class="wid70 form-control" name="minPackQty" title="包装数量" placeholder="数量" ng-model="goods.editMinPackQty" ng-init="goods.editMinPackQty= material.productDetail.minPackQty" ng-blur="setPriceMinPackAmount(goods)" ng-class="{'error' : goods.editMinPackQtyInValid}" style="width: 70px;"/>
+																<span class="tit">包装数量:</span><input type="number" maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" class="wid70 form-control" name="minPackQty" title="包装数量" placeholder="数量" ng-model="goods.editMinPackQty" ng-blur="setPriceMinPackAmount(goods)" ng-class="{'error' : goods.editMinPackQtyInValid}" style="width: 70px;"/>
 															</div>
 														</div>
 														<div class="content">
@@ -1682,7 +1798,7 @@
 															<p class="title height24">单价(¥)</p>
 															<div
 																	class="input-list" ng-repeat="price in goods.editPrices">
-																<input type="number" name="rmb" class="wid92 form-control"  placeholder="单价(¥)" ng-blur="changePrices(goods.editPrices, price.rMBPrice, $index)" ng-class="{'error' : price.priceInvalid}" ng-model="price.rMBPrice" ng-init="price.rMBPrice = material.productDetail.price" oninput="if(value.length>11)value=value.slice(0,11)" autocomplete="off" validata-price/>
+																<input type="number" name="rmb" class="wid92 form-control"  placeholder="单价(¥)" ng-blur="changePrices(goods.editPrices, price.rMBPrice, $index)" ng-class="{'error' : price.priceInvalid}" ng-model="price.rMBPrice" oninput="if(value.length>11)value=value.slice(0,11)" autocomplete="off" validata-price/>
 															</div>
 														</div>
 														<div class="content plusBtn">
@@ -1698,11 +1814,11 @@
 															<div class="input-list">
 																<p>
 											<span><input type="number" class="wid36 form-control" name="minDelivery" title="最小交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)"
-														 ng-model="goods.editMinDelivery" ng-init="goods.editMinDelivery = material.productDetail.minDelivery"
+														 ng-model="goods.editMinDelivery"
 														 ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, true, goods)"
 														 ng-class="{'error' : goods.editMinDeliveryinValid}"/></span>
 																	<span style="margin-left: 4px;">–</span>
-																	<span><input type="number" class="wid36 form-control" name="maxDelivery" title="最大交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)" ng-model="goods.editMaxDelivery" ng-init="goods.editMaxDelivery = material.productDetail.maxDelivery" ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, false, goods)"
+																	<span><input type="number" class="wid36 form-control" name="maxDelivery" title="最大交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)" ng-model="goods.editMaxDelivery" ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, false, goods)"
 																				 ng-class="{'error' : goods.editMaxDeliveryinValid}"/></span>
 																</p>
 															</div>
@@ -1710,7 +1826,7 @@
 														<div class="content margin10">
 															<!--<p class="title">自营 / 寄售</p>-->
 															<div class="input-list">
-																<select ng-disabled="$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale" ng-disabled="$$nonProduct.canSelfSale">
+																<select ng-disabled="!$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale">
 																	<option value="1">自营</option>
 																	<option value="2">寄售</option>
 																</select>
@@ -1800,6 +1916,7 @@
 													<div class="labelling">
 														<!--<em>*</em>-->
 														自定义标签 : <input maxlength="20" type="text" ng-model="goods.editTag" ng-blur="blurTag(goods)" ng-change="changeTag(goods)" placeholder="请设置产品标签"></div>
+													<span>近一个月的销售平均价:<em ng-bind="material.averMonthSalePrice |  formateNumber : 6"></em></span>
 												</td>
 											</tr>
 											<tr class="edit-content edits" ng-if="goods.edit">

+ 146 - 16
src/main/webapp/resources/view/vendor/forstore/erp/vendor_material_unstandard_erp.html

@@ -171,7 +171,8 @@
 	}
 	.search-check{
 		width: 100%;
-		height: 54px;
+		min-height: 54px;
+		height: auto;
 		background: #fff;
 		padding-top: 10px;
 		margin-bottom: 16px;
@@ -237,6 +238,92 @@
 	.search-check .check .check-active label{
 		margin-right: 0 !important;
 	}
+	.search-check .batch-operate {
+		clear: both;
+		background: #99FFFF;
+	}
+	.search-check .batch-operate .operate-head {
+		height: 40px;
+		line-height: 40px;
+		margin: 0 10px;
+		border-bottom: 1px solid;
+		padding: 0 20px;
+	}
+	.search-check .batch-operate .operate-head .check-active {
+		font-weight: normal;
+		height: 40px;
+	}
+	.search-check .batch-operate .operate-head .red-text {
+		color: #ee4312;
+	}
+	.search-check .batch-operate .operate-content {
+		height: 70px;
+		line-height: 30px;
+	}
+	.search-check .batch-operate .operate-content > div {
+		display: inline-block;
+	}
+	.search-check .batch-operate .operate-content > div:first-child {
+		margin-right: 111px;
+		margin-left: 28px;
+	}
+	.search-check .batch-operate .operate-content > div p {
+		font-weight: bold;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-price-title {
+		margin-right: 91px;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-progress {
+		width: 108px;
+		height: 5px;
+		background: #fff;
+		display: inline-block;
+		position: relative;
+	}
+	.search-check .batch-operate .operate-content > div p .batch-progress i {
+		width: 5px;
+		height: 10px;
+		background: #169BD5;
+		display: inline-block;
+		position: absolute;
+		top: -3px;
+	}
+	.search-check .batch-operate .operate-content > div p em {
+		margin: 0 5px;
+	}
+	.search-check .batch-operate .operate-content > div > div input {
+		padding: 0 5px;
+		height: 25px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale input {
+		width: 60px;
+		margin-right: 10px;
+		padding-right: 12px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale div .com-btn-submit {
+		margin-right: 10px;
+	}
+	.search-check .batch-operate .operate-content .batch-sale > div {
+		position: relative;
+	}
+	.search-check .batch-operate .operate-content .batch-sale div i {
+		position: absolute;
+		left: 234px;
+		top: 2px;
+	}
+	.search-check .batch-operate .operate-content .batch-date input {
+		width: 56px;
+	}
+	/*.search-check .batch-operate .operate-content .batch-sale > div > input::-webkit-outer-spin-button,
+	.search-check .batch-operate .operate-content .batch-sale > div > input::-webkit-inner-spin-button {
+		-webkit-appearance: revert !important;
+		margin: unset !important;
+		opacity: 1 !important;
+		height: auto !important;
+	}*/
+	/*.search-check .batch-operate .operate-content .batch-sale input {
+		-webkit-appearance: textfield !important;
+	}*/
 	.check-input input{
 		display: none;
 	}
@@ -1252,6 +1339,13 @@
 	#define-content .labelling em{
 		color: #f00;
 	}
+	#define-content td > span {
+		float: left;
+		margin-left: 20px;
+		font-size: 13px;
+		color: #008000;
+		line-height: 24px;
+	}
 	#define-content .labelling input{
 		padding-left: 10px;
 		width: 157px;
@@ -1518,18 +1612,52 @@
 					<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>
-					<span class="check-btn" ng-show="isBatch">
-						<label class="check-active">
+					<a ng-click="matchAll()" ng-show="!isBatch"><span>一键匹配</span></a>
+					<a ng-click="enterBatch()" ng-show="!isBatch"><span>批量操作</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="exitBatch()">取消</a>-->
+					<!--</span>-->
+				</div>
+				<div class="batch-operate" ng-show="isBatch">
+					<div class="operate-head">
+						<label class="check-active fl">
 							<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="exitBatch()">取消</a>
-					</span>
+						<div class="fr">
+							<span class="red-text">批量上架仅作用于未上架的产品,已上架的不再重复上架!</span>
+							<span class="com-btn-level1 com-btn-submit" ng-click="batchPutOn()">批量上架</span>
+							<span class="com-btn-level1 com-btn-submit" ng-mouseenter="enterBatchPutOnPropertySaveButton()" ng-mouseleave="leaveBatchPutOnPropertySaveButton()" ng-click="saveBatchPutOnProperty()">保存</span>
+							<span class="com-btn-level1 com-btn-red" ng-click="deleteBatch()">删除</span>
+							<span class="com-btn-level1 com-btn-cancel" ng-click="exitBatch()">取消</span>
+						</div>
+					</div>
+					<div class="operate-content">
+						<div class="batch-sale">
+							<p><span class="batch-price-title">批量设置销售价:</span><em>1</em><span class="batch-progress"><i style="left: {{uasBatchPutOnProperty.editFluctuateRate ? uasBatchPutOnProperty.editFluctuateRate > 200 ? '100%' : uasBatchPutOnProperty.editFluctuateRate / 2 + '%' : 0}}"></i></span><em>200</em></p>
+							<div>
+								<span>销售价 = 近一个月的平均销售价 X </span>
+								<input type="number" ng-model="uasBatchPutOnProperty.editFluctuateRate" ng-change="onSalePriceChange()">
+								<i>%</i>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(100)">100%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(120)">120%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(130)">130%</span>
+								<span class="com-btn-level2 com-btn-submit" ng-click="setSalePrice(150)">150%</span>
+							</div>
+						</div>
+						<div class="batch-date">
+							<p>批量设置交期:</p>
+							<div><span>交期(天)= </span><input type="number" ng-model="uasBatchPutOnProperty.editMinDelivery" ng-blur="uasBatchChangeDeliver(uasBatchPutOnProperty.editMinDelivery, uasBatchPutOnProperty.editMaxDelivery, false)"> - <input type="number" ng-model="uasBatchPutOnProperty.editMaxDelivery" ng-blur="uasBatchChangeDeliver(uasBatchPutOnProperty.editMinDelivery, uasBatchPutOnProperty.editMaxDelivery, true)"></div>
+						</div>
+					</div>
 				</div>
 			</div>
 			<div class="wanted_list01">
@@ -1614,6 +1742,7 @@
 													<div class="labelling">
 														<!--<em>*</em>-->
 														自定义标签 : <input maxlength="20" type="text" ng-model="goods.editTag" ng-blur="blurTag(goods)" ng-change="changeTag(goods)" placeholder="请设置产品标签"></div>
+													<span>近一个月的销售平均价:<em ng-bind="material.averMonthSalePrice |  formateNumber : 6"></em></span>
 												</td>
 											</tr>
 											<tr class="edit-content edits" >
@@ -1634,7 +1763,7 @@
 																								   ng-class="{'error' : goods.editPackagingInvalid}" ng-blur="editPackaging(goods, true)" ng-change="changePackaging(goods)"/>
 															</div>
 															<div class="input-list">
-																<span class="tit">生产日期:</span><input type="text" class="form-control" name="produceDate" ng-maxlength="11" title="生产日期" maxlength="11" placeholder="生产日期" style="width: 96px;" ng-model="goods.editProduceDate" ng-init="material.productDetail.produceDate"
+																<span class="tit">生产日期:</span><input type="text" class="form-control" name="produceDate" ng-maxlength="11" title="生产日期" maxlength="11" placeholder="生产日期" style="width: 96px;" ng-model="goods.editProduceDate"
 																									 ng-class="{'error' : goods.editProduceDateInvalid}"
 																									 ng-change="editProduceDateFa(goods, false)"/>
 															</div>
@@ -1652,10 +1781,10 @@
 															</div>
 															<div class="input-list">
 																<span class="tit">起订量:</span><input type="number" class="wid70 form-control" name="minBuyQty" title="起拍"  placeholder="数量"
-																									maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" ng-model="goods.editMinBuyQty" ng-init="goods.editMinBuyQty = material.productDetail.minBuyQty;updateStartNumber(goods);" ng-blur="setPriceMinAmount(goods, false)" ng-change="updateStartNumber(goods)" ng-class="{'error' : goods.editMinBuyQtyInValid}"/>
+																									maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" ng-model="goods.editMinBuyQty" ng-blur="setPriceMinAmount(goods, false)" ng-change="updateStartNumber(goods)" ng-class="{'error' : goods.editMinBuyQtyInValid}"/>
 															</div>
 															<div class="input-list">
-																<span class="tit">包装数量:</span><input type="number" maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" class="wid70 form-control" name="minPackQty" title="包装数量" placeholder="数量" ng-model="goods.editMinPackQty" ng-init="goods.editMinPackQty = material.productDetail.minPackQty" ng-blur="setPriceMinPackAmount(goods)" ng-class="{'error' : goods.editMinPackQtyInValid}" style="width: 70px;"/>
+																<span class="tit">包装数量:</span><input type="number" maxlength="6" oninput="if(value.length>6)value=value.slice(0,6)" class="wid70 form-control" name="minPackQty" title="包装数量" placeholder="数量" ng-model="goods.editMinPackQty" ng-blur="setPriceMinPackAmount(goods)" ng-class="{'error' : goods.editMinPackQtyInValid}" style="width: 70px;"/>
 															</div>
 														</div>
 														<div class="content">
@@ -1682,7 +1811,7 @@
 															<p class="title height24">单价(¥)</p>
 															<div
 																	class="input-list" ng-repeat="price in goods.editPrices">
-																<input type="number" name="rmb" class="wid92 form-control"  placeholder="单价(¥)" ng-blur="changePrices(goods.editPrices, price.rMBPrice, $index)" ng-class="{'error' : price.priceInvalid}" ng-model="price.rMBPrice" ng-init="price.rMBPrice = material.productDetail.price" oninput="if(value.length>11)value=value.slice(0,11)" autocomplete="off" validata-price/>
+																<input type="number" name="rmb" class="wid92 form-control"  placeholder="单价(¥)" ng-blur="changePrices(goods.editPrices, price.rMBPrice, $index)" ng-class="{'error' : price.priceInvalid}" ng-model="price.rMBPrice" oninput="if(value.length>11)value=value.slice(0,11)" autocomplete="off" validata-price/>
 															</div>
 														</div>
 														<div class="content plusBtn">
@@ -1698,11 +1827,11 @@
 															<div class="input-list">
 																<p>
 											<span><input type="number" class="wid36 form-control" name="minDelivery" title="最小交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)"
-														 ng-model="goods.editMinDelivery" ng-init="goods.editMinDelivery = material.productDetail.minDelivery"
+														 ng-model="goods.editMinDelivery"
 														 ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, true, goods)"
 														 ng-class="{'error' : goods.editMinDeliveryinValid}"/></span>
 																	<span style="margin-left: 4px;">–</span>
-																	<span><input type="number" class="wid36 form-control" name="maxDelivery" title="最大交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)" ng-model="goods.editMaxDelivery" ng-init="goods.editMaxDelivery = material.productDetail.maxDelivery" ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, false, goods)"
+																	<span><input type="number" class="wid36 form-control" name="maxDelivery" title="最大交期" placeholder="天数" oninput="if(value.length>2)value=value.slice(0,2)" ng-model="goods.editMaxDelivery" ng-blur="changeDelivery(goods.editMinDelivery, goods.editMaxDelivery, false, goods)"
 																				 ng-class="{'error' : goods.editMaxDeliveryinValid}"/></span>
 																</p>
 															</div>
@@ -1710,7 +1839,7 @@
 														<div class="content margin10">
 															<!--<p class="title">自营 / 寄售</p>-->
 															<div class="input-list">
-																<select ng-disabled="$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale" ng-disabled="$$nonProduct.canSelfSale">
+																<select ng-disabled="!$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale">
 																	<option value="1">自营</option>
 																	<option value="2">寄售</option>
 																</select>
@@ -1800,6 +1929,7 @@
 													<div class="labelling">
 														<!--<em>*</em>-->
 														自定义标签 : <input maxlength="20" type="text" ng-model="goods.editTag" ng-blur="blurTag(goods)" ng-change="changeTag(goods)" placeholder="请设置产品标签"></div>
+													<span>近一个月的销售平均价:<em ng-bind="material.averMonthSalePrice |  formateNumber : 6"></em></span>
 												</td>
 											</tr>
 											<tr class="edit-content edits" ng-if="goods.edit">

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

@@ -678,7 +678,7 @@
           <a ng-switch-when="1">审核通过</a>
           <a ng-switch-when="2">待审核</a>
         </li>
-        <li>
+       <!-- <li>
 				<span>
 					<h5 ng-show="userInfo.havePayPwd"><img class="ok-icon" src="static/img/user/images/ok-account.png"/></h5>
 					<h5 ng-hide="userInfo.havePayPwd"><img src="static/img/user/images/safe.png"/></h5>
@@ -687,7 +687,7 @@
 				</span>
           <a ng-hide="userInfo.havePayPwd" ng-click="updateUserPay()" class="mall-btn-default">立即设置</a>
           <a ng-show="userInfo.havePayPwd" ng-click="updateUserPay()">修改</a>
-        </li>
+        </li>-->
       </ul>
     </div>
     <!--权限管理-->

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

@@ -1707,7 +1707,7 @@
                                                     <div class="content margin10">
                                                         <!--<p class="title">自营 / 寄售</p>-->
                                                         <div class="input-list">
-                                                            <select ng-disabled="$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale" ng-disabled="$$nonProduct.canSelfSale">
+                                                            <select ng-disabled="!$$nonProduct.canSelfSale" name="selfSale" class="wid56 select-adder form-control" ng-model="goods.editSelfSale">
                                                                 <option value="1">自营</option>
                                                                 <option value="2">寄售</option>
                                                             </select>
@@ -1900,7 +1900,7 @@
 													<div class="content margin10">
 														<!--<p class="title">自营 / 寄售</p>-->
 														<div class="input-list">
-															<select name="editSelfSale" ng-change="changeSaleMode(goods)" class="wid56 select-adder form-control" ng-model="goods.editSelfSale" ng-disabled="$$nonProduct.canSelfSale">
+															<select name="editSelfSale" ng-change="changeSaleMode(goods)" class="wid56 select-adder form-control" ng-model="goods.editSelfSale" ng-disabled="!$$nonProduct.canSelfSale">
 																<option value="1">自营</option>
 																<option value="2">寄售</option>
 															</select>

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

@@ -1585,7 +1585,7 @@
 						</td>
 						<!--<td ng-bind="material.unit || 'PCS'" title="{{material.unit  || 'PCS'}}"></td>-->
 						<td>
-							<span ng-bind="material.packaging || '-'" title="{{material.packaging || '-'}}"></span>
+							<span ng-bind="material.spec || '-'" title="{{material.spec || '-'}}"></span>
 						</td>
 						<td class="edit">
 							<span name="delete-material" ng-show="!isBatch && !material.exPandOper && !material.addGoodsOper" ng-click="deleteMaterial(material)"><span>删除</span></span>

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

@@ -79,6 +79,11 @@
         text-decoration: none;
         height: 31px;
     }
+    .ng-table-pagination .page-a:hover {
+        border: 1px solid #5078cb !important;
+        background: #5078cb !important;
+        color: #fff !important;
+    }
 
     div.ng-table-pager div.page-go-block {
         float: right;
@@ -570,7 +575,7 @@
                     <!--</div>-->
                 <!--</div>-->
                 <div class="com-modal-wrap" ng-if="result && result.total != 0 && !hadImport && $$productOn.tab == 'bathOnPerson' && personMedol">
-                    <div class="com-del-box">
+                    <div class="com-del-box com-mall-del-box">
                         <div class="title">
                             <i ng-click="setPersonMedol()"></i>
                         </div>

+ 6 - 4
src/main/webapp/resources/view/vendor/modal/updateUserEmail.html

@@ -32,12 +32,12 @@
         border-radius: 0;
     }
     .userEmail .modal-body .row.validate-code .col-md-8 .input-sm {
-        width: 162px;
+        width: 63%;
         display: inline-block;
     }
     .userEmail .modal-body .row.validate-code .col-md-8 .code-btn {
-        width: 94px;
-        height: 30px;
+        width: 37%;
+        height: 31px;
         text-align: center;
         line-height: 30px;
         vertical-align: middle;
@@ -50,6 +50,8 @@
         background: #5078cb;
         color: #fff;
         cursor: pointer;
+        float: right;
+        margin-top: 3px;
     }
     .userEmail .modal-body .row.validate-code .col-md-8 .code-btn[disabled] {
         cursor: not-allowed;
@@ -127,7 +129,7 @@
             <div class="col-md-8 col-sm-8 col">
                 <input ng-model="checkCode"
                        class="form-control input-sm" placeholder="请输入验证码" type="checkCode" ng-blur="validCheckCode(checkCode)">
-                <input ng-click="sendCheckCode(user.newUserEmail)" ng-disabled="!sendSuccess" ng-init="paracont='获取验证码'" class="code-btn" ng-model="paracont"/>
+                <input ng-click="sendCheckCode(user.newUserEmail)" readonly ng-disabled="!sendSuccess" ng-init="paracont='获取验证码'" class="code-btn" ng-model="paracont"/>
             </div>
             <div class="col">
                 <img ng-show="checkSuccess2" src="static/img/user/images/input-check-yes.png" alt="">

+ 8 - 5
src/main/webapp/resources/view/vendor/modal/updateUserTel.html

@@ -32,12 +32,12 @@
         border-radius: 0;
     }
     .userTel .modal-body .row.validate-code .col-md-8 .input-sm {
-        width: 162px;
+        width: 63%;
         display: inline-block;
     }
     .userTel .modal-body .row.validate-code .col-md-8 .code-btn {
-        width: 94px;
-        height: 30px;
+        width: 37%;
+        height: 31px;
         text-align: center;
         line-height: 30px;
         vertical-align: middle;
@@ -50,6 +50,8 @@
         background: #5078cb;
         color: #fff;
         cursor: pointer;
+        float: right;
+        margin-top: 3px;
     }
     .userTel .modal-body .row.validate-code .col-md-8 .code-btn[disabled] {
         cursor: not-allowed;
@@ -99,6 +101,7 @@
             <label class="col-md-3 col-sm-3 col text-right">原手机号:</label>
             <div class="col-md-8 col-sm-8 col"><input ng-model="user.userTel" class="form-control input-sm"
                                                       type="userTel"  ng-blur="checkUserTel(user.userTel)"
+                                                      placeholder="请输入原手机号"
                                                       ></div>
             <div class="col">
                 <img ng-show="checkSuccess" src="static/img/user/images/input-check-yes.png" alt="">
@@ -110,7 +113,7 @@
             <label class="col-md-3 col-sm-3 col text-right">新手机号:</label>
             <div class="col-md-8 col-sm-8 col">
                 <input ng-model="user.newUserTel"
-                       class="form-control input-sm" type="newUserTel" ng-blur="telEnable(user.newUserTel)">
+                       class="form-control input-sm" placeholder="请输入新手机号" type="newUserTel" ng-blur="telEnable(user.newUserTel)">
                 <!-- <div>密码复杂度</div> -->
             </div>
             <div class="col">
@@ -126,7 +129,7 @@
             <span class="col-md-8 col-sm-8 col">
                 <input ng-model="telCheckCode"
                        class="form-control input-sm" placeholder="请输入验证码"  type="telCheckCode" ng-blur="validTelCheckCode(telCheckCode)">
-                <input class="code-btn" ng-click="sendTelCheckCode(user.newUserTel)" ng-init="paracont='获取验证码'" ng-disabled="!sendSuccess" ng-model="paracont" />
+                <input class="code-btn" readonly ng-click="sendTelCheckCode(user.newUserTel)" ng-init="paracont='获取验证码'" ng-disabled="!sendSuccess" ng-model="paracont" />
             </span>
             <div class="col">
                 <img ng-show="checkSuccess2" src="static/img/user/images/input-check-yes.png" alt="">