Prechádzať zdrojové kódy

Merge branch 'feature-pcb-wangyc-0420' into feature-yc-201813

yangc 7 rokov pred
rodič
commit
8197d095d0
39 zmenil súbory, kde vykonal 1601 pridanie a 82 odobranie
  1. 7 0
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java
  2. 26 0
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  3. 38 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  4. 4 0
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  5. 17 0
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  6. 116 12
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  7. 1 0
      src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/KindServiceImpl.java
  8. 42 0
      src/main/java/com/uas/platform/b2c/prod/commodity/api/GoodsController.java
  9. 2 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  10. 40 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  11. 106 2
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  12. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  13. 98 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/PCBDao.java
  14. 16 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/PcbPropertyvalueDao.java
  15. 8 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java
  16. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  17. 142 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/PCB.java
  18. 99 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/PCBPropertyValue.java
  19. 103 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  20. 27 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  21. 2 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  22. 4 2
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ReleaseProductByBatchService.java
  23. 169 3
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  24. 65 0
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  25. 202 60
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  26. 1 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentGoods.java
  27. 37 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/api/KindController.java
  28. 28 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindInfoDao.java
  29. 1 1
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/Kind.java
  30. 33 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindService.java
  31. 117 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindServiceImpl.java
  32. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/property/dao/PropertyDao.java
  33. 15 1
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java
  34. 10 0
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java
  35. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatch-rmb.xls
  36. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-rmb.xls
  37. BIN
      src/main/resources/jxls-tpl/trade/releasePCBByBatchError-usd.xls
  38. BIN
      src/main/resources/jxls-tpl/trade/releasePCBbyBatch-usd.xls
  39. BIN
      src/main/webapp/WEB-INF/cert/client.keystore

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

@@ -119,6 +119,13 @@ public class SearchUrl {
      */
     public static final String GOODIS_URL= "/search/goodsIds?keyword={keyword}&params={params}";
 
+    /**
+     * 搜索pcb库存信息
+     */
+    public static final String PCBGOODIS_URL= "/search/pcbGoodsIds?keyword={keyword}&params={params}";
+
+    public static final String PCB_COLLECT_URL= "/search/collectBySearchPCBGoods?keyword={keyword}&collectedField={collectedField}&filters={filters}";
+
     /**
      * 搜索库存信息(类目)
      */

+ 26 - 0
src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.common.search.controller;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.search.dao.SearchHistoryDao;
 import com.uas.platform.b2c.common.search.model.SearchHistory;
+import com.uas.platform.b2c.common.search.rpc.service.SearchService;
 import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
@@ -73,6 +74,7 @@ public class SearcherController {
 	@Autowired
 	private SearchHistoryDao searchHistoryDao;
 
+
 	/**
 	 * 作搜索展示跳转
 	 * 
@@ -268,6 +270,30 @@ public class SearcherController {
         return searcherService.getCollectlistBySearchComponentGoods(keyword,collectList,paramJSON,request);
     }
 
+	/**
+	 * 批次搜索PCB结构的类目,品牌统计
+	 *
+	 * @param keyword 关键词
+	 * @return 类目,品牌统计
+	 */
+	@RequestMapping(value = "/PCBGoods/collect", method = RequestMethod.GET)
+	@ResponseBody
+	public List<Map<String, Object>> searchCollectListBySearchPCBGoods(String keyword, String collectedField, String filters , HttpServletRequest request) {
+		return searcherService.getCollectlistBySearchPCBGoods(keyword,collectedField,filters,request);
+	}
+
+	/**
+	 * 分页获取pcb信息
+	 * @param keyword
+	 * @param params
+	 * @return
+	 */
+	@RequestMapping(value = "/pcbgoods/page",method = RequestMethod.GET)
+	@ResponseBody
+	public Map getPcbGoods(String keyword, PageParams params,HttpServletRequest request) {
+		return goodsService.getPCBGoodsBySearch(keyword, params, request);
+	}
+
 
 	/**
 	 * 根据输入获取联想词(包括器件、类目、品牌,按顺序获取,数量不足,才会获取下一个)

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

@@ -459,4 +459,42 @@ public class SearchServiceImpl implements SearchService{
         map.put("size", size);
         return map;
     }
+
+    @Override
+    public List<Map<String, Object>> collectBySearchPCBGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters) {
+        Map<String, Object> map = new HashedMap();
+        map.put("keyword", keyword);
+        map.put("collectedField", collectField);
+        map.put("filters", FastjsonUtils.toJson(filters));
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PCB_COLLECT_URL, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        }else {
+            try {
+                List<Map<String, Object>> reMap = FastjsonUtils.fromJson(str, List.class);
+                return reMap;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
+
+    public Map<String,Object> getPcbGoodsIds(String keyword, PageParams var2) throws  SearchException {
+        Map<String, Object> map = new HashedMap();
+        map.put("keyword", keyword);
+        map.put("params", FlexJsonUtils.toJsonDeep(var2));
+        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.PCBGOODIS_URL, String.class, map);
+        if(StringUtils.isEmpty(str)) {
+            return null;
+        }else {
+            try {
+                Map<String, Object> reMap = FastjsonUtils.fromJson(str, Map.class);
+                return reMap;
+            }catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+    }
 }

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

@@ -56,4 +56,8 @@ public interface SearchService {
     Map<String, Object> getGoodsIdsForKinds(PageParams var2) throws SearchException;
 
     List<Map<String, Object>> collectBySearchGoods(String keyword, CollectField collectField, Map<PageParams.FilterField, Object> filters);
+
+    Map<String,Object> getPcbGoodsIds(String keyword,PageParams var2) throws  SearchException;
+
+    List<Map<String,Object>> collectBySearchPCBGoods(String keyword,CollectField collectField,Map<PageParams.FilterField, Object> filters);
 }

+ 17 - 0
src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java

@@ -19,6 +19,15 @@ import java.util.Map;
  */
 public interface SearcherService {
 
+
+	/**
+	 * 分页获取pcb商品信息
+	 * @param keyword
+	 * @param page
+	 * @return
+	 */
+	ModelMap getPcbGoods(String keyword, PageParams page,HttpServletRequest request);
+
 	/**
 	 * 智能搜索器件
 	 * 
@@ -110,6 +119,14 @@ public interface SearcherService {
 	 */
 	public List<Map<String, Object>> getCollectlistBySearchComponentGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request);
 
+	/**
+	 * 批次搜索PCB结构的类目,品牌统计
+	 * @param keyword 关键词
+	 * @param collectList
+	 * @param paramJSON 参数json
+	 * @return 类目,品牌统计
+	 */
+	public List<Map<String, Object>> getCollectlistBySearchPCBGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request);
 
 	/**
 	 * 根据输入获取联想词(包括器件、类目、品牌,按顺序获取,数量不足,才会获取下一个)

+ 116 - 12
src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java

@@ -15,6 +15,8 @@ import com.uas.platform.b2c.core.constant.Type;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
@@ -22,10 +24,22 @@ import com.uas.platform.b2c.prod.product.component.dao.ComponentGoodsDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentInfoDao;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
+import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.core.exception.SystemException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.search.exception.SearchException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,18 +52,6 @@ import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
 /**
  * 搜索索引
  *
@@ -80,6 +82,15 @@ public class SearcherServiceImpl implements SearcherService {
 	@Autowired
 	private SearchHistoryDao searchHistoryDao;
 
+	@Autowired
+    private PCBDao pcbDao;
+
+	@Autowired
+    private ProductDao productDao;
+
+	@Autowired
+    private OrderDetailDao orderDetailDao;
+
 	private Logger logger = LoggerFactory.getLogger(getClass());
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
@@ -364,6 +375,36 @@ public class SearcherServiceImpl implements SearcherService {
         return collectResult;
     }
 
+    /**
+     * 批次搜索的类目,品牌统计
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getCollectlistBySearchPCBGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request) {
+        List<Map<String, Object>> collectResult = new ArrayList<>();
+        JSONObject jsonObject = FastjsonUtils.parseObject(paramJSON);
+        Set<Entry<String, Object>> paramEntry = jsonObject.entrySet();
+        Map<com.uas.platform.b2c.common.search.util.PageParams.FilterField, Object> param = new LinkedHashMap<>();
+        for (Entry<String, Object> entry : paramEntry) {
+            param.put(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
+        }
+        try {
+            collectResult = searchService.collectBySearchPCBGoods(keyword, CollectField.valueOf(collectList.toUpperCase()), param);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        if ("goods_brand".equals(collectList)) {
+            if (this.deviceResolver.resolveDevice(request).isMobile()) {
+                for (Map<String, Object> m : collectResult) {
+                    m.put("logoUrl", brandDao.findOne(Long.parseLong(m.get("br_id").toString())).getLogoUrl());
+                }
+            }
+        }
+        return collectResult;
+    }
+
     @Override
     public Map<String, Object> getSimilarKeywords(String keyword) {
         Map<String, Object> result = null;
@@ -491,4 +532,67 @@ public class SearcherServiceImpl implements SearcherService {
 		logger.error(e.getMessage(), e);
 		throw new SystemException(e.getMessage());
 	}
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ModelMap getPcbGoods(String keyword, PageParams page,HttpServletRequest request) {
+        if (this.deviceResolver.resolveDevice(request).isMobile()) {
+            SystemSession.setUser((User)request.getSession().getAttribute("user"));
+            if (null != SystemSession.getUser() && null!= SystemSession.getUser().getUserUU()){
+                SearchHistory searchHistory = null;
+                List<SearchHistory> searchHistories = searchHistoryDao.findByKeywordAndUserUUAndUserEnuu(keyword,SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+                if (searchHistories.size()>0){
+                    searchHistory = searchHistories.get(0);
+                }else {
+                    searchHistory = new SearchHistory();
+                }
+                searchHistory.setKeyword(keyword);
+                searchHistory.setSearchTime(new Date(System.currentTimeMillis()));
+                searchHistory.setUserUU(SystemSession.getUser().getUserUU());
+                searchHistory.setUserEnuu(SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+                searchHistoryDao.save(searchHistory);
+                searchHistories = searchHistoryDao.findByUserUUAndUserEnuuOrderBySearchTimeDesc(SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+                if (searchHistories.size()>10){
+                    searchHistoryDao.delete(searchHistories.subList(10,searchHistories.size()));
+                }
+            }
+        }
+        ModelMap map = new ModelMap();
+        Map<String,Object> results = null;
+        try {
+            results = searchService.getPcbGoodsIds(keyword,convertPageParams(page));
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        if ((int)results.get("total") == 0){
+            map.put("total", results.get("total"));// 搜索结果总数
+            map.put("page", results.get("page"));// 当前页面
+            map.put("size", results.get("size"));// 每页个数
+            map.put("pcbgoods", new ArrayList<>());// 当前页器件内容
+            return map;
+        }
+        List<Integer> goodsIds = (List<Integer>)results.get("goodsIds");
+	    List<Goods> pcbGoods = new ArrayList<>();
+	    if (!CollectionUtils.isEmpty(goodsIds)) {
+	        for (int i = 0;i < goodsIds.size();i++) {
+	            Long goodid = null;
+	            if (!StringUtils.isEmpty(goodsIds.get(i))) {
+	                goodid = Long.valueOf(goodsIds.get(i).toString());
+                }
+                if (goodid != null) {
+                    Goods good = goodsDao.findOne(goodid);
+                    if (good != null) {
+                        Double number = orderDetailDao.getPCBSaleQtyByBatchcodesAndStatus(good.getBatchCode());
+                        good.setSaleQty(number == null ? 0 : number);
+                        pcbGoods.add(good);
+                    }
+                }
+            }
+            map.put("pcbgoods",pcbGoods);
+        }
+        map.put("total", results.get("total"));// 搜索结果总数
+        map.put("page", results.get("page"));// 当前页面
+        map.put("size", results.get("size"));// 每页个数
+	    return map;
+    }
 }

+ 1 - 0
src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/KindServiceImpl.java

@@ -109,6 +109,7 @@ public class KindServiceImpl implements KindService {
         return kindPropertyUas;
     }
 
+
     @Override
     public Map<String, List<KindUas>> getParentsByKindCode(String kindCode) {
         Map<Long, Kind> maps = new HashMap<>();

+ 42 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/api/GoodsController.java

@@ -0,0 +1,42 @@
+package com.uas.platform.b2c.prod.commodity.api;
+
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by wangyc on 2018/4/23.
+ *
+ * @version 2018/4/23 9:35 wangyc
+ */
+@RestController("APIGoodsController")
+@RequestMapping("/api/product/goods")
+public class GoodsController {
+
+    private final GoodsService goodsService;
+
+    @Autowired
+    public GoodsController(GoodsService goodsService) {
+        this.goodsService = goodsService;
+    }
+
+    /**
+     * 通过品牌uuid,类目id,关键词获取物料信息(暂时针对pcb模块)
+     * @param pageParams 分页参数
+     * @param branduuid 品牌uuid
+     * @param kindid 类目id
+     * @param keyword 关键词
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
+    public Page<Goods> findProducts(PageParams pageParams, @RequestParam(value = "branduuid", required = true) String branduuid, @RequestParam(value = "kindid", required = false) String kindid, @RequestParam(value = "keyword", required = false) String keyword) {
+        return goodsService.findGoods(pageParams, branduuid, kindid, keyword);
+    }
+
+}

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

@@ -37,6 +37,8 @@ public enum  ErrorInfoConstant {
     BRAND_EMPTY_INFO("英文/中文品牌名称不能为空"),
     KIND_EMPTY_INFO("类目(产品名称)不能为空"),
     KIND_LENGTH_INFO("类目(产品名称)不能超过20个字符"),
+    // PCB模块使用
+    KIND_UNSTANDARD("类目(产品名称)不是商城标准类目"),
     BREAK_UP_INFO("请选择可拆卖情况是或否"),
     RESERVE_NUMBER_INFO("库存须填写小于10亿的正整数"),
     PRODUCE_DATE_INFO("生产日期不能为空"),

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

@@ -111,21 +111,56 @@ public final class UploadConstant {
      */
     public static final int PRICE_THIRD = 16;
 
+    /**
+     * 分段价格结束
+     */
+    public static final int PRICE_END = 14;
+
     /**
      * 自定义标签
      */
     public static final int CUSTOM_LABEL = 17;
 
+    /**
+     * 尺寸(pcb)
+     */
+    public static final int SIZE = 18;
+
+    /**
+     * 颜色(pcb)
+     */
+    public static final int COLOR = 19;
+
+    /**
+     * 铜厚(pcb)
+     */
+    public static final int THICK_COPPER = 20;
+
+    /**
+     * 厚度(pcb)
+     */
+    public static final int THICK = 21;
+
     /**
      * 导入表的最大列数
      */
     public static final int TOTAL_COLUMN = 18;
 
+    /**
+     * 导入pcb表的最大列数
+     */
+    public static final int TOTAL_COLUMN_PCB = 22;
+
     /**
      * 用户可能直接用导入失败的表格进行导入
      */
     public static final int MAX_TOTAL_COLUMN = 19;
 
+    /**
+     * 用户可能直接用导入失败的pcb表格进行导入
+     */
+    public static final int MAX_TOTAL_COLUMN_PCB = 23;
+
     /**
      * 个人导入表的最大列数
      */
@@ -140,4 +175,9 @@ public final class UploadConstant {
      * 规格的最大长度
      */
     public static final int SPEC_MAX_BYTE = 50;
+
+    /**
+     * PCB一级类目id
+     */
+    public static final long PCB_PARENTID = 3825L;
 }

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

@@ -153,7 +153,19 @@ public class ReleaseProductByBatchController {
     @RequestMapping(value = "/batchRelease", method = RequestMethod.POST)
     public String batchRelease(String batch) {
         logger.log("批量上架模块", "批量发布指定批次:" + batch + "的上架内容");
-        return releaseProductByBatchService.publishByBatch(batch);
+        return releaseProductByBatchService.publishByBatch(batch, false);
+    }
+
+    /**
+     * 通过batch批量发布产品(pcb)
+     *
+     * @param batch the batch 发布的批次号
+     * @return string
+     */
+    @RequestMapping(value = "/batchRelease/pcb", method = RequestMethod.POST)
+    public String batchPCBRelease(String batch) {
+        logger.log("批量上架模块", "批量发布指定批次:" + batch + "的上架内容");
+        return releaseProductByBatchService.publishByBatch(batch, true);
     }
 
     /**
@@ -219,7 +231,39 @@ public class ReleaseProductByBatchController {
             } else {
                 throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
             }
-            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson, repeatImport);
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson, repeatImport, false);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        logger.log("批量上架模块", "导入Excel批量上传商品");
+        return map;
+    }
+
+    /**
+     * 通过excel批量导入PCB商品发布(大量)
+     * @param uploadItem 上传内容
+     * @param currency 币别
+     * @param repeatImport 重复导入
+     * @return
+     */
+    @RequestMapping(value = "/release/excel/pcb", method = RequestMethod.POST)
+    public ModelMap releasePCBByExcel(FileUpload uploadItem, String currency, Integer repeatImport) {
+        ModelMap map = new ModelMap();
+        String fileName = uploadItem.getFile().getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        InputStream is = null;
+        Workbook workbook = null;
+        try {
+            is = uploadItem.getFile().getInputStream();
+            if ("xls".equals(suffix)) {
+                workbook = new HSSFWorkbook(is);
+            } else if ("xlsx".equals(suffix)) {
+                workbook = new XSSFWorkbook(is);
+            } else {
+                throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
+            }
+            // pcb都为店铺自营、非个人上传、属于PCB模块上传
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, true, currency, IntegerConstant.NO_SHORT.intValue(), repeatImport, true);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -271,6 +315,49 @@ public class ReleaseProductByBatchController {
         return releaseProductByBatchService.getPageReleaseProductByBatch(info, batch);
     }
 
+    /**
+     * 导出不合格的数据(pcb)
+     *
+     * @param batch   the batch 批次号
+     * @param request the request 请求对象
+     * @param isAjax  the is ajax 是否是ajax 请求
+     * @return model and view
+     */
+    @RequestMapping(value = "/release/failure/pcb/xls", method = RequestMethod.GET)
+    public ModelAndView exportPcbOrderses(String batch, HttpServletRequest request, @RequestParam(defaultValue = "false") Boolean isAjax, String currency, Integer isPerson) {
+        ModelAndView modelAndView = new ModelAndView();
+        HttpSession session = request.getSession();
+        Object loading = session.getAttribute("load-error-ing");
+        if (isAjax) {
+            MappingJackson2JsonView view = new MappingJackson2JsonView();
+            Map attributes = new HashMap();
+            if (loading == null || !Boolean.valueOf(loading.toString())) {
+                attributes.put("load", false);
+            } else if (Boolean.valueOf(loading.toString())) {
+                attributes.put("load", true);
+            }
+            view.setAttributesMap(attributes);
+            modelAndView.setView(view);
+            return modelAndView;
+        }
+        if (loading == null || !Boolean.valueOf(loading.toString())) {
+            session.setAttribute("load-error-ing", true);
+        }
+        modelAndView.addObject("data", releaseProductByBatchService.findFailureReleaseProductByBatch(batch));
+        String url ="";
+
+        if (Currency.USD.equals(currency)) {
+            url = "classpath:jxls-tpl/trade/releasePCBByBatchError-usd";
+        } else {
+            url = "classpath:jxls-tpl/trade/releasePCBByBatchError-rmb";
+        }
+
+        modelAndView.setView(new JxlsExcelView(url, "导入失败产品-优软商城"));
+        logger.log("批量上架模块", "以Excel形式导出批量上架商品匹配不合格的数据");
+        session.setAttribute("load-error-ing", false);
+        return modelAndView;
+    }
+
     /**
      * 导出不合格的数据
      *
@@ -370,4 +457,21 @@ public class ReleaseProductByBatchController {
         session.setAttribute("load-error-ing", false);
         return modelAndView;
     }
+
+    /**
+     * 获取批量发布PCB商品的模板(大量)
+     * @param currency
+     * @return
+     */
+    @RequestMapping(value = "/release/template/pcb", method = RequestMethod.GET)
+    public ModelAndView exportOrdersesPCB(String currency) {
+        ModelAndView modelAndView = new ModelAndView();
+        logger.log("商品批次", "下载批量上架PCB商品的Excel模板");
+        if (Currency.USD.equals(currency)) {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasePCBbyBatch-usd", "PCB产品导入模板-优软商城"));
+        } else {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasePCBByBatch-rmb", "PCB产品导入模板-优软商城"));
+        }
+        return modelAndView;
+    }
 }

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

@@ -760,4 +760,12 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      */
     @Query(value = "select g.tag from Goods g where g.productid = :productId and g.tag like'类型%' order by g.tag")
     List<String> getTagByProductId(@Param("productId") Long productId);
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    @Query(value = "select distinct g.enUU from Goods g where g.storeid = :storeid")
+    Long findenUUByStoreid(@Param("storeid") String storeid);
 }

+ 98 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/PCBDao.java

@@ -0,0 +1,98 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.PCB;
+import java.util.List;
+import java.util.Set;
+
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.security.access.method.P;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by wangyc on 2018/4/23.
+ *
+ * @version 2018/4/23 10:20 wangyc
+ */
+@Repository
+public interface PCBDao extends  JpaSpecificationExecutor<PCB>, JpaRepository<PCB, Long> {
+
+    /**
+     * 通过品牌id获取物料id
+     * @param brandid 品牌id
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_brandid =:brandid")
+    List<Long> findProductIdByBrandid(@Param("brandid") Long brandid);
+
+    /**
+     * 通过类目id获取物料id
+     * @param kindid 类目id
+     * @return
+     */
+    @Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_kindid =:kindid")
+    List<Long> findProductIdByKindid(@Param("kindid") Long kindid);
+
+    /**
+     * 通过类目id、品牌id获取物料id
+     * @param kindid
+     * @param brandid
+     * @return
+     */@Query(nativeQuery = true, value = "select pcb_productid from product$pcb where pcb_kindid =:kindid and pcb_brandid =:brandid")
+    List<Long> findProductIdByKindidAndBrandid(@Param("kindid") Long kindid, @Param("brandid") Long brandid);
+
+
+    /**
+     * 根据PCB器件的品牌id获取器件的类目id,按器件数量倒序排序
+     *
+     * @param brandId 品牌id
+     * @return 器件信息
+     */
+    @Query("select p.kindid from PCB p where p.brandid = :brandId group by p.kindid order by count(p.kindid) desc")
+    public List<Long> findKindInfoIdByBandId(@Param("brandId") Long brandId);
+
+    /**
+     * 根据PCB物料id获取物料属性信息
+     *
+     * @param productId
+     * @return 物料属性信息
+     */
+    @Query("SELECT p1,p1.property from PCBPropertyValue p1 ,Property p2 WHERE p1.propertyid = p2.id and p1.productid = :productId")
+    public List<PCBPropertyValue> findByPCBProductId(@Param("productId") Long productId);
+
+    /**
+     * 根据企业enUU获取PCB类目id信息
+     *
+     * @param enUU
+     * @return 物料属性信息
+     */
+    @Query("select distinct pcb.kindid from PCB pcb where pcb.productid in (select p.id from Product p where p.enUU = :enUU)")
+    public Set<Long> findByEnUU(@Param("enUU") Long enUU);
+
+    /**
+     * 通过物料id获取pcb信息
+     * @param productid
+     * @return
+     */
+    public List<PCB> findByProductid(Long productid);
+
+    /**
+     * 根据类目查找物料id
+     * @param kindIds
+     * @return
+     */
+    @Query("select distinct p.productid from PCB p where p.kindid in :kindIds")
+    public List<Long> findByKindIds(@Param("kindIds") Long[] kindIds);
+
+    /**
+     * 通过pcbids查找物料id
+     * @param pcbIds
+     * @return
+     */
+    @Query("select p.productid from PCB p where p.id = :pcbIds")
+    public Long findProductIdByPCBIds(@Param("pcbIds") Long pcbIds);
+}

+ 16 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/PcbPropertyvalueDao.java

@@ -0,0 +1,16 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Created by wangyc on 2018/6/8.
+ *
+ * @version 2018/6/8 15:40 wangyc
+ */
+@Repository
+public interface PcbPropertyvalueDao extends JpaSpecificationExecutor<PCBPropertyValue>, JpaRepository<PCBPropertyValue, Long> {
+
+}

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

@@ -82,6 +82,14 @@ public interface ReleaseProductByBatchDao
     @Procedure(procedureName = "PRODUCT_RELEASE_VALID_V2")
 	public void callValidProcedure(Long publisherUu, String batchid);
 
+	/**
+	 * 验证器件和品牌的信息pcb
+	 * @param publisherUu
+	 * @param batchid
+	 */
+	@Procedure(procedureName = "PRODUCT_RELEASE_VALID_V2_PCB")
+	public void callValidProcedurePcb(Long publisherUu, String batchid);
+
     /**
      * 创建时间 :2017年1月6日 下午8:25:57
      *

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

@@ -536,6 +536,16 @@ public class Goods implements Serializable {
 	@Transient
 	private String selfSale;
 
+	@Transient
+	private Double saleQty;
+
+	public Double getSaleQty() {
+		return saleQty;
+	}
+
+	public void setSaleQty(Double saleQty) {
+		this.saleQty = saleQty;
+	}
 
 	/**************************************************************************
 	 * Getter And Setter

+ 142 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/PCB.java

@@ -0,0 +1,142 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * PCB实体(含PCB物料的类目、品牌信息)
+ * Created by wangyc on 2018/4/20.
+ *
+ * @version 2018/4/20 10:36 wangyc
+ */
+@Entity
+@Table(name = "product$pcb")
+public class PCB implements Serializable{
+
+    private static final long serialVersionUID = - 3347614981949922491L;
+
+    @Id
+    @Column(name = "pcb_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "pcb_productid")
+    private Long productid;
+
+    /**
+     * 物料信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "pcb_productid", insertable = false, updatable = false)
+    private Product product;
+
+    /**
+     * 类目id
+     */
+    @Column(name = "pcb_kindid")
+    private Long kindid;
+
+    /**
+     * 类目信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH})
+    @JoinColumn(name = "pcb_kindid", insertable = false, updatable = false)
+    private KindInfo kind;
+
+    /**
+     * 品牌id
+     */
+    @Column(name = "pcb_brandid")
+    private Long brandid;
+
+    /**
+     * 品牌信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH})
+    @JoinColumn(name = "pcb_brandid", insertable = false, updatable = false)
+    private BrandInfo brand;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "pcb_createtime")
+    private Date createtime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getProductid() {
+        return productid;
+    }
+
+    public void setProductid(Long productid) {
+        this.productid = productid;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Long getKindid() {
+        return kindid;
+    }
+
+    public void setKindid(Long kindid) {
+        this.kindid = kindid;
+    }
+
+    public KindInfo getKind() {
+        return kind;
+    }
+
+    public void setKind(KindInfo kind) {
+        this.kind = kind;
+    }
+
+    public Long getBrandid() {
+        return brandid;
+    }
+
+    public void setBrandid(Long brandid) {
+        this.brandid = brandid;
+    }
+
+    public BrandInfo getBrand() {
+        return brand;
+    }
+
+    public void setBrand(BrandInfo brand) {
+        this.brand = brand;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+}

+ 99 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/PCBPropertyValue.java

@@ -0,0 +1,99 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.uas.platform.b2c.prod.product.property.model.Property;
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+/**
+ * PCB参数值
+ * Created by wangyc on 2018/4/20.
+ *
+ * @version 2018/4/20 10:53 wangyc
+ */
+@Entity
+@Table(name = "product$pcb_propertyvalue")
+public class PCBPropertyValue implements Serializable{
+
+    private static final long serialVersionUID = 8646182359961620603L;
+
+    @Id
+    @Column(name = "pcbpv_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 物料id
+     */
+    @Column(name = "pcbpv_productid")
+    private Long productid;
+
+    /**
+     * 参数id
+     */
+    @NotNull
+    @Column(name = "pcbpv_propertyid")
+    private Long propertyid;
+
+    /**
+     * 参数信息
+     */
+    @OneToOne(cascade = {CascadeType.REFRESH})
+    @JoinColumn(name = "pcbpv_propertyid", insertable = false, updatable = false)
+    private Property property;
+
+    /**
+     * 参数值
+     */
+    @Column(name = "pcbpv_value")
+    private String value;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getPropertyid() {
+        return propertyid;
+    }
+
+    public void setPropertyid(Long propertyid) {
+        this.propertyid = propertyid;
+    }
+
+    public Long getProductid() {
+        return productid;
+    }
+
+    public void setProductid(Long productid) {
+        this.productid = productid;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public PCBPropertyValue() {
+
+    }
+
+    public PCBPropertyValue(Long propertyid, String value) {
+        this.productid = propertyid;
+        this.value = value;
+    }
+}

+ 103 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -286,6 +286,30 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_selfmindeliverystr")
 	private String selfMinDeliveryStr;
 
+	/**
+	 * 尺寸(pcb)
+	 */
+	@Column(name = "rel_size")
+	private String size;
+
+	/**
+	 * 颜色(pcb)
+	 */
+	@Column(name = "rel_color")
+	private String color;
+
+	/**
+	 * 铜厚(pcb)
+	 */
+	@Column(name = "rel_thickcopper")
+	private String thickCopper;
+
+	/**
+	 * 厚度(pcb)
+	 */
+	@Column(name = "rel_thick")
+	private String thick;
+
 //	/**
 //	 * 商城最长交期
 //	 */
@@ -627,6 +651,9 @@ public class ReleaseProductByBatch implements Serializable {
 
 	public void setReserveByExcel(Object value) {
 		setReserveStr(StringUtilB2C.getStr(value));
+		if (value == null || !RegexConstant.isNumber(value.toString())) {
+			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+		}
 		if (value == null || StringUtils.isEmpty(value) || !RegexConstant.isNumber(value.toString())) {
 			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
 		} else {
@@ -775,6 +802,50 @@ public class ReleaseProductByBatch implements Serializable {
 
 	}
 
+	public void setSizeByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setSize(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setColorByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setColor(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setThickCopperByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setThickCopper(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
+	public void setThickByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 256) {
+				setThick(str);
+			}
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+	}
+
 	@Override
 	public int hashCode() {
 		int result = (brandNameEn == null ? 0 : brandNameEn.hashCode());
@@ -1690,4 +1761,36 @@ public class ReleaseProductByBatch implements Serializable {
 		this.spec = spec;
 		return this;
 	}
+
+	public String getSize() {
+		return size;
+	}
+
+	public void setSize(String size) {
+		this.size = size;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+
+	public String getThickCopper() {
+		return thickCopper;
+	}
+
+	public void setThickCopper(String thickCopper) {
+		this.thickCopper = thickCopper;
+	}
+
+	public String getThick() {
+		return thick;
+	}
+
+	public void setThick(String thick) {
+		this.thick = thick;
+	}
 }

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

@@ -14,6 +14,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.ui.ModelMap;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -709,4 +710,30 @@ public interface GoodsService {
      * @return
      */
     Goods getGoodsById(Long id);
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    public Long findenUUByStoreid(String storeid);
+
+    /**
+     * 返回PCB商品信息
+     * @param keyword
+     * @param var2
+     * @param request
+     * @return
+     */
+    public ModelMap getPCBGoodsBySearch( String keyword, PageParams var2, HttpServletRequest request);
+
+    /**
+     * 通过品牌uuid,类目id,关键词获取批次信息(暂时针对pcb模块)
+     * @param params 分页参数
+     * @param branduuid 品牌uuid
+     * @param kindid 类目id
+     * @param keyword 关键词
+     * @return
+     */
+    Page<Goods> findGoods(PageParams params, String branduuid, String kindid, String keyword);
 }

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

@@ -5,6 +5,7 @@ import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
@@ -262,4 +263,5 @@ public interface ProductService {
      * @return
      */
     Double getQtyInOrderToBeUpload(List<String> batches);
+
 }

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

@@ -31,9 +31,10 @@ public interface ReleaseProductByBatchService {
      * @param workbook the workbook 上传的文件
      * @param selfSale 是否自售
      * @param currency
+     * @param isPcb 是否PCB模块上传
      * @return model map
      */
-    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport);
+    public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport, boolean isPcb);
 
     /**
      * 通过Excel上传资料修改商品
@@ -71,9 +72,10 @@ public interface ReleaseProductByBatchService {
      * 批量发布验证通过的信息
      *
      * @param batch the batch
+     * @param isPcb 是否PCB模块
      * @return string
      */
-    public String publishByBatch(String batch);
+    public String publishByBatch(String batch, boolean isPcb);
 
     /**
      * 批量批量导入个人产品库

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import static com.uas.platform.core.persistence.criteria.PredicateUtils.like;
+
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.core.model.OperateErrorStatus;
 import com.uas.api.b2c_erp.seller.model.GoodsFUas;
@@ -11,6 +13,7 @@ import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
 import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.constant.SplitChar;
@@ -24,6 +27,16 @@ import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
 import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsSimpleDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
@@ -38,6 +51,20 @@ import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory.OperateType;
 import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
+import com.uas.platform.b2c.prod.commodity.model.GoodsPriceInfo;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
+import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsPriceInfoService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ProductStandardPutOnInfoService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.commodity.model.GoodsInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsModifyInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsPriceInfo;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
@@ -56,10 +83,14 @@ import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 import com.uas.platform.b2c.prod.commodity.status.ModifyInfoStatus;
 import com.uas.platform.b2c.prod.commodity.type.ModifyConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
+import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
@@ -97,6 +128,31 @@ import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import com.uas.platform.core.util.StringUtil;
+import java.math.BigInteger;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.log4j.Logger;
@@ -124,6 +180,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigInteger;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -162,6 +219,9 @@ public class GoodsServiceImpl implements GoodsService {
      */
     private final BoundedExecutor executor;
 
+    @Autowired
+    private PCBDao pcbDao;
+
     @Autowired
     private GoodsDao goodsDao;
 
@@ -213,6 +273,9 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private SysConf sysConf;
 
+    @Autowired
+    private SearcherService searcherService;
+
     @Autowired
     private JdbcTemplate jdbcTemplate;
 
@@ -251,13 +314,17 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
 
+    private final BrandDao brandDao;
+
+    private final KindInfoDao kindInfoDao;
+
     @Autowired
     private GoodsModifyInfoDao goodsModifyInfoDao;
 
     private final Logger logger = Logger.getLogger(getClass());
 
     @Autowired
-    public GoodsServiceImpl(KindService kindService, StoreInDao storeInDao, StoreInService storeInService, ProductStandardPutOnInfoDao productStandardPutOnInfoDao, ProductDao productDao, BrowsingHistoryService browsingHistoryService, RecommendProductService recommendProductService) {
+    public GoodsServiceImpl(KindService kindService, StoreInDao storeInDao, StoreInService storeInService, ProductStandardPutOnInfoDao productStandardPutOnInfoDao, ProductDao productDao, BrowsingHistoryService browsingHistoryService, RecommendProductService recommendProductService, BrandDao brandDao, KindInfoDao kindInfoDao) {
         this.kindService = kindService;
         this.storeInDao = storeInDao;
         this.storeInService = storeInService;
@@ -265,6 +332,8 @@ public class GoodsServiceImpl implements GoodsService {
         this.productDao = productDao;
         this.browsingHistoryService = browsingHistoryService;
         this.recommendProductService = recommendProductService;
+        this.brandDao = brandDao;
+        this.kindInfoDao = kindInfoDao;
         ExecutorService executorService = Executors.newCachedThreadPool();
         executor = new BoundedExecutor(executorService, 1600);
     }
@@ -2541,9 +2610,22 @@ public class GoodsServiceImpl implements GoodsService {
             } else {
                 if (kindUuid.contains(",")) {
                     String[] kindIds = kindUuid.split(",");
-                    pageInfo.expression(PredicateUtils.in("kindUuid", kindIds, false));
+                    Long[] listkids = (Long[]) ConvertUtils.convert(kindIds,Long.class);
+                    if (listkids != null && listkids.length > 0) {
+                        List<Long> productIds = pcbDao.findByKindIds(listkids);
+                        if (!CollectionUtils.isEmpty(productIds)) {
+                            pageInfo.expression(PredicateUtils.in("productid",productIds,false));
+                        } else {
+                            pageInfo.expression(PredicateUtils.in("kindUuid", kindIds, false));
+                        }
+                    }
                 } else {
-                    pageInfo.expression(PredicateUtils.eq("kindUuid", kindUuid, false));
+                    List<Long> productId = pcbDao.findProductIdByKindid(Long.parseLong(kindUuid));
+                    if (!CollectionUtils.isEmpty(productId)) {
+                        pageInfo.expression(PredicateUtils.eq("productid",productId.get(0),false));
+                    } else {
+                        pageInfo.expression(PredicateUtils.eq("kindUuid", kindUuid, false));
+                    }
                 }
             }
         }
@@ -3881,6 +3963,90 @@ public class GoodsServiceImpl implements GoodsService {
      * @param batchCode
      * @return
      */
+    private Goods fillDataInGoods(ProductDetail detail) {
+        Goods goods = new Goods();
+        return goods;
+    }
+
+    /**
+     * 根据店铺id查找店铺所属企业enUU
+     * @param storeid
+     * @return
+     */
+    @Override
+    public Long findenUUByStoreid(String storeid) {
+        return goodsDao.findenUUByStoreid(storeid);
+    }
+
+    @Override
+    public ModelMap getPCBGoodsBySearch( String keyword, PageParams var2, HttpServletRequest request) {
+        int page = var2.getPage();
+        if (page > 100) {
+            page = 100;
+        }
+        var2.setPage(page);
+        ModelMap map = searcherService.getPcbGoods(keyword,var2,request);
+        int total = ((Integer)map.get("total")).intValue();
+        int expose = total;
+        int maxExpose = 100*var2.getCount();
+        if (total > maxExpose) {
+            expose = maxExpose;
+        }
+        map.put("expose", expose);
+
+        //unchecked
+        List<Goods> goods = (List<Goods>) map.get("pcbgoods");
+        if (CollectionUtils.isEmpty(goods)) {
+            map.put("pcbgoods",goods);
+            return map;
+        }
+        return map;
+    }
+
+    @Override
+    public Page<Goods> findGoods(PageParams params, String branduuid, String kindid, String keyword) {
+        List<Long> productIds = new ArrayList<Long>();
+        final PageInfo page = new PageInfo(params);
+
+        if (!StringUtils.isEmpty(branduuid)) {
+            Brand brand = brandDao.findByUuid(branduuid);
+            if (brand == null) {
+                throw new IllegalOperatorException("此品牌信息不存在,请重新确认品牌信息");
+            }
+            // 通过品牌信息获取物料id
+            productIds = pcbDao.findProductIdByBrandid(brand.getId());
+
+            if (!StringUtils.isEmpty(kindid)) {
+                KindInfo kind = kindInfoDao.findOne(Long.valueOf(kindid));
+                if (kind == null) {
+                    throw new IllegalOperatorException("此类目信息不存在,请重新确认类目信息");
+                }
+                // 通过品牌类目信息获取物料id
+                productIds = pcbDao.findProductIdByKindidAndBrandid(kind.getId(), brand.getId());
+            }
+        } else {
+            throw new IllegalOperatorException("无品牌信息,请重新确认品牌信息");
+        }
+
+        if (StringUtils.hasText(keyword)) {
+            page.filter("prodNum", keyword, true);
+        }
+
+        if (CollectionUtils.isNotEmpty(productIds)) {
+            LogicalExpression ids = PredicateUtils.in("productid", productIds, true);
+            page.expression(ids);
+        }
+
+        Page<Goods> goodsPage = goodsDao.findAll(new Specification<Goods>() {
+            @Override
+            public Predicate toPredicate(Root<Goods> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(page.getPredicates(root, query, cb));
+                return null;
+            }
+        }, page);
+
+        return goodsPage;
+    }
     private int getFrozenCount(String batchCode) {
         String statusStr = OrderStatus.TOBEPAID.getCodes() + SplitChar.HYPHEN + OrderStatus.TOBEDELIVER.getCodes();
         List<Integer> statusList = new ArrayList<>();

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

@@ -22,6 +22,44 @@ import com.uas.platform.b2c.prod.commodity.constant.StringConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
 import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductModifyHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductReplaceDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStandardPutOnInfoDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductStoreStatusDao;
+import com.uas.platform.b2c.prod.commodity.dao.StockInOutHistDao;
+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.Goods;
+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.MatchModel;
+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.ProductMatchResult;
+import com.uas.platform.b2c.prod.commodity.model.ProductModifyHistory;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
+import com.uas.platform.b2c.prod.commodity.model.ProductStandardPutOnInfo;
+import com.uas.platform.b2c.prod.commodity.model.ProductStoreStatus;
+import com.uas.platform.b2c.prod.commodity.model.StockInOutHist;
+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.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.MatchModelDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductDetailDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductMatchResultDao;
@@ -65,7 +103,9 @@ import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentSubmitDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentSubmit;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -87,10 +127,29 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 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.model.Type;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import java.lang.reflect.Field;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
@@ -244,6 +303,12 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private ProductReplaceDao productReplaceDao;
 
+    @Autowired
+    private KindInfoDao kindInfoDao;
+
+    @Autowired
+    private PCBDao pcbDao;
+
     @Autowired
     private UserDao userDao;
 

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import static com.uas.platform.b2c.core.utils.NumberUtil.fractionNumCeil;
+
 import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
@@ -12,14 +14,34 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
-import com.uas.platform.b2c.prod.commodity.constant.*;
-import com.uas.platform.b2c.prod.commodity.dao.*;
-import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ModifyConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ShortConstant;
+import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.dao.PcbPropertyvalueDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPersonDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.dao.ReleaseProductByBatchDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.PCB;
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
 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.common.service.CreateNumberService;
+import com.uas.platform.b2c.prod.product.kind.dao.KindInfoDao;
+import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
+import com.uas.platform.b2c.prod.product.property.dao.PropertyDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -30,10 +52,37 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DataAccessException;
@@ -46,22 +95,6 @@ import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static com.uas.platform.b2c.core.utils.NumberUtil.fractionNumCeil;
-
 @Service
 public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchService {
 
@@ -104,6 +137,23 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
     @Autowired
     private ProductPersonDao productPersonDao;
 
+	@Autowired
+	private KindInfoDao kindInfoDao;
+
+	@Autowired
+	private PCBDao pcbDao;
+
+	@Autowired
+	private PropertyDao propertyDao;
+
+	@Autowired
+	private PcbPropertyvalueDao pcbPropertyvalueDao;
+
+	private static final String SIZE = "尺寸";
+	private static final String COLOR = "颜色";
+	private static final String THICKCOPPER = "铜厚";
+	private static final String THICK = "厚度";
+
 	@Value("#{sys.productServiceIp}")
 	private String productServiceIp;
 
@@ -121,7 +171,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @author hejq
 	 */
 	@Override
-	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport) {
+	public ModelMap releaseByWorkbook(Workbook workbook, Boolean selfSale, String currency, Integer isPerson, Integer repeatImport, boolean isPcb) {
 		// 是否上传个人物料
 		boolean isAPerson = false;
 		boolean isImport = false;
@@ -140,15 +190,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (colNum != UploadConstant.TOTAL_COLUMN_PERSON && colNum != UploadConstant.MAX_TOTAL_COLUMN_PERSON) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
-		} else {
-			if (colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN) {
+		} else if ((isPcb && colNum != UploadConstant.TOTAL_COLUMN_PCB && colNum != UploadConstant.MAX_TOTAL_COLUMN_PCB) || (colNum != UploadConstant.TOTAL_COLUMN && colNum != UploadConstant.MAX_TOTAL_COLUMN)) {
 				throw new IllegalOperatorException("表格模板不正确!请重新下载最新模板");
 			}
-		}
-		int rowNum = SheetUtil.getSheetLastNum(sheet, UploadConstant.MAX_TOTAL_COLUMN);
+		int rowNum = SheetUtil.getSheetLastNum(sheet, isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN);
 		if (rowNum > 2000) {
-			throw new IllegalOperatorException
-					("您上传的信息超过2000条,请拆分成2000以下再上传");
+			throw new IllegalOperatorException ("您上传的信息超过2000条,请拆分成2000以下再上传");
 		}
 		List<ReleaseProductByBatch> releaseProductByBatchs = new ArrayList<>(rowNum);
 		String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
@@ -156,11 +203,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		Row headerRow = sheet.getRow(0);
 		int total = 0;
 		int blankNum = 0;
-		long time1 = new Date().getTime();
-		System.err.println();
 		if (headerRow != null) {
 			// 验证模板是否为商城模板
-			validateTemplate(headerRow, colNum, currency, isAPerson);
+			validateTemplate(headerRow, colNum, currency, isAPerson, isPcb);
 			for (int r = 2; r <= rowNum; r++) {
 				Row row = sheet.getRow(r);
 				// 英文品牌名称
@@ -174,7 +219,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					setProductDefaultInfo(releaseProductByBatch, batch, currency, storeIn);
 // TODO 个人库验证
 					// 将excel内容对应到ReleaseProductByBatch的字段当中
-					blankNum = convertValueToProduct(row, releaseProductByBatch, r, isAPerson);
+					blankNum = convertValueToProduct(row, releaseProductByBatch, r, isAPerson, isPcb);
 // TODO 个人库验证
 					if (!isAPerson) {
 						// 解析返回分段价格list
@@ -205,15 +250,11 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-		long time2 = new Date().getTime();
-		System.err.println((time2 - time1) + "**********************************1");
 		Long userUU = SystemSession.getUser().getUserUU();
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		List<ReleaseProductByBatch> addList = new ArrayList<>(releaseProductByBatchs.size());
 		addList.addAll(releaseProductByBatchs);
 		resetRepeatData(addList, isImport, isAPerson);
-		long time3 = new Date().getTime();
-		System.err.println((time3 - time2) + "**********************************2");
 		if (isAPerson) {
 			for (ReleaseProductByBatch releaseProductByBatch : addList) {
 				List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabled(enUU,releaseProductByBatch.getB2cCode(),
@@ -229,23 +270,17 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-		long time4 = new Date().getTime();
-		System.err.println((time4 - time3) + "**********************************3");
 		commonDao.save(addList, ReleaseProductByBatch.class);
-		long time5 = new Date().getTime();
-		System.err.println((time5 - time4) + "**********************************4");
-		releaseProductByBatchDao.callValidProcedure(enUU, batch);
-		long time6 = new Date().getTime();
-		System.err.println((time6 - time5) + "**********************************5");
+
+		if (isPcb) {
+			releaseProductByBatchDao.callValidProcedurePcb(enUU, batch);
+		} else {
+			releaseProductByBatchDao.callValidProcedure(enUU, batch);
+		}
+
 		Integer filter = releaseProductByBatchDao.getCountOfImportFail(userUU, batch, failCode);
-		long time7 = new Date().getTime();
-		System.err.println((time7 - time6) + "**********************************6");
 		Integer failure = releaseProductByBatchDao.getCountPublisherUuAndBatchAndReleaseCode(userUU, batch, ReleaseStatus.failure.value());
-		long time8 = new Date().getTime();
-		System.err.println((time8 - time7) + "**********************************7");
 		Integer success = releaseProductByBatchDao.getCountPublisherUuAndBatchAndReleaseCode(userUU, batch, ReleaseStatus.success.value());
-		long time9 = new Date().getTime();
-		System.err.println((time9 - time8) + "**********************************8");
 		modelMap.put("total", total);
 		modelMap.put("success", success);
 		modelMap.put("failure", failure);
@@ -688,8 +723,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param headerRow 首行
 	 * @param colNum	总列
 	 * @param currency	币别
+	 * @param isPcb 是否pcb模块
 	 */
-	private void validateTemplate(Row headerRow, int colNum, String currency, boolean isAPerson) {
+	private void validateTemplate(Row headerRow, int colNum, String currency, boolean isAPerson, boolean isPcb) {
 		if (isAPerson) {
 			if (colNum == UploadConstant.MAX_TOTAL_COLUMN_PERSON) {
 				Cell errorCell = headerRow.getCell(UploadConstant.MAX_TOTAL_COLUMN_PERSON - 1);
@@ -711,8 +747,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				throw new IllegalOperatorException("您上传的信息列信息不正确,请与模板的列做比较");
 			}
 		} else {
-			if (colNum == UploadConstant.MAX_TOTAL_COLUMN) {
-				Cell errorCell = headerRow.getCell(UploadConstant.MAX_TOTAL_COLUMN - 1);
+			if (colNum == (isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB : UploadConstant.MAX_TOTAL_COLUMN)) {
+				Cell errorCell = headerRow.getCell(isPcb ? UploadConstant.MAX_TOTAL_COLUMN_PCB - 1 : UploadConstant.MAX_TOTAL_COLUMN - 1);
 				Object errorCellObj = readWorkBookCell(errorCell, Cell.CELL_TYPE_STRING, 0, 0);
 				String errorHead = StringUtilB2C.replaceLineBreak(String.valueOf(errorCellObj));
 				if (StringUtils.isEmpty(errorHead) || !("错误提示".equals(errorHead))) {
@@ -741,7 +777,6 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				}
 			}
 		}
-
 	}
 
 	/**
@@ -954,8 +989,9 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * @param row 行对象
 	 * @param aProduct 验证单行数据
 	 * @param rowNum 行数
+	 * @param isPcb 是否pcb模块
 	 */
-	private int convertValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, boolean isAPerson) {
+	private int convertValueToProduct(Row row, ReleaseProductByBatch aProduct, int rowNum, boolean isAPerson, boolean isPcb) {
 		// 统计为空的个数
 		int result = 0;
 
@@ -972,6 +1008,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			result += 1;
 		}
 		aProduct.setKindByExcel(kindValue);
+		// pcb模块判断类目是否为商城标准pcb类目
+		if (isPcb && !StringUtils.isEmpty(aProduct.getKindName())) {
+			KindInfo kindInfo = kindInfoDao.findByNameCn(aProduct.getKindName());
+			if (kindInfo != null && kindInfo.getId() != null && (kindInfoDao.existsChildByParentId(UploadConstant.PCB_PARENTID, kindInfo.getId()) > 0)) {
+				aProduct.setKindUuid(kindInfo.getId());
+			} else {
+				aProduct.setErrmsg(ErrorInfoConstant.KIND_UNSTANDARD.getInfo());
+			}
+		}
 
 		Object codeValue = readWorkBookCell(row.getCell(UploadConstant.PRODUCT_CODE), Cell.CELL_TYPE_STRING,
 				rowNum, UploadConstant.PRODUCT_CODE);
@@ -1004,6 +1049,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					String productStr = sdf.format(productCell.getDateCellValue());
 					aProduct.setProductDateByExcel(productStr);
 				} else {
+					aProduct.setProductDateByExcel("");
 					aProduct.setProductDateByExcel(readWorkBookCell(row.getCell(ModifyConstant.PRODUCE_DATE), Cell.CELL_TYPE_STRING,
 							rowNum, ModifyConstant.PRODUCE_DATE));
 				}
@@ -1041,6 +1087,26 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (aProduct.getCode() != null && aProduct.getBrandNameEn() != null && aProduct.getTag() != null) {
 				resetTag(aProduct);
 			}
+
+			// 如果是pcb模块,解析尺寸、颜色、铜厚、厚度
+			if (isPcb) {
+				Object sizeValue = readWorkBookCell(row.getCell(UploadConstant.SIZE), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.SIZE);
+				aProduct.setSizeByExcel(sizeValue);
+
+				Object colorValue = readWorkBookCell(row.getCell(UploadConstant.COLOR), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.COLOR);
+				aProduct.setColorByExcel(colorValue);
+
+				Object thickCopperValue = readWorkBookCell(row.getCell(UploadConstant.THICK_COPPER), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.THICK_COPPER);
+				aProduct.setThickCopperByExcel(thickCopperValue);
+
+				Object thickValue = readWorkBookCell(row.getCell(UploadConstant.THICK), Cell.CELL_TYPE_STRING,
+					rowNum, UploadConstant.THICK);
+				aProduct.setThickByExcel(thickValue);
+			}
+
 		} else {
 			Object packageMethodValue = readWorkBookCell(row.getCell(UploadConstant.SPECIFICATION), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.SPECIFICATION);
@@ -1089,7 +1155,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 */
 	private List<GoodsQtyPrice> initQtyPriceByExcel(Row row, boolean isImport, ReleaseProductByBatch aProduct, int rowNum) {
 		List<GoodsQtyPrice> qtyPriceList = new ArrayList<>();
-		Object firstValue = null;
+		Object firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_NUMERIC,
+				rowNum, UploadConstant.PRICE_START);
 		if (isImport) {
 			firstValue = readWorkBookCell(row.getCell(UploadConstant.PRICE_START), Cell.CELL_TYPE_STRING,
 					rowNum, UploadConstant.PRICE_START);
@@ -1543,14 +1610,14 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	}
 
 	@Override
-	public String publishByBatch(String batch) {
-
+	public String publishByBatch(String batch, boolean isPcb) {
 		List<ReleaseProductByBatch> releaseProductByBatchList =
 				releaseProductByBatchDao.findByRelbatchid(batch);
 		List<Long> productIds = null;
 		List<ProductPrivate> productPrivateList = null;
 		if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
-			List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,false);
+			Map<String, Object> map = convertProduct(releaseProductByBatchList,false, isPcb);
+			List<com.uas.ps.entity.Product> products = (List<com.uas.ps.entity.Product>) map.get("products");
 			// TODO 什么接口
 			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
 			productIds = JSON.parseArray(result, Long.class);
@@ -1566,6 +1633,40 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				productPrivates.add(productPrivate);
 			}
 			productPrivateList = productPrivateDao.save(productPrivates);
+
+			if (isPcb) {
+				List<PCB> pcbList = new ArrayList<>();
+				List<PCBPropertyValue> propertyValueList = new ArrayList<>();
+
+				for (Long prId : idSet) {
+					Product product = productDao.findOne(prId);
+					if (product != null) {
+						List<PCB> pcbs = pcbDao.findByProductid(prId);
+						if (CollectionUtils.isEmpty(pcbs)) {
+							PCB pcb = new PCB();
+							pcb.setProductid(prId);
+							pcb.setBrandid(product.getPbrandid());
+							pcb.setKindid(product.getKindid());
+							pcbList.add(pcb);
+						}
+					}
+
+					List<PCBPropertyValue> propertyValues = (List<PCBPropertyValue>) map.get(product.getEnUU().toString().concat(product.getProdNum()));
+					if (CollectionUtils.isNotEmpty(propertyValues)) {
+						for (PCBPropertyValue propertyValue : propertyValues) {
+							propertyValue.setProductid(prId);
+							propertyValueList.add(propertyValue);
+						}
+					}
+				}
+
+				if (CollectionUtils.isNotEmpty(pcbList)) {
+					pcbDao.save(pcbList);
+				}
+				if (CollectionUtils.isNotEmpty(propertyValueList)) {
+					pcbPropertyvalueDao.save(propertyValueList);
+				}
+			}
 		}
 		Enterprise enterprise = SystemSession.getUser().getEnterprise();
 		final Object[] obj = new Object[]{enterprise.getUu(), enterprise.getEnName(), batch};
@@ -1629,11 +1730,25 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	}
 
 
-	private  List<com.uas.ps.entity.Product> convertProduct (List<ReleaseProductByBatch> releaseProductByBatchList, boolean isAPerson ) {
+	private  Map<String, Object> convertProduct (List<ReleaseProductByBatch> releaseProductByBatchList, boolean isAPerson , boolean isPcb) {
 		if (CollectionUtils.isEmpty(releaseProductByBatchList)) {
 			return null;
 		}
+		Map<String, Object> map = new HashedMap();
 		List<com.uas.ps.entity.Product> products = new ArrayList<>();
+		Map<String, List<PCBPropertyValue>> propertyMap = new HashedMap();
+
+		Long sizeProId = null;
+		Long colorProId = null;
+		Long thickCopperProId = null;
+		Long thickProId = null;
+		if (isPcb) {
+			sizeProId = propertyDao.findIdByLabelCn(SIZE);
+			colorProId = propertyDao.findIdByLabelCn(COLOR);
+			thickCopperProId = propertyDao.findIdByLabelCn(THICKCOPPER);
+			thickProId = propertyDao.findIdByLabelCn(THICK);
+		}
+
 		for (ReleaseProductByBatch releaseProductByBatch : releaseProductByBatchList) {
 		    if (releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.failure.value()) ||
                     releaseProductByBatch.getReleaseCode().equals(ReleaseStatus.success.value())) {
@@ -1662,10 +1777,36 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
                 }
                 String batchCode = "PNUM" + createNumberService.getTimeNumber("trade$product_import_num", 8);
                 product.setCode(batchCode);
+
+				if (isPcb) {
+					List<PCBPropertyValue> propertyValues = new ArrayList<>();
+					if (!StringUtils.isEmpty(releaseProductByBatch.getSize())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(sizeProId, releaseProductByBatch.getSize());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getColor())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(colorProId, releaseProductByBatch.getColor());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getThickCopper())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(thickCopperProId, releaseProductByBatch.getThickCopper());
+						propertyValues.add(propertyValue);
+					}
+					if (!StringUtils.isEmpty(releaseProductByBatch.getThick())) {
+						PCBPropertyValue propertyValue = new PCBPropertyValue(thickProId, releaseProductByBatch.getThick());
+						propertyValues.add(propertyValue);
+					}
+					if (CollectionUtils.isNotEmpty(propertyValues)) {
+						propertyMap.put(product.getEnUU().toString().concat(product.getCode()), propertyValues);
+					}
+				}
                 products.add(product);
             }
 		}
-		return products;
+
+		map.put("products", products);
+		map.put("propertyvalues", propertyMap);
+		return map;
 	}
 
 	@Override
@@ -1673,7 +1814,8 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
         List<ReleaseProductByBatch> releaseProductByBatchList =
                 releaseProductByBatchDao.findByRelbatchid(batch);
         if (!CollectionUtils.isEmpty(releaseProductByBatchList)) {
-            List<com.uas.ps.entity.Product> products = convertProduct(releaseProductByBatchList,true);
+			Map<String, Object> map = convertProduct(releaseProductByBatchList,false, false);
+			List<com.uas.ps.entity.Product> products = (List<com.uas.ps.entity.Product>) map.get("products");
             // TODO 什么接口
 			String result = restTemplate.postForEntity(productServiceIp + "/product/update", products, String.class).getBody();
             List<Long> productIds = JSON.parseArray(result, Long.class);

+ 1 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentGoods.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.prod.product.component.modal;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
+import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.core.support.SystemSession;

+ 37 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/api/KindController.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.kind.api;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
@@ -205,4 +206,40 @@ public class KindController {
 	public List<Kind> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return kindService.getBatchKinds(batchIds);
 	}
+
+	/**
+	 * 获取所有商品类目的所有下级类目
+	 *
+	 * @param parentId 父类目id
+	 * @return 类目信息
+	 */
+	@RequestMapping(value = "/{parentId}/pcbchildren_all", method = RequestMethod.GET)
+	@ResponseBody
+	public List<KindInfo> getAllChildKinds(@PathVariable("parentId") Long parentId) {
+		return kindService.getAllChildKinds(parentId);
+	}
+
+	/**
+	 * 根据PCB品牌id获取器件的类目结构
+	 *
+	 * @param brandId
+	 * @return 包含四个List的List,每个List存放一级相关的类目
+	 *         {{相关的第一级类目},{相关的第二级类目},{相关的第三级类目},{相关的第四级类目}}
+	 */
+	@RequestMapping(value = "/{brandId}/pcbkindinfos", method = RequestMethod.GET)
+	public List<List<KindInfo>> getKindInfosByBrandId(@PathVariable("brandId") Long brandId) {
+		return kindService.findByPCBBrandId(brandId);
+	}
+
+	/**
+	 * 根据PCB物料id获取物料属性信息
+	 *
+	 * @param productId
+	 * @return 物料属性信息
+	 */
+	@RequestMapping(value = "/pcbproperty/{productId}",method = RequestMethod.GET)
+	public List<PCBPropertyValue> getPCBProperty(@PathVariable("productId") Long productId) {
+		return kindService.findByPCBProductId(productId);
+	}
+
 }

+ 28 - 1
src/main/java/com/uas/platform/b2c/prod/product/kind/dao/KindInfoDao.java

@@ -1,12 +1,15 @@
 package com.uas.platform.b2c.prod.product.kind.dao;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import javax.persistence.QueryHint;
 import java.util.List;
 import java.util.Set;
 
@@ -37,4 +40,28 @@ public interface KindInfoDao extends JpaSpecificationExecutor<KindInfo>, JpaRepo
 	 */
 	@Query(nativeQuery = true, value = "select * from product$kind connect by prior ki_parentid =  ki_id start with ki_id=:id order by ki_level")
 	public List<KindInfo> findStructingKinds(@Param("id") Long id);
-}
+
+	/**
+	 * 所有商品类目的所有下级类目
+	 * @param parentid
+	 * @return
+	 */
+	@Query("select k from KindInfo k where k.parentid = :parentid")
+	public List<KindInfo> findByParentid(@Param("parentid")Long parentid);
+
+	/**
+	 * 判断该子类目是否存在于该类目的所有子类目中
+	 * @param parentId 父类目
+	 * @param childId 子类目
+	 * @return
+	 */
+	@Query(nativeQuery = true, value = "select find_in_set(:childid, findLeafKind(:parentid))")
+	public Integer existsChildByParentId(@Param("parentid") Long parentId, @Param("childid") Long childId);
+
+	/**
+	 * 通过类目名获取类目信息
+	 * @param name
+	 * @return
+	 */
+	public KindInfo findByNameCn(String name);
+}

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

@@ -34,7 +34,7 @@ public class Kind implements Serializable {
 	 */
 	@Id
 	@Column(name = "ki_id")
-	@GeneratedValue
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
 	private Long id;
 
 	/**

+ 33 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/KindService.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.kind.service;
 
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
@@ -315,4 +316,36 @@ public interface KindService {
 	 * @return 类目信息
 	 */
 	List<Kind> getBatchKinds(List<Long> batchIds);
+
+	/**
+	 * 所有商品类目的所有下级类目
+	 *
+	 * @param parentid 父类目id
+	 * @return 类目信息
+	 */
+	public List<KindInfo> getAllChildKinds(Long parentid);
+
+	/**
+	 * 根据PCB品牌id获取该品牌下的器件类目树
+	 *
+	 * @param brandId 品牌id
+	 * @return 类目树信息
+	 */
+	public List<List<KindInfo>> findByPCBBrandId(Long brandId);
+
+	/**
+	 * 根据PCB物料id获取物料属性信息
+	 *
+	 * @param productId
+	 * @return 物料属性信息
+	 */
+	public List<PCBPropertyValue> findByPCBProductId(Long productId);
+
+	/**
+	 * 根据店铺enUU获取PCB商品的类目信息
+	 *
+	 * @param enUU
+	 * @return kindids
+	 */
+	public Set<Long> findByEnUU(Long enUU);
 }

+ 117 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/service/impl/KindServiceImpl.java

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.prod.product.kind.service.impl;
 
+import com.uas.platform.b2c.prod.commodity.dao.PCBDao;
+import com.uas.platform.b2c.prod.commodity.model.PCBPropertyValue;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
@@ -22,6 +24,7 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.util.ArrayUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.velocity.runtime.directive.Foreach;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.InvalidDataAccessApiUsageException;
@@ -45,6 +48,9 @@ public class KindServiceImpl implements KindService {
 	@Autowired
 	private KindDao kindDao;
 
+	@Autowired
+	private PCBDao pcbDao;
+
 	@Autowired
 	private BrandInfoDao brandInfoDao;
 
@@ -1219,4 +1225,115 @@ public class KindServiceImpl implements KindService {
 		}
 		return kindDao.findByBatchIds(batchIds);
 	}
+
+	@Override
+	public List<KindInfo> getAllChildKinds(Long parentid) {
+		List<KindInfo> kindInfos = kindInfoDao.findByParentid(parentid);
+		for (KindInfo kindInfo : kindInfos) {
+			if (kindInfo.getIsLeaf().equals(Constant.NO)) {
+				List<KindInfo> list = getAllChildKinds(kindInfo.getId());
+				Set<KindInfo> set = new HashSet<>();
+				set.addAll(list);
+				kindInfo.setChildren(set);
+			}
+		}
+		return kindInfos;
+	}
+
+	@Override
+	public List<List<KindInfo>> findByPCBBrandId(Long brandId) {
+		List<Long> kindInfoIds = pcbDao.findKindInfoIdByBandId(brandId);
+		return getKindInfosByKindInfoIds(kindInfoIds);
+	}
+
+	public List<KindInfo> getPCBParentsByChildId(Long childId) {
+		List<KindInfo> kinds = new ArrayList<KindInfo>();
+		kinds = getPCBParentsByChildId(childId, kinds);
+		return kinds;
+	}
+
+	private List<KindInfo> getPCBParentsByChildId(Long childId, List<KindInfo> container) {
+		KindInfo child = kindInfoDao.findOne(childId);
+		if (child == null) {
+			throw new IllegalOperatorException("要获取的父类目不存在");
+		}
+		if (child.getParentid() != 0) {
+			getPCBParentsByChildId(child.getParentid(), container);
+		}
+		container.add(child);
+		return container;
+	}
+
+	private List<List<KindInfo>> getKindInfosByKindInfoIds(List<Long> kindInfoIds) {
+		List<List<KindInfo>> result = new ArrayList<List<KindInfo>>();
+		if (!CollectionUtils.isEmpty(kindInfoIds)) {
+			List<List<KindInfo>> kindInfoss = new ArrayList<>();
+			for (Long kindInfoId:kindInfoIds) {
+				List<KindInfo> kindInfos = getPCBParentsByChildId(kindInfoId);
+				kindInfoss.add(kindInfos);
+			}
+			//获取第一级相关类目
+			List<KindInfo> result1 = new ArrayList<>();
+			Set<Long> kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				Long firstKindInfoId = ki.get(0).getId();
+				if (!kindInfoIdSet.contains(firstKindInfoId)) {
+					result1.add(ki.get(0));
+					kindInfoIdSet.add(firstKindInfoId);
+				}
+			}
+			result.add(result1);
+			//获取第二级相关类目
+			List<KindInfo> result2 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 1) {
+					Long firstKindInfoId = ki.get(1).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result2.add(ki.get(1));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result2);
+			//获取第三级相关类目
+			List<KindInfo> result3 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 2) {
+					Long firstKindInfoId = ki.get(2).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result3.add(ki.get(2));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result3);
+			//获取第四级相关类目
+			List<KindInfo> result4 = new ArrayList<>();
+			kindInfoIdSet = new HashSet<>();
+			for (List<KindInfo> ki : kindInfoss) {
+				if (ki.size() > 3) {
+					Long firstKindInfoId = ki.get(3).getId();
+					if (!kindInfoIdSet.contains(firstKindInfoId)) {
+						result4.add(ki.get(3));
+						kindInfoIdSet.add(firstKindInfoId);
+					}
+				}
+			}
+			result.add(result4);
+		}
+		return result;
+	}
+
+	@Override
+	public List<PCBPropertyValue> findByPCBProductId(Long productId) {
+		List<PCBPropertyValue> list = pcbDao.findByPCBProductId(productId);
+		return list;
+	}
+
+	@Override
+	public Set<Long> findByEnUU(Long enUU) {
+		return pcbDao.findByEnUU(enUU);
+	}
 }

+ 7 - 0
src/main/java/com/uas/platform/b2c/prod/product/property/dao/PropertyDao.java

@@ -23,4 +23,11 @@ public interface PropertyDao extends JpaSpecificationExecutor<Property>, JpaRepo
 	 * @return 属性信息
 	 */
 	public List<Property> findByLabelEn(String labelEn);
+
+	/**
+	 * 根据属性中文名获取属性id
+	 * @param labelCn
+	 * @return
+	 */
+	public Long findIdByLabelCn(String labelCn);
 }

+ 15 - 1
src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.store.facade.impl;
 
+import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
@@ -27,11 +28,14 @@ public class CommodityFacadeImpl implements CommodityFacade {
 
 	private final GoodsService goodsService;
 
+	private final SysConf sysConf;
+
 	@Autowired
-	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService) {
+	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService,SysConf sysConf) {
 		this.commodityService = commodityService;
 		this.kindService = kindService;
 		this.goodsService = goodsService;
+		this.sysConf = sysConf;
 	}
 
 	@Override
@@ -46,6 +50,16 @@ public class CommodityFacadeImpl implements CommodityFacade {
 			}
 		}
 		int count = goodsService.getNonstandardGoodsCount(storeUuid); //有效的在售非标数
+		if (!sysConf.getStoreid().equals(storeUuid)) {
+			Long enUU = goodsService.findenUUByStoreid(storeUuid);
+			if (enUU != null) {
+				Set<Long> kindInfoids = kindService.findByEnUU(enUU);
+				if (!CollectionUtils.isEmpty(kindInfoids)) {
+					List<KindInfo> kinds = kindService.getStructruingKindsByLeafKindIds(kindInfoids);
+					children.addAll(kinds);
+				}
+			}
+		}
 		if (count != 0){ //存在非标则添加其他类目
 			children.add(KindInfo.getOtherKind());
 		}

+ 10 - 0
src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.trade.order.dao;
 
 import com.uas.platform.b2c.trade.order.model.OrderDetail;
+import net.jpountz.util.Native;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -65,4 +66,13 @@ public interface OrderDetailDao extends JpaSpecificationExecutor<OrderDetail>, J
 	 */
 	@Query(value = "select sum(detail_number) from trade$order_detail where go_batch in (:batches) and detail_status in (:status)", nativeQuery = true)
 	Double getgetSumQtyByBatchcodesAndStatus(@Param("batches") List<String> batches, @Param("status") List<Integer> status);
+
+	/**
+	 * 查询指定批次和状态的购买的数据,
+	 *
+	 * @param batches 批次队列
+	 * @return 数据
+	 */
+	@Query(nativeQuery = true,value = "select sum(detail_number) from trade$order_detail where go_batch  = :batches and detail_status in (501, 504, 502, 406, 404, 520, 405, 503, 514, 506)")
+	Double getPCBSaleQtyByBatchcodesAndStatus(@Param("batches") String batches);
 }

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


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


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


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


BIN
src/main/webapp/WEB-INF/cert/client.keystore