|
|
@@ -4,10 +4,8 @@ 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;
|
|
|
@@ -23,12 +21,8 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
-import com.uas.search.console.model.OrderDetailSimpleInfo;
|
|
|
-import com.uas.search.console.model.OrderInvoiceDetailSimpleInfo;
|
|
|
import com.uas.search.console.model.OrderInvoiceSimpleInfo;
|
|
|
import com.uas.search.console.model.OrderSimpleInfo;
|
|
|
-import com.uas.search.console.model.PurchaseDetailSimpleInfo;
|
|
|
-import com.uas.search.console.model.PurchaseInvoiceDetailSimpleInfo;
|
|
|
import com.uas.search.console.model.PurchaseInvoiceSimpleInfo;
|
|
|
import com.uas.search.console.model.PurchaseSimpleInfo;
|
|
|
import com.uas.search.console.service.InnerOrderSearchService;
|
|
|
@@ -81,26 +75,26 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
|
|
|
@Override
|
|
|
public SPage<BaseOrder> searchOrderIds(String keyword, PageParams params) {
|
|
|
- return searchMainTable(keyword, params, SearchConstants.ORDER_TABLE_NAME);
|
|
|
+ return searchMainOrder(keyword, params, SearchConstants.ORDER_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public SPage<BaseOrder> searchOrderInvoiceIds(String keyword, PageParams params) {
|
|
|
- return searchMainTable(keyword, params, SearchConstants.ORDER_INVOICE_TABLE_NAME);
|
|
|
+ return searchMainOrder(keyword, params, SearchConstants.ORDER_INVOICE_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public SPage<BaseOrder> searchPurchaseIds(String keyword, PageParams params) {
|
|
|
- return searchMainTable(keyword, params, SearchConstants.PURCHASE_TABLE_NAME);
|
|
|
+ return searchMainOrder(keyword, params, SearchConstants.PURCHASE_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public SPage<BaseOrder> searchPurchaseInvoiceIds(String keyword, PageParams params) {
|
|
|
- return searchMainTable(keyword, params, SearchConstants.PURCHASE_INVOICE_TABLE_NAME);
|
|
|
+ return searchMainOrder(keyword, params, SearchConstants.PURCHASE_INVOICE_TABLE_NAME);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 搜索主表索引
|
|
|
+ * 搜索主索引(相对于明细来说)
|
|
|
*
|
|
|
* @param keyword
|
|
|
* 关键词
|
|
|
@@ -110,7 +104,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
* 主表名
|
|
|
* @return 搜索结果
|
|
|
*/
|
|
|
- private SPage<BaseOrder> searchMainTable(String keyword, PageParams params, String tableName) {
|
|
|
+ private SPage<BaseOrder> searchMainOrder(String keyword, PageParams params, String tableName) {
|
|
|
if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
throw new SearchException("搜索关键词无效:" + keyword);
|
|
|
}
|
|
|
@@ -219,7 +213,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
|
|
|
// 如果主表中未匹配到结果,再搜索其明细表
|
|
|
if (totalHits == 0) {
|
|
|
- return searchDetailTable(keyword, params, OrderSearchUtils.getDetailTableName(tableName));
|
|
|
+ return searchDetails(keyword, params, tableName);
|
|
|
} else {
|
|
|
if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
|
|
|
throw new SearchException("页码过大:元素总数量为" + totalHits);
|
|
|
@@ -234,7 +228,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
// 如果主表中未匹配到结果,再搜索其明细表
|
|
|
int totalHits = topDocs.totalHits;
|
|
|
if (totalHits < 1) {
|
|
|
- return searchDetailTable(keyword, params, OrderSearchUtils.getDetailTableName(tableName));
|
|
|
+ return searchDetails(keyword, params, tableName);
|
|
|
}
|
|
|
|
|
|
// 设置总元素个数、页数等信息
|
|
|
@@ -252,8 +246,11 @@ 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)));
|
|
|
+ List<BaseOrderDetail> details = DocumentToObjectUtils
|
|
|
+ .toDetailsList(document.get(OrderSearchUtils.getDetailsField(tableName)));
|
|
|
+ if (!CollectionUtils.isEmpty(details)) {
|
|
|
+ baseOrder.setDetails(details);
|
|
|
+ }
|
|
|
baseOrders.add(baseOrder);
|
|
|
}
|
|
|
sPage.setContent(baseOrders);
|
|
|
@@ -266,7 +263,7 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 搜索明细表索引
|
|
|
+ * 搜索明细索引
|
|
|
*
|
|
|
* @param keyword
|
|
|
* 关键词
|
|
|
@@ -276,12 +273,11 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
* 明细表名
|
|
|
* @return 搜索结果
|
|
|
*/
|
|
|
- private SPage<BaseOrder> searchDetailTable(String keyword, PageParams params, String tableName) {
|
|
|
+ private SPage<BaseOrder> searchDetails(String keyword, PageParams params, String tableName) {
|
|
|
if (SearchUtils.isKeywordInvalid(keyword)) {
|
|
|
throw new SearchException("搜索关键词无效:" + keyword);
|
|
|
}
|
|
|
IndexSearcher indexSearcher = SearchUtils.getIndexSearcher();
|
|
|
- List<String> keywordFields = OrderSearchUtils.getKeywordFields(tableName);
|
|
|
|
|
|
SPage<BaseOrder> sPage = new SPage<>();
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
@@ -289,12 +285,8 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
// 关键词带空格,进行与操作
|
|
|
String[] strs = keyword.split(" ");
|
|
|
for (String str : strs) {
|
|
|
- // keyword可能是哪些域
|
|
|
- BooleanQuery booleanQuery2 = new BooleanQuery();
|
|
|
- for (String keywordField : keywordFields) {
|
|
|
- booleanQuery2.add(SearchUtils.getBooleanQuery(keywordField, str), BooleanClause.Occur.SHOULD);
|
|
|
- }
|
|
|
- booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
|
|
|
+ booleanQuery.add(SearchUtils.getBooleanQuery(OrderSearchUtils.getDetailsField(tableName), str),
|
|
|
+ BooleanClause.Occur.MUST);
|
|
|
}
|
|
|
|
|
|
// 分页信息
|
|
|
@@ -316,22 +308,6 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
} else {
|
|
|
sPage.setSize(PAGE_SIZE);
|
|
|
}
|
|
|
- Map<String, Object> filters = params.getFilters();
|
|
|
- if (!CollectionUtils.isEmpty(filters)) {
|
|
|
- // 如果filter中有订单状态
|
|
|
- if (!StringUtils.isEmpty(filters.get(OrderSearchConstants.STATUS_KEY))) {
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- List<Integer> statusList = (List<Integer>) filters.get(OrderSearchConstants.STATUS_KEY);
|
|
|
- BooleanQuery booleanQuery2 = new BooleanQuery();
|
|
|
- for (Integer status : statusList) {
|
|
|
- booleanQuery2.add(
|
|
|
- new TermQuery(
|
|
|
- new Term(OrderSearchUtils.getStatusField(tableName), String.valueOf(status))),
|
|
|
- BooleanClause.Occur.SHOULD);
|
|
|
- }
|
|
|
- booleanQuery.add(booleanQuery2, BooleanClause.Occur.MUST);
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
logger.info(booleanQuery);
|
|
|
|
|
|
@@ -369,24 +345,20 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
}
|
|
|
|
|
|
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
- // 多条明细数据可能同属于一条主表数据,因此先统计主表id(作为key,以免重复,值为其下的明细数据),最后再获取所有的主表数据
|
|
|
- Map<Long, List<BaseOrderDetail>> map = new HashMap<>();
|
|
|
+ List<BaseOrder> baseOrders = new ArrayList<>();
|
|
|
for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
- Long orderId = Long.valueOf(document.get(OrderSearchUtils.getDetailTableForeignIdField(tableName)));
|
|
|
- List<BaseOrderDetail> baseOrderDetails = map.get(orderId);
|
|
|
- if (CollectionUtils.isEmpty(baseOrderDetails)) {
|
|
|
- baseOrderDetails = new ArrayList<>();
|
|
|
+ Long id = Long.valueOf(document.get(OrderSearchUtils.getIdField(tableName)));
|
|
|
+ String code = document.get(OrderSearchUtils.getCodeField(tableName));
|
|
|
+ BaseOrder baseOrder = new BaseOrder(id, code);
|
|
|
+ List<BaseOrderDetail> details = DocumentToObjectUtils
|
|
|
+ .toDetailsList(document.get(OrderSearchUtils.getDetailsField(tableName)));
|
|
|
+ if (!CollectionUtils.isEmpty(details)) {
|
|
|
+ baseOrder.setDetails(details);
|
|
|
}
|
|
|
-
|
|
|
- baseOrderDetails
|
|
|
- .add(new BaseOrderDetail(Long.valueOf(document.get(OrderSearchUtils.getIdField(tableName))),
|
|
|
- Short.valueOf(document.get(OrderSearchUtils.getDetnoField(tableName))),
|
|
|
- document.get(OrderSearchUtils.getCodeField(tableName))));
|
|
|
- map.put(orderId, baseOrderDetails);
|
|
|
+ baseOrders.add(baseOrder);
|
|
|
}
|
|
|
- // 获取主表数据
|
|
|
- sPage.setContent(getBaseOrdersByDetails(map, OrderSearchUtils.getMainTableName(tableName)));
|
|
|
+ sPage.setContent(baseOrders);
|
|
|
} catch (NumberFormatException | IOException e) {
|
|
|
throw new SearchException(e).setDetailedMessage(e);
|
|
|
} finally {
|
|
|
@@ -395,111 +367,26 @@ public class OrderSearchServiceImpl implements OrderSearchService, InnerOrderSea
|
|
|
return sPage;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 明细表中根据主表单据id(外键)获取明细信息
|
|
|
- *
|
|
|
- * @param id
|
|
|
- * 单据id
|
|
|
- * @param tableName
|
|
|
- * 明细表名
|
|
|
- * @return 对应的明细信息
|
|
|
- */
|
|
|
- private List<BaseOrderDetail> getDetails(Long id, String tableName) {
|
|
|
- if (id == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- List<Document> documents = SearchUtils.getDocuments(OrderSearchUtils.getDetailTableForeignIdField(tableName),
|
|
|
- id.toString());
|
|
|
- List<BaseOrderDetail> baseOrderDetails = new ArrayList<>();
|
|
|
- for (Document document : documents) {
|
|
|
- baseOrderDetails.add(new BaseOrderDetail(Long.valueOf(document.get(OrderSearchUtils.getIdField(tableName))),
|
|
|
- Short.valueOf(document.get(OrderSearchUtils.getDetnoField(tableName))),
|
|
|
- document.get(OrderSearchUtils.getCodeField(tableName))));
|
|
|
- }
|
|
|
- return baseOrderDetails;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 主表中根据单据明细获取主表数据,汇总后返回
|
|
|
- *
|
|
|
- * @param map
|
|
|
- * 明细数据,主表id(外键)为key,明细数据为value
|
|
|
- * @return 汇总后的数据
|
|
|
- */
|
|
|
- private List<BaseOrder> getBaseOrdersByDetails(Map<Long, List<BaseOrderDetail>> map, String tableName) {
|
|
|
- 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 = SearchUtils.getDocuments(OrderSearchUtils.getIdField(tableName),
|
|
|
- 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(OrderSearchUtils.getCodeField(tableName)));
|
|
|
- }
|
|
|
- }
|
|
|
- baseOrders.add(baseOrder);
|
|
|
- }
|
|
|
- return baseOrders;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public OrderSimpleInfo getOrder(Long id) {
|
|
|
return DocumentToObjectUtils.toOrder(SearchUtils.getDocumentById(SearchConstants.ORDER_ID_FIELD, id));
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public OrderDetailSimpleInfo getOrderDetail(Long id) {
|
|
|
- return DocumentToObjectUtils
|
|
|
- .toOrderDetail(SearchUtils.getDocumentById(SearchConstants.ORDER_DETAIL_ID_FIELD, id));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public OrderInvoiceSimpleInfo getOrderInvoice(Long id) {
|
|
|
return DocumentToObjectUtils
|
|
|
.toOrderInvoice(SearchUtils.getDocumentById(SearchConstants.ORDER_INVOICE_ID_FIELD, id));
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public OrderInvoiceDetailSimpleInfo getOrderInvoiceDetail(Long id) {
|
|
|
- return DocumentToObjectUtils
|
|
|
- .toOrderInvoiceDetail(SearchUtils.getDocumentById(SearchConstants.ORDER_INVOICE_DETAIL_ID_FIELD, id));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public PurchaseSimpleInfo getPurchase(Long id) {
|
|
|
return DocumentToObjectUtils.toPurchase(SearchUtils.getDocumentById(SearchConstants.PURCHASE_ID_FIELD, id));
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public PurchaseDetailSimpleInfo getPurchaseDetail(Long id) {
|
|
|
- return DocumentToObjectUtils
|
|
|
- .toPurchaseDetail(SearchUtils.getDocumentById(SearchConstants.PURCHASE_DETAIL_ID_FIELD, id));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public PurchaseInvoiceSimpleInfo getPurchaseInvoice(Long id) {
|
|
|
return DocumentToObjectUtils
|
|
|
.toPurchaseInvoice(SearchUtils.getDocumentById(SearchConstants.PURCHASE_INVOICE_ID_FIELD, id));
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public PurchaseInvoiceDetailSimpleInfo getPurchaseInvoiceDetail(Long id) {
|
|
|
- return DocumentToObjectUtils.toPurchaseInvoiceDetail(
|
|
|
- SearchUtils.getDocumentById(SearchConstants.PURCHASE_INVOICE_DETAIL_ID_FIELD, id));
|
|
|
- }
|
|
|
-
|
|
|
}
|