Browse Source

Merge branch 'feature-201836-wangcz' into dev

# Conflicts:
#	src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreApplyServiceImpl.java
wangcz 7 years ago
parent
commit
6f5b7a159f
31 changed files with 2259 additions and 387 deletions
  1. 1 1
      pom.xml
  2. 1 1
      src/main/java/com/uas/platform/b2c/core/support/view/JxlsExcelView.java
  3. 45 0
      src/main/java/com/uas/platform/b2c/core/utils/CollectionUtils.java
  4. 31 3
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java
  5. 100 3
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  6. 21 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/AbstractKeyEntity.java
  7. 3 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Product.java
  8. 13 10
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  9. 16 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java
  10. 30 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  11. 26 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  12. 90 45
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  13. 156 9
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  14. 16 18
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  15. 22 1
      src/main/java/com/uas/platform/b2c/prod/commodity/type/ReleaseConstant.java
  16. 7 0
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseProductServiceImpl.java
  17. BIN
      src/main/resources/jxls-tpl/trade/product_background.xls
  18. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  19. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  20. 3 3
      src/main/resources/pre/sys.properties
  21. 3 1
      src/main/webapp/WEB-INF/views/normal/adminWithNav.html
  22. 6 0
      src/main/webapp/resources/js/admin/app.js
  23. 54 43
      src/main/webapp/resources/js/admin/controllers/product/productManageCtrl.js
  24. 6 3
      src/main/webapp/resources/js/admin/controllers/product/productManageDetailCtrl.js
  25. 877 0
      src/main/webapp/resources/js/admin/controllers/product/saleProductManageCtrl.js
  26. 13 1
      src/main/webapp/resources/js/common/query/goods.js
  27. 72 72
      src/main/webapp/resources/js/usercenter/controllers/forstore/single_entry_ctrl.js
  28. 6 5
      src/main/webapp/resources/view/admin/product/productManage.html
  29. 583 0
      src/main/webapp/resources/view/admin/product/saleProductManage.html
  30. 1 1
      src/main/webapp/resources/view/sso/left_nav.html
  31. 57 166
      src/main/webapp/resources/view/usercenter/forstore/single_entry.html

+ 1 - 1
pom.xml

@@ -685,7 +685,7 @@
 				<artifactId>tomcat7-maven-plugin</artifactId>
 				<version>2.2</version>
 				<configuration>
-					<port>8080</port>
+					<port>8090</port>
 					<path>/</path>
 					<uriEncoding>utf-8</uriEncoding>
 				</configuration>

+ 1 - 1
src/main/java/com/uas/platform/b2c/core/support/view/JxlsExcelView.java

@@ -36,7 +36,7 @@ public class JxlsExcelView extends AbstractExcelView {
     /**
      * 管理后台goods最大导出行
      */
-	public final static int GOODS_MAX_SIZE = 5000;
+	public final static int GOODS_MAX_SIZE = 1000;
 
     /**
      * 文件名

+ 45 - 0
src/main/java/com/uas/platform/b2c/core/utils/CollectionUtils.java

@@ -0,0 +1,45 @@
+package com.uas.platform.b2c.core.utils;
+
+import com.uas.platform.b2c.prod.commodity.model.AbstractKeyEntity;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 集合处理工具类
+ *
+ * @author hejq
+ * @date 2018-07-19 11:03
+ */
+public class CollectionUtils {
+
+    /**
+     * 用继承自KeyEntity的类,重写的getKey方法来取值,封装成List一次性查询数据
+     *
+     * @param paramArray
+     * @return
+     */
+    public static Set<Long> getKeyCollection(Collection<? extends AbstractKeyEntity> paramArray) {
+        Set<Long> idList = new HashSet<>();
+        if (!org.springframework.util.CollectionUtils.isEmpty(paramArray)) {
+            for (AbstractKeyEntity param : paramArray) {
+                Object val = param.getKey();
+                if (val != null) {
+                    idList.add(Long.valueOf(val.toString()));
+                }
+            }
+        }
+        return idList;
+    }
+
+    /**
+     * 集合是否为空
+     *
+     * @param coll 集合
+     * @return true or false
+     */
+    public static boolean isEmpty(Collection<?> coll) {
+        return (coll == null || coll.isEmpty());
+    }
+}

+ 31 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.base.model.FileUpload;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
@@ -49,7 +50,6 @@ import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.*;
 import java.text.SimpleDateFormat;
@@ -848,8 +848,7 @@ public class GoodsController {
      * @return ModelAndView
      */
 	@RequestMapping(value = "/background/download", method = RequestMethod.GET)
-    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, PageParams params, HttpServletResponse response,
-                                           @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
         HttpSession session = request.getSession();
         ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
         if (!modelAndView.isEmpty()) {
@@ -872,6 +871,35 @@ public class GoodsController {
         return modelAndView;
     }
 
+    /**
+     * 根据ID查询导出goods信息
+     *
+     * @param idStr 拼接的id
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/downloadByIds", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(HttpServletRequest request, String idStr, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        List<Long> idList = JSON.parseArray(idStr, Long.class);
+        List<Goods> privates = goodsService.findByIds(idList);
+        if (CollectionUtils.isNotEmpty(privates)) {
+            logger.info("产品导出结果 products: " + privates.size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", privates);
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
 	/**
 	 * 根据id返回一个Goods数据
 	 * @param goodsId

+ 100 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -7,28 +7,42 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 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.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
+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.ProductReplace;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
 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.type.ProductConstant;
+import com.uas.platform.b2c.trade.order.support.AjaxUtil;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -483,4 +497,87 @@ public class ProductController {
         USELOG.log("卖家中心物料", "单个物料录入操作");
 	    return productService.editOne(jsonObject);
     }
+
+	/**
+	 * 根据分页参数和过滤对象分页获取数据
+	 *
+	 * @param params 分页参数
+	 * @param goodsFilter 过滤对象
+	 * @return Page<Product>
+	 */
+	@RequestMapping(value = "/background/page", method = RequestMethod.POST)
+	public Page<V_ProductPrivate> getPageDataOfBackground(PageParams params, @RequestBody GoodsFilter goodsFilter) {
+		PageInfo info = new PageInfo(params);
+		logger.info("后台产品管理", "分页获取Product信息");
+		return productService.getPageDataOfBackground(info, goodsFilter);
+	}
+
+    /**
+     * 根据分页参数和过滤对象导出数据
+     *
+     * @param goodsFilter 过滤对象
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/download", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(1, JxlsExcelView.GOODS_MAX_SIZE);
+        Page<V_ProductPrivate> page = productService.getPageDataOfBackground(info, goodsFilter);
+        if (CollectionUtils.isNotEmpty(page.getContent())) {
+            logger.info("产品导出结果 products: " + page.getContent().size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", page.getContent());
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/product_background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
+
+    /**
+     * 根据id返回一个Goods数据
+     * @param productId productId
+     * @return V_ProductPrivate
+     */
+    @RequestMapping(value = "/one", method = RequestMethod.GET)
+    public V_ProductPrivate getGoodsById(Long productId) {
+        logger.info("后台产品管理", "根据id: " + productId + "返回product和goods数据");
+        return productService.getProductAndGoodsById(productId);
+    }
+
+    /**
+     * 根据ID查询导出products和goods信息
+     *
+     * @param idStr 拼接的id
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/downloadByIds", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(HttpServletRequest request, String idStr, @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        List<Long> idList = JSON.parseArray(idStr, Long.class);
+        List<V_ProductPrivate> privates = productService.findProductAndGoodsByIds(idList);
+        if (CollectionUtils.isNotEmpty(privates)) {
+            logger.info("产品导出结果 products: " + privates.size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", privates);
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/product_background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
 }

+ 21 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/AbstractKeyEntity.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * 外键值
+ *
+ * @author hejq
+ * @date 2018-11-06 9:10
+ */
+public abstract class AbstractKeyEntity {
+
+
+    /**
+     * 主键值
+     *
+     * @return
+     */
+    @JsonIgnore
+    public abstract Object getKey();
+}

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

@@ -32,7 +32,9 @@ import java.util.Set;
 	@Index(name = "products_enuu_code_index", columnList = "pr_enuu,pr_code", unique = true),
 	@Index(name = "products_enuu_standard_index", columnList = "pr_enuu,pr_standard"),
 	@Index(name = "products_erpdown_index", columnList = "pr_erpdown"),
-	@Index(name = "pr_createtime_index", columnList = "pr_create_time")})
+	@Index(name = "pr_createtime_index", columnList = "pr_create_time"),
+		@Index(name = "products_kind_index", columnList ="pr_kind,pr_kindid" )
+})
 @Logger
 public class Product {
 

+ 13 - 10
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -628,7 +628,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setBreakUpByExcel(Object value) {
 		setBreakUpStr(StringUtilB2C.getStr(value));
-		if (!StringUtils.isEmpty(value) && ReleaseConstant.NO.equals(value.toString())) {
+		if (ReleaseConstant.NO.equals(value)) {
 			setBreakUp(Boolean.FALSE);
 		} else {
 			setBreakUp(Boolean.TRUE);
@@ -657,15 +657,17 @@ public class ReleaseProductByBatch implements Serializable {
 			int compareTo = reserve.compareTo(DoubleConstant.maxReserve);
 			if (compareTo > 0) {
 				reserve = DoubleConstant.maxReserve;
-			} else if (NumberUtil.compare(reserve, DoubleConstant.zero) < 1) {
-				reserve = DoubleConstant.minReserve;
+			} else if (reserve.compareTo(DoubleConstant.zero) == -1) {
+				reserve = DoubleConstant.zero;
 			}
 			setReserve(reserve);
 		}
 	}
 
 	public void setPackagingByExcel(Object value, boolean isAPerson) {
-		if (!StringUtils.isEmpty(value)) {
+		if (StringUtils.isEmpty(value)) {
+			setPackaging(PACKAGING_LIST.get(PACKAGING_LIST.size() - 1));
+		} else {
 			String packagingData = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(value));
 			if (!isAPerson) {
 				if (PACKAGING_LIST.contains(packagingData)) {
@@ -673,7 +675,8 @@ public class ReleaseProductByBatch implements Serializable {
 				}
 			} else {
 				try {
-					packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 150);
+					packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData,
+							ReleaseConstant.PACKAKING_MAX_LENGTH);
 				} catch (UnsupportedEncodingException e) {
 					throw new RuntimeException(e + "指定字符集不支持");
 				}
@@ -684,19 +687,19 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 规格信息
-	 * @param value
+	 * @param value 规格字段
 	 */
 	public void setSpecByExcel(Object value) {
 		if (!StringUtils.isEmpty(value)) {
-				String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(value.toString(), UploadConstant.SPEC_MAX_BYTE);
-				setSpec(str);
+			String str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutStringIgnoreEncode(value.toString(), UploadConstant.SPEC_MAX_BYTE);
+			setSpec(str);
 		}
 	}
 
 	/**
 	 * 交期赋值逻辑较为复杂,在调用类进行赋值
-	 * @param minValue
-	 * @param maxValue
+	 * @param minValue 最小交期
+	 * @param maxValue 最大交期
 	 */
 	public void setDeliveryByExcel(Object minValue, Object maxValue) {
 		setSelfMinDeliveryStr(StringUtilB2C.getStr(minValue));

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

@@ -15,6 +15,11 @@ import java.io.*;
 import java.util.Date;
 import java.util.Set;
 
+/**
+ * 商城物料私有字段
+ *
+ * @author US50
+ */
 @Entity
 @Table(name = "v$product$private")
 public class V_ProductPrivate implements Serializable {
@@ -309,6 +314,9 @@ public class V_ProductPrivate implements Serializable {
     @Transient
     private Goods goods;
 
+    @Transient
+    private String enterpriseName;
+
     public Long getId() {
         return id;
     }
@@ -672,4 +680,12 @@ public class V_ProductPrivate implements Serializable {
         this.goods = goods;
         return this;
     }
+
+    public String getEnterpriseName() {
+        return enterpriseName;
+    }
+
+    public void setEnterpriseName(String enterpriseName) {
+        this.enterpriseName = enterpriseName;
+    }
 }

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

@@ -843,4 +843,34 @@ public interface GoodsService {
      * @return List<Goods>
      */
     List<Goods> multiSearch(PageInfo info, GoodsFilter goodsFilter);
+
+    /**
+     * 通过batchCode查询冻结数量
+     *
+     * @param batchCode 批号
+     * @return 冻结数量
+     */
+    int getFrozenCount(String batchCode);
+
+    /**
+     * 给goods信息赋值
+     *
+     * @param goods Goods
+     */
+    void defineGoodsInfo(Goods goods);
+
+    /**
+     * 封装goods信息
+     *
+     * @param goods goods
+     * @return Goods
+     */
+    Goods covertGoodsInfo(Goods goods);
+
+    /**
+     * 通过goods id查询goods信息
+     * @param idList goods idList
+     * @return List<Goods>
+     */
+    List<Goods> findByIds(List<Long> idList);
 }

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

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.prod.commodity.service;
 
 import com.alibaba.fastjson.JSONObject;
 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.InOutboundDetail;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
@@ -403,4 +404,29 @@ public interface ProductService {
      * @return ResultMap
      */
     ResultMap checkCriterion(Product product);
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info 分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter);
+
+    /**
+     * 通过物料id查询 V_ProductPrivate
+     * @param id 物料id
+     *
+     * @return V_ProductPrivate
+     */
+    V_ProductPrivate getProductAndGoodsById(Long id);
+
+    /**
+     * 通过传入ID查询数据
+     *
+     * @param idList V_ProductPrivate的idList
+     * @return V_ProductPrivate
+     */
+    List<V_ProductPrivate> findProductAndGoodsByIds(List<Long> idList);
 }

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

@@ -3450,13 +3450,25 @@ public class GoodsServiceImpl implements GoodsService {
     public Goods getGoodsById(Long id) {
         Goods goods = goodsDao.findOne(id);
         if (goods != null) {
-            if (sysConf.getStoreid().equals(goods.getStoreid())) {
-                goods.setSelfSale("寄售");
-            } else {
-                goods.setSelfSale("自营");
-            }
-            goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+            goods = covertGoodsInfo(goods);
+        }
+        return goods;
+    }
+
+    /**
+     * 封装goods信息
+     *
+     * @param goods goods
+     * @return Goods
+     */
+    @Override
+    public Goods covertGoodsInfo(Goods goods) {
+        if (sysConf.getStoreid().equals(goods.getStoreid())) {
+            goods.setSelfSale("寄售");
+        } else {
+            goods.setSelfSale("自营");
         }
+        goods.setFrozen(getFrozenCount(goods.getBatchCode()));
         if (StringUtils.isEmpty(goods.getAttach()) && goods.getUuid() != null) {
             Component component = componentDao.findByUuid(goods.getUuid());
             if (component != null) {
@@ -3524,33 +3536,43 @@ public class GoodsServiceImpl implements GoodsService {
                 -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
         List<Goods> goodsList = page.getContent();
         for (Goods goods : goodsList) {
-            if (sysConf.getStoreid().equals(goods.getStoreid())) {
-                goods.setSelfSale(StringConstant.CONSIGNMENT);
-            } else {
-                goods.setSelfSale(StringConstant.SALE_SELF);
-            }
-            goods.setFrozen(getFrozenCount(goods.getBatchCode()));
-            List<GoodsQtyPrice> prices = goods.getPrices();
-            if (CollectionUtils.isNotEmpty(prices)) {
-                int size = prices.size();
-                StringBuffer gradeBuffer = new StringBuffer();
-                StringBuffer priceBuffer = new StringBuffer();
-                for (int i = 0; i < size; i++) {
-                    if (gradeBuffer.length() > 0) {
-                        gradeBuffer.append("\n");
-                        priceBuffer.append("\n");
-                    }
-                    String priceEnd = i + 1 == size ? "以上" : prices.get(i).getEnd().toString();
-                    gradeBuffer.append(prices.get(i).getStart()).append("-").append(priceEnd);
-                    String currencyName = StringConstant.RMB.equals(goods.getCurrencyName()) ? "¥" : "$";
-                    Double price = StringConstant.RMB.equals(goods.getCurrencyName()) ? prices.get(i).getRMBPrice() : prices.get(i).getUSDPrice();
-                    priceBuffer.append(currencyName).append(price);
+           defineGoodsInfo(goods);
+        }
+        return page;
+    }
+
+    /**
+     * 给goods赋值
+     *
+     * @param goods goods
+     */
+    @Override
+    public void defineGoodsInfo(Goods goods) {
+        if (sysConf.getStoreid().equals(goods.getStoreid())) {
+            goods.setSelfSale(StringConstant.CONSIGNMENT);
+        } else {
+            goods.setSelfSale(StringConstant.SALE_SELF);
+        }
+        goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+        List<GoodsQtyPrice> prices = goods.getPrices();
+        if (CollectionUtils.isNotEmpty(prices)) {
+            int size = prices.size();
+            StringBuffer gradeBuffer = new StringBuffer();
+            StringBuffer priceBuffer = new StringBuffer();
+            for (int i = 0; i < size; i++) {
+                if (gradeBuffer.length() > 0) {
+                    gradeBuffer.append("\n");
+                    priceBuffer.append("\n");
                 }
-                goods.setPriceGradeStr(gradeBuffer.toString());
-                goods.setPriceStr(priceBuffer.toString());
+                String priceEnd = i + 1 == size ? "以上" : prices.get(i).getEnd().toString();
+                gradeBuffer.append(prices.get(i).getStart()).append("-").append(priceEnd);
+                String currencyName = StringConstant.RMB.equals(goods.getCurrencyName()) ? "¥" : "$";
+                Double price = StringConstant.RMB.equals(goods.getCurrencyName()) ? prices.get(i).getRMBPrice() : prices.get(i).getUSDPrice();
+                priceBuffer.append(currencyName).append(price);
             }
+            goods.setPriceGradeStr(gradeBuffer.toString());
+            goods.setPriceStr(priceBuffer.toString());
         }
-        return page;
     }
 
     /**
@@ -3632,7 +3654,9 @@ public class GoodsServiceImpl implements GoodsService {
 
         return goodsPage;
     }
-    private int getFrozenCount(String batchCode) {
+
+    @Override
+    public int getFrozenCount(String batchCode) {
         String statusStr = OrderStatus.TOBEPAID.getCodes() + SplitChar.HYPHEN + OrderStatus.TOBEDELIVER.getCodes();
         List<Integer> statusList = new ArrayList<>();
         for (String str : statusStr.split(SplitChar.HYPHEN)) {
@@ -4114,7 +4138,10 @@ public class GoodsServiceImpl implements GoodsService {
      */
     @Override
     public com.uas.sso.support.Page<KindHierarchicalCount> getKindProductsCount(Pageable pageable, Date startTime, Date endTime) {
+        // 查询一段时间内类目数量,按类目分组查询统计数量
         StringBuffer sql = new StringBuffer("select pr_kind as thirdKind, pr_kindid as kindId, count(1) as count from products where pr_kind is not null ");
+
+        // 根据物料创建时间筛选
         if (null != startTime) {
             sql.append(" and pr_create_time >= '").append(new java.sql.Date(startTime.getTime())).append("' ");
         }
@@ -4122,30 +4149,34 @@ public class GoodsServiceImpl implements GoodsService {
             sql.append(" and pr_create_time < '").append(new java.sql.Date(endTime.getTime() + IntegerConstant.ONE_DAY_MILLISECONDS)).append("' ");
         }
         sql.append("group by pr_kind, pr_kindid");
+
+        // 统计数量
         StringBuffer countSql = new StringBuffer("select count(1) from (").append(sql).append(") as a");
         Integer count = commonDao.queryForObject(countSql.toString(), Integer.class);
+
         // 分页参数
         Integer offset = (pageable.getPageNumber() - 1) * pageable.getPageSize();
         sql.append(" limit ? offset ?");
         List<KindHierarchicalCount> kindList = commonDao.query(sql.toString(), KindHierarchicalCount.class, pageable.getPageSize(), offset);
+
+        // 根据父级类目id一层层判断是否存在
         if (CollectionUtils.isNotEmpty(kindList)) {
-            kindList.forEach(kind -> {
-                if (null != kind.getKindId()) {
-                    KindInfo kindInfo = kindInfoDao.findOne(kind.getKindId());
-                    if (null != kindInfo && null != kindInfo.getParentid() && kindInfo.getParentid() != 0) {
-                        KindInfo parentKind = kindInfoDao.findOne(kindInfo.getParentid());
-                        if (null != parentKind) {
-                            kind.setSecondKind(parentKind.getNameCn());
-                            if (null != parentKind.getParentid() && parentKind.getParentid() != 0) {
-                                KindInfo firstKind = kindInfoDao.findOne(parentKind.getParentid());
-                                if (null != firstKind) {
-                                    kind.setFirstKind(firstKind.getNameCn());
+            kindList.stream().filter(kind -> null != kind.getKindId())
+                    .forEach(kind -> {
+                        KindInfo kindInfo = kindInfoDao.findOne(kind.getKindId());
+                        if (null != kindInfo && null != kindInfo.getParentid() && 0 != kindInfo.getParentid()) {
+                            KindInfo parentKind = kindInfoDao.findOne(kindInfo.getParentid());
+                            if (null != parentKind) {
+                                kind.setSecondKind(parentKind.getNameCn());
+                                if (null != parentKind.getParentid() && 0 != parentKind.getParentid()) {
+                                    KindInfo firstKind = kindInfoDao.findOne(parentKind.getParentid());
+                                    if (null != firstKind) {
+                                        kind.setFirstKind(firstKind.getNameCn());
+                                    }
                                 }
                             }
                         }
-                    }
-                }
-            });
+                    });
         }
         return new com.uas.sso.support.Page<>(pageable.getPageNumber(), pageable.getPageSize(), kindList, count);
     }
@@ -4194,10 +4225,12 @@ public class GoodsServiceImpl implements GoodsService {
          * 线程序号
          */
         Integer i;
+
         /**
          * 过滤条件
          */
         GoodsFilter goodsFilter;
+
         /**
          * 分页大小
          */
@@ -4226,4 +4259,16 @@ public class GoodsServiceImpl implements GoodsService {
         }
     }
 
+    /**
+     * 通过goods id查询goods信息
+     *
+     * @param idList goods idList
+     * @return List<Goods>
+     */
+    @Override
+    public List<Goods> findByIds(List<Long> idList) {
+        List<Goods> goodsList = goodsDao.findAll(idList);
+        goodsList.forEach(goods ->  defineGoodsInfo(goods));
+        return goodsList;
+    }
 }

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

@@ -43,6 +43,7 @@ import com.uas.platform.b2c.prod.commodity.dao.V_ProductPersonDao;
 import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
 import com.uas.platform.b2c.prod.commodity.model.CommodityInOutbound;
 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.GoodsQtyPrice;
 import com.uas.platform.b2c.prod.commodity.model.InOutboundDetail;
@@ -59,7 +60,13 @@ import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.service.*;
+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.ProductAttachService;
+import com.uas.platform.b2c.prod.commodity.service.ProductPersonService;
+import com.uas.platform.b2c.prod.commodity.service.ProductPrivateService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
 import com.uas.platform.b2c.prod.commodity.type.InOutBoundType;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
@@ -93,6 +100,7 @@ import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
@@ -2482,14 +2490,7 @@ public class ProductServiceImpl implements ProductService {
         }
         Long enUU = SystemSession.getUser().getEnterprise().getUu();
         Long userUU = SystemSession.getUser().getUserUU();
-        product.setPbrand(product.getBrand());
-        product.setPbranden(product.getBrand());
-        product.setPcmpcode(product.getCmpCode());
-        product.setKind(product.getProdName());
-        product.setSourceApp("B2C");
-        product.setEnUU(enUU);
-        product.setUserUU(userUU);
-        product.setCreateTime(new Date(System.currentTimeMillis()));
+        setDefaultInfo(enUU, userUU, product);
         // PCB产品做标准判断处理
         if (null != isPcb && Objects.equals(IntegerConstant.YES_SHORT, isPcb)) {
             // 判断传入的数据是否是标准的
@@ -2558,6 +2559,33 @@ public class ProductServiceImpl implements ProductService {
         return ResultMap.success();
     }
 
+    /**
+     * 物料信息赋值
+     *
+     * @param enUU 企业UU
+     * @param userUU 用户UU
+     * @param product 物料信息
+     */
+    private void setDefaultInfo(Long enUU, Long userUU, Product product) {
+        product.setPbrand(product.getBrand());
+        product.setPbranden(product.getBrand());
+        product.setPcmpcode(product.getCmpCode());
+        product.setKind(product.getProdName());
+        product.setSourceApp("B2C");
+        product.setEnUU(enUU);
+        product.setUserUU(userUU);
+        product.setCreateTime(new Date(System.currentTimeMillis()));
+        if (null == product.getPackaging()) {
+            product.setPackaging("其他");
+        }
+        if (null == product.getErpReserve()) {
+            product.setErpReserve(DoubleConstant.zero);
+        }
+        if (null == product.getMinPackQty()) {
+            product.setMinPackQty(DoubleConstant.minReserve);
+        }
+    }
+
     /**
      * 判断是否是标准物料
      *
@@ -2876,4 +2904,123 @@ public class ProductServiceImpl implements ProductService {
         goods = goodsDao.save(goods);
         LOGGER.log("上架商品", "新增上架商品", "通过卖家中心单个物料上传新增上架商品", goods.getCode(), goods.getId());
     }
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info        分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    @Override
+    public Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter) {
+        if (info == null) {
+            throw new IllegalOperatorException("分页参数丢失");
+        }
+        if (goodsFilter != null) {
+            convertPageInfo(info, goodsFilter);
+        }
+        Page<V_ProductPrivate> page = v_productPrivateDao.findAll((Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder builder)
+                -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
+        page.getContent().forEach(product -> {
+            List<Goods> goodsList = goodsDao.findByProductId(product.getId());
+            Enterprise enterprise = enterpriseService.getEnterpriseInfo(product.getEnUU());
+            product.setEnterpriseName(enterprise.getEnName());
+            if (CollectionUtils.isNotEmpty(goodsList)) {
+                Goods goods = goodsList.get(0);
+                goodsService.defineGoodsInfo(goods);
+                product.setGoods(goods);
+            }
+        });
+        return page;
+    }
+
+    /**
+     * 封装分页条件
+     *
+     * @param info 分页信息
+     * @param goodsFilter 过滤条件
+     */
+    private void convertPageInfo(PageInfo info, GoodsFilter goodsFilter) {
+        info.filter("b2cEnabled", Constant.YES);
+        if (!StringUtils.isEmpty(goodsFilter.getStartTime())) {
+            java.sql.Date startDate = new java.sql.Date(goodsFilter.getStartTime());
+            info.expression(PredicateUtils.gte("createTime", startDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getEndTime())) {
+            // 截止日期是到当天23:59:59,java.sql.Date精确到天,这里采用加一天小于的方法设置截止日期判断
+            java.sql.Date endDate = new java.sql.Date(goodsFilter.getEndTime() + com.uas.platform.b2c.prod.commodity.constant.IntegerConstant.ONE_DAY_MILLISECONDS);
+            info.expression(PredicateUtils.lt("createTime", endDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getCode())) {
+            info.filter("cmpCode", goodsFilter.getCode());
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getBrand())) {
+            SimpleExpression[] brandExpression = new SimpleExpression[2];
+            brandExpression[0] = PredicateUtils.like("pbrand", goodsFilter.getBrand(), false, true);
+            brandExpression[1] = PredicateUtils.like("pbranden", goodsFilter.getBrand(), false, true);
+            info.expression(PredicateUtils.or((CriterionExpression[]) brandExpression));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getKindUuid())) {
+            // 如果包含多个叶子类目ID,则获取所有的叶子类目对应的商品信息
+            if (goodsFilter.getKindUuid().contains(SplitChar.COMMA)) {
+                String[] kindIds = goodsFilter.getKindUuid().split(SplitChar.COMMA);
+                info.expression(PredicateUtils.in("kindid", kindIds, false));
+            } else {
+                info.expression(PredicateUtils.eq("kindid", goodsFilter.getKindUuid(), false));
+            }
+        }
+        if (goodsFilter.getHaveImg() != null) {
+            if (goodsFilter.getHaveImg()) {
+                info.expression(PredicateUtils.isNotNull("cmpImg"));
+            } else {
+                info.expression(PredicateUtils.isNull("cmpImg"));
+            }
+        }
+        if (goodsFilter.getStandard() != null) {
+            info.filter("standard", goodsFilter.getStandard() ? Constant.YES : Constant.NO);
+        }
+    }
+
+    /**
+     * 通过物料id查询 V_ProductPrivate
+     *
+     * @param id 物料id
+     * @return V_ProductPrivate
+     */
+    @Override
+    public V_ProductPrivate getProductAndGoodsById(Long id) {
+        V_ProductPrivate productPrivate = v_productPrivateDao.findOne(id);
+        List<Goods> goodsList = goodsDao.findByProductId(productPrivate.getId());
+        if (CollectionUtils.isNotEmpty(goodsList)) {
+            Goods goods = goodsList.get(0);
+            if (goods != null) {
+                goods = goodsService.covertGoodsInfo(goods);
+                productPrivate.setGoods(goods);
+            }
+        }
+        return productPrivate;
+    }
+
+    /**
+     * 通过传入ID查询数据
+     *
+     * @param idList V_ProductPrivate的idList
+     * @return V_ProductPrivate
+     */
+    @Override
+    public List<V_ProductPrivate> findProductAndGoodsByIds(List<Long> idList) {
+        List<V_ProductPrivate> privates = v_productPrivateDao.findProductInId(idList);
+        privates.forEach(product -> {
+            List<Goods> goodsList = getGoodsByProductId(product.getId());
+            Enterprise enterprise = enterpriseService.getEnterpriseInfo(product.getEnUU());
+            product.setEnterpriseName(enterprise.getEnName());
+            if (CollectionUtils.isNotEmpty(goodsList)) {
+                Goods goods = goodsList.get(0);
+                goodsService.defineGoodsInfo(goods);
+                product.setGoods(goods);
+            }
+        });
+        return privates;
+    }
 }

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

@@ -41,6 +41,7 @@ import com.uas.platform.b2c.prod.commodity.service.InOutboundDetailService;
 import com.uas.platform.b2c.prod.commodity.service.ProductPrivateService;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.commodity.type.ReleaseConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
 import com.uas.platform.b2c.prod.commodity.util.SheetUtil;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
@@ -241,7 +242,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		} else if ((isPcb && colNum != UploadConstant.TOTAL_COLUMN_PCB && colNum != UploadConstant.MAX_TOTAL_COLUMN_PCB) ||
 				(!isPcb && colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN)) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
-			}
+		}
 		int rowNum = SheetUtil.getSheetLastNum(sheet, isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN);
 		if (rowNum > 2002) {
 			throw new IllegalOperatorException("您上传的信息超过2000条,请拆分成2000以下再上传");
@@ -872,21 +873,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 		Object breakValue = readWorkBookCell(row.getCell(ModifyConstant.BREAK_UP), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.BREAK_UP);
-		if (!StringUtils.isEmpty(breakValue)) {
-            aProduct.setBreakUpByExcel(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);
-        }
+		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);
-        }
+		aProduct.setMinBuyQtyByExcel(buyQtyValue);
 
 		Object reserveValue = readWorkBookCell(row.getCell(ModifyConstant.RESERVE_NUMBER), Cell.CELL_TYPE_STRING,
 				rowNum, ModifyConstant.RESERVE_NUMBER);
@@ -1194,10 +1189,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 	/**
 	 * 设置交期的信息
+	 * @param releaseProductByBatch 批量导入临时表对象
+	 * @param minDelivery 最短交期
+	 * @param maxDelivery 最长交期
 	 */
 	private void setDeliveryTime(ReleaseProductByBatch releaseProductByBatch, Object minDelivery, Object maxDelivery) {
-		minDelivery = minDelivery == null ? maxDelivery : minDelivery;
-		maxDelivery = maxDelivery == null ? minDelivery : maxDelivery;
 		Short min = getDeliveryTime(minDelivery);
 		Short max = getDeliveryTime(maxDelivery);
 		if ((min != null) || (max != null)) {
@@ -1222,6 +1218,10 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			}
 			releaseProductByBatch.setSelfMinDelivery(min);
 			releaseProductByBatch.setSelfMaxDelivery(max);
+		} else {
+			// 设置默认值
+			releaseProductByBatch.setSelfMinDelivery(ReleaseConstant.DEFAULT_MIN_DELIVERY);
+			releaseProductByBatch.setSelfMaxDelivery(ReleaseConstant.DEFAULT_MAX_DELIVERY);
 		}
 	}
 
@@ -1319,16 +1319,14 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.PACKAGE_METHOD), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PACKAGE_METHOD);
-			aProduct.setPackagingByExcel(packageMethodValue , isAPerson);
+			aProduct.setPackagingByExcel(packageMethodValue, isAPerson);
 
 			Object minValue = readWorkBookCell(row.getCell(UploadConstant.MIN_DELIVERY), Cell.CELL_TYPE_STRING,
-					rowNum, UploadConstant.MIN_DELIVERY);
+					 rowNum, UploadConstant.MIN_DELIVERY);
 			Object maxValue = readWorkBookCell(row.getCell(UploadConstant.MAX_DELIVERY), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.MAX_DELIVERY);
 			aProduct.setDeliveryByExcel(minValue, maxValue);
-			if (!StringUtils.isEmpty(minValue) || !StringUtils.isEmpty(maxValue)) {
-				setDeliveryTime(aProduct, minValue, maxValue);
-			}
+			setDeliveryTime(aProduct, minValue, maxValue);
 
 			Object packageNumValue = readWorkBookCell(row.getCell(UploadConstant.PACKAGE_NUMBER), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PACKAGE_NUMBER);
@@ -1362,7 +1360,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		} else {
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.SPECIFICATION), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.SPECIFICATION);
-			aProduct.setPackagingByExcel(packageMethodValue , isAPerson);
+			aProduct.setPackagingByExcel(packageMethodValue, isAPerson);
 		}
 		return result;
 	}

+ 22 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/type/ReleaseConstant.java

@@ -7,7 +7,28 @@ package com.uas.platform.b2c.prod.commodity.type;
  */
 public class ReleaseConstant {
 
-    public static final String YES= "是";
+    /**
+     * 是
+     */
+    public static final String YES = "是";
 
+    /**
+     * 否
+     */
     public static final String NO = "否";
+
+    /**
+     * 默认最长交期
+     */
+    public static final Short DEFAULT_MAX_DELIVERY = 10;
+
+    /**
+     * 默认最短交期
+     */
+    public static final Short DEFAULT_MIN_DELIVERY = 1;
+
+    /**
+     * 包装方式最长长度
+     */
+    public static final Integer PACKAKING_MAX_LENGTH = 150;
 }

+ 7 - 0
src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseProductServiceImpl.java

@@ -4,6 +4,7 @@ import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.constant.ReleaseStatus;
 import com.uas.platform.b2c.core.support.SystemSession;
 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.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
@@ -197,6 +198,12 @@ public class PurchaseProductServiceImpl implements PurchaseProductService {
         aProduct.setPublisherName(SystemSession.getUser().getUserName());
         aProduct.setPublisherTel(SystemSession.getUser().getUserTel());
         aProduct.setPublisherUu(SystemSession.getUser().getUserUU());
+        if (null == aProduct.getReserve()) {
+            aProduct.setReserve(DoubleConstant.zero);
+        }
+        if (null == aProduct.getPackaging()) {
+            aProduct.setPackaging("其他");
+        }
     }
 
     /**

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


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


BIN
src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls


+ 3 - 3
src/main/resources/pre/sys.properties

@@ -37,19 +37,19 @@ recommendPort=20100
 # upload file
 uploadFileUrl=http://dfs-api.ubtob.com
 # search file
-searchUrl=http://172.21.0.49:8081
+searchUrl=http://192.168.78.12:8081
 
 # message ip
 messageServiceIp=http://message.ubtob.com/
 # product public ip
-productServiceIp=http://172.21.0.47:8080
+productServiceIp=http://192.168.78.11:8080
 
 # 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
 
 #inquiry service url
 inquiryServiceUrl=https://api-inquiry.usoftchina.com
-inquiryServiceInnerUrl=http://172.21.0.48:8080
+inquiryServiceInnerUrl=http://192.168.78.9:8080
 
 #public message  service url
 messageServiceUrl=http://api-message.ubtob.com/

+ 3 - 1
src/main/webapp/WEB-INF/views/normal/adminWithNav.html

@@ -100,8 +100,10 @@
 					<!--class="fa fa-home"></i><span> 平台换货出货单管理</span></a></li>-->
 
 			<li class="nav-header">产品管理</li>
-			<li class="nav-node"><a href="#/manage"><i
+			<li class="nav-node"><a href="#/saleManage"><i
 					class="fa fa-flag"></i><span> 产品管理</span></a></li>
+			<li class="nav-node"><a href="#/manage"><i
+					class="fa fa-flag"></i><span> 在售产品管理</span></a></li>
 			<li class="nav-node"><a href="#trade/goodsStatistics"><i
 					class="fa fa-filter"></i><span> 在售产品信息统计</span></a></li>
 			<li class="nav-node"><a href="#product/overtimeBatch"><i

+ 6 - 0
src/main/webapp/resources/js/admin/app.js

@@ -274,6 +274,12 @@
 			templateUrl : 'static/view/admin/product/productManage.html',
 			controller : 'productManageCtrl',
 			controllerUrl : 'app/controllers/product/productManageCtrl'
+        })).state('saleManage', angularAMD.route({
+            // 在售产品管理
+            url: '/saleManage',
+            templateUrl : 'static/view/admin/product/saleProductManage.html',
+            controller : 'saleProductManageCtrl',
+            controllerUrl : 'app/controllers/product/saleProductManageCtrl'
 		})).state('manage_detail', angularAMD.route({
             // 产品详情列表
             url: '/manage/:id',

+ 54 - 43
src/main/webapp/resources/js/admin/controllers/product/productManageCtrl.js

@@ -197,9 +197,11 @@ define(['app/app'], function(app) {
         //获取选中之后的信息
         var getChooseBatch = function () {
             $scope.choosedBatch = [];
+            $scope.ids = [];
             angular.forEach($scope.goodsList, function (goods) {
                 if (goods.isChoosed) {
                     $scope.choosedBatch.push(goods.batchCode);
+                    $scope.ids.push(goods);
                 }
             });
         };
@@ -317,49 +319,58 @@ define(['app/app'], function(app) {
 
         // 产品导出事件
         $scope.exportClick = function () {
-            // 拼装链接
-            var url = "/trade/goods/background/download?page=" + $scope.pageParams.page + "&count=" + $scope.pageParams.count + "&sorting=" + encodeURIComponent(angular.toJson($scope.pageParams.sorting));
-            if (angular.isDefined($scope.startDate) && null != $scope.startDate) {
-                url = url + "&startTime=" + $scope.startDate.getTime();
-            }
-            if (angular.isDefined($scope.endDate) && null != $scope.endDate) {
-                url = url + "&endTime=" + $scope.endDate.getTime();
-            }
-            if (angular.isDefined($scope.goodsFilter.kindUuid)) {
-                url = url + "&kindUuid=" + $scope.goodsFilter.kindUuid;
-            }
-            if (angular.isDefined($scope.goodsFilter.code)) {
-                url = url + "&code=" + $scope.goodsFilter.code
-            }
-            if (angular.isDefined($scope.goodsFilter.brand)) {
-                url = url + "&brand=" + $scope.goodsFilter.brand
-            }
-            if (angular.isDefined($scope.goodsFilter.store)) {
-                url = url + "&store=" + $scope.goodsFilter.store
-            }
-            if (angular.isDefined($scope.goodsFilter.saleStatus)) {
-                url = url + "&saleStatus=" + $scope.goodsFilter.saleStatus
-            }
-            if (angular.isDefined($scope.goodsFilter.saleNum)) {
-                url = url + "&saleNum=" + $scope.goodsFilter.saleNum
-            }
-            if (angular.isDefined($scope.goodsFilter.currency)) {
-                url = url + "&currency=" + $scope.goodsFilter.currency
-            }
-            if (angular.isDefined($scope.goodsFilter.saleSelf)) {
-                url = url + "&saleSelf=" + $scope.goodsFilter.saleSelf
-            }
-            if (angular.isDefined($scope.goodsFilter.bredakUp)) {
-                url = url + "&breakUp=" + $scope.goodsFilter.bredakUp
-            }
-            if (angular.isDefined($scope.goodsFilter.standard)) {
-                url = url + "&standard=" + $scope.goodsFilter.standard
-            }
-            if (angular.isDefined($scope.goodsFilter.audited)) {
-                url = url + "&audited=" + $scope.goodsFilter.audited
-            }
-            if (angular.isDefined($scope.goodsFilter.haveImg)) {
-                url = url + "&haveImg=" + $scope.goodsFilter.haveImg;
+            var url = '';
+            if($scope.choosedBatch.length > 0) {
+                var idList = [];
+                angular.forEach($scope.ids, function(val) {
+                    idList.push(val.id)
+                })
+                url = '/trade/goods/background/downloadByIds?idStr=' + angular.toJson(idList)
+            } else {
+                // 拼装链接
+                url = "/trade/goods/background/download?page=" + $scope.pageParams.page + "&count=" + $scope.pageParams.count + "&sorting=" + encodeURIComponent(angular.toJson($scope.pageParams.sorting));
+                if (angular.isDefined($scope.startDate) && null != $scope.startDate) {
+                    url = url + "&startTime=" + $scope.startDate.getTime();
+                }
+                if (angular.isDefined($scope.endDate) && null != $scope.endDate) {
+                    url = url + "&endTime=" + $scope.endDate.getTime();
+                }
+                if (angular.isDefined($scope.goodsFilter.kindUuid)) {
+                    url = url + "&kindUuid=" + $scope.goodsFilter.kindUuid;
+                }
+                if (angular.isDefined($scope.goodsFilter.code)) {
+                    url = url + "&code=" + $scope.goodsFilter.code
+                }
+                if (angular.isDefined($scope.goodsFilter.brand)) {
+                    url = url + "&brand=" + $scope.goodsFilter.brand
+                }
+                if (angular.isDefined($scope.goodsFilter.store)) {
+                    url = url + "&store=" + $scope.goodsFilter.store
+                }
+                if (angular.isDefined($scope.goodsFilter.saleStatus)) {
+                    url = url + "&saleStatus=" + $scope.goodsFilter.saleStatus
+                }
+                if (angular.isDefined($scope.goodsFilter.saleNum)) {
+                    url = url + "&saleNum=" + $scope.goodsFilter.saleNum
+                }
+                if (angular.isDefined($scope.goodsFilter.currency)) {
+                    url = url + "&currency=" + $scope.goodsFilter.currency
+                }
+                if (angular.isDefined($scope.goodsFilter.saleSelf)) {
+                    url = url + "&saleSelf=" + $scope.goodsFilter.saleSelf
+                }
+                if (angular.isDefined($scope.goodsFilter.bredakUp)) {
+                    url = url + "&breakUp=" + $scope.goodsFilter.bredakUp
+                }
+                if (angular.isDefined($scope.goodsFilter.standard)) {
+                    url = url + "&standard=" + $scope.goodsFilter.standard
+                }
+                if (angular.isDefined($scope.goodsFilter.audited)) {
+                    url = url + "&audited=" + $scope.goodsFilter.audited
+                }
+                if (angular.isDefined($scope.goodsFilter.haveImg)) {
+                    url = url + "&haveImg=" + $scope.goodsFilter.haveImg;
+                }
             }
             window.open(url);
             /*var modalInstance = $modal.open({

+ 6 - 3
src/main/webapp/resources/js/admin/controllers/product/productManageDetailCtrl.js

@@ -1,9 +1,12 @@
 define(['app/app'], function(app) {
     'use strict';
-    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', '$modal', function ($scope, $stateParams, Goods, $modal) {
-        $scope.goodId = $stateParams.id;
+    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', '$modal', '$location', function ($scope, $stateParams, Goods, $modal, $location) {
+        $scope.id = $stateParams.id;
         var initGoods = function () {
-            Goods.findOneById({goodsId:$scope.goodId}, function (data) {
+            var url = $location.$$search.type
+            var urlData = (url=== 'goods'? 'findOneById' : 'findProductsOneById')
+            var params = (url=== 'goods'? {goodsId:$scope.id} : {productId:$scope.id})
+            Goods[urlData](params , function (data) {
                 $scope.goods = data;
             })
         };

+ 877 - 0
src/main/webapp/resources/js/admin/controllers/product/saleProductManageCtrl.js

@@ -0,0 +1,877 @@
+define(['app/app'], function(app) {
+    'use strict';
+    app.register.controller('saleProductManageCtrl', ['$scope', '$modal', 'toaster', 'ngTableParams', 'BaseService', '$http', 'Goods', 'BackgroundRecord', 'Commodity', 'GoodsModifyInfo', function($scope, $modal, toaster, ngTableParams, BaseService, $http, Goods, BackgroundRecord, Commodity, GoodsModifyInfo) {
+        $scope.dateArea = 'oneMonth';
+        var _formatDate = function (date, fmt) {
+            if (!date) {
+                return null;
+            }
+            if (typeof date === 'string') {
+                date = new Date(Date.parse(date.replace(/-/g, '/')));
+            }
+            var o = {
+                'M+': date.getMonth() + 1, // 月份
+                'd+': date.getDate(), // 日
+                'h+': date.getHours(), // 小时
+                'm+': date.getMinutes(), // 分
+                's+': date.getSeconds(), // 秒
+                'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
+                'S': date.getMilliseconds() // 毫秒
+            }
+            if (/(y+)/.test(fmt)) {
+                fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
+            }
+            for (var k in o) {
+                if (new RegExp('(' + k + ')').test(fmt)) {
+                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
+                }
+            }
+            return fmt;
+        };
+        var _getClearDay = function (date) {
+            return new Date(_formatDate(date, 'yyyy-MM-dd')).getTime() - 8 * 60 * 60 * 1000
+        };
+
+        var currentTime = _getClearDay(new Date());
+        $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000);
+        $scope.endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+        $scope.startFormatDate = _formatDate($scope.startDate, 'yyyy-MM-dd');
+        $scope.endFormatDate = _formatDate($scope.endDate, 'yyyy-MM-dd');
+        var addStartDate = new Date($scope.startDate.getTime() + 24 * 60 * 60 * 1000)
+        var addEndDate = new Date($scope.endDate.getTime() + 24 * 60 * 60 * 1000)
+        $scope.addStartFormatDate = _formatDate(addStartDate, 'yyyy-MM-dd');
+        $scope.addEndFormatDate = _formatDate(addEndDate, 'yyyy-MM-dd');
+
+        $scope.setFilters = function (type, val) {
+            $scope[type] = val;
+            if (type == 'dateArea') {
+                // 时间筛选
+                var currentTime = _getClearDay(new Date());
+                var endDate = new Date(currentTime + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+                if (val == 'oneMonth') {
+                    $scope.startDate = new Date(currentTime - 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'threeMonth') {
+                    $scope.startDate = new Date(currentTime - 3 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'sixMonth') {
+                    $scope.startDate = new Date(currentTime - 6 * 30 * 24 * 60 * 60 * 1000 - 24 * 60 * 60 * 1000);
+                    $scope.endDate = endDate;
+                } else if (val == 'allMonth') {
+                    $scope.startDate = null;
+                    $scope.endDate = null;
+                }
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            if (val != 'autoMonth') {
+                $scope.manageTableParams.page(1);
+                $scope.manageTableParams.reload();
+            }
+        };
+
+        $scope.condition = [];
+        var start = {
+            open : false
+        };
+        var end = {
+            open : false
+        };
+        $scope.condition.push(start);
+        $scope.condition.push(end);
+        // 打开日期选择框
+        $scope.openDatePicker = function($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            openParam == 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+            item[openParam].open = !item[openParam].open;
+        };
+
+        $scope.onDateCondition = function (bool, date) {
+            if (bool == 1) {
+                $scope.startDate = date;
+            } else {
+                $scope.endDate = date;
+            }
+            var startTime = $scope.startDate ? $scope.startDate.getTime() : null;
+            var endTime = $scope.endDate ? $scope.endDate.getTime() : null;
+            if (startTime && endTime && startTime > endTime) {
+                if (bool == 1) {
+                    toaster.pop('info', '起始时间不能大于结束时间');
+                    $scope.startDate = null;
+                } else {
+                    toaster.pop('info', '结束时间不能小于起始时间');
+                    $scope.endDate = null;
+                }
+            }
+            if ($scope.endDate && bool == 2) {
+                $scope.endDate = new Date($scope.endDate.getFullYear(), $scope.endDate.getMonth(), $scope.endDate.getDate())
+                $scope.endDate = new Date($scope.endDate.getTime() + 23 * 60 * 60 * 1000 + 59 * 60 * 1000 + 59 * 1000);
+            }
+            $scope.startFormatDate = $scope.startDate ? _formatDate($scope.startDate, 'yyyy-MM-dd') : '';
+            $scope.endFormatDate = $scope.endDate ? _formatDate($scope.endDate, 'yyyy-MM-dd') : '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+        $scope.goodsFilter = {};
+        $scope.kindPojo = {};
+        var initTitleInfo = function () {
+            BackgroundRecord.getUserTitle({}, function (data) {
+                $scope.tableTabs = data;
+                $scope.titleInShow = {};
+                angular.forEach($scope.tableTabs, function (item) {
+                    $scope.titleInShow[item.titleName] = true;
+                });
+            });
+        };
+        initTitleInfo();
+
+        $scope.saleStatus = {
+            601 : '已上架',
+            602 : '已上架',
+            612 : '已下架',
+            613 : '新品未上架'
+        };
+
+        // 获取分页Goods数据
+        $scope.manageTableParams = new ngTableParams({
+            page: 1,
+            count: 10,
+            sorting: {
+                createTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            counts: [],
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                if($scope.startFormatDate) {
+                    $scope.goodsFilter.startTime = $scope.startFormatDate
+                } else {
+                    delete $scope.goodsFilter.startTime
+                }
+                if($scope.endFormatDate) {
+                    $scope.goodsFilter.endTime = $scope.endFormatDate
+                } else {
+                    delete $scope.goodsFilter.endTime
+                }
+                $scope.pageParams = param;
+                Goods.loadBrandProductsList(param, $scope.goodsFilter, function (data) {
+                    $scope.totalCount = data.totalElements;
+                    $scope.goodsList = data.content;
+                    angular.forEach($scope.goodsList, function (list) {
+                        list.isChoosed = false
+                    });
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        // 全选
+        $scope.chooseAll = function () {
+            $scope.isChooseAll = !$scope.isChooseAll;
+            angular.forEach($scope.goodsList, function (list) {
+                list.isChoosed = $scope.isChooseAll;
+            })
+        };
+
+        // 检查是否全选
+        var checkChoosedAll = function () {
+            $scope.isChooseAll = true;
+            angular.forEach($scope.goodsList, function (list) {
+                if(!list.isChoosed) {
+                    $scope.isChooseAll = false;
+                }
+            })
+        };
+
+        // 单选
+        $scope.chooseOne = function (list) {
+            (typeof list.isChoosed === 'undefined' || !list.isChoosed) ? list.isChoosed = true : list.isChoosed = false;
+            checkChoosedAll();
+        };
+
+        //获取选中之后的信息
+        var getChooseBatch = function () {
+            $scope.choosedBatch = [];
+            $scope.ids = [];
+            angular.forEach($scope.goodsList, function (goods) {
+                if (goods.isChoosed) {
+                    $scope.choosedBatch.push(goods.batchCode);
+                    $scope.ids.push(goods);
+                }
+            });
+        };
+
+        $scope.batchDown = function () {
+            getChooseBatch();
+            if (!$scope.choosedBatch || $scope.choosedBatch.length == 0) {
+                toaster.pop("info", "您尚未选中任何产品");
+                return ;
+            }
+            $scope.soldOutProduct($scope.choosedBatch);
+        };
+
+        var initKindDataInfo = function () {
+            Commodity.getAllKindInfo({}, function (data) {
+                $scope.kindInfo = data[0].children;
+            })
+        };
+        initKindDataInfo();
+
+        // 是否打开树型选择
+        $scope.showSecondList = function () {
+            $scope.selectDown = true;
+        };
+        $scope.selectDown = false;
+        $scope.treeOptions = {
+            nodeChildren: "children",
+            dirSelectable: false,
+            injectClasses: {
+                ul: "a1",
+                li: "a2",
+                liSelected: "a7",
+                iExpanded: "a3",
+                iCollapsed: "a4",
+                iLeaf: "a5",
+                label: "a6",
+                labelSelected: "a8"
+            }
+        };
+        $scope.showSelected = function(node) {
+            $scope.leaf = node.nameCn;
+            $scope.selectDown = false;
+        };
+
+        /**
+         * 获取根据当前类目的信息获取所有叶子节点的类目信息
+         *
+         * @param kind
+         */
+        function getAllLeafKindId(kind) {
+            if (!kind) {
+                return null;
+            }
+            if (kind.isLeaf == 1) {
+                return kind.id;
+            }
+            if (kind.isLeaf == 0) {
+                // 获取第一级类目的所有叶子类目ID
+                if (kind.level == 1) {
+                    var leafKindIds = [];
+                    angular.forEach(kind.children, function (kind) {
+                        // 获取第一级类目的直接子类目的所有叶子类目ID
+                        var childrenIds = getAllLeafKindId(kind);
+                        if (Array.isArray(childrenIds)) {
+                            angular.forEach(childrenIds, function (child) {
+                                leafKindIds.push(child);
+                            })
+                        } else {
+                            leafKindIds.push(childrenIds);
+                        }
+                    });
+                    return leafKindIds;
+                } else if (kind.level == 2) {
+                    // 获取第二级类目的所有叶子类目ID
+                    var kindIds = [];
+                    angular.forEach(kind.children, function (kind) {
+                        kindIds.push(kind.id);
+                    });
+                    return kindIds;
+                }
+            }
+        }
+
+        // 清空数据
+        $scope.clearClick = function () {
+            for( var tmp in $scope.goodsFilter) {
+                $scope.goodsFilter[tmp] = '';
+            }
+            for( var tmp in $scope.kindPojo) {
+                $scope.kindPojo[tmp] = '';
+            }
+            $scope.goodsFilter.kindUuid = '';
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+
+        // 搜索事件
+        $scope.searchClick = function () {
+            if ($scope.kindPojo && $scope.kindPojo.first) {
+                if (!$scope.kindPojo.second) {
+                    var kind = $scope.kindInfo[$scope.kindPojo.first];
+                    var kindUuid = getAllLeafKindId(kind);
+                    $scope.goodsFilter.kindUuid = kindUuid.join(',')
+                } else if ($scope.kindPojo.second && $scope.kindPojo.third) {
+                    $scope.goodsFilter.kindUuid = getAllLeafKindId($scope.kindPojo.third);
+                } else {
+                    var kind = $scope.kindInfo[$scope.kindPojo.first].children[$scope.kindPojo.second];
+                    var kindUuid = getAllLeafKindId(kind);
+                    $scope.goodsFilter.kindUuid = kindUuid.join(',')
+                }
+            }
+            $scope.manageTableParams.page(1);
+            $scope.manageTableParams.reload();
+        };
+
+        // 产品导出事件
+        $scope.exportClick = function () {
+            var url = '';
+            getChooseBatch();
+            if($scope.ids.length > 0) {
+                var idList = [];
+                angular.forEach($scope.ids, function(val) {
+                    idList.push(val.id)
+                })
+                url = '/trade/products/background/downloadByIds?idStr=' + angular.toJson(idList);
+            } else {
+                // 拼装链接
+                url = "/trade/products/background/download?page=" + $scope.pageParams.page + "&count=" + $scope.pageParams.count + "&sorting=" + encodeURIComponent(angular.toJson($scope.pageParams.sorting));
+                if (angular.isDefined($scope.startDate) && null != $scope.startDate) {
+                    url = url + "&startTime=" + $scope.startDate.getTime();
+                }
+                if (angular.isDefined($scope.endDate) && null != $scope.endDate) {
+                    url = url + "&endTime=" + $scope.endDate.getTime();
+                }
+                if (angular.isDefined($scope.goodsFilter.kindUuid)) {
+                    url = url + "&kindUuid=" + $scope.goodsFilter.kindUuid;
+                }
+                if (angular.isDefined($scope.goodsFilter.code)) {
+                    url = url + "&code=" + $scope.goodsFilter.code
+                }
+                if (angular.isDefined($scope.goodsFilter.brand)) {
+                    url = url + "&brand=" + $scope.goodsFilter.brand
+                }
+                if (angular.isDefined($scope.goodsFilter.store)) {
+                    url = url + "&store=" + $scope.goodsFilter.store
+                }
+                if (angular.isDefined($scope.goodsFilter.saleStatus)) {
+                    url = url + "&saleStatus=" + $scope.goodsFilter.saleStatus
+                }
+                if (angular.isDefined($scope.goodsFilter.saleNum)) {
+                    url = url + "&saleNum=" + $scope.goodsFilter.saleNum
+                }
+                if (angular.isDefined($scope.goodsFilter.currency)) {
+                    url = url + "&currency=" + $scope.goodsFilter.currency
+                }
+                if (angular.isDefined($scope.goodsFilter.saleSelf)) {
+                    url = url + "&saleSelf=" + $scope.goodsFilter.saleSelf
+                }
+                if (angular.isDefined($scope.goodsFilter.bredakUp)) {
+                    url = url + "&breakUp=" + $scope.goodsFilter.bredakUp
+                }
+                if (angular.isDefined($scope.goodsFilter.standard)) {
+                    url = url + "&standard=" + $scope.goodsFilter.standard
+                }
+                if (angular.isDefined($scope.goodsFilter.audited)) {
+                    url = url + "&audited=" + $scope.goodsFilter.audited
+                }
+                if (angular.isDefined($scope.goodsFilter.haveImg)) {
+                    url = url + "&haveImg=" + $scope.goodsFilter.haveImg;
+                }
+            }
+            window.open(url);
+            /*var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/exportProduct_modal.html',
+                controller: 'exportProductCtrl',
+                resolve: {
+                    account: function () {
+                        return angular.copy(data);
+                    }
+                }
+            });
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })*/
+        };
+
+        // 更多信息事件
+        $scope.moreInfo = function () {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/moreInfo_modal.html',
+                controller: 'moreInfoCtrl',
+                resolve: {
+                    titleInShow: function () {
+                        return angular.copy($scope.titleInShow);
+                    }
+                }
+            });
+            modalInstance.result.then(function (data) {
+                if (data) {
+                    BackgroundRecord.updateUserTitle({}, data, function (data) {
+                        if (data.success) {
+                            if (data.data) {
+                                initTitleInfo();
+                            }
+                        } else {
+                            toaster.pop("info", data.message);
+                        }
+                    })
+                }
+            })
+        };
+
+        // 审核事件
+        $scope.auditProduct = function (goods) {
+            // 分页获取修改历史记录
+            // $scope.modifyTableParams = new ngTableParams({
+            //     page: 1,
+            //     count: 3
+            // }, {
+            //     total: 0,
+            //     getData: function ($defer, params) {
+            //         var param = BaseService.parseParams(params.url());
+            //         param.batchCode = goods.batchCode;
+            //         GoodsModifyInfo.getPageModifyInfo(param, function (data) {
+            //             var modalInstance = $modal.open({
+            //                 templateUrl: 'static/view/admin/modal/manage/manageAudit.html',
+            //                 controller: 'AuditCtrl',
+            //                 resolve: {
+            //                     goods: function () {
+            //                         return angular.copy(goods);
+            //                     },
+            //                     info: function () {
+            //                         return angular.copy(data.content);
+            //                     }
+            //                 }
+            //             });
+            //             modalInstance.result.then(function (result) {
+            //
+            //             }, function () {
+            //
+            //             })
+            //             params.total(data.totalElements);
+            //             $defer.resolve(data.content);
+            //         }, function () {
+            //             toaster.pop('error', '获取数据失败')
+            //         })
+            //     }
+            // });
+            GoodsModifyInfo.getModifyInfoByBatchCode({batchCode:goods.batchCode}, function (data) {
+                if (data) {
+                    var modalInstance = $modal.open({
+                        templateUrl: 'static/view/admin/modal/manage/manageAudit.html',
+                        controller: 'AuditCtrl',
+                        resolve: {
+                            goods: function () {
+                                return angular.copy(goods);
+                            },
+                            info: function () {
+                                return angular.copy(data);
+                            }
+                        }
+                    });
+                    modalInstance.result.then(function () {
+                        $scope.manageTableParams.reload();
+                    }, function () {
+
+                    })
+                }
+            }, function (error) {
+                toaster.pop("error", error.data);
+            });
+
+        };
+        // 日志点击事件
+        $scope.journalProduct = function (goods) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/journal_modal.html',
+                controller: 'journalCtrl',
+                resolve: {
+                    goods: function () {
+                        return angular.copy(goods);
+                    }
+                }
+            });
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })
+        };
+
+        // 下架事件
+        $scope.soldOutProduct = function (batchArray) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/ManageSoldOut.html',
+                controller: 'soleOutCtrl',
+                resolve: {
+                    batchArray: function () {
+                        return angular.copy(batchArray);
+                    }
+                }
+            });
+            modalInstance.result.then(function () {
+                $scope.manageTableParams.reload();
+            }, function () {
+
+            })
+        };
+        // 显示对比图片信息
+        $scope.showImg = function (data) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/showContrastImg_modal.html',
+                controller: 'showContrastImgCtrl',
+                resolve: {
+                    img: function () {
+                        return angular.copy(data);
+                    }
+                }
+            })
+            modalInstance.result.then(function (account) {
+
+            }, function () {
+
+            })
+        }
+
+    }]);
+
+    app.register.controller('exportProductCtrl', ['$scope', '$modalInstance', 'account', function($scope, $modalInstance, account) {
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('moreInfoCtrl', ['$scope', '$modalInstance', 'titleInShow', function ($scope, $modalInstance, titleInShow) {
+
+        $scope.allTitle = [{titleName : '商家ID'}, {titleName : '商家名称'}, {titleName : '产品信息'}, {titleName : 'SKU编码'},
+            {titleName : '产品编号'}, {titleName : '封装'}, {titleName : '梯度'}, {titleName : '单价'}, {titleName : '交期(天)'},
+            {titleName : '包装'}, {titleName : '包装数量'}, {titleName : '起订量'}, {titleName : '拆包售卖'}, {titleName : '在售数量'},
+            {titleName : '锁库数'}, {titleName : '冻结数量'}, {titleName : '库存总数'}, {titleName : '在售状态'}, {titleName : '销售方式'},
+            {titleName : '创建人'}, {titleName : '创建时间'}, {titleName : '产品类型'}, {titleName : '图片类型'}, {titleName : '产品图片'}];
+
+        var initTitleInfo = function () {
+            angular.forEach($scope.allTitle, function (item) {
+                if (titleInShow[item.titleName]) {
+                    item.choosed = true;
+                }
+            })
+        };
+        initTitleInfo();
+
+        var getChooseInfo = function () {
+            $scope.titleSet = [];
+            angular.forEach($scope.allTitle, function (item) {
+                if (item.choosed) {
+                    $scope.titleSet.push(item);
+                }
+            })
+        };
+
+        $scope.ensureAddAccount = function () {
+            getChooseInfo();
+            $modalInstance.close($scope.titleSet);
+        };
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('AuditCtrl', ['$scope', 'goods', 'info', 'toaster', '$modalInstance', 'GoodsModifyInfo', function($scope, goods, info, toaster, $modalInstance, GoodsModifyInfo) {
+        $scope.auditGoods = goods;
+        $scope.modifyList = info;
+        $scope.hasAuditTwo = false;
+        $scope.errorMsg = '';
+        $scope.otherMessage = '';
+        $scope.errorArray = ['价格异常', '图片违规', '基本信息有误', '断缺货'];
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        };
+
+        $scope.toggleAudit = function (type) {
+            $scope.hasAuditTwo = type
+        };
+        
+        $scope.changeType = function (type) {
+            $scope.errorType = type;
+        };
+
+        var countLength = function (string) {
+            return string.replace(/[^\x00-\xff]/g, '**').length;
+        };
+
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (countLength(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+
+        $scope.inputMessage = function () {
+            if ($scope.otherMessage) {
+                $scope.otherMessage = cutOutString($scope.otherMessage, 30);
+            }
+        };
+
+        $scope.ensureAudit = function (pass) {
+            if (!pass) {
+                if (!$scope.errorType) {
+                    toaster.pop("info", "您尚未选择下架原因");
+                    return;
+                }
+                if ($scope.errorType == 5) {
+                    if (!$scope.otherMessage || countLength($scope.otherMessage) < 2) {
+                        toaster.pop("info", "原因至少要填写2个字");
+                        return;
+                    }
+                }
+                if ($scope.errorType == 5) {
+                    $scope.errorMsg = $scope.otherMessage;
+                } else {
+                    $scope.errorMsg = $scope.errorArray[$scope.errorType - 1];
+                }
+            }
+            GoodsModifyInfo.auditedGoods({batchCode:goods.batchCode,pass:pass,message:$scope.errorMsg}, {}, function () {
+                toaster.pop("info", "审核完毕");
+                $modalInstance.close();
+            })
+        };
+
+    }]);
+
+    app.register.controller('journalCtrl', ['$scope', 'goods', 'toaster', 'ngTableParams', 'BaseService', 'GoodsHistory', 'GoodsModifyInfo', '$modalInstance', function($scope, goods, toaster, ngTableParams, BaseService, GoodsHistory, GoodsModifyInfo, $modalInstance) {
+        $scope.tabs = 'basic';
+
+        // 日期选择框部分
+        $scope.condition = [{open: false},{open: false} ];
+        $scope.openDatePicker = function ($event, item, openParam) {
+            $event.preventDefault();
+            $event.stopPropagation();
+            openParam === 0 ? $scope.condition[1].open = false : $scope.condition[0].open = false;
+            item[openParam].open = !item[openParam].open;
+        };
+        $scope.onDateCondition = function (bool) {
+            if (bool === 1) {
+               if ($scope.startDate && !$scope.endDate) {
+                   var nowTime = new Date();
+                   $scope.endDate = new Date(nowTime.getFullYear(), nowTime.getMonth(), nowTime.getDate());
+                   if ($scope.endDate.getTime() == $scope.startDate.getTime()) {
+                       $scope.endDate = new Date($scope.endDate.getTime() + 86400000);
+                   }
+               }
+               if ($scope.startDate && $scope.endDate) {
+                   if($scope.startDate.getTime() > $scope.endDate) {
+                       $scope.endDate = new Date($scope.startDate.getTime() + 86400000)
+                   }
+               }
+            } else if (bool === 2) {
+                if ($scope.startDate && $scope.endDate) {
+                   $scope.startDate = new Date($scope.endDate.getTime() - 86400000);
+                }
+            }
+        };
+
+        $scope.convertTab = function (tab) {
+            $scope.tabs = tab;
+            $scope.startDate = null;
+            $scope.endDate = null;
+            $scope.keyword = null;
+        };
+
+        $scope.search = function (tab) {
+            switch (tab) {
+                case 'basic':
+                    $scope.ModifyDetailTableParams.page(1);
+                    $scope.ModifyDetailTableParams.reload();
+                    break;
+                case 'sell':
+                    $scope.ModifyDetailTableParams.page(1);
+                    $scope.ModifyDetailTableParams.reload();
+                    break;
+                case 'smt':
+                    $scope.historyTableParams.page(1);
+                    $scope.historyTableParams.reload();
+                    break;
+                case 'audit':
+                    $scope.auditedTableParams.page(1);
+                    $scope.auditedTableParams.reload();
+                    break;
+            }
+        };
+
+        $scope.historyStatus = {
+            '上架' : '上架',
+            '发布商品' : '上架',
+            '下架商品' : '下架',
+            '批量下架公司产品' : '下架'
+        };
+
+        var initQueryParams = function (param) {
+            if ($scope.startDate) {
+                param.startDate = $scope.startDate.getTime();
+            }
+            if ($scope.endDate) {
+                param.endDate = $scope.endDate.getTime();
+            }
+            if ($scope.keyword) {
+                param.keyword = $scope.keyword;
+            }
+        };
+
+        // 获取分页GoodsHistory数据
+        $scope.historyTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                operateDate : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+                GoodsHistory.findDataOfUpAndDown(param, function (data) {
+                    $scope.historyList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.auditedTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                updateTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+                GoodsModifyInfo.getPageModifyInfo(param, function (data) {
+                    $scope.auditedList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.ModifyDetailTableParams = new ngTableParams({
+            page: 1,
+            count: 3,
+            sorting: {
+                updateTime : 'DESC'
+            }
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                initQueryParams(param);
+
+                GoodsModifyInfo.getPageModifyDetail(param, function (data) {
+                    $scope.detailList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    app.register.controller('soleOutCtrl', ['$scope', 'batchArray', 'Goods', 'toaster', '$modalInstance', function($scope, batchArray, Goods, toaster, $modalInstance) {
+        $scope.errorMsg = '';
+        $scope.otherMessage = '';
+        $scope.errorArray = ['价格异常', '图片违规', '基本信息有误', '短缺货'];
+
+        var countLength = function (string) {
+            return string.replace(/[^\x00-\xff]/g, '**').length;
+        };
+
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (countLength(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+
+        $scope.inputMessage = function () {
+            if ($scope.otherMessage) {
+                $scope.otherMessage = cutOutString($scope.otherMessage, 30);
+            }
+        };
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        };
+
+        $scope.changeType = function (type) {
+            $scope.errorType = type;
+        };
+
+        $scope.ensureDown = function () {
+            if (!$scope.errorType) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            if ($scope.errorType == 5) {
+                if (!$scope.otherMessage || countLength($scope.otherMessage) < 2) {
+                    toaster.pop("info", "原因至少要填写2个字");
+                    return;
+                }
+            }
+            if ($scope.errorType == 5) {
+                $scope.errorMsg = $scope.otherMessage;
+            } else {
+                $scope.errorMsg = $scope.errorArray[$scope.errorType - 1];
+            }
+
+            if (!$scope.errorMsg || $scope.errorMsg.length == 0) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            var batchs = batchArray.join(",");
+            Goods.offShelfGoodsByProvider({batchCodes:batchs, downMsg:$scope.errorMsg}, {}, function(map){
+                if (map.success) {
+                    toaster.pop('success', '下架成功');
+                    $modalInstance.close();
+                } else {
+                    toaster.pop('error', map.message);
+                }
+            }, function() {
+                toaster.pop('error', '下架失败');
+            });
+        };
+
+    }]);
+    app.register.controller('showContrastImgCtrl', ['$scope', 'img', '$modalInstance', function ($scope, img, $modalInstance) {
+        $scope.showImgs = img;
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        }
+    }]);
+
+    //器件选择功能方法
+    app.register.factory('TreeData', function() {
+        return function (tree) {
+            var me = this;
+            me.$data = tree;
+        }
+    })
+})

+ 13 - 1
src/main/webapp/resources/js/common/query/goods.js

@@ -7,10 +7,16 @@ define([ 'ngResource' ], function() {
 			* 获取分页面的GOODS数据(后台数据 产品管理部分)
 			 * start wangcz
 			* */
+            // 获取超级后台在售产品管理数据
 			loadGoodsList: {
-				url: 'trade/goods/background/page',
+				url: '/trade/goods/background/page',
 				method: 'POST'
 			},
+			// 获取超级后台产品管理数据
+            loadBrandProductsList: {
+                url: '/trade/products/background/page',
+                method: 'POST'
+            },
 			// 获取商家产品详情列表数据
 			loadUploadProductDetail: {
 				url: '/store-service/storeinfo',
@@ -48,10 +54,16 @@ define([ 'ngResource' ], function() {
 				method : 'GET',
 				isArray : true
 			},
+			// 查询在售产品详情接口
 			findOneById : {
 				url : 'trade/goods/one',
 				method : 'GET'
 			},
+			// 查询产品详情接口
+            findProductsOneById : {
+                url : 'trade/products/one',
+                method : 'GET'
+            },
 			//取得有效的简化的消息
 			findSimpleAvailableByUuid : {
 				url : 'trade/goods/simple/byUuidAndCurrency',

+ 72 - 72
src/main/webapp/resources/js/usercenter/controllers/forstore/single_entry_ctrl.js

@@ -15,7 +15,7 @@ define(['app/app', 'jquery-uploadify'], function(app) {
         iniUrlImg: 'static/img/vendor/images/upload.png',
         RegulImg: 'static/img/vendor/images/upload.png',
         prices: [{'start': 1, rMBPrice: ''}],
-        minPackQty: 1,
+        // minPackQty: 1,
         minDelivery: 1,
         maxDelivery: 10,
         dateArea: 'formMe',
@@ -30,9 +30,9 @@ define(['app/app', 'jquery-uploadify'], function(app) {
         pcmpcode: false,
         spec: false,
         minDelivery: false,
-        maxDelivery: false,
-        OnePrice: false,
-        minPackQty: false
+        maxDelivery: false
+        // OnePrice: false
+        // minPackQty: false
       }
       for (var i = 0; i < $scope.Regul.prices.length; i++) {
         $scope.Regul.prices[i].priceInvalid = false
@@ -250,35 +250,35 @@ define(['app/app', 'jquery-uploadify'], function(app) {
       goods.packaging = item;
     }
 
-    $scope.setPriceMinPackAmount = function(num) {
-      $rootScope.singleEntryInfo = true
-      if (num && num.indexOf('.') > -1) {
-        toaster.pop('warning', '提示', '最小包装数不能存在小数点')
-        $scope.Regul.minPackQty = 1
-      } else {
-        $scope.Regul.minPackQty = num
-      }
-      $scope.objError.minPackQty = false
-    }
+    // $scope.setPriceMinPackAmount = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   if (num && num.indexOf('.') > -1) {
+    //     toaster.pop('warning', '提示', '最小包装数不能存在小数点')
+    //     $scope.Regul.minPackQty = 1
+    //   } else {
+    //     $scope.Regul.minPackQty = num
+    //   }
+    //   $scope.objError.minPackQty = false
+    // }
 
 
 
-    $scope.setReserve = function(num) {
-      $rootScope.singleEntryInfo = true
-      if (num && num.indexOf('.') > -1) {
-        toaster.pop('warning', '提示', '库存数量不能存在小数点')
-        $scope.Regul.reserve = 1
-      } else {
-        $scope.Regul.reserve = num
-      }
-      $scope.objError.reserve = false
-    }
+    // $scope.setReserve = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   if (num && num.indexOf('.') > -1) {
+    //     toaster.pop('warning', '提示', '库存数量不能存在小数点')
+    //     $scope.Regul.reserve = 1
+    //   } else {
+    //     $scope.Regul.reserve = num
+    //   }
+    //   $scope.objError.reserve = false
+    // }
 
-    $scope.setOnePrice = function(num) {
-      $rootScope.singleEntryInfo = true
-      $scope.Regul.OnePrice = num
-      $scope.objError.OnePrice = false
-    }
+    // $scope.setOnePrice = function(num) {
+    //   $rootScope.singleEntryInfo = true
+    //   $scope.Regul.OnePrice = num
+    //   $scope.objError.OnePrice = false
+    // }
     // 修改规格书
     $scope.onUploadSuccess = function(data) {
       $rootScope.singleEntryInfo = true
@@ -313,10 +313,10 @@ define(['app/app', 'jquery-uploadify'], function(app) {
 
     // 最小起订量修改 梯度1的值等于最小起订量
     $scope.ProductupdateStartNumber = function(productUpOff) {
-      if (parseInt(productUpOff) >= parseInt($scope.Regul.prices[0].start)) {
-        $scope.Regul.prices[0].start = $scope.Regul.minPackQty
-        return false
-      }
+      // if (parseInt(productUpOff) >= parseInt($scope.Regul.prices[0].start)) {
+      //   $scope.Regul.prices[0].start = $scope.Regul.minPackQty
+      //   return false
+      // }
       $scope.Regul.prices[0].start = parseInt(productUpOff)
     }
     // 最小起订量失去焦点
@@ -327,13 +327,13 @@ define(['app/app', 'jquery-uploadify'], function(app) {
         return
       }
       $rootScope.singleEntryInfo = true
-      if (!$scope.Regul.breakUp && $scope.Regul.minBuyQty !== $scope.Regul.minPackQty) {
-        if ($scope.Regul.minBuyQty % $scope.Regul.minPackQty !== 0) {
-          $scope.Regul.minBuyQty = $scope.Regul.minPackQty
-          toaster.pop('warning', '提示', '不可拆卖时,起订量必须是包装数量的倍数');
-          $scope.ProductupdateStartNumber($scope.Regul.minBuyQty)
-        }
-      }
+      // if (!$scope.Regul.breakUp && $scope.Regul.minBuyQty !== $scope.Regul.minPackQty) {
+      //   if ($scope.Regul.minBuyQty % $scope.Regul.minPackQty !== 0) {
+      //     $scope.Regul.minBuyQty = $scope.Regul.minPackQty
+      //     toaster.pop('warning', '提示', '不可拆卖时,起订量必须是包装数量的倍数');
+      //     $scope.ProductupdateStartNumber($scope.Regul.minBuyQty)
+      //   }
+      // }
     }
 
     /**
@@ -521,35 +521,35 @@ define(['app/app', 'jquery-uploadify'], function(app) {
         $scope.objError.pcmpcode = true
         return;
       }
-      if ($scope.Regul.reserve === '' || !$scope.Regul.reserve) {
-        toaster.pop('warning','提示', '库存数量不能为空')
-        $scope.objError.reserve = true
-        return;
-      }
-
-      if ($scope.Regul.reserve <= 0) {
-        toaster.pop('warning','提示', '库存数量必须大于等于1')
-        $scope.objError.reserve = true
-        return;
-      }
-
-      if (/\D/.test($scope.Regul.reserve)) {
-        toaster.pop('warning','提示', '库存数量只能为正整数')
-        $scope.objError.reserve = true
-        return;
-      }
-
-      if ($scope.Regul.minPackQty && /\D/.test($scope.Regul.minPackQty)) {
-        toaster.pop('warning','提示', '最小包装数输入不正确')
-        $scope.objError.minPackQty = true
-        return;
-      }
-
-      if ($scope.Regul.OnePrice && !/^\d+(\.\d+)?$/.test($scope.Regul.OnePrice.trim())) {
-        toaster.pop('warning','提示', '成本单价输入不正确')
-        $scope.objError.OnePrice = true
-        return;
-      }
+      // if ($scope.Regul.reserve === '' || !$scope.Regul.reserve) {
+      //   toaster.pop('warning','提示', '库存数量不能为空')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.reserve <= 0) {
+      //   toaster.pop('warning','提示', '库存数量必须大于等于1')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if (/\D/.test($scope.Regul.reserve)) {
+      //   toaster.pop('warning','提示', '库存数量只能为正整数')
+      //   $scope.objError.reserve = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.minPackQty && /\D/.test($scope.Regul.minPackQty)) {
+      //   toaster.pop('warning','提示', '最小包装数输入不正确')
+      //   $scope.objError.minPackQty = true
+      //   return;
+      // }
+
+      // if ($scope.Regul.OnePrice && !/^\d+(\.\d+)?$/.test($scope.Regul.OnePrice.trim())) {
+      //   toaster.pop('warning','提示', '成本单价输入不正确')
+      //   $scope.objError.OnePrice = true
+      //   return;
+      // }
 
       if (!$scope.Regul.minBuyQty || $scope.Regul.minBuyQty === 0) {
         toaster.pop('warning','提示', '最小起订量必须是大于0的数字')
@@ -636,12 +636,12 @@ define(['app/app', 'jquery-uploadify'], function(app) {
       }
       jsonObject.product = {
         spec: $scope.Regul.spec, // 规格
-        minPackQty: $scope.Regul.minPackQty, // 最小包装量
-        erpReserve:  $scope.Regul.reserve, //库存
+        // minPackQty: $scope.Regul.minPackQty, // 最小包装量
+        erpReserve:  0, //库存
         cmpCode: $scope.Regul.pcmpcode, //型号
         brand: $scope.Regul.pbranden,//品牌
         prodName: $scope.Regul.kind, // 名称
-        price: $scope.Regul.OnePrice, // 成本单价
+        // price: $scope.Regul.OnePrice, // 成本单价
         attachment: $scope.Regul.Ischange ? $scope.Regul.Regulpic : '', // 规格书
         cmpImg: $scope.Regul.RegulImg !== $scope.Regul.iniUrlImg ? $scope.Regul.RegulImg : '',// 图片
         packaging: $scope.Regul.packaging // 包装方式

+ 6 - 5
src/main/webapp/resources/view/admin/product/productManage.html

@@ -115,8 +115,8 @@
                         <select name="" id="1" class="form-control" ng-model="goodsFilter.saleStatus">
                             <option value="">全部</option>
                             <option value="601">已上架</option>
-                            <option value="613">新品未上架</option>
-                            <option value="612">已下架</option>
+                            <!--<option value="613">新品未上架</option>-->
+                            <option value="612">未上架</option>
                         </select>
                     </label>
                 </div>
@@ -220,6 +220,7 @@
                 <a ng-click="batchDown()">批量下架</a>
                 <!--<a title="此功能没有开放">产品导出</a>-->
                 <a ng-click="exportClick()">产品导出</a>
+                <strong>请注意:当无选择项时,默认导出所有前1000条数据!</strong>
             </span>
             <span style="float: right;font-size: 14px">共<span style="color: red;" ng-bind="totalCount">3424</span>个产品</span>
         </div>
@@ -228,9 +229,9 @@
         <table class="table" ng-table="manageTableParams">
             <thead>
             <tr>
-                <th width="80">
+                <th width="120">
                     <label>
-                        <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选
+                        <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选当前页
                     </label>
                 </th>
                 <th width="120">操作</th>
@@ -266,7 +267,7 @@
                     <input id="{{$index+1}}" type="checkbox" ng-checked="list.isChoosed" ng-click="chooseOne(list)">
                 </td>
                 <td>
-                    <a target="_blank" href="admin#/manage/{{list.id}}">详情</a>
+                    <a target="_blank" href="admin#/manage/{{list.id}}?type=goods">详情</a>
                     <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
                     <br/>
                     <a ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>

+ 583 - 0
src/main/webapp/resources/view/admin/product/saleProductManage.html

@@ -0,0 +1,583 @@
+<div id="manage">
+    <div class="manage-form">
+        <div class="form-item">
+            <span class="item-title">物料录入时间:</span>
+            <div class="screen">
+                <div class="radio-block fl">
+                    <label class="com-check-radio">
+                        <input type="radio" id="oneMonth" name="date" ng-click="setFilters('dateArea', 'oneMonth')" ng-checked="dateArea == 'oneMonth'">
+                        <label for="oneMonth"></label>
+                        30天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="threeMonth" name="date" ng-click="setFilters('dateArea', 'threeMonth')" ng-checked="dateArea == 'threeMonth'">
+                        <label for="threeMonth"></label>
+                        90天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="sixMonth" name="date" ng-click="setFilters('dateArea', 'sixMonth')" ng-checked="dateArea == 'sixMonth'">
+                        <label for="sixMonth"></label>
+                        180天
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="allMonth" name="date" ng-click="setFilters('dateArea', 'allMonth')" ng-checked="dateArea == 'allMonth'">
+                        <label for="allMonth"></label>
+                        不限
+                    </label>
+                    <label class="com-check-radio">
+                        <input type="radio" id="autoMonth" name="date" ng-click="setFilters('dateArea', 'autoMonth')" ng-checked="dateArea == 'autoMonth'">
+                        <label for="autoMonth"></label>
+                        自定义
+                    </label>
+                </div>
+                <div class="sreach fr">
+                    <div  ng-show="dateArea == 'autoMonth'" class="date fl">
+                        <div class="data-input">
+                            <input id="start" type="text" ng-model="startDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="起始时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[0].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 0,1)"
+                                   ng-change="onDateCondition(1, startDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 0)"></button>
+                        </div>
+                        <strong>–</strong>
+                        <div class="data-input">
+                            <input id="end" type="text" ng-model="endDate" readonly="readonly"
+                                   class="form-control select-adder" placeholder="结束时间"
+                                   datepicker-popup="yyyy-MM-dd"
+                                   is-open="condition[1].open"
+                                   current-text="今天" clear-text="清除" close-text="关闭"
+                                   datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                   ng-click="openDatePicker($event, condition, 1, 2)"
+                                   ng-change="onDateCondition(2, endDate)"/>
+                            <button class="open" ng-click="openDatePicker($event, condition, 1)"></button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="form-item" style="background:#f5f5f5;">
+            <span class="item-title">条件筛选:</span>
+            <span>
+                <a ng-click="clearClick()">清空条件</a>
+                <a ng-click="searchClick()">确认筛选</a>
+            </span>
+            <span style="float:right">
+                <a ng-click="moreInfo()">更多信息</a>
+            </span>
+        </div>
+        <div class="form-top">
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>物料名称:</span>
+                    </label>
+                    <div class="select-three">
+                        <select class="form-control"
+                                ng-model="kindPojo.first"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo"
+                                ng-change="kindPojo.second='';kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">一级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.second"
+                                ng-options="key as value.nameCn for (key,value) in kindInfo[kindPojo.first].children"
+                                ng-change="kindPojo.third='';"
+                                style="opacity: 1;">
+                            <option value="">二级类目</option>
+                        </select>
+                        <select class="form-control" ng-model="kindPojo.third" style="opacity: 1;"
+                                ng-options="value as value.nameCn for value in kindInfo[kindPojo.first].children[kindPojo.second].children">
+                            <option value="">三级类目</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="form-inline">
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>型号:</span>
+                        <input class="form-control" type="text" ng-model="goodsFilter.code" placeholder="型号">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>品牌:</span>
+                        <input type="text" placeholder="品牌中英文名称" class="form-control" ng-model="goodsFilter.brand">
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>产品类型:</span>
+                        <select name="" id="8" ng-model="goodsFilter.standard" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">标准产品</option>
+                            <option value="false">非标准产品</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="form-group form-group-sm">
+                    <label class="control-label">
+                        <span>图片类型:</span>
+                        <select name="" id="9" ng-model="goodsFilter.haveImg" class="form-control">
+                            <option value="">全部</option>
+                            <option value="true">自有图片</option>
+                            <option value="false">默认图片</option>
+                        </select>
+                    </label>
+                </div>
+            </div>
+        </div>
+        <div class="form-item">
+            <span class="item-title">查看报表:</span>
+            <span ng-if="startFormatDate">
+                <a ng-href="#/merchantProducts?startDate={{startFormatDate}}&endDate={{endFormatDate}}">商家产品数</a>
+                <a ng-href="#/brandProductsCount?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品牌产品数</a>
+                <a ng-href="#/categoryNumber?startDate={{startFormatDate}}&endDate={{endFormatDate}}">品类产品数</a>
+            </span>
+            <span ng-if="!startFormatDate">
+                <a ng-href="#/merchantProducts">商家产品数</a>
+                <a ng-href="#/brandProductsCount">品牌产品数</a>
+                <a ng-href="#/categoryNumber">品类产品数</a>
+            </span>
+        </div>
+        <div class="form-item">
+            <span class="item-title">更多操作:</span>
+            <span>
+                <a ng-click="batchDown()">批量下架</a>
+                <!--<a title="此功能没有开放">产品导出</a>-->
+                <a ng-click="exportClick()">产品导出</a>
+                <strong>请注意:当无选择项时,默认导出所有前1000条数据!</strong>
+            </span>
+            <span style="float: right;font-size: 14px">共<span style="color: red;" ng-bind="totalCount">3424</span>个产品</span>
+        </div>
+    </div>
+    <div class="manage-table">
+        <table class="table" ng-table="manageTableParams">
+            <thead>
+            <tr>
+                <th width="120">
+                    <label>
+                        <input id="AllChoose" type="checkbox" ng-checked="isChooseAll" ng-click="chooseAll()">全选当前页
+                    </label>
+                </th>
+                <th width="120">操作</th>
+                <th width="160" ng-if="titleInShow['商家ID']">商家ID</th>
+                <th width="160" ng-if="titleInShow['商家名称']">商家名称</th>
+                <th width="160">产品信息</th>
+                <th width="160" ng-if="titleInShow['SKU编码']">SKU编码</th>
+                <th width="160" ng-if="titleInShow['产品编号']">产品编号</th>
+                <th width="160" ng-if="titleInShow['封装']">封装</th>
+                <th width="160" ng-if="titleInShow['梯度']">梯度</th>
+                <th width="160" ng-if="titleInShow['单价']">单价</th>
+                <th width="160" ng-if="titleInShow['交期(天)']">交期(天)</th>
+                <th width="160" ng-if="titleInShow['包装']">包装</th>
+                <th width="160" ng-if="titleInShow['包装数量']">包装数量</th>
+                <th width="160" ng-if="titleInShow['起订量']">起订量</th>
+                <th width="160" ng-if="titleInShow['拆包售卖']">拆包售卖</th>
+                <th width="160" ng-if="titleInShow['在售数量']">在售数量</th>
+                <th width="160" ng-if="titleInShow['锁库数']">锁库数</th>
+                <th width="160" ng-if="titleInShow['冻结数量']">冻结数量</th>
+                <th width="160" ng-if="titleInShow['库存总数']">库存总数</th>
+                <th width="160" ng-if="titleInShow['在售状态']">在售状态</th>
+                <th width="160" ng-if="titleInShow['销售方式']">销售方式</th>
+                <th width="160" ng-if="titleInShow['创建人']">创建人</th>
+                <th width="160" ng-if="titleInShow['创建时间']">创建时间</th>
+                <th width="160" ng-if="titleInShow['产品类型']">产品类型</th>
+                <th width="160" ng-if="titleInShow['图片类型']">图片类型</th>
+                <th width="160" ng-if="titleInShow['产品图片']">产品图片</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="list in goodsList">
+                <td>
+                    <input id="{{$index+1}}" type="checkbox" ng-checked="list.isChoosed" ng-click="chooseOne(list)">
+                </td>
+                <td>
+                    <a target="_blank" href="admin#/manage/{{list.id}}?type=product">详情</a>
+                    <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
+                    <br/>
+                    <a ng-if="list.goods" ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>
+                    <a ng-if="list.status == 601 || list.status == 602" ng-click="soldOutProduct([list.batchCode])">下架</a>
+                </td>
+                <td ng-if="titleInShow['商家ID']">
+                    <span ng-if="list.goods" ng-bind="list.goods.enUU || '-'">商家ID</span>
+                    <span ng-if="!list.goods" ng-bind="list.enUU || '-'">商家ID</span>
+                </td>
+                <td ng-if="titleInShow['商家名称']">
+                    <span ng-if="list.goods" ng-bind="list.goods.storeName || '-'">商家名称</span>
+                    <span ng-if="!list.goods" ng-bind="list.enterpriseName || '-'">商家名称</span>
+                </td>
+                <td>
+                    <p ng-if="list.goods">物料名称:<span ng-bind="list.goods.kindNameCn || '-'">****</span></p>
+                    <p ng-if="!list.goods">物料名称:<span ng-bind="list.kind || list.kinden|| '-'">****</span></p>
+                    <p ng-if="list.goods">型号:<span ng-bind="list.goods.code || '-'">****</span></p>
+                    <p ng-if="!list.goods">型号:<span ng-bind="list.cmpCode || '-'">****</span></p>
+                    <p ng-if="list.goods">品牌:<span ng-bind="list.goods.brandNameEn || '-'">****</span></p>
+                    <p ng-if="!list.goods">品牌:<span ng-bind="list.pbrand || list.pbranden || '-'">****</span></p>
+                </td>
+                <td ng-if="titleInShow['SKU编码']">
+                    <span ng-if="list.goods" ng-bind="list.goods.batchCode || '-'">SKU编码</span>
+                    <span ng-if="!list.goods" ng-bind="list.batchCode || '-'">SKU编码</span>
+                </td>
+                <td ng-if="titleInShow['产品编号']">
+                    <span ng-if="list.goods" ng-bind="list.goods.prodNum || '-'">产品编号</span>
+                    <span ng-if="!list.goods" ng-bind="list.prodNum || '-'">产品编号</span>
+                </td>
+                <td ng-if="titleInShow['封装']">
+                    <span ng-if="list.goods" ng-bind="list.goods.encapsulation || '-'">封装</span>
+                    <span ng-if="!list.goods" ng-bind="list.encapsulation || '-'">封装</span>
+                </td>
+                <td ng-if="titleInShow['梯度']">
+                    <div ng-repeat="qty in list.goods.prices" ng-if="list.goods">
+                          <span ng-if="!$last">
+                              <span ng-bind="qty.start"></span>-<span ng-bind="qty.end"></span>
+                          </span>
+                        <span ng-if="$last">
+                              <span ng-bind="qty.start"></span>以上
+                          </span>
+                    </div>
+                    <div ng-repeat="qty in list.prices" ng-if="!list.goods">
+                          <span ng-if="!$last">
+                              <span ng-bind="qty.start"></span>-<span ng-bind="qty.end"></span>
+                          </span>
+                        <span ng-if="$last">
+                              <span ng-bind="qty.start"></span>以上
+                          </span>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['单价']">
+                    <div ng-repeat="price in list.goods.prices" ng-if="list.goods">
+                        <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
+                        <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
+                    </div>
+                    <div ng-repeat="price in list.prices" ng-if="!list.goods">
+                        <span ng-bind="list.currencyName == 'RMB' ? '¥' : '$'"></span>
+                        <span ng-bind="list.currencyName == 'RMB' ? price.rMBPrice : price.uSDPrice"></span>
+                    </div>
+                </td>
+                <td ng-if="titleInShow['交期(天)']">
+                    <div ng-if="list.goods && list.goods.b2cMinDelivery != list.goods.b2cMaxDelivery">
+                        <span ng-bind="list.goods.b2cMinDelivery || '-'">交期(天)</span>-
+                        <span ng-bind="list.goods.b2cMaxDelivery || '-'">交期(天)</span>
+                    </div>
+                    <div ng-if="!list.goods && list.b2cMinDelivery != list.b2cMaxDelivery">
+                        <span ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>-
+                        <span ng-bind="list.b2cMaxDelivery || '-'">交期(天)</span>
+                    </div>
+                    <span ng-if="list.goods && list.goods.b2cMinDelivery == list.goods.b2cMaxDelivery" ng-bind="list.goods.b2cMinDelivery || '-'">交期(天)</span>
+                    <span ng-if="!list.goods && list.b2cMinDelivery == list.b2cMaxDelivery" ng-bind="list.b2cMinDelivery || '-'">交期(天)</span>
+                </td>
+                <td ng-if="titleInShow['包装']">
+                    <span ng-if="list.goods" ng-bind="list.goods.packaging || '-'">包装</span>
+                    <span ng-if="!list.goods" ng-bind="list.packaging || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['包装数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.minPackQty || '-'">包装</span>
+                    <span ng-if="!list.goods" ng-bind="list.minPackQty || '-'">包装</span>
+                </td>
+                <td ng-if="titleInShow['起订量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.minBuyQty || '-'">起订量</span>
+                    <span ng-if="!list.goods" ng-bind="list.minBuyQty || '-'">起订量</span>
+                </td>
+                <td ng-if="titleInShow['拆包售卖']">
+                    <span ng-if="list.breakUp">可拆卖</span>
+                    <span ng-if="!list.breakUp">不可拆卖</span>
+                </td>
+                <td ng-if="titleInShow['在售数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.reserve">在售数量</span>
+                    <span ng-if="!list.goods" ng-bind="list.reserve">在售数量</span>
+                </td>
+                <td ng-if="titleInShow['锁库数']">
+                    <span ng-bind="'-'">锁库数</span>
+                </td>
+                <td ng-if="titleInShow['冻结数量']">
+                    <span ng-if="list.goods" ng-bind="list.goods.frozen">冻结数量</span>
+                    <span ng-if="!list.goods" ng-bind="list.frozen">冻结数量</span>
+                </td>
+                <td ng-if="titleInShow['库存总数']">
+                    <span ng-if="list.goods" ng-bind="list.goods.reserve + list.goods.frozen">库存总数</span>
+                    <span ng-if="!list.goods" ng-bind="list.reserve + list.frozen">库存总数</span>
+                </td>
+                <td ng-if="titleInShow['在售状态']">
+                    <span ng-if="list.goods" ng-bind="saleStatus[list.goods.status] || '-'">在售状态</span>
+                    <span ng-if="!list.goods" ng-bind="saleStatus[list.status] || '-'">在售状态</span>
+                </td>
+                <td ng-if="titleInShow['销售方式']">
+                    <span ng-if="list.goods" ng-bind="list.goods.selfSale || '-'">销售方式</span>
+                    <span ng-if="!list.goods" ng-bind="list.selfSale || '-'">销售方式</span>
+                </td>
+                <td ng-if="titleInShow['创建人']">
+                    <span ng-if="list.goods" ng-bind="list.goods.publisherName || '-'">创建人</span>
+                    <span ng-if="!list.goods" ng-bind="list.publisherName || '-'">创建人</span>
+                </td>
+                <td ng-if="titleInShow['创建时间']">
+                    <span ng-if="list.goods" ng-bind="list.goods.createdDate | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
+                    <span ng-if="!list.goods" ng-bind="list.createTime | date: 'yyyy-MM-dd HH:mm:ss' || '-'">创建时间</span>
+                </td>
+                <td ng-if="titleInShow['产品类型']">
+                    <span ng-if="list.goods" ng-bind="list.goods.uuid ? '标准' : '非标'"></span>
+                    <span ng-if="!list.goods" ng-bind="list.uuid ? '标准' : '非标'"></span>
+                </td>
+                <td ng-if="titleInShow['图片类型']">
+                    <span ng-if="list.goods" ng-bind="list.goods.img ? '自有图片' : '默认图片'"></span>
+                    <span ng-if="!list.goods" ng-bind="list.cmpImg ? '自有图片' : '默认图片'"></span>
+                </td>
+                <td ng-if="titleInShow['产品图片']">
+                    <img ng-if="list.goods" ng-src="{{list.goods.img || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
+                    <img ng-if="!list.goods" ng-src="{{list.cmpImg || 'static/img/store/common/default.png'}}" ng-click="showImg(list.img)" alt="产品图片">
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+<style>
+    .ng-table-pager {
+        position: absolute;
+        right: 0;
+        margin-top: 20px;
+    }
+    #manage input[type=checkbox]{
+        position:relative;
+        top:3px;
+        left:-3px;
+    }
+
+    .manage-form .form-top{
+        padding-top:15px;
+        border:1px solid #f5f5f5;
+    }
+    .manage-form .form-top .form-inline{
+        display: inline-block;
+        margin-bottom:10px;
+    }
+    .manage-form .form-top .form-group{
+        display: inline-block;
+        margin:0 5px;
+        vertical-align: middle;
+        line-height: 30px;
+    }
+
+    .manage-form .form-top label{
+        text-align: right;
+        font-size: 14px;
+        color:#666;
+    }
+
+    .manage-form .form-top label span{
+        display:inline-block;
+        width:80px;
+        font-weight:bold;
+        color:#2fa4e7;
+    }
+
+    .manage-form .form-top label input, .manage-form .form-top label select{
+        display: inline-block;
+        width:110px;
+        height:25px;
+        line-height: 25px;
+        padding:0 2px;
+        margin:0;
+    }
+    .manage-form .form-top .select-three {
+        display: inline-block;
+        margin:0;
+    }
+    .manage-form .form-top .select-three select{
+        display: inline-block;
+        min-width:140px;
+        height:25px;
+        line-height: 25px;
+        padding:0 2px;
+        margin:0;
+    }
+
+    .manage-table{
+        overflow-y: auto;
+    }
+
+    .manage-table table{
+        table-layout: fixed;
+        font-size: 14px;
+        color:#666;
+        border-collapse:separate;
+        border-spacing:0 5px;
+    }
+    .manage-table table thead tr{
+        height:50px;
+        line-height: 50px;
+        background: #f5f5f5;
+    }
+    .manage-table table thead tr label{
+        margin:0;
+    }
+    .form-control{
+        border-radius: 3px;
+    }
+    .manage-table table thead th{
+        text-align: center;
+        border:none;
+    }
+    .manage-table table thead th:first-child{
+        text-align: left;
+        padding-left:20px;
+    }
+    .manage-table table tbody{}
+    .manage-table table tbody tr{
+        height:72px;
+        margin-bottom:10px;
+        background: #fff;
+    }
+    .manage-table table tbody tr:hover{
+        position:relative;
+        top:2px;
+        left:2px;
+        cursor:pointer;
+        box-shadow:0 0 10px #e0e0e0;
+        background: #fff;
+    }
+    .manage-table table tbody td{
+        height:74px;
+        border:none;
+        vertical-align: middle;
+        text-align: center;
+    }
+    .manage-table table tbody td:first-child{
+        text-align: left;
+        padding-left:20px;
+    }
+    .manage-table table tbody td:nth-child(2){
+        padding:0;
+    }
+    .manage-table table tbody td p{
+        margin:0;
+        text-align: left;
+        font-size: 14px;
+        line-height: 18px;
+        width:100%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space:nowrap;
+    }
+    .select-adder{
+        background:url("static/img/user/images/xiala.png") right no-repeat ;
+        background-position-x: 180px;
+    }
+    .manage-table table tbody td img{
+        margin:0;
+        width:50%;
+    }
+    .manage-table table tbody td p span{
+        margin:0;
+        font-size: 14px;
+        line-height: 18px;
+    }
+    .manage-table table tbody td a{
+        display:inline-block;
+        padding:0 8px;
+        margin:2px;
+        line-height: 18px;
+        height:20px;
+        border:1px solid #35a6e8;
+        border-radius:3px;
+        font-size: 12px;
+        color:#666;
+        background: #fff;
+        text-decoration: none;
+    }
+    .manage-table table tbody td a:hover{
+        background: #35a6e8;
+        cursor:pointer;
+        color:#fff;
+    }
+</style>
+<style>
+    .fr{
+        float:right;
+    }
+    .fl{
+        float:left;
+    }
+    /*搜索时间筛选 start*/
+    .manage-form .form-item .screen {
+        display: inline-block;
+        padding: 0;
+        vertical-align: middle;
+    }
+    .manage-form .com-check-radio{
+        font-size: 14px;
+        font-weight: normal;
+        line-height: 32px;
+        margin-right: 10px;
+        cursor:pointer;
+    }
+    .manage-form .screen .sreach .date{
+        margin:0 20px;
+    }
+    .manage-form .screen .sreach .date input{
+        width: 117px;
+        text-align: left;
+        border: 1px solid #5078cb;
+    }
+    .manage-form .screen .sreach .date input:hover{
+        cursor: pointer;
+    }
+    .manage-form .screen .sreach .date strong{
+        float: left;
+        line-height: 32px;
+        color: #999;
+        margin: 0 5px;
+    }
+    .manage-form .data-input{
+        float: left;
+        position: relative;
+    }
+    .manage-form .data-input button.open{
+        position: absolute;
+        right: 1px;
+        top: 1px;
+        width: 20px;
+        height: 30px;
+        background: url('static/img/user/images/xiala.png') right no-repeat #fff !important;
+        background-position-x: 100% !important;
+        border: none;
+    }
+    .manage-form .screen .sreach .date input.form-control{
+        padding: 6px 6px;
+        border-radius: 2px;
+        height:32px;
+    }
+    .manage-form .screen .radio-block {
+        width: auto;
+    }
+    .manage-form .form-item{
+        font-size:14px;
+        vertical-align: top;
+        line-height:40px;
+    }
+    .manage-form .form-item span{}
+    .manage-form .form-item span a{
+        display:inline-block;
+        text-decoration:none;
+        height:26px;
+        line-height:26px;
+        color:#2fa4e7;
+        border:1px solid #2fa4e7;
+        border-radius:4px;
+        padding:0 10px;
+        margin:0 10px;
+    }
+    .manage-form .form-item span a:hover{
+        cursor:pointer;
+        background: #2fa4e7;
+        color:#fff;
+    }
+    .manage-form .form-item .item-title{
+        margin-left:5px;
+        font-weight:bold;
+    }
+</style>

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

@@ -51,7 +51,7 @@
 		<li ng-class="{'active' : active == 'sso_invoice'}"><span ui-sref="ssoInvoice">开票信息</span></li>
 		<li ng-class="{'active' : active == 'vendor_pay_center'}" ng-if="userInfo.enterprise.uu && userInfo.enterprise.isVendor == 313"><span ui-sref="gatheringAccount({'tab': 'accountTab'})">收款账户</span></li>
 		<li ng-class="{'active' : active == 'buyer_pay_center'}"><span ui-sref="payAccount({'status': 'pay-info'})">付款账户</span></li>
-		<li ng-class="{'active' : active == 'baseInfo_myRequest'}"><span ui-sref="baseInfo_myRequest">企业圈</span></li>
+		<li ng-if="personage" ng-class="{'active' : active == 'baseInfo_myRequest'}"><span ui-sref="baseInfo_myRequest">企业圈</span></li>
 		<li ng-class="{'active' : active == 'approvalflow_log'}"><span ui-sref="approvalflow_log">操作日志</span></li>
 		<!--<li ng-class="{'active' : active == 'approvalflow_flow'}"><span ui-sref="approvalflow_flow">审批流</span></li>-->
 		<!--<li ng-class="{'active' : active == 'vendor_logistics'}">-->

+ 57 - 166
src/main/webapp/resources/view/usercenter/forstore/single_entry.html

@@ -258,62 +258,63 @@
             {{Regul.packaging || '-'}}
           </div>
         </div>
-        <div class="clearfix w50 fl list">
-          <div class="fl name">
-            最小包装数(PCS):
-          </div>
-          <div class="fl input" ng-show="!showProductInfo">
-            <!-- 可编辑状态 -->
-            <input type="text"
-                   oninput="if(value.length>6)value=value.slice(0,6)"
-                   placeholder="请输入最小包装数"
-                   ng-model="Regul.minPackQty"
-                   onkeyup="this.value=this.value.replace(/\D|^0/g,'')" onafterpaste="this.value=this.value.replace(/\D|^0/g,'')"
-                   ng-blur="setPriceMinPackAmount(Regul.minPackQty)"
-                   class="form-control inputText" maxlength="50"
-                   ng-class="objError.minPackQty ? 'danger' : '' "
-            />
-          </div>
-          <div class="fl textinput" ng-show="showProductInfo">
-            {{Regul.minPackQty || '-'}}
-          </div>
-        </div>
-        <div class="clearfix w50 fl list">
-          <div class="fl name">
-            <span class="red">*</span>库存数量(PCS):
-          </div>
-          <div class="fl input" ng-show="!showProductInfo">
-            <!-- 可编辑状态 oninput="if(value.length>6)value=value.slice(0,6)" -->
-            <input type="text"
-                   placeholder="请输入库存数量"
-                   ng-model="Regul.reserve"
-                   ng-blur="setReserve(Regul.reserve)"
-                   class="form-control inputText" maxlength="9"
-                   ng-class="objError.reserve ? 'danger' : '' "/>
-          </div>
-          <div class="fl textinput" ng-show="showProductInfo">
-            {{Regul.reserve || '-'}}
-          </div>
-        </div>
-        <div class="clearfix w50 fl list">
-          <div class="fl name">
-            成本单价({{(!storeInfo.enType || storeInfo.enType === 'MAINLAND') ? '¥' : '$'}}):
-          </div>
-          <div class="fl input" ng-show="!showProductInfo">
-            <!-- 可编辑状态 oninput="if(value.length>6)value=value.slice(0,6)" -->
-            <input type="text"
-                   placeholder="请输入成本单价"
-                   ng-model="Regul.OnePrice"
-                   ng-blur="setOnePrice(Regul.OnePrice)"
-                   class="form-control inputText" maxlength="12" validata-price
-                   oninput="if(value.length>11)value=value.slice(0,11)"
-                   ng-class="objError.OnePrice ? 'danger' : '' "
-            />
-          </div>
-          <div class="fl textinput" ng-show="showProductInfo">
-            {{Regul.OnePrice || '-'}}
-          </div>
-        </div>
+        <div class="clearfix w50 fl list" style="height:40px;"></div>
+        <!--<div class="clearfix w50 fl list">-->
+          <!--<div class="fl name">-->
+            <!--最小包装数(PCS):-->
+          <!--</div>-->
+          <!--<div class="fl input" ng-show="!showProductInfo">-->
+            <!--&lt;!&ndash; 可编辑状态 &ndash;&gt;-->
+            <!--<input type="text"-->
+                   <!--oninput="if(value.length>6)value=value.slice(0,6)"-->
+                   <!--placeholder="请输入最小包装数"-->
+                   <!--ng-model="Regul.minPackQty"-->
+                   <!--onkeyup="this.value=this.value.replace(/\D|^0/g,'')" onafterpaste="this.value=this.value.replace(/\D|^0/g,'')"-->
+                   <!--ng-blur="setPriceMinPackAmount(Regul.minPackQty)"-->
+                   <!--class="form-control inputText" maxlength="50"-->
+                   <!--ng-class="objError.minPackQty ? 'danger' : '' "-->
+            <!--/>-->
+          <!--</div>-->
+          <!--<div class="fl textinput" ng-show="showProductInfo">-->
+            <!--{{Regul.minPackQty || '-'}}-->
+          <!--</div>-->
+        <!--</div>-->
+        <!--<div class="clearfix w50 fl list">-->
+          <!--<div class="fl name">-->
+            <!--<span class="red">*</span>库存数量(PCS):-->
+          <!--</div>-->
+          <!--<div class="fl input" ng-show="!showProductInfo">-->
+            <!--&lt;!&ndash; 可编辑状态 oninput="if(value.length>6)value=value.slice(0,6)" &ndash;&gt;-->
+            <!--<input type="text"-->
+                   <!--placeholder="请输入库存数量"-->
+                   <!--ng-model="Regul.reserve"-->
+                   <!--ng-blur="setReserve(Regul.reserve)"-->
+                   <!--class="form-control inputText" maxlength="9"-->
+                   <!--ng-class="objError.reserve ? 'danger' : '' "/>-->
+          <!--</div>-->
+          <!--<div class="fl textinput" ng-show="showProductInfo">-->
+            <!--{{Regul.reserve || '-'}}-->
+          <!--</div>-->
+        <!--</div>-->
+        <!--<div class="clearfix w50 fl list">-->
+          <!--<div class="fl name">-->
+            <!--成本单价({{(!storeInfo.enType || storeInfo.enType === 'MAINLAND') ? '¥' : '$'}}):-->
+          <!--</div>-->
+          <!--<div class="fl input" ng-show="!showProductInfo">-->
+            <!--&lt;!&ndash; 可编辑状态 oninput="if(value.length>6)value=value.slice(0,6)" &ndash;&gt;-->
+            <!--<input type="text"-->
+                   <!--placeholder="请输入成本单价"-->
+                   <!--ng-model="Regul.OnePrice"-->
+                   <!--ng-blur="setOnePrice(Regul.OnePrice)"-->
+                   <!--class="form-control inputText" maxlength="12" validata-price-->
+                   <!--oninput="if(value.length>11)value=value.slice(0,11)"-->
+                   <!--ng-class="objError.OnePrice ? 'danger' : '' "-->
+            <!--/>-->
+          <!--</div>-->
+          <!--<div class="fl textinput" ng-show="showProductInfo">-->
+            <!--{{Regul.OnePrice || '-'}}-->
+          <!--</div>-->
+        <!--</div>-->
         <div class="clearfix w50 fl list">
           <div class="fl name">
             规格书:
@@ -367,116 +368,6 @@
       </div>
     </div>
     <div class="single_middle">
-      <!--<div class="title-div" style="margin-top: 20px;">销售信息</div>
-      <div class="single_middle single_top_wrapper clearfix">
-        <div class="w50 fl list">
-          <div class="clearfix marginBottom14">
-            <div class="fl name">最小起订量(PCS):
-            </div>
-            <div class="fl input" style="position: relative" ng-show="!showProductInfo">
-              <input type="text"
-                     placeholder="请输入最小起订量"
-                     maxlength="6"
-                     class="form-control inputText"
-                     oninput="if(value.length>6)value=value.slice(0,6)"
-                     ng-model="Regul.minBuyQty"
-                     ng-change="ProductupdateStartNumber(Regul.minBuyQty)"
-                     ng-blur="ProductblurMinBuyQty(Regul.minBuyQty)"
-                     ng-class="{'danger': objError.minBuyQty}"
-              />
-            </div>
-            <div class="fl textinput" ng-show="showProductInfo">
-              {{Regul.minBuyQty || '-'}}
-            </div>
-          </div>
-          <div class="clearfix marginBottom14">
-            <div class="fl name">交期(天):</div>
-            <div class="fl input" ng-show="!showProductInfo">
-              <input type="text"
-                     placeholder="天数"
-                     maxlength="3"
-                     class="form-control inputText"
-                     oninput="if(value.length>3)value=value.slice(0,3)"
-                     ng-model="Regul.minDelivery"
-                     ng-blur="changeDelivery(Regul.minDelivery, Regul.maxDelivery, true, productUpOff)"
-                     ng-class="{'error' : objError.minDelivery}"
-                     style="width: 144px;display: inline-block;"
-              />&nbsp;-&nbsp;<input type="text"
-                                    style="width: 144px;display: inline-block;"
-                                    placeholder="天数"
-                                    maxlength="3"
-                                    class="form-control inputText"
-                                    oninput="if(value.length>3)value=value.slice(0,3)"
-                                    ng-model="Regul.maxDelivery"
-                                    ng-blur="changeDelivery(Regul.minDelivery, Regul.maxDelivery, true, productUpOff)"
-                                    ng-class="{'danger' : objError.maxDelivery}"
-            />
-            </div>
-            <div class="fl textinput" ng-show="showProductInfo">
-              {{Regul.minDelivery}} - {{Regul.maxDelivery}}
-            </div>
-          </div>
-          <div class="clearfix marginBottom14">
-            <div class="fl name">可拆卖:</div>
-            <div class="fl" ng-show="!showProductInfo">
-              <span class="switch"><button ng-class="{'active' : Regul.breakUp}" ng-click="productToggleIsBreadUp('breakUp', false)"></button></span>
-            </div>
-            <div class="fl textinput" ng-show="showProductInfo">
-              {{Regul.breakUp ? '是': '否'}}
-            </div>
-          </div>
-          <div class="clearfix">
-            <div class="fl name">销售方式:</div>
-            <div class="fl" style="line-height: 34px;"  ng-show="!showProductInfo">
-              <label class="com-check-radio" style="margin-left: 5px;font-size: 14px">
-                <input type="radio" id="autoMonth0" ng-click="productChangeSelfType(1, 'formMe')" name="date" ng-model="Regul.dateArea" value="formMe">
-                <label style="vertical-align: middle;top:0px !important;" for="autoMonth0"></label>
-                自营
-              </label>
-              <label class="com-check-radio" style="margin-left: 10px;font-size: 14px">
-                <input type="radio" id="autoMonth1" ng-click="productChangeSelfType(2, 'autoMonth')" name="date"  ng-model="Regul.dateArea" value="autoMonth">
-                <label style="vertical-align: middle;top:0px !important;" for="autoMonth1"></label>
-                寄售
-              </label>
-            </div>
-            <div class="fl textinput" ng-show="showProductInfo">
-              {{Regul.dateArea === 'formMe' ? '自营': '寄售'}}
-            </div>
-          </div>
-        </div>
-        <div class="w50 fl list">
-          <li class="wuliao_list clearfix">
-            <div class="name pull-left">价格梯度:</div>
-            <div class="list pull-left" style="width: 280px;border: 1px solid #dcdcdc;margin-top: 0px">
-              <div style="background: #f1f3f6;font-size: 14px;color: #333;text-align: center;line-height: 34px;">
-                <span class="fl w50" style="width: 50%">分段数量(PCS)</span>
-                <span class="fl w50" style="width: 50%">分段价格({{storeInfo.enType !== 'HK' ? '¥' : '$'}})</span>
-                <div style="clear:both"></div>
-              </div>
-              <div class="plusBtn" style="font-size: 14px;color: #333;background: #fff;border-top: 1px solid #dcdcdc;position:relative" ng-repeat="price in Regul.prices">
-                <span class="fl w50" style="width: 50%;border-right:1px solid #dcdcdc" ng-show="!showProductInfo">
-                  <input text="text" style="width: 100%;outline: 0;border: 0;text-align: center;height: 30px" maxlength="9" ng-disabled="$index === 0" ng-readonly="$index === 0" ng-model="price.start" ng-blur="productPriceInfoBlur($index, price.start)" />
-                </span>
-                <span class="fl w50" style="text-align: center;border-right:1px solid #dcdcdc" ng-show="showProductInfo">
-                  {{price.start}}+
-                </span>
-                <span class="fl w50" style="width: 50%" ng-show="!showProductInfo">
-                  <input ng-show="storeInfo.enType !== 'HK'" type="text" autocomplete="off" validata-price ng-blur="changePrices(Regul.prices, price.rMBPrice, $index)" oninput="if(value.length>11)value=value.slice(0,11)" style="width: 100%;outline: 0;border: 0;text-align: center;height: 30px" ng-model="price.rMBPrice" />
-                  <input ng-show="storeInfo.enType === 'HK'" type="text" autocomplete="off" validata-price ng-blur="changePrices(Regul.prices, price.uSDPrice, $index)" oninput="if(value.length>11)value=value.slice(0,11)" style="width: 100%;outline: 0;border: 0;text-align: center;height: 30px" ng-model="price.uSDPrice" />
-                </span>
-                <span class="fl w50" ng-show="showProductInfo" style="text-align: center">
-                  {{price.rMBPrice || price.uSDPrice || '-'}}
-                </span>
-                <div style="clear:both"></div>
-                <div class="input-list ng-scope" style="height: 24px;line-height: 24px;position: absolute;right: -38px;top: 3px" ng-show="!showProductInfo">
-                  <a class="reduce" ng-disabled="Regul.prices.length < 2" ng-click="productDeleteFragment(Regul.prices, $index)" disabled="disabled"><i class="fa fa-minus-circle restrict-color" ng-class="{ 'restrict-color':Regul.prices.length === 1 }"></i></a>
-                  <a class="add" ng-click="productAddFragment(Regul.prices)" ng-disabled="Regul.prices.length >= 3"><i class="fa fa-plus-circle" ng-class="{ 'restrict-color': $index === 2 }"></i></a>
-                </div>
-              </div>
-            </div>
-          </li>
-        </div>
-      </div>-->
       <div class="editRegulControll">
         <div ng-click="clearCheckBox()" ng-show="!showProductInfo">取消</div>
         <div ng-click="productSave()"  ng-show="!showProductInfo">确定</div>