Pārlūkot izejas kodu

索引实时更新:支持销售发货单明细、采购单、采购单明细、采购发货单、采购发货单明细

sunyj 9 gadi atpakaļ
vecāks
revīzija
61e8d3dc68

+ 3 - 0
search-console/src/main/java/com/uas/search/console/jms/AQListener.java

@@ -156,6 +156,9 @@ public class AQListener {
 		}
 
 		Object[] objects = parsedQueueMessage.getObjects();
+		if (objects == null) {
+			return;
+		}
 		// 新增索引
 		if (parsedQueueMessage.isInsert()) {
 			for (Object object : objects) {

+ 206 - 75
search-console/src/main/java/com/uas/search/console/jms/QueueMessageParser.java

@@ -1,10 +1,7 @@
 package com.uas.search.console.jms;
 
 import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
 
-import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -27,9 +24,14 @@ import com.uas.search.console.model.BrandSimpleInfo;
 import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
 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.ParsedQueueMessage;
+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;
 import com.uas.search.console.service.InnerSearchService;
 import com.uas.search.console.util.SearchConstants;
@@ -129,7 +131,7 @@ public class QueueMessageParser {
 		} else if (table.equals(SearchConstants.ORDER_INVOICE_TABLE_NAME)) {
 			objects = parseOrderInvoice(jsonObject);
 		} else if (table.equals(SearchConstants.ORDER_INVOICE_DETAIL_TABLE_NAME)) {
-			objects = parseOrderDetailInvoice(jsonObject);
+			objects = parseOrderInvoiceDetail(jsonObject);
 		} else if (table.equals(SearchConstants.PURCHASE_TABLE_NAME)) {
 			objects = parsePurchase(jsonObject);
 		} else if (table.equals(SearchConstants.PURCHASE_DETAIL_TABLE_NAME)) {
@@ -137,7 +139,7 @@ public class QueueMessageParser {
 		} else if (table.equals(SearchConstants.PURCHASE_INVOICE_TABLE_NAME)) {
 			objects = parsePurchaseInvoice(jsonObject);
 		} else if (table.equals(SearchConstants.PURCHASE_INVOICE_DETAIL_TABLE_NAME)) {
-			objects = parsePurchaseDetailInvoice(jsonObject);
+			objects = parsePurchaseInvoiceDetail(jsonObject);
 		} else {
 			return null;
 		}
@@ -392,84 +394,213 @@ public class QueueMessageParser {
 		return orderInvoices;
 	}
 
-	private Object[] parsePurchaseDetailInvoice(JSONObject jsonObject) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 对销售发货单明细进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 销售发货单明细对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$invoice_fmor_dt","ids":[124]}
+	private OrderInvoiceDetailSimpleInfo[] parseOrderInvoiceDetail(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		OrderInvoiceDetailSimpleInfo[] orderInvoiceDetails = new OrderInvoiceDetailSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			OrderInvoiceDetailSimpleInfo orderInvoiceDetail = orderInvoiceDetailDao.findById(id);
+			OrderInvoiceDetailSimpleInfo localOrderInvoiceDetail = innerOrderSearchService.getOrderInvoiceDetail(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (orderInvoiceDetail != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localOrderInvoiceDetail == null || localOrderInvoiceDetail.equals(orderInvoiceDetail)) {
+						orderInvoiceDetail = null;
+					}
+				} else {
+					if (localOrderInvoiceDetail != null) {
+						orderInvoiceDetail = new OrderInvoiceDetailSimpleInfo();
+						orderInvoiceDetail.setId(id);
+					}
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localOrderInvoiceDetail != null && localOrderInvoiceDetail.equals(orderInvoiceDetail)) {
+					orderInvoiceDetail = null;
+				}
+			}
+			orderInvoiceDetails[i] = orderInvoiceDetail;
+		}
+		return orderInvoiceDetails;
 	}
 
-	private Object[] parsePurchaseInvoice(JSONObject jsonObject) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 对采购单进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 采购单对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$purchase","ids":[124]}
+	private PurchaseSimpleInfo[] parsePurchase(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		System.out.println("purchase ids " + ids.length + " " + Arrays.toString(ids));
+		PurchaseSimpleInfo[] purchases = new PurchaseSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			PurchaseSimpleInfo purchase = purchaseDao.findById(id);
+			PurchaseSimpleInfo localPurchase = innerOrderSearchService.getPurchase(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (purchase != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localPurchase == null || localPurchase.equals(purchase)) {
+						purchase = null;
+					}
+				} else {
+					if (localPurchase != null) {
+						purchase = new PurchaseSimpleInfo();
+						purchase.setId(id);
+					}
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localPurchase != null && localPurchase.equals(purchase)) {
+					purchase = null;
+				}
+			}
+			purchases[i] = purchase;
+		}
+		return purchases;
 	}
 
-	private Object[] parsePurchaseDetail(JSONObject jsonObject) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 对采购单明细进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 采购单对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$purchase_detail","ids":[124]}
+	private PurchaseDetailSimpleInfo[] parsePurchaseDetail(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		System.out.println("purchaseDetail ids " + ids.length + " " + Arrays.toString(ids));
+		PurchaseDetailSimpleInfo[] purchaseDetails = new PurchaseDetailSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			PurchaseDetailSimpleInfo purchaseDetail = purchaseDetailDao.findById(id);
+			PurchaseDetailSimpleInfo localPurchaseDetail = innerOrderSearchService.getPurchaseDetail(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (purchaseDetail != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localPurchaseDetail == null || localPurchaseDetail.equals(purchaseDetail)) {
+						purchaseDetail = null;
+					}
+				} else {
+					if (localPurchaseDetail != null) {
+						purchaseDetail = new PurchaseDetailSimpleInfo();
+						purchaseDetail.setId(id);
+					}
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localPurchaseDetail != null && localPurchaseDetail.equals(purchaseDetail)) {
+					purchaseDetail = null;
+				}
+			}
+			purchaseDetails[i] = purchaseDetail;
+		}
+		return purchaseDetails;
 	}
 
-	private Object[] parsePurchase(JSONObject jsonObject) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 对采购发货单进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 采购发货单对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$invoice_fmpu","ids":[124]}
+	private PurchaseInvoiceSimpleInfo[] parsePurchaseInvoice(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		PurchaseInvoiceSimpleInfo[] purchaseInvoices = new PurchaseInvoiceSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			PurchaseInvoiceSimpleInfo purchaseInvoice = purchaseInvoiceDao.findById(id);
+			PurchaseInvoiceSimpleInfo localPurchaseInvoice = innerOrderSearchService.getPurchaseInvoice(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (purchaseInvoice != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localPurchaseInvoice == null || localPurchaseInvoice.equals(purchaseInvoice)) {
+						purchaseInvoice = null;
+					}
+				} else {
+					if (localPurchaseInvoice != null) {
+						purchaseInvoice = new PurchaseInvoiceSimpleInfo();
+						purchaseInvoice.setId(id);
+					}
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localPurchaseInvoice != null && localPurchaseInvoice.equals(purchaseInvoice)) {
+					purchaseInvoice = null;
+				}
+			}
+			purchaseInvoices[i] = purchaseInvoice;
+		}
+		return purchaseInvoices;
 	}
 
-	private Object[] parseOrderDetailInvoice(JSONObject jsonObject) {
-		// TODO Auto-generated method stub
-		return null;
+	/**
+	 * 对采购发货单明细进行解析
+	 * 
+	 * @param jsonObject
+	 * @return 采购发货单明细对象数组
+	 * @throws JSONException
+	 */
+	// {"method":"insert","table":"trade$invoice_fmpu_dt","ids":[124]}
+	private PurchaseInvoiceDetailSimpleInfo[] parsePurchaseInvoiceDetail(JSONObject jsonObject) throws JSONException {
+		Object[] ids = jsonObject.getJSONArray("ids").toArray();
+		PurchaseInvoiceDetailSimpleInfo[] purchaseInvoiceDetails = new PurchaseInvoiceDetailSimpleInfo[ids.length];
+		for (int i = 0; i < ids.length; i++) {
+			Long id = Long.parseLong(ids[i].toString());
+			PurchaseInvoiceDetailSimpleInfo purchaseInvoiceDetail = purchaseInvoiceDetailDao.findById(id);
+			PurchaseInvoiceDetailSimpleInfo localPurchaseInvoiceDetail = innerOrderSearchService
+					.getPurchaseInvoiceDetail(id);
+			// 删除操作
+			if (jsonObject.getString("method").equals("delete")) {
+				if (purchaseInvoiceDetail != null) {
+					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
+					if (localPurchaseInvoiceDetail == null
+							|| localPurchaseInvoiceDetail.equals(purchaseInvoiceDetail)) {
+						purchaseInvoiceDetail = null;
+					}
+				} else {
+					if (localPurchaseInvoiceDetail != null) {
+						purchaseInvoiceDetail = new PurchaseInvoiceDetailSimpleInfo();
+						purchaseInvoiceDetail.setId(id);
+					}
+				}
+			}
+			// 更新或者插入操作
+			else {
+				// 本地有相同的数据,不更新索引
+				if (localPurchaseInvoiceDetail != null && localPurchaseInvoiceDetail.equals(purchaseInvoiceDetail)) {
+					purchaseInvoiceDetail = null;
+				}
+			}
+			purchaseInvoiceDetails[i] = purchaseInvoiceDetail;
+		}
+		return purchaseInvoiceDetails;
 	}
 
-	// private OrderSimpleInfo[] parseOrder2(JSONObject jsonObject) throws
-	// JSONException {
-	// HashSet<Long> ids = parseIds(jsonObject);
-	// // 一次性从数据库获取同一次批处理下ids中对应的所有数据(删除操作,数据可能为空)
-	// List<OrderSimpleInfo> orderList = orderDao.findAll(ids);
-	// System.out.println("orderList: " + orderList.size() + " " + orderList);
-	// for (int i = 0; i < orderList.size(); i++) {
-	// OrderSimpleInfo order = orderList.get(i);
-	// Long id = order.getId();
-	// System.out.println("id " + id);
-	// OrderSimpleInfo localOrder = innerOrderSearchService.getOrder(id);
-	// System.out.println("localOrder " + localOrder);
-	// // 删除操作
-	// if (jsonObject.getString("method").equals("delete")) {
-	// // 删除之后,数据还存在,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
-	// if (localOrder == null || localOrder.equals(order)) {
-	// orderList.remove(i);
-	// i--;
-	// }
-	// }
-	// // 更新或者插入操作
-	// else {
-	// // 本地有相同的数据,不更新索引
-	// if (localOrder != null && localOrder.equals(order)) {
-	// orderList.remove(i);
-	// i--;
-	// }
-	// }
-	// }
-	// System.out.println("removed orderList: " + orderList.size() + " " +
-	// orderList);
-	// if (CollectionUtils.isEmpty(orderList)) {
-	// return null;
-	// }
-	// OrderSimpleInfo[] orders = new OrderSimpleInfo[orderList.size()];
-	// orderList.toArray(orders);
-	// System.out.println("orders: " + orders.length + " " + orders);
-	// return orders;
-	// }
-	//
-	// private HashSet<Long> parseIds(JSONObject jsonObject) {
-	// System.out.println("-------------------------------------");
-	// Object[] objectIds = jsonObject.getJSONArray("ids").toArray();
-	// System.out.println("objectIds: " + objectIds.length + " " +
-	// Arrays.toString(objectIds));
-	// // 先去重
-	// HashSet<Long> hashSetIds = new HashSet<>();
-	// for (Object objectId : objectIds) {
-	// Long longId = Long.valueOf(objectId.toString());
-	// hashSetIds.add(longId);
-	// }
-	// System.out.println("hashSetIds: " + hashSetIds.size() + " " +
-	// hashSetIds);
-	// return hashSetIds;
-	// }
 }

+ 1 - 2
search-console/src/main/java/com/uas/search/console/service/impl/IndexServiceImpl.java

@@ -122,8 +122,7 @@ public class IndexServiceImpl implements IndexService {
 	public Long createIndexs() {
 		try {
 			if (IndexWriter.isLocked(directory)) {
-				logger.warn("已有线程正在创建索引!");
-				return 0L;
+				throw new SearchException("索引文件被锁定");
 			}
 		} catch (IOException e1) {
 			e1.printStackTrace();

+ 10 - 8
search-console/src/main/java/com/uas/search/console/support/IndexWriterManager.java

@@ -45,14 +45,16 @@ public class IndexWriterManager {
 	 * 不关闭的话,多次创建索引会抛出NoSuchFileException异常(IndexWriter保留的是旧信息?未更新?)
 	 */
 	public synchronized void release() {
-		if (indexWriter != null) {
-			try {
-				indexWriter.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			indexWriter = null;
-		}
+		// TODO
+		// 因保存索引后,调用release一直卡在indexWriter.close方法处,所以每次索引更改后不再关闭indexWriter,待测试没有问题才能删除
+		// if (indexWriter != null) {
+		// try {
+		// indexWriter.close();
+		// } catch (IOException e) {
+		// e.printStackTrace();
+		// }
+		// indexWriter = null;
+		// }
 		doneUsing();
 	}
 

+ 1 - 1
search-console/src/main/java/com/uas/search/console/util/OrderSearchUtils.java

@@ -47,7 +47,7 @@ public class OrderSearchUtils {
 		} else if (tableName.equals(SearchConstants.ORDER_INVOICE_DETAIL_TABLE_NAME)) {
 			return SearchConstants.ORDER_INVOICE_TABLE_NAME;
 		} else if (tableName.equals(SearchConstants.PURCHASE_DETAIL_TABLE_NAME)) {
-			return SearchConstants.ORDER_TABLE_NAME;
+			return SearchConstants.PURCHASE_TABLE_NAME;
 		} else if (tableName.equals(SearchConstants.PURCHASE_INVOICE_DETAIL_TABLE_NAME)) {
 			return SearchConstants.PURCHASE_INVOICE_TABLE_NAME;
 		} else {