sunyj 9 роки тому
батько
коміт
40626b3502

+ 16 - 2
search-console/src/main/java/com/uas/search/console/controller/OrderSearchController.java

@@ -112,11 +112,25 @@ public class OrderSearchController {
 		return orderSearchService.searchOrderIds(keyword, params);
 	}
 
+	@RequestMapping("orderDetails")
+	@ResponseBody
+	public SPage<BaseOrder> searchOrderDetailIds(String keyword, Integer page, Integer size) {
+		PageParams params = new PageParams();
+		if (page != null) {
+			params.setPage(page);
+		}
+		if (size != null) {
+			params.setSize(size);
+		}
+		return orderSearchService.searchOrderDetailIds(keyword, params);
+	}
+
 	/**
-	 * 2016-10-10 1:12:20
+	 * 将时间字符串转为long eg. 2016-10-10 1:12:20
 	 * 
 	 * @param str
-	 * @return
+	 *            时间,eg. 2016-10-10 1:12:20
+	 * @return long值
 	 */
 	private Long parseTime(String str) {
 		try {

+ 22 - 8
search-console/src/main/java/com/uas/search/console/service/InnerOrderSearchService.java

@@ -16,9 +16,10 @@ public interface InnerOrderSearchService {
 	 * 根据关键词和其他信息搜索销售单id信息
 	 * 
 	 * @param keyword
-	 *            关键词,可以是:销售单号、买方个人姓名、买方企业名称、卖方企业名称、明细中的器件型号、 器件品牌名称、器件类目名称
+	 *            关键词,可以是:销售单号、买方个人姓名、买方企业名称、卖方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
 	 * @param params
-	 *            其他信息,filter中可以有:买方个人UU号、买方企业UU号、卖方企业UU号、订单日期范围最大值、订单日期最小值
+	 *            其他信息,可能带有翻页信息,filter中可以有:买方个人UU号、买方企业UU号、卖方企业UU号、订单日期范围最大值、
+	 *            订单日期最小值
 	 * @return 符合条件的单据。<br>
 	 *         如果关键词命中主表中的信息,结果有主表信息不带从表;<br>
 	 *         如果关键词没命中主表信息,命中了从表中的信息,结果有主表带被命中的从表信息;<br>
@@ -26,13 +27,26 @@ public interface InnerOrderSearchService {
 	 */
 	public SPage<BaseOrder> searchOrderIds(String keyword, PageParams params);
 
+	/**
+	 * 根据关键词搜索销售单明细id信息
+	 * 
+	 * @param keyword
+	 *            关键词,可以是:单号、器件型号、 器件品牌名称、器件类目名称
+	 * @param params
+	 *            其他信息,可能带有翻页信息
+	 * @return 符合条件的单据。<br>
+	 *         如果关键词命中了从表中的信息,结果有主表带被命中的从表信息;<br>
+	 *         如果都没有命中,则不命中。
+	 */
+	public SPage<BaseOrder> searchOrderDetailIds(String keyword, PageParams params);
+
 	/**
 	 * 根据关键词和其他信息搜索销售发货单id信息
 	 * 
 	 * @param keyword
-	 *            关键词,可以是:发货单号、买方个人姓名、买方企业名称、明细中的器件型号、 器件品牌名称、器件类目名称
+	 *            关键词,可以是:发货单号、买方个人姓名、买方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
 	 * @param params
-	 *            其他信息,filter中可以有:买方个人UU号、买方企业UU号、订单日期范围最大值、订单日期最小值
+	 *            其他信息,可能带有翻页信息,filter中可以有:买方个人UU号、买方企业UU号、订单日期范围最大值、订单日期最小值
 	 * @return 符合条件的单据。<br>
 	 *         如果关键词命中主表中的信息,结果有主表信息不带从表;<br>
 	 *         如果关键词没命中主表信息,命中了从表中的信息,结果有主表带被命中的从表信息;<br>
@@ -44,9 +58,9 @@ public interface InnerOrderSearchService {
 	 * 根据关键词和其他信息搜索采购单id信息
 	 * 
 	 * @param keyword
-	 *            模糊搜索关键词,可以是:采购单号、卖方企业名称、明细中的器件型号、器件品牌名称、 器件类目名称
+	 *            模糊搜索关键词,可以是:采购单号、卖方企业名称、明细中的单号、器件型号、器件品牌名称、 器件类目名称
 	 * @param params
-	 *            关键词,可以是:卖方企业UU号、订单日期范围最大值、订单日期最小值
+	 *            关键词,可能带有翻页信息,可以是:卖方企业UU号、订单日期范围最大值、订单日期最小值
 	 * @return 符合条件的单据。<br>
 	 *         如果关键词命中主表中的信息,结果有主表信息不带从表;<br>
 	 *         如果关键词没命中主表信息,命中了从表中的信息,结果有主表带被命中的从表信息;<br>
@@ -58,9 +72,9 @@ public interface InnerOrderSearchService {
 	 * 根据关键词和其他信息搜索采购发货单id信息
 	 * 
 	 * @param keyword
-	 *            关键词,可以是:发货单号、卖方企业名称、明细中的器件型号、 器件品牌名称、器件类目名称
+	 *            关键词,可以是:发货单号、卖方企业名称、明细中的单号、器件型号、 器件品牌名称、器件类目名称
 	 * @param params
-	 *            其他信息,filter中可以有:卖方企业UU号、订单日期范围最大值、订单日期最小值
+	 *            其他信息,可能带有翻页信息,filter中可以有:卖方企业UU号、订单日期范围最大值、订单日期最小值
 	 * @return 符合条件的单据。<br>
 	 *         如果关键词命中主表中的信息,结果有主表信息不带从表;<br>
 	 *         如果关键词没命中主表信息,命中了从表中的信息,结果有主表带被命中的从表信息;<br>

+ 171 - 23
search-console/src/main/java/com/uas/search/console/service/impl/OrderSearchServiceImpl.java

@@ -4,8 +4,10 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.apache.lucene.document.Document;
@@ -166,8 +168,8 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 				if (totalHits == 0) {
 					return searchOrderDetailIds(keyword, params);
 				} else {
-					if ((sPage.getPage() - 1) * sPage.getSize() > totalHits) {
-						throw new SearchException("页码过大");
+					if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
+						throw new SearchException("页码过大:元素总数量为" + totalHits);
 					}
 					topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
 							sPage.getSize());
@@ -208,6 +210,139 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		return sPage;
 	}
 
+	@Override
+	public SPage<BaseOrder> searchOrderDetailIds(String keyword, PageParams params) {
+		if (SearchUtils.isKeywordInvalid(keyword)) {
+			throw new SearchException("搜索关键词无效:" + keyword);
+		}
+		IndexSearcher indexSearcher = getIndexSearcher();
+		SPage<BaseOrder> sPage = new SPage<>();
+		BooleanQuery booleanQuery = new BooleanQuery();
+
+		// 关键词带空格,进行与操作
+		String[] strs = keyword.split(" ");
+		for (String str : strs) {
+			// 单号、器件型号、 器件品牌名称、器件类目名称
+			BooleanQuery booleanQuery2 = new BooleanQuery();
+			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_CODE_FIELD, str),
+					BooleanClause.Occur.SHOULD);
+			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD, str),
+					BooleanClause.Occur.SHOULD);
+			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD, str),
+					BooleanClause.Occur.SHOULD);
+			booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_DETAIL_BRANDNAME_FIELD, str),
+					BooleanClause.Occur.SHOULD);
+			booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
+		}
+
+		// 分页信息
+		if (params == null) {
+			sPage.setPage(PAGE_INDEX);
+			sPage.setSize(PAGE_SIZE);
+			sPage.setFirst(true);
+		} else {
+			int page = params.getPage();
+			if (page > 0) {
+				sPage.setPage(page);
+			} else {
+				sPage.setPage(PAGE_INDEX);
+				sPage.setFirst(true);
+			}
+			int size = params.getSize();
+			if (size > 0) {
+				sPage.setSize(size);
+			} else {
+				sPage.setSize(PAGE_SIZE);
+			}
+		}
+		logger.info(booleanQuery);
+
+		try {
+			TopDocs topDocs = null;
+			// 如果页码不为1
+			if (sPage.getPage() > 1) {
+				TopDocs previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * sPage.getSize());
+				int totalHits = previousTopDocs.totalHits;
+				ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
+				logger.info(previousScoreDocs == null || previousScoreDocs.length == 0);
+				if (totalHits != 0) {
+					if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
+						throw new SearchException("页码过大:元素总数量为" + totalHits);
+					}
+					topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
+							sPage.getSize());
+				}
+			} else {
+				sPage.setFirst(true);
+				topDocs = indexSearcher.search(booleanQuery, sPage.getSize());
+			}
+
+			if (topDocs == null || topDocs.totalHits < 1) {
+				sPage.setTotalElement(0);
+				sPage.setFirst(true);
+				sPage.setLast(true);
+				return sPage;
+			}
+
+			sPage.setTotalElement(topDocs.totalHits);
+			int totalPage = (int) Math.ceil(topDocs.totalHits / (1.0 * sPage.getSize()));
+			sPage.setTotalPage(totalPage);
+			if (totalPage == sPage.getPage()) {
+				sPage.setLast(true);
+			}
+
+			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
+			Map<Long, List<BaseOrderDetail>> map = new HashMap<>();
+			for (ScoreDoc scoreDoc : scoreDocs) {
+				Document document = indexSearcher.doc(scoreDoc.doc);
+				Long orderId = Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ORDERID_FIELD));
+				List<BaseOrderDetail> baseOrderDetails = map.get(orderId);
+				if (CollectionUtils.isEmpty(baseOrderDetails)) {
+					baseOrderDetails = new ArrayList<>();
+				}
+
+				logger.info(document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD) + " "
+						+ document.get(SearchConstants.ORDER_DETAIL_COMPONENTCODE_FIELD) + " "
+						+ document.get(SearchConstants.ORDER_DETAIL_KINDNAME_FIELD) + " "
+						+ document.get(SearchConstants.ORDER_DETAIL_BRANDNAME_FIELD));
+
+				Long id = Long.valueOf(document.get(SearchConstants.ORDER_DETAIL_ID_FIELD));
+				String code = document.get(SearchConstants.ORDER_DETAIL_CODE_FIELD);
+				String detno = document.get(SearchConstants.ORDER_DETAIL_DETNO_FIELD);
+				if (!StringUtils.isEmpty(detno)) {
+					baseOrderDetails.add(new BaseOrderDetail(id, Short.valueOf(detno), code));
+				} else {
+					baseOrderDetails.add(new BaseOrderDetail(id, null, code));
+				}
+				map.put(orderId, baseOrderDetails);
+			}
+			sPage.setContent(getBaseOrdersByDetails(map));
+		} catch (NumberFormatException | IOException e) {
+			throw new SearchException(e).setDetailedMessage(e);
+		} finally {
+			searcherManager.release(indexSearcher);
+		}
+		return sPage;
+	}
+
+	@Override
+	public SPage<BaseOrder> searchOrderInvoiceIds(String keyword, PageParams params) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public SPage<BaseOrder> searchPurchaseInvoiceIds(String keyword, PageParams params) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 	/**
 	 * 根据销售单id获取其明细
 	 * 
@@ -234,27 +369,40 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
 		return baseOrderDetails;
 	}
 
-	private SPage<BaseOrder> searchOrderDetailIds(String keyword, PageParams params) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SPage<BaseOrder> searchOrderInvoiceIds(String keyword, PageParams params) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public SPage<BaseOrder> searchPurchaseInvoiceIds(String keyword, PageParams params) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 根据销售单明细获取销售单数据
+	 * 
+	 * @param map
+	 *            销售单id为key,销售单明细数据为值
+	 * @return 销售单数据
+	 */
+	public List<BaseOrder> getBaseOrdersByDetails(Map<Long, List<BaseOrderDetail>> map) {
+		List<BaseOrder> baseOrders = new ArrayList<>();
+		if (CollectionUtils.isEmpty(map)) {
+			return baseOrders;
+		}
+		Set<Long> keySet = map.keySet();
+		for (Long key : keySet) {
+			BaseOrder baseOrder = new BaseOrder();
+			List<BaseOrderDetail> baseOrderDetails = map.get(key);
+			baseOrder.setDetails(baseOrderDetails);
+			List<Document> documents = getDocuments(SearchConstants.ORDER_ID_FIELD, Long.toString(key));
+			if (CollectionUtils.isEmpty(documents)) {
+				logger.error("明细表中外键" + key + "对应的主表索引不存在");
+				continue;
+			} else {
+				if (documents.size() > 1) {
+					logger.error("明细表中外键" + key + "对应的主表索引不唯一");
+					continue;
+				} else {
+					Document document = documents.get(0);
+					baseOrder.setId(key);
+					baseOrder.setCode(document.get(SearchConstants.ORDER_CODE_FIELD));
+				}
+			}
+			baseOrders.add(baseOrder);
+		}
+		return baseOrders;
 	}
 
 	/**