|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/**
|