|
|
@@ -89,7 +89,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
|
|
|
@Override
|
|
|
public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params) {
|
|
|
- // TODO Auto-generated method stub
|
|
|
return searchMainTable(keyword, params, SearchConstants.PURCHASE_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
@@ -98,369 +97,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
return searchMainTable(keyword, params, SearchConstants.PURCHASE_INVOICE_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
- public SPage<BaseOrder> searchOrder2Ids(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_CODE_FIELD, str),
|
|
|
- BooleanClause.Occur.SHOULD);
|
|
|
- booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_BUYERNAME_FIELD, str),
|
|
|
- BooleanClause.Occur.SHOULD);
|
|
|
- booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_BUYERENNAME_FIELD, str),
|
|
|
- BooleanClause.Occur.SHOULD);
|
|
|
- booleanQuery2.add(SearchUtils.getBooleanQuery(SearchConstants.ORDER_SELLERENNAME_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);
|
|
|
- }
|
|
|
-
|
|
|
- // 买方uu、买方企业uu、卖方企业uu、日期范围
|
|
|
- Map<String, Object> filters = params.getFilters();
|
|
|
- if (!CollectionUtils.isEmpty(filters)) {
|
|
|
- if (!StringUtils.isEmpty(filters.get("or_buyeruu"))) {
|
|
|
- booleanQuery.add(new TermQuery(
|
|
|
- new Term(SearchConstants.ORDER_BUYERUU_FIELD, filters.get("or_buyeruu").toString())),
|
|
|
- BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
- if (!StringUtils.isEmpty(filters.get("or_buyerenuu"))) {
|
|
|
- booleanQuery.add(new TermQuery(
|
|
|
- new Term(SearchConstants.ORDER_BUYERENUU_FIELD, filters.get("or_buyerenuu").toString())),
|
|
|
- BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
- if (!StringUtils.isEmpty(filters.get("or_sellerenuu"))) {
|
|
|
- booleanQuery.add(new TermQuery(
|
|
|
- new Term(SearchConstants.ORDER_SELLERENUU_FIELD, filters.get("or_sellerenuu").toString())),
|
|
|
- BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
- if (!StringUtils.isEmpty(filters.get(SearchConstants.MIN_TIME_KEY))
|
|
|
- || !StringUtils.isEmpty(filters.get(SearchConstants.MAX_TIME_KEY))) {
|
|
|
- // 最小日期初始化为2016.1.1
|
|
|
- Calendar calendar = Calendar.getInstance();
|
|
|
- calendar.set(2016, 0, 1);
|
|
|
- // 最大日期初始化为现在
|
|
|
- long minTime = calendar.getTimeInMillis();
|
|
|
- long maxTime = new Date().getTime();
|
|
|
- if (!StringUtils.isEmpty(filters.get(SearchConstants.MIN_TIME_KEY))) {
|
|
|
- minTime = Long.parseLong(filters.get(SearchConstants.MIN_TIME_KEY).toString());
|
|
|
- logger.info("--" + minTime);
|
|
|
- }
|
|
|
- if (!StringUtils.isEmpty(filters.get(SearchConstants.MAX_TIME_KEY))) {
|
|
|
- maxTime = Long.parseLong(filters.get(SearchConstants.MAX_TIME_KEY).toString());
|
|
|
- logger.info("--" + maxTime);
|
|
|
- }
|
|
|
- booleanQuery.add(NumericRangeQuery.newLongRange(SearchConstants.ORDER_CREATETIME_FIELD, minTime,
|
|
|
- maxTime, true, true), BooleanClause.Occur.MUST);
|
|
|
- logger.info(minTime);
|
|
|
- logger.info(maxTime);
|
|
|
- logger.info(new Date(minTime));
|
|
|
- logger.info(new Date(maxTime));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- logger.info(booleanQuery);
|
|
|
-
|
|
|
- try {
|
|
|
- TopDocs topDocs;
|
|
|
- // 如果页码不为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) {
|
|
|
- return searchOrderDetailIds(keyword, params);
|
|
|
- } else {
|
|
|
- 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());
|
|
|
- }
|
|
|
- // 如果主表中未匹配到结果,再搜索其明细表
|
|
|
- int totalHits = topDocs.totalHits;
|
|
|
- if (totalHits < 1) {
|
|
|
- return searchOrderDetailIds(keyword, params);
|
|
|
- }
|
|
|
-
|
|
|
- sPage.setTotalElement(totalHits);
|
|
|
- int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
|
|
|
- sPage.setTotalPage(totalPage);
|
|
|
- if (totalPage == sPage.getPage()) {
|
|
|
- sPage.setLast(true);
|
|
|
- }
|
|
|
-
|
|
|
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
- List<BaseOrder> baseOrders = new ArrayList<>();
|
|
|
- for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
- Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
- Long id = Long.valueOf(document.get(SearchConstants.ORDER_ID_FIELD));
|
|
|
- String code = document.get(SearchConstants.ORDER_CODE_FIELD);
|
|
|
- BaseOrder baseOrder = new BaseOrder(id, code);
|
|
|
- baseOrder.setDetails(getOrderDetails(id));
|
|
|
- baseOrders.add(baseOrder);
|
|
|
- }
|
|
|
- sPage.setContent(baseOrders);
|
|
|
- } catch (NumberFormatException | IOException e) {
|
|
|
- throw new SearchException(e).setDetailedMessage(e);
|
|
|
- } finally {
|
|
|
- searcherManager.release(indexSearcher);
|
|
|
- }
|
|
|
- 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;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据销售单id获取其明细
|
|
|
- *
|
|
|
- * @param orderid
|
|
|
- * 销售单id
|
|
|
- * @return 对应的明细信息
|
|
|
- */
|
|
|
- private List<BaseOrderDetail> getOrderDetails(Long orderid) {
|
|
|
- if (orderid == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- List<Document> documents = getDocuments(SearchConstants.ORDER_DETAIL_ORDERID_FIELD, orderid.toString());
|
|
|
- List<BaseOrderDetail> baseOrderDetails = new ArrayList<>();
|
|
|
- for (Document document : documents) {
|
|
|
- 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));
|
|
|
- }
|
|
|
- }
|
|
|
- return baseOrderDetails;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据销售单明细获取销售单数据
|
|
|
- *
|
|
|
- * @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;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取IndexSearcher对象,若为空,抛出异常
|
|
|
- *
|
|
|
- * @return IndexSearcher对象
|
|
|
- */
|
|
|
- private IndexSearcher getIndexSearcher() {
|
|
|
- searcherManager.maybeReopen();
|
|
|
- IndexSearcher indexSearcher = searcherManager.get();
|
|
|
- if (indexSearcher == null) {
|
|
|
- throw new SearchException("获取索引文件失败");
|
|
|
- }
|
|
|
- return indexSearcher;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 根据域和搜索词获取Document列表
|
|
|
- *
|
|
|
- * @param field
|
|
|
- * 搜索域
|
|
|
- * @param keyword
|
|
|
- * 搜索词
|
|
|
- * @return Document列表
|
|
|
- */
|
|
|
- private List<Document> getDocuments(String field, String keyword) {
|
|
|
- if (StringUtils.isEmpty(field) || StringUtils.isEmpty(keyword)) {
|
|
|
- throw new SearchException("搜索的域和搜索词不能为空");
|
|
|
- }
|
|
|
- IndexSearcher indexSearcher = getIndexSearcher();
|
|
|
- List<Document> documents = new ArrayList<>();
|
|
|
- TermQuery termQuery = new TermQuery(new Term(field, String.valueOf(keyword)));
|
|
|
- try {
|
|
|
- TopDocs topDocs = indexSearcher.search(termQuery, TOP_NUM);
|
|
|
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
- for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
- documents.add(indexSearcher.doc(scoreDoc.doc));
|
|
|
- }
|
|
|
- } catch (IOException e) {
|
|
|
- throw new SearchException(e);
|
|
|
- } finally {
|
|
|
- searcherManager.release(indexSearcher);
|
|
|
- }
|
|
|
- return documents;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 搜索主表索引
|
|
|
*
|
|
|
@@ -477,7 +113,9 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
throw new SearchException("搜索关键词无效:" + keyword);
|
|
|
}
|
|
|
IndexSearcher indexSearcher = getIndexSearcher();
|
|
|
+ // 获取该表keyword可以搜索的域
|
|
|
List<String> keywordFields = OrderSearchUtils.getKeywordFields(tableName);
|
|
|
+ // 获取filter可以过滤的域
|
|
|
List<String> filterFields = OrderSearchUtils.getFilterFields(tableName);
|
|
|
|
|
|
SPage<BaseOrder> sPage = new SPage<>();
|
|
|
@@ -514,7 +152,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
sPage.setSize(PAGE_SIZE);
|
|
|
}
|
|
|
|
|
|
- // filter中的域、日期范围
|
|
|
Map<String, Object> filters = params.getFilters();
|
|
|
if (!CollectionUtils.isEmpty(filters)) {
|
|
|
// filter中可能会有哪些域
|
|
|
@@ -542,10 +179,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
booleanQuery.add(NumericRangeQuery.newLongRange(SearchConstants.ORDER_CREATETIME_FIELD, minTime,
|
|
|
maxTime, true, true), BooleanClause.Occur.MUST);
|
|
|
- logger.info(minTime);
|
|
|
- logger.info(maxTime);
|
|
|
- logger.info(new Date(minTime));
|
|
|
- logger.info(new Date(maxTime));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -579,6 +212,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
return searchDetailTable(keyword, params, OrderSearchUtils.getDetailTableName(tableName));
|
|
|
}
|
|
|
|
|
|
+ // 设置总元素个数、页数等信息
|
|
|
sPage.setTotalElement(totalHits);
|
|
|
int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
|
|
|
sPage.setTotalPage(totalPage);
|
|
|
@@ -593,6 +227,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
Long id = Long.valueOf(document.get(OrderSearchUtils.getIdField(tableName)));
|
|
|
String code = document.get(OrderSearchUtils.getCodeField(tableName));
|
|
|
BaseOrder baseOrder = new BaseOrder(id, code);
|
|
|
+ // 获取明细表的信息,汇合起来返回
|
|
|
baseOrder.setDetails(getDetails(id, OrderSearchUtils.getDetailTableName(tableName)));
|
|
|
baseOrders.add(baseOrder);
|
|
|
}
|
|
|
@@ -679,13 +314,13 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
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);
|
|
|
@@ -694,6 +329,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
|
|
|
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
+ // 多条明细数据可能同属于一条主表数据,因此先统计主表id(作为key,以免重复,值为其下的明细数据),最后再获取所有的主表数据
|
|
|
Map<Long, List<BaseOrderDetail>> map = new HashMap<>();
|
|
|
for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
@@ -713,6 +349,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
map.put(orderId, baseOrderDetails);
|
|
|
}
|
|
|
+ // 获取主表数据
|
|
|
sPage.setContent(getBaseOrdersByDetails(map, OrderSearchUtils.getMainTableName(tableName)));
|
|
|
} catch (NumberFormatException | IOException e) {
|
|
|
throw new SearchException(e).setDetailedMessage(e);
|
|
|
@@ -723,7 +360,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 明细表中根据主表单据id(外键)获取其明细信息
|
|
|
+ * 明细表中根据主表单据id(外键)获取明细信息
|
|
|
*
|
|
|
* @param id
|
|
|
* 单据id
|
|
|
@@ -754,7 +391,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
* 主表中根据单据明细获取主表数据,汇总后返回
|
|
|
*
|
|
|
* @param map
|
|
|
- * 明细数据,主表id(外键)为key,销售单明细数据为值
|
|
|
+ * 明细数据,主表id(外键)为key,明细数据为value
|
|
|
* @return 汇总后的数据
|
|
|
*/
|
|
|
private List<BaseOrder> getBaseOrdersByDetails(Map<Long, List<BaseOrderDetail>> map, String tableName) {
|
|
|
@@ -786,4 +423,48 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
return baseOrders;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取IndexSearcher对象,若为空,抛出异常
|
|
|
+ *
|
|
|
+ * @return IndexSearcher对象
|
|
|
+ */
|
|
|
+ private IndexSearcher getIndexSearcher() {
|
|
|
+ searcherManager.maybeReopen();
|
|
|
+ IndexSearcher indexSearcher = searcherManager.get();
|
|
|
+ if (indexSearcher == null) {
|
|
|
+ throw new SearchException("获取索引文件失败");
|
|
|
+ }
|
|
|
+ return indexSearcher;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据域和搜索词获取Document列表
|
|
|
+ *
|
|
|
+ * @param field
|
|
|
+ * 搜索域
|
|
|
+ * @param keyword
|
|
|
+ * 搜索词
|
|
|
+ * @return Document列表
|
|
|
+ */
|
|
|
+ private List<Document> getDocuments(String field, String keyword) {
|
|
|
+ if (StringUtils.isEmpty(field) || StringUtils.isEmpty(keyword)) {
|
|
|
+ throw new SearchException("搜索的域和搜索词不能为空");
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = getIndexSearcher();
|
|
|
+ List<Document> documents = new ArrayList<>();
|
|
|
+ TermQuery termQuery = new TermQuery(new Term(field, String.valueOf(keyword)));
|
|
|
+ try {
|
|
|
+ TopDocs topDocs = indexSearcher.search(termQuery, TOP_NUM);
|
|
|
+ ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
+ for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
+ documents.add(indexSearcher.doc(scoreDoc.doc));
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new SearchException(e);
|
|
|
+ } finally {
|
|
|
+ searcherManager.release(indexSearcher);
|
|
|
+ }
|
|
|
+ return documents;
|
|
|
+ }
|
|
|
+
|
|
|
}
|