Browse Source

Merge remote-tracking branch 'origin/feature-b2b201807-suntg' into feature-b2b201807-suntg

hejq 7 years ago
parent
commit
f14993f8aa

+ 9 - 0
mall-search/src/main/java/com/uas/search/constant/SearchConstants.java

@@ -307,6 +307,11 @@ public class SearchConstants {
 	public static final String PRODUCT_PRIVATE_STANDARD_FIELD = "pr_standard";
 	// 1可用  0 不可用
 	public static final String PRODUCT_PRIVATE_B2CENABLED_FIELD = "pr_b2cenabled";
+	// 1可卖  0 不可
+	public static final String PRODUCT_PRIVATE_ISSALE_FIELD = "pr_issale";
+	// 1可买  0 不可
+	public static final String PRODUCT_PRIVATE_ISPURCHASE_FIELD = "pr_ispurchase";
+
     /**
      * 非标字段
      */
@@ -314,6 +319,8 @@ public class SearchConstants {
     public static final String PRODUCT_PRIVATE_TITLE_FIELD = "pr_title";
     // 型号
 	public static final String PRODUCT_PRIVATE_CMPCODE_FIELD = "pr_cmpcode";
+	// 编号
+	public static final String PRODUCT_PRIVATE_CODE_FIELD = "pr_code";
 	// 品牌
 	public static final String PRODUCT_PRIVATE_BRAND_FIELD = "pr_brand";
     /**
@@ -327,6 +334,8 @@ public class SearchConstants {
 	public static final String PRODUCT_PRIVATE_PBRAND_ENUU_FIELD = "pr_pbrand_enuu";
     // 类目
     public static final String PRODUCT_PRIVATE_KIND_FIELD = "pr_kind";
+	// 规格
+	public static final String PRODUCT_PRIVATE_SPEC_FIELD = "pr_spec";
 	// 类目+enuu
 	public static final String PRODUCT_PRIVATE_KIND_ENUU_FIELD = "pr_kind_enuu";
     // 标准型号

+ 18 - 0
mall-search/src/main/java/com/uas/search/controller/SearchController.java

@@ -310,6 +310,24 @@ public class SearchController {
         return goodsIds;
     }
 
+	/**
+	 * 原goodIds搜索接口
+	 * @param keyword
+	 * @param params
+	 * @param request
+	 * @return
+	 * @throws IOException
+	 */
+	@RequestMapping("/oldGoodsIds")
+	@ResponseBody
+	public Map<String, Object> getOldGoodsIds(String keyword, String params, HttpServletRequest request) throws IOException {
+		long start = System.currentTimeMillis();
+		PageParams pageParams = params == null ? null : JSONObject.parseObject(params, PageParams.class);
+		Map<String, Object> goodsIds = searchService.getOldGoodsIds(keyword, pageParams);
+		logger.info(String.format("goodsIds\t%s\t%.3fs", keyword, (System.currentTimeMillis() - start) / 1000.0));
+		return goodsIds;
+	}
+
     @RequestMapping("/pcbGoodsIds")
     @ResponseBody
     public Map<String, Object> getPCBGoodsIds(String keyword, String params, HttpServletRequest request) throws IOException {

+ 69 - 2
mall-search/src/main/java/com/uas/search/model/V_Products.java

@@ -40,12 +40,24 @@ public class V_Products implements RowMapper, Serializable {
     @Column(name = "pr_title")
     private String title;
 
+    /**
+     * 规格
+     */
+    @Column(name = "pr_spec")
+    private String spec;
+
     /**
      * 型号
      */
     @Column(name = "pr_cmpcode")
     private String cmpCode;
 
+    /**
+     * 产品编号
+     */
+    @Column(name = "pr_code")
+    private String code;
+
     /**
      * 品牌
      */
@@ -88,6 +100,22 @@ public class V_Products implements RowMapper, Serializable {
     @Column(name = "pr_b2cenabled")
     private Short b2cEnabled;
 
+    /**
+     * 是否可卖<br>
+     * 1. 可以卖 <br>
+     * 0. 不可
+     */
+    @Column(name = "pr_issale")
+    private Short isSale;
+
+    /**
+     * 是否可买<br>
+     * 1. 可以买<br>
+     * 0. 不可
+     */
+    @Column(name = "pr_ispurchase")
+    private Short isPurchase;
+
     public Long getId() {
         return id;
     }
@@ -112,6 +140,14 @@ public class V_Products implements RowMapper, Serializable {
         this.title = title;
     }
 
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
     public String getCmpCode() {
         return cmpCode;
     }
@@ -120,6 +156,14 @@ public class V_Products implements RowMapper, Serializable {
         this.cmpCode = cmpCode;
     }
 
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
     public String getBrand() {
         return brand;
     }
@@ -176,20 +220,39 @@ public class V_Products implements RowMapper, Serializable {
         this.b2cEnabled = b2cEnabled;
     }
 
+    public Short getIsSale() {
+        return isSale;
+    }
+
+    public void setIsSale(Short isSale) {
+        this.isSale = isSale;
+    }
+
+    public Short getIsPurchase() {
+        return isPurchase;
+    }
+
+    public void setIsPurchase(Short isPurchase) {
+        this.isPurchase = isPurchase;
+    }
 
     @Override
     public String toString() {
         return "V_Products{" +
                 "id=" + id +
                 ", title='" + title + '\'' +
+                ", code='" + code + '\'' +
                 ", cmpCode='" + cmpCode + '\'' +
                 ", brand='" + brand + '\'' +
                 ", kind='" + kind + '\'' +
+                ", spec='" + spec + '\'' +
                 ", pCmpCode='" + pCmpCode + '\'' +
                 ", pBrandEn='" + pBrandEn + '\'' +
                 ", pBrandCn='" + pBrandCn + '\'' +
-                ", standard=" + standard +
-                ", b2cEnabled=" + b2cEnabled +
+                ", standard=" + standard + '\'' +
+                ", b2cEnabled=" + b2cEnabled + '\'' +
+                ", isSale=" + isSale +  '\'' +
+                ", isPurchase=" + isPurchase + '\'' +
                 '}';
     }
 
@@ -199,14 +262,18 @@ public class V_Products implements RowMapper, Serializable {
         products.setId(rs.getLong("pr_id"));
         products.setB2cEnabled(rs.getShort("pr_b2cenabled"));
         products.setBrand(rs.getString("pr_brand"));
+        products.setCode(rs.getString("pr_code"));
         products.setCmpCode(rs.getString("pr_cmpcode"));
         products.setEnUU(rs.getLong("pr_enuu"));
         products.setKind(rs.getString("pr_kind"));
+        products.setSpec(rs.getString("pr_spec"));
         products.setpBrandEn(rs.getString("pr_pbranden"));
         products.setpBrandCn(rs.getString("pr_pbrand"));
         products.setpCmpCode(rs.getString("pr_pcmpcode"));
         products.setStandard(rs.getShort("pr_standard"));
         products.setTitle(rs.getString("pr_title"));
+        products.setIsSale(rs.getShort("pr_issale"));
+        products.setIsPurchase(rs.getShort("pr_ispurchase"));
         return products;
     }
 }

+ 58 - 1
mall-search/src/main/java/com/uas/search/service/SearchService.java

@@ -265,7 +265,7 @@ public interface SearchService {
 	public List<Map<String, String>> getSimilarPropertyValues(Long kindId, Long propertyId, String keyword, Long topNum);
 
 	/**
-	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌
+	 * 根据关键词搜索批次(关键词是型号
 	 * 
 	 * @param keyword
 	 *            关键词
@@ -321,6 +321,63 @@ public interface SearchService {
 	 */
 	public Map<String, Object> getGoodsIds(String keyword, PageParams pageParams) throws IOException;
 
+	/**
+	 * 根据关键词搜索批次(关键词可能是器件、类目、品牌)
+	 *
+	 * @param keyword
+	 *            关键词
+	 * @param pageParams
+	 *            翻页、过滤、排序等信息
+	 *            <p>
+	 *            关于过滤,通过键值对指定过滤条件,键为
+	 *            {@link com.uas.search.constant.model.PageParams.FilterField}
+	 *            ,值的类型由键决定:
+	 *            </p>
+	 *
+	 *            <table border=1 cellpadding=5 cellspacing=0 summary=
+	 *            "Fields and types">
+	 *            <tr>
+	 *            <th>Field</th>
+	 *            <th>Type</th>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_KINDID</td>
+	 *            <td>List(Long)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_BRANDID</td>
+	 *            <td>List(Long)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_STORE_TYPE</td>
+	 *            <td>List(String)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_CRNAME</td>
+	 *            <td>List(String)</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MINPRICERMB</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MAXPRICERMB</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MINPRICEUSD</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            <tr>
+	 *            <td>GOODS_MAXPRICEUSD</td>
+	 *            <td>Double</td>
+	 *            </tr>
+	 *            </table>
+	 *
+	 * @return 器件id、批次id和分页信息
+	 */
+	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException;
+
     /**
      * 根据关键词搜索 PCB 批次
      *

+ 87 - 0
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -1184,6 +1184,21 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+	@Override
+	public Map<String, Object> getOldGoodsIds(String keyword, PageParams pageParams) throws IOException {
+		List<String> keywordFields = new ArrayList<>();
+		// 先根据品牌搜索,品牌不存在再搜索型号等
+		keywordFields.add(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD);
+		keywordFields.add(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD);
+		Map<String, Object> goodsIds = getGoodsIds(keyword, keywordFields, false, pageParams);
+		if (CollectionUtils.isEmpty(goodsIds) || goodsIds.get("componentIds") == null
+			|| JSONObject.parseArray(goodsIds.get("componentIds").toString()).isEmpty()) {
+			keyword = recursivelyGetGoodsIds(keyword, null, true);
+			goodsIds = getOldGoodsIds(keyword, null, true, pageParams);
+		}
+		return goodsIds;
+	}
+
 	/**
 	 * 递归查询物料(如果没有结果,则降低精度,直至长度为 1)
 	 *
@@ -1356,6 +1371,78 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+	/**
+	 * @param keyword
+	 * @param keywordFields
+	 *            要查询的字段
+	 * @param tokenized
+	 *            是否分词
+	 * @param pageParams
+	 * @return
+	 */
+	private Map<String, Object> getOldGoodsIds(String keyword, List<String> keywordFields, Boolean tokenized,
+		PageParams pageParams) {
+// 因为器件、属性值的数据量远比类目、品牌大得多,而且器件搜索可能还需进行分页,
+		// 所以涉及器件、属性值的搜索,大都不能像类目和品牌一样直接利用SearchUtils.getDocuments方法
+		IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(SearchConstants.GOODS_TABLE_NAME);
+
+		if (pageParams == null) {
+			pageParams = new PageParams();
+		}
+		if (pageParams.getPage() <= 0)
+			pageParams.setPage(1);
+		if (pageParams.getSize() <= 0)
+			pageParams.setSize(20);
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<Long> cmpIds = new ArrayList<>();
+		List<Long> goIds = new ArrayList<>();
+		try {
+			BooleanQuery booleanQuery = queryGoods(keyword, keywordFields, tokenized);
+			setGoodsFilter(pageParams.getFilters(), booleanQuery);
+			logger.info(booleanQuery.toString());
+
+			Sort sort = sortGoods(keyword, pageParams.getSort());
+			TopDocs hits;
+			if (pageParams.getPage() > 1) {// 不是第一页
+				TopDocs previousHits = indexSearcher.search(booleanQuery,
+					(pageParams.getPage() - 1) * pageParams.getSize(), sort, true, false);
+				int totalHits = previousHits.totalHits;
+				if ((pageParams.getPage() - 1) * pageParams.getSize() >= totalHits) {
+					return map;
+				}
+				ScoreDoc[] previousScoreDocs = previousHits.scoreDocs;
+				ScoreDoc after = previousScoreDocs[previousScoreDocs.length - 1];
+				hits = indexSearcher.searchAfter(after, booleanQuery, pageParams.getSize(), sort, true, false);
+			} else {
+				hits = indexSearcher.search(booleanQuery, pageParams.getSize(), sort, true, false);
+			}
+
+			// 数据量太大,需要指定将获取的数据(以免载入不必要的数据,降低速度)
+			Set<String> fieldsToLoad = new HashSet<>();
+			fieldsToLoad.add(SearchConstants.GOODS_CMP_ID_FIELD);
+			fieldsToLoad.add(SearchConstants.GOODS_GO_ID_FIELD);
+			ScoreDoc[] scoreDocs = hits.scoreDocs;
+			for (ScoreDoc scoreDoc : scoreDocs) {
+				Document document = indexSearcher.doc(scoreDoc.doc, fieldsToLoad);
+				String cmpId = document.get(SearchConstants.GOODS_CMP_ID_FIELD);
+				cmpIds.add(StringUtils.isEmpty(cmpId) || cmpId.equals(ObjectToDocumentUtils.NULL_VALUE) ? null : Long.valueOf(cmpId));
+				String goId = document.get(SearchConstants.GOODS_GO_ID_FIELD);
+				goIds.add(StringUtils.isEmpty(goId) || goId.equals(ObjectToDocumentUtils.NULL_VALUE) ? null : Long.valueOf(goId));
+			}
+			map.put("componentIds", cmpIds);
+			map.put("goodsIds", goIds);
+			map.put("page", pageParams.getPage());
+			map.put("size", pageParams.getSize());
+			map.put("total", hits.totalHits);
+		} catch (IOException e) {
+			logger.error("", e);
+		} finally {
+			SearchUtils.releaseIndexSearcher(indexSearcher);
+		}
+		return map;
+	}
+
 	/**
 	 * 获取物料信息
 	 * @param keyword

+ 23 - 1
mall-search/src/main/java/com/uas/search/util/ObjectToDocumentUtils.java

@@ -121,7 +121,6 @@ public class ObjectToDocumentUtils {
 			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PBRAND_EN_FIELD, product.getpBrandEn().toLowerCase(), Store.YES));
 			brandAndEnuu += product.getpBrandEn();
 		}
-
 		if (!StringUtils.isEmpty(product.getpBrandCn())) {
 			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PBRAND_CN_FIELD, product.getpBrandCn().toLowerCase(), Store.YES));
 			brandAndEnuu += product.getpBrandCn();
@@ -132,12 +131,21 @@ public class ObjectToDocumentUtils {
         if (!StringUtils.isEmpty(product.getCmpCode())) {
             document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_CMPCODE_FIELD, product.getCmpCode().toLowerCase(), Store.YES));
         }
+        if (!StringUtils.isEmpty(product.getCode())) {
+			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_CODE_FIELD, product.getCode().toLowerCase(), Store.YES));
+		}
         if (!StringUtils.isEmpty(product.getKind())) {
             document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD, product.getKind().toLowerCase(), Store.YES));
 			if (!StringUtils.isEmpty(product.getEnUU())) {
 				document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_KIND_ENUU_FIELD, product.getKind().toLowerCase() + product.getEnUU(), Store.YES));
 			}
         }
+
+        // 规格
+        if (!StringUtils.isEmpty(product.getSpec())) {
+			document.add(new TextField(SearchConstants.PRODUCT_PRIVATE_SPEC_FIELD, product.getSpec().toLowerCase(), Store.YES));
+		}
+
         document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PBRANDEN_FIELD, product.getpBrandEn().toLowerCase(), Store.YES));
 		document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, product.getpCmpCode().toLowerCase(), Store.YES));
 		if (product.getStandard() != null) {
@@ -152,6 +160,20 @@ public class ObjectToDocumentUtils {
 			// 为空默认可用
 			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_B2CENABLED_FIELD, String.valueOf(1), Store.YES));
 		}
+
+		// 是否可卖 为空则不可卖
+		if (product.getIsSale() != null) {
+			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_ISSALE_FIELD, String.valueOf(product.getIsSale()), Store.YES));
+		} else {
+			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_ISSALE_FIELD, String.valueOf(0), Store.YES));
+		}
+
+		// 是否可买 为空则不可买
+		if (product.getIsPurchase() != null) {
+			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_ISPURCHASE_FIELD, String.valueOf(product.getIsPurchase()), Store.YES));
+		} else {
+			document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_ISPURCHASE_FIELD, String.valueOf(0), Store.YES));
+		}
 		return document;
 	}