Browse Source

Merge branch 'feature_release-tomysql' of ssh://10.10.100.21/source/platform-b2c into feature_release-tomysql

zhaohongpeng 7 years ago
parent
commit
4ee5c40909
22 changed files with 1348 additions and 80 deletions
  1. 17 0
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  2. 1 1
      src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java
  3. 38 16
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  4. 137 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyConstant.java
  5. 7 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyErrorConstant.java
  6. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  7. 64 0
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  8. 35 2
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  9. 83 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  10. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java
  11. 84 15
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  12. 16 5
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  13. 426 26
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  14. 3 1
      src/main/java/com/uas/platform/b2c/prod/commodity/type/ModifyConstant.java
  15. BIN
      src/main/resources/jxls-tpl/trade/goods.xls
  16. BIN
      src/main/resources/jxls-tpl/trade/products-error.xls
  17. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  18. 83 1
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js
  19. 87 3
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js
  20. 124 3
      src/main/webapp/resources/view/vendor/forstore/vendor_material.html
  21. 2 0
      src/main/webapp/resources/view/vendor/forstore/vendor_material_person.html
  22. 128 6
      src/main/webapp/resources/view/vendor/forstore/vendor_onSale.html

+ 17 - 0
src/main/java/com/uas/platform/b2c/core/constant/Status.java

@@ -495,6 +495,23 @@ public enum Status {
 		throw new IllegalArgumentException("没有与编号 [" + statusCode + "]匹配的状态");
 	}
 
+	/**
+	 * @param statusCode
+	 *            状态的编码
+	 * @return 状态描述
+	 * @throws IllegalArgumentException
+	 *             如果statusCode不存在的话
+	 * @date 2018年5月15日 17:31:47 dongbw
+	 */
+	public static String valueStringOf(int statusCode) {
+		for (Status status : values()) {
+			if (status.value == statusCode) {
+				return status.phrase;
+			}
+		}
+		throw new IllegalArgumentException("没有与编号 [" + statusCode + "]匹配的状态");
+	}
+
 	/**
 	 * 返回状态的编号
 	 */

+ 1 - 1
src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java

@@ -84,7 +84,7 @@ public class StringUtils {
 	 * @return
 	 */
 	public static String cutOutString(String original, int length) throws UnsupportedEncodingException {
-		if (length >= original.length()) {
+		if (length >= original.getBytes("GBK").length) {
 			return original;
 		}
 		StringBuilder builder = new StringBuilder(original.length());

+ 38 - 16
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java

@@ -7,23 +7,45 @@ package com.uas.platform.b2c.prod.commodity.constant;
  */
 public enum  ErrorInfoConstant {
     REPEAT_INFO("产品库已存在相同的产品"),
-    CODE_PATTERN_INFO("A列:请勿输入中文或中文特殊字符"),
-    CODE_LENGTH_INFO("A列:产品型号不能超过100字符"),
-    CODE_EMPTY_INFO("A列:产品型号不能为空"),
+    BATCH_EMPTY("SKU编码不能为空"),
+    BATCH_ERROR("SKU编码信息有误"),
+    STORE_ERROR("店铺信息错误"),
+    SALE_EMPTY("在售状态不能为空"),
+    SALE_ERROR("在售状态信息错误"),
+//    CODE_PATTERN_INFO("A列:请勿输入中文或中文特殊字符"),
+//    CODE_LENGTH_INFO("A列:产品型号不能超过100字符"),
+//    CODE_EMPTY_INFO("A列:产品型号不能为空"),
+//
+//    BRAND_LENGTH_INFO("B列:品牌名称不能超过50个字符或25个汉字"),
+//    BRAND_EMPTY_INFO("B列:英文品牌不能为空"),
+//    BREAK_UP_INFO("C列:请选择可拆卖情况是或否"),
+//    RESERVE_NUMBER_INFO("D列:库存须填写小于10亿的正整数"),
+//    PRODUCE_DATE_INFO("E列:生产日期不能为空"),
+//    PACKAGE_NOT_EXIST_INFO("F列:包装方式不存在"),
+//    PACKAGE_METHOD_INFO("F列:包装方式只能填写中英文"),
+//    PACKAGE_EMPTY_INFO("F列:包装方式不能为空"),
+//    PERSON_PACKAGE_EMPTY_INFO("C列:规格信息不能为空"),
+//    DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
+//    DELIVERY_VALUE_INFO("G-H列:交期只能填写1-999之间的整数值"),
+//    PRICE_INFO("K列:单价必须是小于1万的正数"),
+//    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符"),
+    CODE_PATTERN_INFO("请勿输入中文或中文特殊字符"),
+    CODE_LENGTH_INFO("产品型号不能超过100字符"),
+    CODE_EMPTY_INFO("产品型号不能为空"),
 
-    BRAND_LENGTH_INFO("B列:品牌名称不能超过50个字符或25个汉字"),
-    BRAND_EMPTY_INFO("B列:英文品牌不能为空"),
-    BREAK_UP_INFO("C列:请选择可拆卖情况是或否"),
-    RESERVE_NUMBER_INFO("D列:库存须填写小于10亿的正整数"),
-    PRODUCE_DATE_INFO("E列:生产日期不能为空"),
-    PACKAGE_NOT_EXIST_INFO("F列:包装方式不存在"),
-    PACKAGE_METHOD_INFO("F列:包装方式只能填写中英文"),
-    PACKAGE_EMPTY_INFO("F列:包装方式不能为空"),
-    PERSON_PACKAGE_EMPTY_INFO("C列:规格信息不能为空"),
-    DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
-    DELIVERY_VALUE_INFO("G-H列:交期只能填写1-999之间的整数值"),
-    PRICE_INFO("K列:单价必须是小于1万的正数"),
-    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符"),
+    BRAND_LENGTH_INFO("品牌名称不能超过50个字符或25个汉字"),
+    BRAND_EMPTY_INFO("英文品牌不能为空"),
+    BREAK_UP_INFO("请选择可拆卖情况是或否"),
+    RESERVE_NUMBER_INFO("库存须填写小于10亿的正整数"),
+    PRODUCE_DATE_INFO("生产日期不能为空"),
+    PACKAGE_NOT_EXIST_INFO("包装方式不存在"),
+    PACKAGE_METHOD_INFO("包装方式只能填写中英文"),
+    PACKAGE_EMPTY_INFO("包装方式不能为空"),
+    PERSON_PACKAGE_EMPTY_INFO("规格信息不能为空"),
+    DELIVERY_EMPTY_INFO("存在交期的信息为空"),
+    DELIVERY_VALUE_INFO("交期只能填写1-999之间的整数值"),
+    PRICE_INFO("单价必须是小于1万的正数"),
+    MIN_PACKAGE_INFO("最小包数量包含非数字字符"),
     REPEAT_IN_EXCEL("表格中已存在相同的产品");
 
     /**

+ 137 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyConstant.java

@@ -0,0 +1,137 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * 产品修改对应字段的常量
+ * 后期需求更改,维护这个常量信息即可
+ *
+ * @author
+ */
+public class ModifyConstant {
+
+    /**
+     * 私有构造器,防止创建类实例
+     */
+    private ModifyConstant() {
+
+    }
+
+    /**
+     * 导入最大行数
+     */
+    public static final int EXCEL_MAX_ROW = 2000;
+
+    /**
+     * The constant TOTAL_ROW.
+     */
+    public static final int TOTAL_COLUMN = 21;
+
+    /**
+     * The constant MAX_TOTAL_COLUMN.
+     */
+    public static final int MAX_TOTAL_COLUMN = 22;
+
+    /**
+     * 产品编码
+     */
+    public static final int SKU_CODE = 0;
+
+    /**
+     * The constant PRODUCT_KIND.
+     */
+    public static final int PRODUCT_KIND = 1;
+
+    /**
+     * The constant PRODUCT_CODE.
+     */
+    public static final int PRODUCT_CODE = 2;
+
+    /**
+     * The constant PRODUCT_BRAND.
+     */
+    public static final int PRODUCT_BRAND = 3;
+
+    /**
+     * The constant PRODUCE_DATE.
+     */
+    public static final int PRODUCE_DATE = 4;
+
+    /**
+     * The constant PACKAGE_METHOD.
+     */
+    public static final int PACKAGE_METHOD = 5;
+
+    /**
+     * The constant MIN_DELIVERY.
+     */
+    public static final int MIN_DELIVERY = 6;
+
+    /**
+     * The constant MAX_DELIVERY.
+     */
+    public static final int MAX_DELIVERY = 7;
+
+    /**
+     * The constant BREAK_UP.
+     */
+    public static final int BREAK_UP = 8;
+
+    /**
+     * The constant PACKAGE_NUMBER.
+     */
+    public static final int PACKAGE_NUMBER = 9;
+
+    /**
+     * 最小起订量
+     */
+    public static final int BUY_MIN_QTY = 10;
+
+    /**
+     * 分段价格开始
+     */
+    public static final int PRICE_FIRST = 11;
+
+    /**
+     * 第二个分段
+     */
+    public static final int QTY_SECOND_START = 12;
+
+    /**
+     * 第二个分段
+     */
+    public static final int PRICE_SECOND = 13;
+
+    /**
+     * 第三个分段
+     */
+    public static final int QTY_THIRD_START = 14;
+
+    /**
+     * 第三个分段
+     */
+    public static final int PRICE_THIRD = 15;
+
+    /**
+     * The constant SALE_METHOD.
+     */
+    public static final int SALE_METHOD = 16;
+
+    /**
+     * The constant RESERVE_NUMBER.
+     */
+    public static final int RESERVE_NUMBER = 17;
+
+    /**
+     * The constant CUSTOM_LABEL.
+     */
+    public static final int CUSTOM_LABEL = 18;
+
+    /**
+     * The constant SALE_STATUS.
+     */
+    public static final int SALE_STATUS = 19;
+
+    /**
+     * The constant MATCH_STATUS.
+     */
+    public static final int MATCH_STATUS = 20;
+}

+ 7 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ModifyErrorConstant.java

@@ -0,0 +1,7 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * Created by hulh on 2018/3/15.
+ */
+public enum ModifyErrorConstant {
+}

+ 5 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java

@@ -15,6 +15,11 @@ public final class UploadConstant {
 
     }
 
+    /**
+     * 导入最大行数
+     */
+    public static final int EXCEL_MAX_ROW = 2000;
+
     /**
      * 产品型号
      */

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

@@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -226,6 +227,36 @@ public class ReleaseProductByBatchController {
         return map;
     }
 
+    /**
+     * 通过excel批量导入商品发布(大量)
+     *
+     * @param uploadItem the upload item 上传的文件
+     * @return model map
+     */
+    @RequestMapping(value = "/modify/excel", method = RequestMethod.POST)
+    public ModelMap modifyByExcel(FileUpload uploadItem) {
+        ModelMap map = new ModelMap();
+        String fileName = uploadItem.getFile().getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        InputStream is = null;
+        Workbook workbook = null;
+        try {
+            is = uploadItem.getFile().getInputStream();
+            if ("xls".equals(suffix)) {
+                workbook = new HSSFWorkbook(is);
+            } else if ("xlsx".equals(suffix)) {
+                workbook = new XSSFWorkbook(is);
+            } else {
+                throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
+            }
+            map = releaseProductByBatchService.modifyByWorkbook(workbook);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        logger.log("批量上架模块", "导入Excel批量上传商品");
+        return map;
+    }
+
     /**
      * 获取上传信息
      *
@@ -306,4 +337,37 @@ public class ReleaseProductByBatchController {
         }
         return modelAndView;
     }
+
+    /**
+     * 批量导出产品表
+     *
+     * @return model and view
+     * @throws UnsupportedEncodingException the unsupported encoding exception
+     */
+    @RequestMapping(value = "/modify/failure", method = RequestMethod.GET)
+    public ModelAndView exportFailureData(String batch, HttpServletRequest request, @RequestParam(defaultValue = "false") Boolean isAjax) throws UnsupportedEncodingException {
+        ModelAndView modelAndView = new ModelAndView();
+        HttpSession session = request.getSession();
+        Object loading = session.getAttribute("load-error-ing");
+        if (isAjax) {
+            MappingJackson2JsonView view = new MappingJackson2JsonView();
+            Map<String, Boolean> attributes = new HashMap<>();
+            if (loading == null || !Boolean.valueOf(loading.toString())) {
+                attributes.put("load", false);
+            } else if (Boolean.valueOf(loading.toString())) {
+                attributes.put("load", true);
+            }
+            view.setAttributesMap(attributes);
+            modelAndView.setView(view);
+            return modelAndView;
+        }
+        if (loading == null || !Boolean.valueOf(loading.toString())) {
+            session.setAttribute("load-error-ing", true);
+        }
+		modelAndView.addObject("data", releaseProductByBatchService.findFailureReleaseProductByBatch(batch));
+        String url = "classpath:jxls-tpl/trade/products-error";
+        modelAndView.setView(new JxlsExcelView(url, "修改失败产品-优软商城"));
+        session.setAttribute("load-error-ing", false);
+        return modelAndView;
+    }
 }

+ 35 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java

@@ -576,10 +576,23 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
 	 * @param minBuyQty
 	 * @return
 	 */
-	@Query(value = "select g from Goods g where g.productid = :productId and g.produceDate = :produceDate and g.packaging = :packaging and g.minPackQty = :minPackQty and g.minBuyQty = :minBuyQty and g.maxDelivery = :maxDelivery and g.minDelivery = :minDelivery and g.unit = :unit")
-	List<Goods> findRepeatGoodsInProductId(@Param("productId") Long productId, @Param("produceDate") String produceDate, @Param("packaging") String packaging, @Param("minPackQty") Double minPackQty,
+	@Query(value = "select g from Goods g where g.productid = :productId and g.batchCode != :batchCode and g.produceDate = :produceDate and g.packaging = :packaging and g.minPackQty = :minPackQty and g.minBuyQty = :minBuyQty and g.maxDelivery = :maxDelivery and g.minDelivery = :minDelivery and g.unit = :unit")
+	List<Goods> findRepeatGoodsInProductIdNotBatch(@Param("productId") Long productId, @Param("batchCode") String batchCode, @Param("produceDate") String produceDate, @Param("packaging") String packaging, @Param("minPackQty") Double minPackQty,
 										   @Param("minBuyQty") Double minBuyQty, @Param("maxDelivery") Short maxDelivery, @Param("minDelivery") Short minDelivery, @Param("unit") String unit);
 
+    /**
+     * 根据以下条件查找对应Goods列表
+     * @param productId
+     * @param produceDate
+     * @param packaging
+     * @param minPackQty
+     * @param minBuyQty
+     * @return
+     */
+    @Query(value = "select g from Goods g where g.productid = :productId and g.produceDate = :produceDate and g.packaging = :packaging and g.minPackQty = :minPackQty and g.minBuyQty = :minBuyQty and g.maxDelivery = :maxDelivery and g.minDelivery = :minDelivery and g.unit = :unit")
+    List<Goods> findRepeatGoodsInProductId(@Param("productId") Long productId, @Param("produceDate") String produceDate, @Param("packaging") String packaging, @Param("minPackQty") Double minPackQty,
+                                           @Param("minBuyQty") Double minBuyQty, @Param("maxDelivery") Short maxDelivery, @Param("minDelivery") Short minDelivery, @Param("unit") String unit);
+
     /**
      * 根据产品编号获取相同标签的信息
      * @param prodNum
@@ -701,6 +714,18 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Query(value = "select count(1) from Goods g where g.enUU = :enUU and g.brandNameEn = :brandEn and g.code = :code and g.tag = :tag")
     int findCountByTagInGoods(@Param("enUU") Long enUU, @Param("brandEn") String brandEn, @Param("code") String code, @Param("tag") String tag);
 
+    /**
+     * 根据以下字段返回结果数
+     * @param enUU
+     * @param batchCode
+     * @param brandEn
+     * @param code
+     * @param tag
+     * @return
+     */
+    @Query(value = "select count(1) from Goods g where g.enUU = :enUU and g.batchCode != :batchCode and g.brandNameEn = :brandEn and g.code = :code and g.tag = :tag")
+    int findCountByTagNotBatch(@Param("enUU") Long enUU, @Param("batchCode") String batchCode, @Param("brandEn") String brandEn, @Param("code") String code, @Param("tag") String tag);
+
     /**
      * 分页获取库存的信息
      *
@@ -727,4 +752,12 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      */
     @Query(value = "select g from Goods g where g.code = :code and (g.brandNameCn = :brand or g.brandNameEn = :brand) and status = 601 order by currencyName asc")
     List<Goods> getGoodsByCodeAndName(@Param("code")String code, @Param("brand")String brand);
+
+    /**
+     * 查询某产品下自定义标签
+     * @param productId
+     * @return
+     */
+    @Query(value = "select g.tag from Goods g where g.productid = :productId and g.tag like'类型%' order by g.tag")
+    List<String> getTagByProductId(@Param("productId") Long productId);
 }

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

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.model;
 
 import com.alibaba.fastjson.annotation.JSONField;
+import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
@@ -39,10 +40,15 @@ public class ReleaseProductByBatch implements Serializable {
 	 */
 	private static final List<String> PACKAGING_LIST;
 
+	private static final List<String> STATUS_LIST;
+
 	static {
 		String[] array = {"Bulk-散装", "Reel-卷装", "Tape/Reel-编带", "Tray-盘装",
 				"Tube-管装", "盒装", "袋装", "罐装", "瓶装", "桶装", "箱装", "其他"};
 		PACKAGING_LIST = Arrays.asList(array);
+
+		String[] status = {"上架", "下架"};
+		STATUS_LIST = Arrays.asList(status);
 	}
 
 	/**
@@ -72,6 +78,27 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_batchid")
 	private String relbatchid;
 
+	/**
+	 * 批次号,批量修改使用
+	 */
+	@Column(name = "rel_batchcode")
+	private String batchCode;
+
+	/**
+	 * 上下架状态,批量修改使用
+	 */
+	@Column(name = "rel_status")
+	private Integer status;
+
+	@Column(name = "rel_status_str")
+	private String statusStr;
+
+	/**
+	 * 寄售-自营
+	 */
+	@Column(name = "rel_sale_method")
+	private String saleMethod;
+
 	/**
 	 * 产品中文品牌
 	 */
@@ -505,6 +532,29 @@ public class ReleaseProductByBatch implements Serializable {
 		return selfMinDeliveryStr.equals(that.selfMinDeliveryStr);
 	}
 
+	public void setBatchCodeByExcel(Object value) {
+		if (StringUtils.isEmpty(value)) {
+			addErrmsg(ErrorInfoConstant.BATCH_EMPTY.getInfo());
+		}
+		setBatchCode(StringUtilB2C.getStr(value).trim());
+	}
+
+	public void setStatusByExcel(Object value) {
+		if (StringUtils.isEmpty(value)) {
+			addErrmsg(ErrorInfoConstant.SALE_EMPTY.getInfo());
+		} else {
+			String statusStr = StringUtilB2C.getStr(value);
+			setStatusStr(statusStr);
+			if (!STATUS_LIST.contains(statusStr)) {
+				addErrmsg(ErrorInfoConstant.SALE_EMPTY.getInfo());
+			} else {
+				int status = "上架".equals(statusStr) ? Status.AVAILABLE.value() : Status.REMOVED.value();
+				setStatus(status);
+			}
+		}
+
+	}
+
 	public void setBrandEnByExcel(Object value) {
 		if (StringUtils.isEmpty(value)) {
 			addErrmsg(ErrorInfoConstant.BRAND_EMPTY_INFO.getInfo());
@@ -555,7 +605,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setReserveByExcel(Object value) {
 		setReserveStr(StringUtilB2C.getStr(value));
-		if (value == null || !RegexConstant.isNumber(value.toString())) {
+		if (value == null || StringUtils.isEmpty(value) || !RegexConstant.isNumber(value.toString())) {
 			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
 		} else {
 			Double reserve = Double.valueOf(value.toString());
@@ -1566,4 +1616,36 @@ public class ReleaseProductByBatch implements Serializable {
 		this.componentUuId = componentUuId;
 		return this;
 	}
+
+	public String getBatchCode() {
+		return batchCode;
+	}
+
+	public void setBatchCode(String batchCode) {
+		this.batchCode = batchCode;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public String getStatusStr() {
+		return statusStr;
+	}
+
+	public void setStatusStr(String statusStr) {
+		this.statusStr = statusStr;
+	}
+
+	public String getSaleMethod() {
+		return saleMethod;
+	}
+
+	public void setSaleMethod(String saleMethod) {
+		this.saleMethod = saleMethod;
+	}
 }

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

@@ -35,6 +35,14 @@ public interface ReleaseProductByBatchService {
      */
     public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport);
 
+    /**
+     * 通过Excel上传资料修改商品
+     *
+     * @param workbook the workbook 上传的文件
+     * @return model map
+     */
+    public ModelMap modifyByWorkbook(Workbook workbook);
+
     /**
      * 根据发布者UU获取一组产品的信息
      *

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

@@ -19,16 +19,39 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.DoubleArith;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
-import com.uas.platform.b2c.core.utils.PatternUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
 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.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsModifyInfoDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsSimpleDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
+import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory.OperateType;
-import com.uas.platform.b2c.prod.commodity.service.*;
+import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
+import com.uas.platform.b2c.prod.commodity.model.GoodsModifyInfo;
+import com.uas.platform.b2c.prod.commodity.model.GoodsPriceInfo;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
+import com.uas.platform.b2c.prod.commodity.model.ModifyInfo;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
+import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsPriceInfoService;
+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.ProductStandardPutOnInfoService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.status.ModifyInfoStatus;
 import com.uas.platform.b2c.prod.commodity.type.ModifyConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
@@ -62,7 +85,11 @@ import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.b2c.trade.util.BoundedExecutor;
 import com.uas.platform.core.exception.IllegalOperatorException;
-import com.uas.platform.core.model.*;
+import com.uas.platform.core.model.Constant;
+import com.uas.platform.core.model.EncodingRulesConstant;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
@@ -99,7 +126,17 @@ import javax.persistence.criteria.Root;
 import java.math.BigInteger;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.regex.Matcher;
@@ -1356,7 +1393,7 @@ public class GoodsServiceImpl implements GoodsService {
         for (Goods goods1 : repeatGoodsInProductId) {
             if (!goods1.getId().equals(goods.getId())
                     && GoodsUtil.compareWithQtyPrice(goods1.getPrices(), goods.getPrices(), goods.getCurrencyName())) {
-                throw new IllegalOperatorException("该物料已存在(包装、日期、最小包装量、最小起订量、交期、单位、价格)相同的信息");
+                return new ResultMap(CodeType.SAVED.code(), "该物料已存在(包装、日期、最小包装量、最小起订量、交期、单位、价格)相同的信息");
             }
         }
         // 比较两个goods编辑信息
@@ -1470,6 +1507,17 @@ public class GoodsServiceImpl implements GoodsService {
             info.setBatchCode(beforeGoods.getBatchCode());
             infoList.add(info);
         }
+        Integer beforeGoodsStatus = beforeGoods.getStatus();
+        Integer afterGoodsStatus = afterGoods.getStatus();
+        if (!beforeGoodsStatus.equals(afterGoodsStatus)) {
+            ModifyInfo info = new ModifyInfo();
+            info.setModifyField(ModifyConstant.MODIFY_GOODS_STATUS.getPhrase());
+            info.setBefore(Status.valueStringOf(beforeGoodsStatus));
+            info.setAfter(Status.valueStringOf(afterGoodsStatus));
+            info.setType(ModifyInfo.TYPE_SALE);
+            info.setBatchCode(beforeGoods.getBatchCode());
+            infoList.add(info);
+        }
         Short beforeMaxDelivery = beforeGoods.getMaxDelivery();
         Short afterMaxDelivery = afterGoods.getMaxDelivery();
         if (!beforeMaxDelivery.equals(afterMaxDelivery)) {
@@ -1656,6 +1704,8 @@ public class GoodsServiceImpl implements GoodsService {
             ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
             if (productPrivate == null) {
                 productPrivate = new ProductPrivate();
+                productPrivate.setPrId(product.getId());
+                productPrivate.setB2cEnabled(IntegerConstant.YES_INT);
             }
             Integer count = productPrivate.getBatchCount();
             productPrivate.setBatchCount(count ==
@@ -1759,12 +1809,19 @@ public class GoodsServiceImpl implements GoodsService {
         if (resultMap.getCode() != CodeType.OK.code()) {
             return null;
         }
-
-        GoodsHistory history =
-                goodsHistoryService
-                        .converTGoodsHist
-                                (nowGoods,
-                                        OperateType.Update.getPhrase(),false);
+        GoodsHistory history = goodsHistoryService.converTGoodsHist(nowGoods,
+                OperateType.Update.getPhrase(), false);
+        // 修改上下架状态并产生上下架历史
+        GoodsHistory goodsHistory = null;
+        if (!nowGoods.getStatus().equals(oldGoods.getStatus())) {
+            nowGoods.setStatus(oldGoods.getStatus());
+            // 如果是下架
+            if (oldGoods.getStatus().equals(Status.REMOVED.value())) {
+                goodsHistory = goodsHistoryService.converTGoodsHist(nowGoods, OperateType.Down.getPhrase(), false);
+            } else if (oldGoods.getStatus().equals(Status.AVAILABLE.value())) {
+                goodsHistory = goodsHistoryService.converTGoodsHist(nowGoods, OperateType.Publish.getPhrase(), false);
+            }
+        }
         List<Order> orders = detailService.updateOrderDetailsByGoods(nowGoods);
         //更新购物车信息
         List<Cart> cartList = cartService.updateCartByGoods(nowGoods);
@@ -1773,6 +1830,9 @@ public class GoodsServiceImpl implements GoodsService {
 //		ProductStandardPutOnInfo putOnInfo = productStandardPutOnInfoService.updateProductStandardPutOnInfoByGoods(nowGoods);
 //		Product product = productService.updateProduct(putOnInfo);
 		updateGoodsRelateInfo(orders, cartList, browsingHistories, null, null, history, nowGoods);
+		if (null != goodsHistory) {
+            goodsHistoryService.save(goodsHistory);
+        }
 		//更新店铺推荐的信息
 		if(isChangeSaleType) { // 如果切换了销售方式
 			Set<String> uuids = new HashSet<>();
@@ -2556,8 +2616,9 @@ public class GoodsServiceImpl implements GoodsService {
         if (StringUtils.hasText(keyword)) {
             SimpleExpression code = like("code", keyword, true, true);
             SimpleExpression brandNameEn = like("brandNameEn", keyword, true, true);
-            SimpleExpression batchCode = PredicateUtils.like("prodNum", keyword, true, true);
-            SimpleExpression[] expressions2 = new SimpleExpression[]{code, brandNameEn, batchCode};
+            SimpleExpression prodNum = PredicateUtils.like("prodNum", keyword, true, true);
+            SimpleExpression batchCode = PredicateUtils.like("batchCode", keyword, true, true);
+            SimpleExpression[] expressions2 = new SimpleExpression[]{code, brandNameEn, prodNum, batchCode};
             LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
             expressions.add(logicalExpression2);
         }
@@ -3133,6 +3194,8 @@ public class GoodsServiceImpl implements GoodsService {
                     ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                     if (productPrivate == null) {
                         productPrivate = new ProductPrivate();
+                        productPrivate.setPrId(product.getId());
+                        productPrivate.setB2cEnabled(IntegerConstant.YES_INT);
                     }
                     Integer count = productPrivate.getBatchCount();
                     productPrivate.setBatchCount(--count);
@@ -3425,6 +3488,8 @@ public class GoodsServiceImpl implements GoodsService {
                 ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                 if (productPrivate == null) {
                     productPrivate = new ProductPrivate();
+                    productPrivate.setPrId(product.getId());
+                    productPrivate.setB2cEnabled(IntegerConstant.YES_INT);
                 }
                 Integer count = productPrivate.getBatchCount();
                 productPrivate.setBatchCount(--count);
@@ -3507,6 +3572,8 @@ public class GoodsServiceImpl implements GoodsService {
                     ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                     if (productPrivate == null) {
                         productPrivate = new ProductPrivate();
+                        productPrivate.setPrId(product.getId());
+                        productPrivate.setB2cEnabled(IntegerConstant.YES_INT);
                     }
                     Integer count = productPrivate.getBatchCount();
                     if (null == count){
@@ -3614,6 +3681,8 @@ public class GoodsServiceImpl implements GoodsService {
                 ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                 if (productPrivate == null) {
                     productPrivate = new ProductPrivate();
+                    productPrivate.setPrId(product.getId());
+                    productPrivate.setB2cEnabled(IntegerConstant.YES_INT);
                 }
                 productPrivate.setBatchCount(goods.size());
                 productPrivateDao.save(productPrivate);

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

@@ -529,6 +529,7 @@ public class ProductServiceImpl implements ProductService {
                     ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                     if (productPrivate == null) {
                         productPrivate = new ProductPrivate();
+                        productPrivate.setPrId(product.getId());
                     }
                     productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
                     productPrivateDao.save(productPrivate);
@@ -605,11 +606,16 @@ public class ProductServiceImpl implements ProductService {
                     goodsService.deleteGoods(goodses);
                     //productDao.delete(product.getId());
                     ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
-                    if (productPrivate.getB2cEnabled().equals(IntegerConstant.NO_SHORT)) {
-                        fail++;
-                        isHave++;
+                    if (null == productPrivate) {
+                        productPrivate = new ProductPrivate();
+                        productPrivate.setPrId(product.getId());
                     } else {
-                        success++;
+                        if (productPrivate.getB2cEnabled().equals(IntegerConstant.NO_SHORT)) {
+                            fail++;
+                            isHave++;
+                        } else {
+                            success++;
+                        }
                     }
                     productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
                     productPrivateDao.save(productPrivate);
@@ -1086,6 +1092,7 @@ public class ProductServiceImpl implements ProductService {
             ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
             if (productPrivate == null) {
                 productPrivate = new ProductPrivate();
+                productPrivate.setPrId(product.getId());
             }
             productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
             productPrivate.setBatchCount(0);
@@ -1114,6 +1121,7 @@ public class ProductServiceImpl implements ProductService {
         ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(beforeProduct.getId());
         if (productPrivate == null) {
             productPrivate = new ProductPrivate();
+            productPrivate.setPrId(beforeProduct.getId());
         }
         productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
         productPrivateDao.save(productPrivate);
@@ -1188,9 +1196,11 @@ public class ProductServiceImpl implements ProductService {
         ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
         if (productPrivate == null) {
             productPrivate = new ProductPrivate();
+            productPrivate.setPrId(product.getId());
+            productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
         }
         Integer count = productPrivate.getBatchCount();
-        productPrivate.setBatchCount(count + saveList.size());
+        productPrivate.setBatchCount((null != count ? count : 0) + saveList.size());
         productPrivateDao.save(productPrivate);
         goodsHistoryDao.save(historyList);
     }
@@ -1337,6 +1347,7 @@ public class ProductServiceImpl implements ProductService {
                         ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
                         if (productPrivate == null) {
                             productPrivate = new ProductPrivate();
+                            productPrivate.setPrId(product.getId());
                         }
                         if (CollectionUtils.isEmpty(products)) {
                             productPrivate.setB2cEnabled(1);

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

@@ -7,12 +7,14 @@ import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.ReleaseStatus;
+import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ModifyConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ShortConstant;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
@@ -34,6 +36,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.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
@@ -71,10 +74,13 @@ import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -195,7 +201,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 // TODO 个人库验证
 					if (!isAPerson) {
 						// 解析返回分段价格list
-						List<GoodsQtyPrice> qtyPriceList = initQtyPriceByExcel(row, releaseProductByBatch, r);
+						List<GoodsQtyPrice> qtyPriceList = initQtyPriceByExcel(row, true, releaseProductByBatch, r);
 						if (!CollectionUtils.isEmpty(qtyPriceList)) {
 							releaseProductByBatch.setPrices(qtyPriceList);
 						}
@@ -256,6 +262,336 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		return modelMap;
 	}
 
+	@Override
+	public ModelMap modifyByWorkbook(Workbook workbook) {
+		ModelMap modelMap = new ModelMap();
+		StoreIn self = getStoreIn(true);
+		StoreIn consignment = getStoreIn(false);
+		// 获取第一个工作表
+		Sheet sheet = workbook.getSheetAt(0);
+		int colNum = sheet.getRow(0).getPhysicalNumberOfCells();
+		if (colNum != ModifyConstant.TOTAL_COLUMN && colNum != ModifyConstant.MAX_TOTAL_COLUMN) {
+			throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
+		}
+		int rowNum = sheet.getLastRowNum();
+		if (rowNum > ModifyConstant.EXCEL_MAX_ROW) {
+			throw new IllegalOperatorException("您上传的信息超过2000条,请拆分成2000以再在上传");
+		}
+		List<ReleaseProductByBatch> batchList = new ArrayList<>(rowNum);
+		String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
+		Row headerRow = sheet.getRow(1);
+		validateModifyExcel(headerRow);
+		int total = 0;
+		for (int r = 2; r <= rowNum; r++) {
+			Row row = sheet.getRow(r);
+			ReleaseProductByBatch aBatch = new ReleaseProductByBatch();
+			Object skuObj = readWorkBookCell(row.getCell(ModifyConstant.SKU_CODE), Cell.CELL_TYPE_STRING,
+					r, ModifyConstant.SKU_CODE);
+			aBatch.setBatchCodeByExcel(skuObj);
+			if (!validateBatchCode(aBatch.getBatchCode(), aBatch)) {
+				aBatch.addErrmsg(ErrorInfoConstant.BATCH_ERROR.getInfo());
+			}
+
+			Object sellObj = readWorkBookCell(row.getCell(ModifyConstant.SALE_METHOD), Cell.CELL_TYPE_STRING,
+					r, ModifyConstant.SALE_METHOD);
+			aBatch.setSaleMethod(StringUtilB2C.getStr(sellObj).trim());
+			StoreIn storeIn = getModifyStoreInfo(sellObj, self, consignment);
+			if (storeIn == null) {
+				aBatch.addErrmsg(ErrorInfoConstant.STORE_ERROR.getInfo());
+				aBatch.setErrmsg(aBatch.getErrmsg().substring(1));
+				aBatch.setReleaseCode(ReleaseStatus.lack_info.value());
+				aBatch.setReleaseStatus(ReleaseStatus.lack_info.getPhrase());
+				continue;
+			}
+			setProductDefaultInfo(aBatch, batch, aBatch.getCurrency(), storeIn);
+			convertModifyToBatch(aBatch, row, r);
+			// 解析返回分段价格list
+			List<GoodsQtyPrice> qtyPriceList = initQtyPriceByExcel(row, false, aBatch, r);
+			if (!CollectionUtils.isEmpty(qtyPriceList)) {
+				aBatch.setPrices(qtyPriceList);
+			}
+
+			if (!StringUtils.isEmpty(aBatch.getErrmsg())) {
+				aBatch.setErrmsg(aBatch.getErrmsg().substring(1));
+				aBatch.setReleaseCode(ReleaseStatus.lack_info.value());
+				aBatch.setReleaseStatus(ReleaseStatus.lack_info.getPhrase());
+			} else {
+				// 导入成功的需要判断自定义标签是否重复
+				if (CollectionUtils.isNotEmpty(batchList) && aBatch.getTag() != null) {
+					if (validateTagInfo(aBatch, batchList)) {
+						aBatch.setTag(null);
+					}
+				}
+				validateRepeatInExcel(batchList, aBatch, true);
+			}
+			batchList.add(aBatch);
+			total++;
+		}
+		Long userUU = SystemSession.getUser().getUserUU();
+		Long enUU = SystemSession.getUser().getEnterprise().getUu();
+		resetRepeatData(batchList, true, false);
+		setDefaultTag(batchList);
+		int success = modifyGoodsByBatch(batchList);
+		commonDao.save(batchList, ReleaseProductByBatch.class);
+		Integer filter = releaseProductByBatchDao.getCountOfImportFail(userUU, batch, failCode);
+		modelMap.put("total", total);
+		modelMap.put("success", success);
+		modelMap.put("fail", batchList.size() - success);
+		modelMap.put("filter", filter);
+		modelMap.put("batch", batch);
+		return modelMap;
+	}
+
+	/**
+	 * 给自定义标签为空的batch设置默认自定义标签
+	 * @param batchList
+	 */
+	private void setDefaultTag(List<ReleaseProductByBatch> batchList) {
+		List<Integer> statusList = Arrays.asList(ReleaseStatus.success.value(), ReleaseStatus.failure.value());
+		Map<Long, String> tagMap = new HashMap<>(batchList.size());
+		for (ReleaseProductByBatch aBatch : batchList) {
+			if (aBatch.getErrmsg() != null || !statusList.contains(aBatch.getReleaseCode())) {
+				continue;
+			}
+			if (aBatch.getTag() == null) {
+				Goods goods = goodsDao.findByBatchCode(aBatch.getBatchCode());
+				if (!tagMap.containsKey(goods.getProductid())) {
+					List<String> tagStr = goodsDao.getTagByProductId(goods.getProductid());
+					if (CollectionUtils.isEmpty(tagStr)) {
+						tagMap.put(goods.getProductid(), "类型1");
+					} else {
+						Collections.sort(tagStr, new Comparator<String>() {
+							@Override
+							public int compare(String o1, String o2) {
+								// 按类型降序排序
+								int a = Integer.parseInt(o1.substring(2));
+								int b = Integer.parseInt(o2.substring(2));
+								return b > a ? 1 : b == a ? 0 : -1;
+							}
+						});
+						String str = "类型" + (Integer.parseInt(tagStr.get(0).substring(2)) + 1);
+						tagMap.put(goods.getProductid(), str);
+					}
+				} else {
+					String str = "类型" + (Integer.parseInt(tagMap.get(goods.getProductid()).substring(2)) + 1);
+					tagMap.put(goods.getProductid(), str);
+				}
+				aBatch.setTag(tagMap.get(goods.getProductid()));
+			}
+		}
+	}
+
+	/**
+	 * 通过导入excel内容修改goods信息
+	 * @param batchList
+	 * @return
+	 */
+	private int modifyGoodsByBatch(List<ReleaseProductByBatch> batchList) {
+		int result = 0;
+		List<Integer> statusList = Arrays.asList(ReleaseStatus.success.value(), ReleaseStatus.failure.value());
+		for (ReleaseProductByBatch aBatch : batchList) {
+			if (aBatch.getErrmsg() != null || !statusList.contains(aBatch.getReleaseCode())) {
+				continue;
+			}
+			Goods goods = goodsDao.findByBatchCode(aBatch.getBatchCode());
+			fillInGoods(goods, aBatch);
+			ResultMap resultMap = goodsService.updateGoods(goods);
+			if (resultMap.isSuccess()) {
+				Goods goods1 = (Goods) resultMap.getData();
+				if (Status.REMOVED.value() == aBatch.getStatus() && Status.REMOVED.value() != goods1.getStatus()) {
+					ResultMap offMap = goodsService.offShelfGoodsByProvider(goods.getBatchCode(), null, false);
+					if (offMap.isSuccess()) {
+						result++;
+					} else {
+						aBatch.setErrmsg(offMap.getMessage());
+						aBatch.setReleaseCode(ReleaseStatus.lack_info.value());
+						aBatch.setReleaseStatus(ReleaseStatus.lack_info.getPhrase());
+					}
+				} else {
+					result++;
+				}
+			} else {
+				aBatch.setErrmsg(resultMap.getMessage());
+				aBatch.setReleaseCode(ReleaseStatus.lack_info.value());
+				aBatch.setReleaseStatus(ReleaseStatus.lack_info.getPhrase());
+			}
+		}
+		return result;
+	}
+
+	private void fillInGoods(Goods goods, ReleaseProductByBatch aBatch) {
+		if (!StringUtils.isEmpty(aBatch.getProductDate())) {
+			goods.setProduceDate(aBatch.getProductDate());
+		}
+		if (!StringUtils.isEmpty(aBatch.getPackaging())) {
+			goods.setPackaging(aBatch.getPackaging());
+		}
+		if (null != aBatch.getSelfMinDelivery()) {
+			goods.setMinDelivery(aBatch.getSelfMinDelivery());
+		}
+		if (null != aBatch.getSelfMaxDelivery()) {
+			goods.setMaxDelivery(aBatch.getSelfMaxDelivery());
+		}
+		if (null != aBatch.getBreakUp()) {
+			goods.setBreakUp(aBatch.getBreakUp());
+		}
+		if (null != aBatch.getMinPackage()) {
+			goods.setMinPackQty(aBatch.getMinPackage());
+		} else {
+			goods.setMinPackQty(1d);
+		}
+		if (null != aBatch.getMinBuyQty()) {
+			goods.setMinBuyQty(aBatch.getMinBuyQty());
+		}
+		if (null != aBatch.getPrices()) {
+			goods.setPrices(aBatch.getPrices());
+		}
+		if (null != aBatch.getReserve()) {
+			goods.setReserve(aBatch.getReserve());
+		}
+		goods.setTag(aBatch.getTag());
+		if (SysConf.getStoreid().equals(aBatch.getStoreid())) {
+			goods.setSelfSale("2");
+		} else {
+			goods.setSelfSale("1");
+		}
+		goods.setStatus(aBatch.getStatus());
+	}
+
+	private StoreIn getModifyStoreInfo(Object value, StoreIn self, StoreIn consignment) {
+		List<String> sellList = Arrays.asList("自营", "寄售");
+		if (StringUtils.isEmpty(value) || !sellList.contains(StringUtilB2C.getStr(value))) {
+			return null;
+		}
+		boolean selfValue = "自营".equals(StringUtilB2C.getStr(value));
+		return selfValue ? self : consignment;
+	}
+
+	private void convertModifyToBatch(ReleaseProductByBatch aProduct, Row row, int rowNum) {
+		Object kindValue = readWorkBookCell(row.getCell(ModifyConstant.PRODUCT_KIND), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PRODUCT_KIND);
+		aProduct.setKindName(StringUtilB2C.getStr(kindValue));
+
+		Object brandValue = readWorkBookCell(row.getCell(ModifyConstant.PRODUCT_BRAND), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PRODUCT_BRAND);
+		aProduct.setBrandNameEn(StringUtilB2C.getStr(brandValue));
+
+		Object codeValue = readWorkBookCell(row.getCell(ModifyConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PRODUCT_CODE);
+		aProduct.setCode(StringUtilB2C.getStr(codeValue));
+
+		Cell productCell = row.getCell(ModifyConstant.PRODUCE_DATE);
+		if (productCell != null && productCell.getCellType() == 0) {
+			if (HSSFDateUtil.isCellDateFormatted(productCell)) {
+				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+				String productStr = sdf.format(productCell.getDateCellValue());
+				aProduct.setProductDateByExcel(productStr);
+			} else {
+				aProduct.setProductDateByExcel(readWorkBookCell(row.getCell(ModifyConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
+						rowNum, ModifyConstant.PRODUCE_DATE));
+			}
+		} else {
+			Object produceValue = readWorkBookCell(row.getCell(ModifyConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.PRODUCE_DATE);
+			aProduct.setProductDateByExcel(produceValue);
+		}
+
+		Object packageMethodValue = readWorkBookCell(row.getCell(ModifyConstant.PACKAGE_METHOD), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PACKAGE_METHOD);
+		if (!StringUtils.isEmpty(packageMethodValue)) {
+            aProduct.setPackagingByExcel(packageMethodValue, false);
+        }
+
+		Object minValue = readWorkBookCell(row.getCell(ModifyConstant.MIN_DELIVERY), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.MIN_DELIVERY);
+		Object maxValue = readWorkBookCell(row.getCell(ModifyConstant.MAX_DELIVERY), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.MAX_DELIVERY);
+		aProduct.setDeliveryByExcel(minValue, maxValue);
+		if (!StringUtils.isEmpty(minValue) || !StringUtils.isEmpty(maxValue)) {
+			setDeliveryTime(aProduct, minValue, maxValue);
+		}
+
+		Object breakValue = readWorkBookCell(row.getCell(ModifyConstant.BREAK_UP), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.BREAK_UP);
+		if (!StringUtils.isEmpty(breakValue)) {
+            aProduct.setBreakUpByExcel(breakValue);
+        }
+
+		Object packageNumValue = readWorkBookCell(row.getCell(ModifyConstant.PACKAGE_NUMBER), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.PACKAGE_NUMBER);
+		if (!StringUtils.isEmpty(packageNumValue)) {
+            aProduct.setMinPackageByExcel(packageNumValue);
+        }
+
+		Object buyQtyValue = readWorkBookCell(row.getCell(ModifyConstant.BUY_MIN_QTY), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.BUY_MIN_QTY);
+		if (!StringUtils.isEmpty(buyQtyValue)) {
+            aProduct.setMinBuyQtyByExcel(buyQtyValue);
+        }
+
+		Object reserveValue = readWorkBookCell(row.getCell(ModifyConstant.RESERVE_NUMBER), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.RESERVE_NUMBER);
+        if (!StringUtils.isEmpty(reserveValue)) {
+            aProduct.setReserveByExcel(reserveValue);
+        }
+
+		Object statusValue = readWorkBookCell(row.getCell(ModifyConstant.SALE_STATUS), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.SALE_STATUS);
+        if (!StringUtils.isEmpty(statusValue)) {
+            aProduct.setStatusByExcel(statusValue);
+        }
+
+		Object tagValue = readWorkBookCell(row.getCell(ModifyConstant.CUSTOM_LABEL), Cell.CELL_TYPE_STRING,
+				rowNum, ModifyConstant.CUSTOM_LABEL);
+        if (!StringUtils.isEmpty(tagValue)) {
+            aProduct.setTagByExcel(tagValue.toString().trim());
+        }
+		// 自定义标签不为null,则检查是否重复
+		if (aProduct.getCode() != null && aProduct.getBrandNameEn() != null && aProduct.getTag() != null) {
+			resetTag(aProduct);
+		}
+	}
+
+	/**
+	 * 验证批次号是否正确,并为该公司下的goods
+	 * @param batchCode
+	 * @param aBatch
+	 * @return
+	 */
+	private boolean validateBatchCode(String batchCode, ReleaseProductByBatch aBatch) {
+		if (StringUtils.isEmpty(batchCode)) {
+			return false;
+		}
+		Goods goods = goodsDao.findByBatchCode(batchCode);
+		if (goods == null) {
+			return false;
+		}
+		aBatch.setB2cBranden(goods.getBrandNameEn());
+		aBatch.setBrandNameEn(goods.getBrandNameEn());
+		aBatch.setKindName(goods.getKindNameCn());
+		aBatch.setB2cCode(goods.getCode());
+		aBatch.setCode(goods.getCode());
+		aBatch.setCurrency(goods.getCurrencyName());
+		if (goods.getUuid() == null) {
+			aBatch.setReleaseCode(ReleaseStatus.failure.value());
+			aBatch.setReleaseStatus(ReleaseStatus.failure.getPhrase());
+		}
+		Long enuu = SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
+		if (goods.getEnUU() != null) {
+			return goods.getEnUU().equals(enuu);
+		}
+		return goods.getEnUU() == null && enuu == null;
+	}
+
+	private void validateModifyExcel(Row headerRow) {
+		Object skuCellObj = readWorkBookCell(headerRow.getCell(ModifyConstant.SKU_CODE), Cell.CELL_TYPE_STRING,
+				1, ModifyConstant.SKU_CODE);
+		String skuStr = StringUtilB2C.getStr(skuCellObj);
+		if (StringUtilB2C.isEmpty(skuCellObj) || !"SKU编码(不可修改)".equals(skuStr)) {
+			throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
+		}
+	}
+
 	/**
 	 * 验证Excel中数据是否重复
 	 *
@@ -309,7 +645,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 			List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(enuu, each.getB2cCode(), each.getB2cBranden(), IntegerConstant.YES_SHORT);
 			if (!CollectionUtils.isEmpty(productList)) {
-				List<Goods> goodsList = goodsDao.findRepeatGoodsInProductId(productList.get(0).getId(), each.getProductDate(), each.getPackaging(), each.getMinPackage(), each.getMinBuyQty(), each.getSelfMaxDelivery(), each.getSelfMinDelivery(), each.getUnit());
+				List<Goods> goodsList = null;
+				if (each.getBatchCode() != null) {
+					goodsList = goodsDao.findRepeatGoodsInProductIdNotBatch(productList.get(0).getId(), each.getBatchCode(), each.getProductDate(), each.getPackaging(), each.getMinPackage(), each.getMinBuyQty(), each.getSelfMaxDelivery(), each.getSelfMinDelivery(), each.getUnit());
+				} else {
+					goodsList = goodsDao.findRepeatGoodsInProductId(productList.get(0).getId(), each.getProductDate(), each.getPackaging(), each.getMinPackage(), each.getMinBuyQty(), each.getSelfMaxDelivery(), each.getSelfMinDelivery(), each.getUnit());
+				}
 				if (!CollectionUtils.isEmpty(goodsList)) {
 					if (!isImport) {
 						each.setErrmsg(ErrorInfoConstant.REPEAT_INFO.getInfo());
@@ -513,6 +854,24 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		return storeIn;
 	}
 
+	/**
+	 * 获取店铺的信息
+	 * @param selfSale
+	 * @return
+	 */
+	private StoreIn getStoreIn(Boolean selfSale) {
+		StoreIn storeIn = null;
+		if (selfSale) {
+			storeIn = storeInService.findByEnUU(SystemSession.getUser().getEnterprise().getUu());
+			if((storeIn == null) || (storeIn.getStatus() != StoreStatus.OPENED)) {
+				return null;
+			}
+		} else {
+			storeIn = storeInService.findByUuid(SysConf.getStoreid());
+		}
+		return storeIn;
+	}
+
 	private Boolean isNumber(String str) {
 		Pattern numberPattern = Pattern.compile(RegexConstant.NumberData);
 		Matcher matcher = numberPattern.matcher(str);
@@ -635,7 +994,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					String productStr = sdf.format(productCell.getDateCellValue());
 					aProduct.setProductDateByExcel(productStr);
 				} else {
-					aProduct.setProductDateByExcel("");
+					aProduct.setProductDateByExcel(readWorkBookCell(row.getCell(ModifyConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
+							rowNum, ModifyConstant.PRODUCE_DATE));
 				}
 			} else {
 				Object produceValue = readWorkBookCell(row.getCell(UploadConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
@@ -688,11 +1048,22 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		int count = 0;
 		List<Product> productList = productDao.findMatchStandard(enuu, aProduct.getBrandNameEn(), aProduct.getCode(), IntegerConstant.YES_SHORT);
 		if (!CollectionUtils.isEmpty(productList)) {
-			count = goodsDao.findCountByTagInGoods(enuu, productList.get(0).getPbranden(),
-					productList.get(0).getPcmpcode(), aProduct.getTag());
+			if (aProduct.getBatchCode() != null) {
+				count = goodsDao.findCountByTagNotBatch(enuu, aProduct.getBatchCode(), productList.get(0).getPbranden(),
+						productList.get(0).getPcmpcode(), aProduct.getTag());
+			} else {
+				count = goodsDao.findCountByTagInGoods(enuu, productList.get(0).getPbranden(),
+						productList.get(0).getPcmpcode(), aProduct.getTag());
+			}
+
 		} else {
-			count = goodsDao.findCountByTagInGoods(SystemSession.getUser().getEnterprise().getUu(), aProduct.getBrandNameEn(),
-					aProduct.getCode(), aProduct.getTag());
+			if (aProduct.getBatchCode() != null) {
+				count = goodsDao.findCountByTagNotBatch(enuu, aProduct.getBatchCode(), aProduct.getBrandNameEn(),
+						aProduct.getCode(), aProduct.getTag());
+			} else {
+				count = goodsDao.findCountByTagInGoods(enuu, aProduct.getBrandNameEn(),
+						aProduct.getCode(), aProduct.getTag());
+			}
 		}
 		// 如果在该型号品牌已有重复,则忽略该自定义标签
 		if (count != 0) {
@@ -706,10 +1077,16 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param aProduct 验证单行数据
 	 * @param rowNum 行数
 	 */
-	private List<GoodsQtyPrice> initQtyPriceByExcel(Row row, ReleaseProductByBatch aProduct, int rowNum) {
+	private List<GoodsQtyPrice> initQtyPriceByExcel(Row row, boolean isImport, ReleaseProductByBatch aProduct, int rowNum) {
 		List<GoodsQtyPrice> qtyPriceList = new ArrayList<>();
-		Object firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_NUMERIC,
-				rowNum, UploadConstant.PRICE_START);
+		Object firstValue = null;
+		if (isImport) {
+			firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.PRICE_START);
+		} else {
+			firstValue = readWorkBookCell(row.getCell(ModifyConstant.PRICE_FIRST), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.PRICE_FIRST);
+		}
 		if (aProduct.getMinBuyQty() != null) {
 			aProduct.setFragmentQty(aProduct.getMinBuyQty().toString(), 0);
 		}
@@ -729,12 +1106,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 		if (!CollectionUtils.isEmpty(qtyPriceList)) {
 			// 设置第二分段并设置第三分段梯度和价格
-			setSecondPrice(row, rowNum, qtyPriceList, aProduct);
+			setSecondPrice(row, isImport, rowNum, qtyPriceList, aProduct);
 			// 设置本批次最低和最高价格
 			setMinMaxPrice(aProduct, qtyPriceList);
 		}
 		for (int index = 0; index <= 1; index++) {
-			setInputValueToProduct(row, aProduct, rowNum, index);
+			setInputValueToProduct(row, isImport, aProduct, rowNum, index);
 		}
 		return qtyPriceList;
 	}
@@ -781,11 +1158,20 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param qtyPriceList 分段价格list
 	 * @param aProduct 验证单行数据
 	 */
-	private void setSecondPrice(Row row, int rowNum, List<GoodsQtyPrice> qtyPriceList, ReleaseProductByBatch aProduct) {
-		Object startValue = readWorkBookCell(row.getCell(UploadConstant.QTY_SECOND_START), Cell.CELL_TYPE_NUMERIC,
-				rowNum, UploadConstant.QTY_SECOND_START);
-		Object priceValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_SECOND), Cell.CELL_TYPE_NUMERIC,
-				rowNum, UploadConstant.PRICE_SECOND);
+	private void setSecondPrice(Row row, boolean isImport, int rowNum, List<GoodsQtyPrice> qtyPriceList, ReleaseProductByBatch aProduct) {
+		Object startValue = null;
+		Object priceValue = null;
+		if (isImport) {
+			startValue = readWorkBookCell(row.getCell(UploadConstant.QTY_SECOND_START), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.QTY_SECOND_START);
+			priceValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_SECOND), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.PRICE_SECOND);
+		} else {
+			startValue = readWorkBookCell(row.getCell(ModifyConstant.QTY_SECOND_START), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.QTY_SECOND_START);
+			priceValue = readWorkBookCell(row.getCell(ModifyConstant.PRICE_SECOND), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.PRICE_SECOND);
+		}
 		if (!StringUtils.isEmpty(startValue) && !StringUtils.isEmpty(priceValue)) {
 			Double price = Double.valueOf(priceValue.toString());
 			Double start = Double.valueOf(startValue.toString());
@@ -794,12 +1180,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 						price, aProduct.getRmbTaxRate(), aProduct.getCurrency());
 				qtyPriceList.add(qtyPrice);
 				qtyPriceList.get(0).setEnd(Double.valueOf(startValue.toString()) - 1);
-				setThirdPrice(row, rowNum, qtyPriceList, aProduct);
+				setThirdPrice(row, isImport, rowNum, qtyPriceList, aProduct);
 			}
 			return ;
 		}
 		if (StringUtils.isEmpty(startValue) && StringUtils.isEmpty(priceValue)) {
-			setThirdPrice(row, rowNum, qtyPriceList, aProduct);
+			setThirdPrice(row, isImport, rowNum, qtyPriceList, aProduct);
 		}
 	}
 
@@ -810,11 +1196,20 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param qtyPriceList 分段价格list
 	 * @param aProduct 验证单行数据
 	 */
-	private void setThirdPrice(Row row, int rowNum, List<GoodsQtyPrice> qtyPriceList, ReleaseProductByBatch aProduct) {
-		Object startValue = readWorkBookCell(row.getCell(UploadConstant.QTY_THIRD_START), Cell.CELL_TYPE_NUMERIC,
-				rowNum, UploadConstant.QTY_THIRD_START);
-		Object priceValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_THIRD), Cell.CELL_TYPE_NUMERIC,
-				rowNum, UploadConstant.PRICE_THIRD);
+	private void setThirdPrice(Row row, boolean isImport, int rowNum, List<GoodsQtyPrice> qtyPriceList, ReleaseProductByBatch aProduct) {
+		Object startValue = null;
+		Object priceValue = null;
+		if (isImport) {
+			startValue = readWorkBookCell(row.getCell(UploadConstant.QTY_THIRD_START), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.QTY_THIRD_START);
+			priceValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_THIRD), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.PRICE_THIRD);
+		} else {
+			startValue = readWorkBookCell(row.getCell(ModifyConstant.QTY_THIRD_START), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.QTY_THIRD_START);
+			priceValue = readWorkBookCell(row.getCell(ModifyConstant.PRICE_THIRD), Cell.CELL_TYPE_STRING,
+					rowNum, ModifyConstant.PRICE_THIRD);
+		}
 		if (!StringUtils.isEmpty(startValue) && !StringUtils.isEmpty(priceValue)) {
 			Double price = Double.valueOf(priceValue.toString());
 			Double start = Double.valueOf(startValue.toString());
@@ -835,8 +1230,13 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param rowNum
 	 * @param index
 	 */
-	private void setInputValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, int index) {
-		int nextQty = UploadConstant.PRICE_START + 1 + (index * 2);
+	private void setInputValueToProduct(Row row, boolean isImport, ReleaseProductByBatch aProduct, int rowNum, int index) {
+		int nextQty = 0;
+		if (isImport) {
+			nextQty = UploadConstant.PRICE_START + 1 + (index * 2);
+		} else {
+			nextQty = ModifyConstant.PRICE_FIRST + 1 + (index * 2);
+		}
 		Object startValue = readWorkBookCell(row.getCell(nextQty), Cell.CELL_TYPE_STRING,
 				rowNum, nextQty);
 		Object priceValue = readWorkBookCell(row.getCell(nextQty + 1), Cell.CELL_TYPE_STRING,

+ 3 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/type/ModifyConstant.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.prod.commodity.type;
 /**
  * 商品修改常量
  * @author hulh 2017年12月14日 11点22分
+ * @version dongbw 2018年5月15日 16:49:02 增加在售状态
  */
 public enum  ModifyConstant {
     MODIFY_IMG(10, "产品图片"),
@@ -16,7 +17,8 @@ public enum  ModifyConstant {
     MODIFY_MAX_DELIVERY(18, "最大交期"),
     MODIFY_SALE_METHOD(19, "销售方式"),
     MODIFY_QTY_NUMBER(20, "分段数量"),
-    MODIFY_QTY_PRICE(21, "分段价格");
+    MODIFY_QTY_PRICE(21, "分段价格"),
+    MODIFY_GOODS_STATUS(22, "在售状态");
 
     ModifyConstant(int value, String phrase) {
         this.value = value;

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


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


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


+ 83 - 1
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', '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) {
+	app.register.controller('vendor_materialCtrl', ['$scope', 'Loading', '$rootScope', 'Material', 'toaster', 'ComponentActive', 'Enterprise', '$q', 'NumberService', '$location', '$stateParams', 'Search', '$modal', 'ComponentActiveAPI', 'BrandSubmit', 'BrandActiveAPI', 'DistributionRule', 'prodRepositoryService', 'AuthenticationService', 'StoreInfo', 'ProductServiceQuery', 'StoreCms', 'ByteCountService', 'Goods', 'UASBatchPutOnPropertyServices', '$filter', '$upload', function ($scope, Loading, $rootScope, Material, toaster, ComponentActive, Enterprise, $q, NumberService, $location, $stateParams, Search, $modal, ComponentActiveAPI, BrandSubmit, BrandActiveAPI, DistributionRule, prodRepositoryService, AuthenticationService, StoreInfo, ProductServiceQuery, StoreCms, ByteCountService, Goods, UASBatchPutOnPropertyServices, $filter, $upload) {
 		$rootScope.active = 'vendor_material';
 		document.title = '卖家产品库-优软商城';
 		$scope.tab = 'material';
@@ -366,6 +366,48 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			});
 		};
 
+		$scope.batchModify = false;
+		$scope.modifyResult = false;
+		$scope.modifyBatch = function () {
+			$scope.batchModify = true;
+		};
+
+		$scope.importExcel = function () {
+			if(($scope.myFile == null) || ($scope.myFile.length == 0)) {
+				return ;
+			}
+			var file = $scope.myFile[0];
+			if (!file) {
+				toaster.pop('info', '请选择需要上传的文件');
+				return;
+			}
+			$upload.upload({
+				url: 'release/product/modify/excel',
+				file: file,
+				method: 'POST'
+			}).success(function(data) {
+				$scope.selectFile(' ');
+				$scope.myFile = [];
+				$scope.modifyData = data;
+				$scope.batchModify = false;
+				$scope.modifyResult = true;
+			}).error(function(response) {
+				$scope.selectFile(' ');
+				$scope.myFile = [];
+				toaster.pop('error', response.data || response);
+			});
+		};
+
+		//选择文件
+		$scope.selectFile = function(value) {
+			if(value != null) {
+				upload_text.value = value;
+			}else {
+				var fileInput = angular.element('#uploadCommodity')[0];
+				upload_text.value = fileInput.value;
+			}
+		};
+
 		// 确认删除
 		$scope.confirmDelete = function (ids) {
 			if ($scope.isChoosedAll) {
@@ -1038,6 +1080,46 @@ define([ 'app/app', 'jquery-uploadify' ], function(app) {
 			}
 		};
 
+		// 下载未修改成功的数据
+		$scope.downloadExcel = function(){
+			var param = {isAjax : true, batch : $scope.modifyData.batch};
+			if ($scope.modifyData && $scope.modifyData.batch && ($scope.modifyData.fail || $scope.modifyData.filter)) {
+				var form = document.getElementById('load-error');
+				form.action= 'release/product/modify/failure';
+				form.submit();
+				Loading.show();
+				var intervalId = null;
+				var getDownLoadStatus = function () {
+					$.ajax({
+						type: 'GET',
+						url: 'release/product/modify/failure',
+						data : param,
+						dataType : 'json',
+						success: function (data) {
+							if (!data.load) {
+								$scope.$apply(function () {
+									Loading.hide();
+									/*toaster.pop('success', '数据处理完毕,正在下载文件,请稍等。');*/
+								});
+								clearInterval(intervalId);
+							}
+						},
+						error: function () {
+							Loading.hide();
+							clearInterval(intervalId);
+						}
+					});
+				};
+				intervalId= setInterval(function () {
+					getDownLoadStatus();
+				}, 500);
+			} else {
+				if (!$scope.modifyData.fail && !$scope.modifyData.filter) {
+					toaster.pop('info', '提示', '您没有修改不成功的数据');
+				}
+			}
+		};
+
 		//初始化页数信息
 		$scope.initPages = function (totalElementPages) {
 			var pageNum = [];

+ 87 - 3
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js

@@ -1,6 +1,6 @@
 define([ 'app/app' ], function(app) {
     'use strict';
-    app.register.controller('vendor_onSaleCtrl', ['$scope', '$rootScope', 'Goods', '$modal', 'toaster', 'Loading', 'StoreInfo', 'AuthenticationService', '$q', 'StoreCms', 'NumberService', 'Enterprise', 'ByteCountService', 'DistributionRule', '$http', function ($scope, $rootScope, Goods, $modal, toaster, Loading, StoreInfo, AuthenticationService, $q, StoreCms, NumberService, Enterprise, ByteCountService, DistributionRule, $http) {
+    app.register.controller('vendor_onSaleCtrl', ['$scope', '$rootScope', 'Goods', '$modal', 'toaster', 'Loading', 'StoreInfo', 'AuthenticationService', '$q', 'StoreCms', 'NumberService', 'Enterprise', 'ByteCountService', 'DistributionRule', '$upload', '$http', function ($scope, $rootScope, Goods, $modal, toaster, Loading, StoreInfo, AuthenticationService, $q, StoreCms, NumberService, Enterprise, ByteCountService, DistributionRule, $upload, $http) {
         $rootScope.active = 'vendor_material';
         $scope.keyword = '';
         $scope.tab = 'onSale';
@@ -10,7 +10,7 @@ define([ 'app/app' ], function(app) {
         var intPattern = /^[1-9]+$/;
 
         $scope.packageArray = ["Bulk-散装", "Reel-卷装", "Tape/Reel-编带", "Tray-盘装",
-            "Tube-管装", "盒装", "袋装", "罐装", "瓶装", "桶装", "箱装"];
+            "Tube-管装", "盒装", "袋装", "罐装", "瓶装", "桶装", "箱装", "其他"];
 
         //只包含中文和英文的字符
         var pattern = /^[\u4e00-\u9fa5a-zA-Z]+$/;
@@ -693,7 +693,8 @@ define([ 'app/app' ], function(app) {
          * 将需要编辑的信息增加一个备份
          * @param commodity
          */
-        $scope.editCommodity = function (commodity) {
+        $scope.editCommodity = function (commodity, e) {
+            e.stopPropagation();
             if(commodity == null) {
                 true;
             }
@@ -1779,6 +1780,89 @@ define([ 'app/app' ], function(app) {
                 }
             }
         }
+
+        $scope.batchModify = false;
+        $scope.modifyResult = false;
+        $scope.modifyBatch = function () {
+            $scope.batchModify = true;
+        };
+
+        $scope.importExcel = function () {
+            if(($scope.myFile == null) || ($scope.myFile.length == 0)) {
+                return ;
+            }
+            var file = $scope.myFile[0];
+            if (!file) {
+                toaster.pop('info', '请选择需要上传的文件');
+                return;
+            }
+            $upload.upload({
+                url: 'release/product/modify/excel',
+                file: file,
+                method: 'POST'
+            }).success(function(data) {
+                $scope.selectFile(' ');
+                $scope.myFile = [];
+                $scope.modifyData = data;
+                $scope.batchModify = false;
+                $scope.modifyResult = true;
+            }).error(function(response) {
+                $scope.selectFile(' ');
+                $scope.myFile = [];
+                toaster.pop('error', response.data || response);
+            });
+        };
+
+        //选择文件
+        $scope.selectFile = function(value) {
+            if(value != null) {
+                upload_text.value = value;
+            }else {
+                var fileInput = angular.element('#uploadCommodity')[0];
+                upload_text.value = fileInput.value;
+            }
+        };
+
+        // 下载未修改成功的数据
+        $scope.downloadExcel = function(){
+            var param = {isAjax : true, batch : $scope.modifyData.batch};
+            if ($scope.modifyData && $scope.modifyData.batch && ($scope.modifyData.fail || $scope.modifyData.filter)) {
+                var form = document.getElementById('load-error');
+                form.action= 'release/product/modify/failure';
+                form.submit();
+                Loading.show();
+                var intervalId = null;
+                var getDownLoadStatus = function () {
+                    $.ajax({
+                        type: 'GET',
+                        url: 'release/product/modify/failure',
+                        data : param,
+                        dataType : 'json',
+                        success: function (data) {
+                            if (!data.load) {
+                                $scope.$apply(function () {
+                                    Loading.hide();
+                                    /*toaster.pop('success', '数据处理完毕,正在下载文件,请稍等。');*/
+                                });
+                                clearInterval(intervalId);
+                            }
+                        },
+                        error: function () {
+                            Loading.hide();
+                            clearInterval(intervalId);
+                        }
+                    });
+                };
+                intervalId= setInterval(function () {
+                    getDownLoadStatus();
+                }, 500);
+            } else {
+                if (!$scope.modifyData.fail && !$scope.modifyData.filter) {
+                    toaster.pop('info', '提示', '您没有修改不成功的数据');
+                }
+            }
+        };
+
     }]);
 
     app.register.controller('editPictureCtrl', ['$scope', 'pic', '$modalInstance', function ($scope, pic, $modalInstance) {

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

@@ -311,11 +311,11 @@
 		color: #333;
 		right: 0;
 		display: none;
-		height: 57px;
+		height: 82px;
 		line-height: 26px;
 		text-align: center;
 		background: #fff;
-		bottom: -57px;
+		bottom: -82px;
 		width: 98px;
 		z-index: 10;
 		border: 1px solid #e4e5e5;
@@ -1671,6 +1671,86 @@
 	.wanted_list01 .tab table th {
 		color: #333 !important;
 	}
+	.import-product {
+		border-radius: 3px;
+		width: 330px;
+		height: 170px;
+		left: 44%;
+	}
+	.import-product .content > i {
+		font-size: 12px;
+		float: right;
+		margin: 5px 5px 0 0;
+		color: #ddd;
+		cursor: pointer;
+	}
+	.import-product .content p a {
+		color: #5078cb;
+	}
+	.import-product .upload-content {
+		position: relative;
+		left: -29px;
+		margin-bottom: 10px !important;
+	}
+	.import-product .upload-content #upload_text {
+		width: 157px;
+		height: 25px;
+		border: #ccc 1px solid;
+		padding-left: 10px;
+		line-height: 25px;
+		font-size: 14px;
+	}
+	.import-product .upload-content i {
+		background: #5078cb;
+		width: 62px;
+		height: 25px;
+		display: inline-block;
+		text-align: center;
+		color: #fff;
+		line-height: 25px;
+		font-size: 12px;
+		position: absolute;
+		left: 232px;
+		top: 0;
+		border-left: #ccc 1px solid;
+		cursor: pointer;
+	}
+	.import-product .upload-content #uploadCommodity {
+		width: 218px;
+		height: 25px;
+		filter: alpha(opacity=0);
+		-moz-opacity: 0;
+		opacity: 0;
+		position: absolute;
+		left: 77px;
+		top: 0px;
+	}
+	.import-product h5 {
+		margin-bottom: 25px;
+	}
+	.import-result .content p {
+		padding: 0;
+	}
+	.import-result .content p span {
+		color: #5078cb;
+	}
+	.import-result .content h5 {
+		font-size: 14px;
+		margin-bottom: 10px;
+		margin-top: -10px;
+	}
+	.import-result .content h5 span {
+		color: red;
+	}
+	.import-result .content div a {
+		color: #fff !important;
+		background: #5078cb !important;
+	}
+
+	.import-result .content div span {
+		color: #4290f7;
+		cursor: pointer;
+	}
 
 	.edit-replace-box {
 		position: fixed;
@@ -1895,6 +1975,7 @@
 						<span class="expander">
 							<span ng-click="download()">导出选中</span>
 							<span ng-click="deleteBatch()" name="delete-material">删除选中</span>
+							<span ng-click="modifyBatch()">批量修改</span>
 						</span>
 					</div>
 					<!--<a ng-show="!isBatch" ng-click="enterBatch()"><span ng-show="!isBatch">批量操作</span></a>-->
@@ -2137,7 +2218,7 @@
 										<tbody ng-repeat="goods in material.goodsArr">
 										<tr class="define defines" ng-if="!goods.edit">
 											<td colspan="10">
-												<div class="code">产品编码 : <span ng-bind="goods.prodNum || '-'">247823589235</span></div>
+												<div class="code">SKU编码 : <span ng-bind="goods.batchCode || '-'">247823589235</span></div>
 												<div class="labelling">
 													<!--<em>*</em>-->
 													自定义标签 : <span ng-bind="goods.tag">散装出售</span></div>
@@ -2657,6 +2738,46 @@
 	</div>
 </div>
 
+<div class="com-modal-wrap" ng-show="batchModify">
+	<div class="com-mall-del-box import-product">
+		<div class="content">
+			<i class="fa fa-close" ng-click="batchModify=false"></i>
+			<p><i class="fa fa-exclamation-circle"></i>请先<a ng-click="download()">导出产品信息</a>,将内容修改后重新导入</p>
+			<div class="upload-content">
+				<input type="text" name="txt" id="upload_text">
+				<i>选择文件</i>
+				<input type="file" id="uploadCommodity" ng-file-select="" ng-change="selectFile()" accept="*.xls,*.xlsx" ng-model="myFile" ng-multiple="false" />
+				<!--<input type="file" id="uploadCommodity">-->
+			</div>
+			<h5>温馨提示:仅修改现有产品信息</h5>
+			<div>
+				<a ng-click="batchModify=false">取消</a>
+				<a ng-click="importExcel()">导入</a>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<div class="com-modal-wrap" ng-show="modifyResult">
+	<div class="com-mall-del-box import-result">
+		<div class="title" ng-click="modifyResult=false">
+			<i></i>
+		</div>
+		<div class="content">
+			<p><i class="fa fa-exclamation-circle"></i><span ng-bind="modifyData.success">583</span>个产品修改成功,</p>
+			<h5><span class="red" ng-bind="modifyData.filter">5</span>个产品修改失败!</h5>
+			<div>
+				<a ng-click="modifyResult=false">确定</a>
+				<span ng-if="modifyData.filter" ng-click="downloadExcel()">下载失败列表</span>
+				<form id="load-error" style="display: none;" method="get">
+					<input type="hidden" name="batch" ng-value="modifyData.batch">
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+
 <style>
     /**/
     .wanted_list01 .empty{

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

@@ -2553,6 +2553,8 @@
 	</div>
 </div>
 
+
+
 <style>
     /**/
     .wanted_list01 .empty{

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

@@ -785,11 +785,11 @@
         color: #333;
         right: 0;
         display: none;
-        height: 82px;
+        height: 108px;
         line-height: 26px;
         text-align: center;
         background: #fff;
-        bottom: -82px;
+        bottom: -108px;
         width: 98px;
         z-index: 10;
         border: 1px solid #e4e5e5;
@@ -862,6 +862,87 @@
     .pro_management .com_tab ul li.active:after{
         display: block
     }
+
+    .import-product {
+        border-radius: 3px;
+        width: 330px;
+        height: 170px;
+        left: 44%;
+    }
+    .import-product .content > i {
+        font-size: 12px;
+        float: right;
+        margin: 5px 5px 0 0;
+        color: #ddd;
+        cursor: pointer;
+    }
+    .import-product .content p a {
+        color: #5078cb;
+    }
+    .import-product .upload-content {
+        position: relative;
+        left: -29px;
+        margin-bottom: 10px !important;
+    }
+    .import-product .upload-content #upload_text {
+        width: 157px;
+        height: 25px;
+        border: #ccc 1px solid;
+        padding-left: 10px;
+        line-height: 25px;
+        font-size: 14px;
+    }
+    .import-product .upload-content i {
+        background: #5078cb;
+        width: 62px;
+        height: 25px;
+        display: inline-block;
+        text-align: center;
+        color: #fff;
+        line-height: 25px;
+        font-size: 12px;
+        position: absolute;
+        left: 232px;
+        top: 0;
+        border-left: #ccc 1px solid;
+        cursor: pointer;
+    }
+    .import-product .upload-content #uploadCommodity {
+        width: 218px;
+        height: 25px;
+        filter: alpha(opacity=0);
+        -moz-opacity: 0;
+        opacity: 0;
+        position: absolute;
+        left: 77px;
+        top: 0px;
+    }
+    .import-product h5 {
+        margin-bottom: 25px;
+    }
+    .import-result .content p {
+        padding: 0;
+    }
+    .import-result .content p span {
+        color: #5078cb;
+    }
+    .import-result .content h5 {
+        font-size: 14px;
+        margin-bottom: 10px;
+        margin-top: -10px;
+    }
+    .import-result .content h5 span {
+        color: red;
+    }
+    .import-result .content div a {
+        color: #fff !important;
+        background: #5078cb !important;
+    }
+
+    .import-result .content div span {
+        color: #4290f7;
+        cursor: pointer;
+    }
 </style>
 <div class="user_right fr">
     <!--货品管理-->
@@ -884,7 +965,7 @@
         </div>
         <div class="search-check">
             <div class="search fl check">
-                <input type="text" class="form-control" ng-model="keyword" ng-search="onSearch()" placeholder="产品型号/品牌/产品编码"/>
+                <input type="text" class="form-control" ng-model="keyword" ng-search="onSearch()" placeholder="产品型号/品牌/编码"/>
                 <button ng-click="onSearch()" style="float: left;">搜索</button>
                 <!--<a ng-click="downGoods()" class="down-goods-btn">批量导出</a>-->
                 <div class="operate-btn more-operate">
@@ -893,6 +974,7 @@
                         <span ng-click="download()">导出选中</span>
                         <span ng-click="batchOperation(1)" name="delete-material">删除选中</span>
                         <span ng-click="batchOperation(2)">下架选中</span>
+                        <span ng-click="modifyBatch()">批量修改</span>
                     </span>
                 </div>
                 <form style="display: none;" id="down-load-goods" method="get">
@@ -975,7 +1057,7 @@
                     <!--非编辑状态自定义标签-->
                     <tr class="define" ng-if="!commodity.edit">
                         <td colspan="10">
-                            <div class="code">产品编码 : <span ng-bind="commodity.prodNum">247823589235</span></div>
+                            <div class="code">SKU编码 : <span ng-bind="commodity.batchCode">247823589235</span></div>
                             <div class="labelling" ng-if="commodity.tag">
                             <!--<em>*</em>-->
                                 自定义标签 : <span ng-bind="commodity.tag">散装出售散装出售</span>
@@ -1066,7 +1148,7 @@
                             </div>
                         </td>
                         <td class="padding0">
-                            <div ng-if="!commodity.sourceId" name="edit-a" class="edit-a"><span class="edit edits" ng-click="editCommodity(commodity)">编辑</span></div><!--updateCommodityInfo(commodity, false)-->
+                            <div ng-if="!commodity.sourceId" name="edit-a" class="edit-a"><span class="edit edits" ng-click="editCommodity(commodity, $event)">编辑</span></div><!--updateCommodityInfo(commodity, false)-->
                             <div ng-if="commodity.sourceId"><a style="margin: 0;">来源UAS</a></div>
                             <div ng-if="!commodity.sourceId" name="down-a" class="down-a"><span class='edits' ng-click="soldOut($event, commodity)">下架</span></div>
                         </td>
@@ -1074,7 +1156,7 @@
                     <!--编辑状态自定义标签-->
                     <tr class="define defines" ng-if="commodity.edit">
                         <td colspan="10">
-                            <div class="code">产品编码 : <span ng-bind="commodity.prodNum">247823589235</span></div>
+                            <div class="code">SKU编码 : <span ng-bind="commodity.batchCode">247823589235</span></div>
                             <div class="labelling">
                                 <!--<em>*</em>-->
                                 自定义标签 : <input type="text" ng-blur="editTag(commodity)" ng-model="commodity.editTag" ng-change="changeTag(commodity)"
@@ -1428,6 +1510,46 @@
         </div>
     </div>
 </div>
+
+<div class="com-modal-wrap" ng-show="batchModify">
+    <div class="com-mall-del-box import-product">
+        <div class="content">
+            <i class="fa fa-close" ng-click="batchModify=false"></i>
+            <p><i class="fa fa-exclamation-circle"></i>请先<a ng-click="download()">导出产品信息</a>,将内容修改后重新导入</p>
+            <div class="upload-content">
+                <input type="text" name="txt" id="upload_text">
+                <i>选择文件</i>
+                <input type="file" id="uploadCommodity" ng-file-select="" ng-change="selectFile()" accept="*.xls,*.xlsx" ng-model="myFile" ng-multiple="false" />
+                <!--<input type="file" id="uploadCommodity">-->
+            </div>
+            <h5>温馨提示:仅修改现有产品信息</h5>
+            <div>
+                <a ng-click="batchModify=false">取消</a>
+                <a ng-click="importExcel()">导入</a>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<div class="com-modal-wrap" ng-show="modifyResult">
+    <div class="com-mall-del-box import-result">
+        <div class="title" ng-click="modifyResult=false">
+            <i></i>
+        </div>
+        <div class="content">
+            <p><i class="fa fa-exclamation-circle"></i><span ng-bind="modifyData.success">583</span>个产品修改成功,</p>
+            <h5><span class="red" ng-bind="modifyData.filter">5</span>个产品修改失败!</h5>
+            <div>
+                <a ng-click="modifyResult=false">确定</a>
+                <span ng-if="modifyData.filter" ng-click="downloadExcel()">下载失败列表</span>
+                <form id="load-error" style="display: none;" method="get">
+                    <input type="hidden" name="batch" ng-value="modifyData.batch">
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
 <style>
     /**/
     .wanted_list01 .empty{