ObjectToDocumentUtils.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. package com.uas.search.util;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.uas.search.constant.SearchConstants;
  4. import com.uas.search.model.*;
  5. import org.apache.lucene.document.*;
  6. import org.apache.lucene.document.Field.Store;
  7. import org.apache.lucene.util.BytesRef;
  8. import java.util.Set;
  9. /**
  10. * 将对象转换为Document的工具类
  11. *
  12. * @author sunyj
  13. * @since 2016年10月17日 上午11:32:19
  14. */
  15. public class ObjectToDocumentUtils {
  16. /**
  17. * 空值
  18. */
  19. public static final String NULL_VALUE = "NULLVALUE";
  20. /**
  21. * 将对象转为Document
  22. *
  23. * @param object
  24. * 对象,可为Kind、Brand、Component、
  25. * Order、OrderInvoice、Purchase、
  26. * PurchaseInvoice
  27. *
  28. * @return 转换的Document
  29. */
  30. public static Document toDocument(Object object) {
  31. if (object == null) {
  32. return null;
  33. }
  34. if (object instanceof Kind) {
  35. return toDocument((Kind) object);
  36. } else if (object instanceof Brand) {
  37. return toDocument((Brand) object);
  38. } else if (object instanceof Component) {
  39. return toDocument((Component) object);
  40. } else if (object instanceof Goods) {
  41. return toDocument((Goods) object);
  42. } else if (object instanceof PCBGoods) {
  43. return toDocument((PCBGoods) object);
  44. } else if (object instanceof Order) {
  45. return toDocument((Order) object);
  46. } else if (object instanceof OrderInvoice) {
  47. return toDocument((OrderInvoice) object);
  48. } else if (object instanceof Purchase) {
  49. return toDocument((Purchase) object);
  50. } else if (object instanceof PurchaseInvoice) {
  51. return toDocument((PurchaseInvoice) object);
  52. } else if (object instanceof V_Products) {
  53. return toDocument((V_Products) object);
  54. } else {
  55. throw new IllegalArgumentException("不支持将以下类型转换为Document:" + object.getClass().getName());
  56. }
  57. }
  58. /**
  59. * Kind对象转为Document
  60. *
  61. * @param kind
  62. * @return
  63. */
  64. public static Document toDocument(Kind kind) {
  65. if (kind == null || kind.getId() == null || StringUtils.isEmpty(kind.getNameCn()) || kind.getIsLeaf() == null
  66. || kind.getLevel() == null) {
  67. return null;
  68. }
  69. Document document = new Document();
  70. // 不能用LongField,否则后续实时更新索引时,方法updateDocument(new Term("", ""),
  71. // doc)无法根据id进行更新
  72. document.add(new StringField(SearchConstants.KIND_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
  73. document.add(new TextField(SearchConstants.KIND_NAMECN_FIELD, kind.getNameCn(), Store.YES));
  74. document.add(new StringField(SearchConstants.KIND_NAMECN_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
  75. document.add(new BinaryDocValuesField(SearchConstants.KIND_NAMECN_UNTOKENIZED_FIELD, new BytesRef(kind.getNameCn())));
  76. document.add(new StringField(SearchConstants.KIND_ISLEAF_FIELD, String.valueOf(kind.getIsLeaf()), Store.YES));
  77. document.add(new StringField(SearchConstants.KIND_LEVEL_FIELD, String.valueOf(kind.getLevel()), Store.YES));
  78. if (kind.getVisitCount() != null) {
  79. document.add(new DoubleDocValuesField(SearchConstants.KIND_VISIT_COUNT_FIELD, kind.getVisitCount()));
  80. document.add(new LongField(SearchConstants.KIND_VISIT_COUNT_FIELD, kind.getVisitCount(), Store.YES));
  81. }
  82. if (kind.getSearchCount() != null) {
  83. document.add(new DoubleDocValuesField(SearchConstants.KIND_SEARCH_COUNT_FIELD, kind.getSearchCount()));
  84. document.add(new LongField(SearchConstants.KIND_SEARCH_COUNT_FIELD, kind.getSearchCount(), Store.YES));
  85. }
  86. return document;
  87. }
  88. /**
  89. * Product对象转为Document
  90. *
  91. * @param product
  92. * @return
  93. */
  94. public static Document toDocument(V_Products product) {
  95. if (product == null || product.getId() == null || StringUtils.isEmpty(product.getpBrandEn())
  96. || StringUtils.isEmpty(product.getpCmpCode())) {
  97. return null;
  98. }
  99. Document document = new Document();
  100. // 不能用LongField,否则后续实时更新索引时,方法updateDocument(new Term("", ""),
  101. // doc)无法根据id进行更新
  102. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_ID_FIELD, String.valueOf(product.getId()), Store.YES));
  103. document.add(new DoubleDocValuesField(SearchConstants.PRODUCT_PRIVATE_ID_FIELD, product.getId()));
  104. if (!StringUtils.isEmpty(product.getTitle())) {
  105. document.add(new TextField(SearchConstants.PRODUCT_PRIVATE_TITLE_FIELD, product.getTitle(), Store.YES));
  106. }
  107. if (!StringUtils.isEmpty(product.getBrand())) {
  108. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_BRAND_FIELD, product.getBrand(), Store.YES));
  109. }
  110. if (!StringUtils.isEmpty(product.getCmpCode())) {
  111. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_CMPCODE_FIELD, product.getCmpCode(), Store.YES));
  112. }
  113. if (!StringUtils.isEmpty(product.getKind())) {
  114. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_KIND_FIELD, product.getKind(), Store.YES));
  115. }
  116. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PBRANDEN_FIELD, product.getpBrandEn(), Store.YES));
  117. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_PCMPCODE_FIELD, product.getpCmpCode(), Store.YES));
  118. if (product.getStandard() != null) {
  119. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_STANDARD_FIELD, String.valueOf(product.getStandard()), Store.YES));
  120. } else {
  121. // 为空默认非标
  122. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_STANDARD_FIELD, String.valueOf(0), Store.YES));
  123. }
  124. if (product.getB2cEnabled() != null) {
  125. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_B2CENABLED_FIELD, String.valueOf(product.getB2cEnabled()), Store.YES));
  126. } else {
  127. // 为空默认可用
  128. document.add(new StringField(SearchConstants.PRODUCT_PRIVATE_B2CENABLED_FIELD, String.valueOf(1), Store.YES));
  129. }
  130. return document;
  131. }
  132. /**
  133. * Brand对象转为Document
  134. *
  135. * @param brand
  136. * @return
  137. */
  138. public static Document toDocument(Brand brand) {
  139. if (brand == null || brand.getId() == null || StringUtils.isEmpty(brand.getNameCn())
  140. || StringUtils.isEmpty(brand.getUuid())) {
  141. return null;
  142. }
  143. Document document = new Document();
  144. document.add(new StringField(SearchConstants.BRAND_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
  145. document.add(new TextField(SearchConstants.BRAND_NAMECN_FIELD, brand.getNameCn(), Store.YES));
  146. document.add(new StringField(SearchConstants.BRAND_NAMECN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
  147. document.add(new BinaryDocValuesField(SearchConstants.BRAND_NAMECN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
  148. document.add(new StringField(SearchConstants.BRAND_UUID_FIELD, brand.getUuid(), Store.YES));
  149. if (brand.getNameEn() != null) {
  150. document.add(new TextField(SearchConstants.BRAND_NAMEEN_FIELD, brand.getNameEn(), Store.YES));
  151. document.add(new StringField(SearchConstants.BRAND_NAMEEN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
  152. document.add(new BinaryDocValuesField(SearchConstants.BRAND_NAMEEN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
  153. }
  154. if (brand.getVisitCount() != null) {
  155. document.add(new DoubleDocValuesField(SearchConstants.BRAND_VISIT_COUNT_FIELD, brand.getVisitCount()));
  156. document.add(new LongField(SearchConstants.BRAND_VISIT_COUNT_FIELD, brand.getVisitCount(), Store.YES));
  157. }
  158. if (brand.getSearchCount() != null) {
  159. document.add(new DoubleDocValuesField(SearchConstants.BRAND_SEARCH_COUNT_FIELD, brand.getSearchCount()));
  160. document.add(new LongField(SearchConstants.BRAND_SEARCH_COUNT_FIELD, brand.getSearchCount(), Store.YES));
  161. }
  162. if (brand.getWeight() != null) {
  163. document.add(new DoubleDocValuesField(SearchConstants.BRAND_WEIGHT_FIELD, brand.getWeight()));
  164. document.add(new DoubleField(SearchConstants.BRAND_WEIGHT_FIELD, brand.getWeight(), Store.YES));
  165. }
  166. return document;
  167. }
  168. /**
  169. * Component对象转为Document
  170. *
  171. * @param component
  172. * @return
  173. */
  174. public static Document toDocument(Component component) {
  175. if (component == null || component.getId() == null || StringUtils.isEmpty(component.getUuid())
  176. || StringUtils.isEmpty(component.getCode()) || component.getKind() == null
  177. || component.getKind().getId() == null || StringUtils.isEmpty(component.getKind().getNameCn())
  178. || component.getKind().getLevel() == null || component.getBrand() == null
  179. || component.getBrand().getId() == null || StringUtils.isEmpty(component.getBrand().getNameCn())
  180. || StringUtils.isEmpty(component.getBrand().getUuid())) {
  181. return null;
  182. }
  183. Document document = new Document();
  184. document.add(new StringField(SearchConstants.COMPONENT_ID_FIELD, String.valueOf(component.getId()), Store.YES));
  185. document.add(new StringField(SearchConstants.COMPONENT_UUID_FIELD, component.getUuid(), Store.YES));
  186. // 转小写,以避免分词,又不会因大小写影响搜索
  187. document.add(new StringField(SearchConstants.COMPONENT_CODE_FIELD, component.getCode().toLowerCase(), Store.YES));
  188. document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_CODE_FIELD, new BytesRef(component.getCode())));
  189. if (component.getVisitCount() != null) {
  190. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_VISIT_COUNT_FIELD, component.getVisitCount()));
  191. document.add(new LongField(SearchConstants.COMPONENT_VISIT_COUNT_FIELD, component.getVisitCount(), Store.YES));
  192. }
  193. if (component.getSearchCount() != null) {
  194. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_SEARCH_COUNT_FIELD, component.getSearchCount()));
  195. document.add(new LongField(SearchConstants.COMPONENT_SEARCH_COUNT_FIELD, component.getSearchCount(), Store.YES));
  196. }
  197. if (component.getWeight() != null) {
  198. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_WEIGHT_FIELD, component.getWeight()));
  199. document.add(new DoubleField(SearchConstants.COMPONENT_WEIGHT_FIELD, component.getWeight(), Store.YES));
  200. }
  201. Kind kind = component.getKind();
  202. document.add(new StringField(SearchConstants.COMPONENT_KI_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
  203. document.add(new TextField(SearchConstants.COMPONENT_KI_NAME_FIELD, kind.getNameCn(), Store.YES));
  204. document.add(new StringField(SearchConstants.COMPONENT_KI_NAME_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
  205. document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_KI_NAME_UNTOKENIZED_FIELD, new BytesRef(kind.getNameCn())));
  206. document.add(new StringField(SearchConstants.COMPONENT_KI_LEVEL_FIELD, String.valueOf(kind.getLevel()), Store.YES));
  207. if (kind.getVisitCount() != null) {
  208. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_KI_VISIT_COUNT_FIELD, kind.getVisitCount()));
  209. document.add(new LongField(SearchConstants.COMPONENT_KI_VISIT_COUNT_FIELD, kind.getVisitCount(), Store.YES));
  210. }
  211. if (kind.getSearchCount() != null) {
  212. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_KI_SEARCH_COUNT_FIELD, kind.getSearchCount()));
  213. document.add(new LongField(SearchConstants.COMPONENT_KI_SEARCH_COUNT_FIELD, kind.getSearchCount(), Store.YES));
  214. }
  215. Brand brand = component.getBrand();
  216. document.add(new StringField(SearchConstants.COMPONENT_BR_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
  217. document.add(new TextField(SearchConstants.COMPONENT_BR_NAMECN_FIELD, brand.getNameCn(), Store.YES));
  218. document.add(new StringField(SearchConstants.COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
  219. document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_BR_NAMECN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
  220. if(brand.getNameEn() != null){
  221. document.add(new TextField(SearchConstants.COMPONENT_BR_NAMEEN_FIELD, brand.getNameEn(), Store.YES));
  222. document.add(new StringField(SearchConstants.COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
  223. document.add(new BinaryDocValuesField(SearchConstants.COMPONENT_BR_NAMEEN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
  224. }
  225. document.add(new StringField(SearchConstants.COMPONENT_BR_UUID_FIELD, brand.getUuid(), Store.YES));
  226. if (brand.getVisitCount() != null) {
  227. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_BR_VISIT_COUNT_FIELD, brand.getVisitCount()));
  228. document.add(new LongField(SearchConstants.COMPONENT_BR_VISIT_COUNT_FIELD, brand.getVisitCount(), Store.YES));
  229. }
  230. if (brand.getSearchCount() != null) {
  231. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_BR_SEARCH_COUNT_FIELD, brand.getSearchCount()));
  232. document.add(new LongField(SearchConstants.COMPONENT_BR_SEARCH_COUNT_FIELD, brand.getSearchCount(), Store.YES));
  233. }
  234. if (brand.getWeight() != null) {
  235. document.add(new DoubleDocValuesField(SearchConstants.COMPONENT_BR_WEIGHT_FIELD, brand.getWeight()));
  236. document.add(new DoubleField(SearchConstants.COMPONENT_BR_WEIGHT_FIELD, brand.getWeight(), Store.YES));
  237. }
  238. if (component.getReserve() != null) {
  239. document.add(new DoubleField(SearchConstants.COMPONENT_RESERVE_FIELD, component.getReserve(), Store.YES));
  240. }
  241. if (component.getSampleQty() != null) {
  242. document.add(
  243. new DoubleField(SearchConstants.COMPONENT_SAMPLE_QTY_FIELD, component.getSampleQty(), Store.YES));
  244. }
  245. if (component.getOriginalQty() != null) {
  246. document.add(new DoubleField(SearchConstants.COMPONENT_ORIGINAL_QTY_FIELD, component.getOriginalQty(),
  247. Store.YES));
  248. }
  249. if (component.getInactionStockQty() != null) {
  250. document.add(new DoubleField(SearchConstants.COMPONENT_INACTION_STOCK_QTY_FIELD,
  251. component.getInactionStockQty(), Store.YES));
  252. }
  253. // 属性值加入索引,索引中field的键:"pr_"前缀连接属性的id
  254. Set<PropertyValue> propertyValues = component.getProperties();
  255. for (PropertyValue propertyValue : propertyValues) {
  256. if (!StringUtils.isEmpty(propertyValue.getValue())) {
  257. String fieldKey = SearchConstants.COMPONENT_PROPERTY_PREFIX + propertyValue.getPropertyid();
  258. document.add(new StringField(fieldKey, propertyValue.getValue(), Store.YES));
  259. // 另建一份分词的属性索引,用于属性值联想时不区分大小写
  260. String fieldKeyTokenized = fieldKey + SearchConstants.COMPONENT_PROPERTY_TOKENIZED_SUFFIX;
  261. document.add(new TextField(fieldKeyTokenized, propertyValue.getValue(), Store.YES));
  262. }
  263. }
  264. return document;
  265. }
  266. /**
  267. * Goods对象转为Document
  268. *
  269. * @param goods
  270. * @return
  271. */
  272. public static Document toDocument(Goods goods) {
  273. if (goods == null ||
  274. (goods.getTradeGoods() != null && goods.getTradeGoods().getId() == null) ||
  275. (goods.getComponent() != null && (goods.getComponent().getId() == null ||
  276. StringUtils.isEmpty(goods.getComponent().getCode()) ||
  277. goods.getComponent().getKind() == null ||
  278. goods.getComponent().getBrand() == null))) {
  279. return null;
  280. }
  281. String primaryKey = "";
  282. Document document = new Document();
  283. if(goods.getTradeGoods() != null){
  284. TradeGoods tradeGoods = goods.getTradeGoods();
  285. document.add(new StringField(SearchConstants.GOODS_GO_ID_FIELD, String.valueOf(tradeGoods.getId()), Store.YES));
  286. if (tradeGoods.getReserve() != null) {
  287. document.add(new DoubleDocValuesField(SearchConstants.GOODS_GO_RESERVE_FIELD, tradeGoods.getReserve()));
  288. document.add(new DoubleField(SearchConstants.GOODS_GO_RESERVE_FIELD, tradeGoods.getReserve(), Store.YES));
  289. }
  290. if (tradeGoods.getStatus() != null) {
  291. document.add(new StringField(SearchConstants.GOODS_GO_STATUS_FIELD, String.valueOf(tradeGoods.getStatus()), Store.YES));
  292. }
  293. if (tradeGoods.getMinPriceRMB() != null) {
  294. document.add(
  295. new DoubleDocValuesField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, tradeGoods.getMinPriceRMB()));
  296. document.add(
  297. new DoubleField(SearchConstants.GOODS_GO_MINPRICERMB_FIELD, tradeGoods.getMinPriceRMB(), Store.YES));
  298. }
  299. if (tradeGoods.getMinPriceUSD() != null) {
  300. document.add(
  301. new DoubleDocValuesField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, tradeGoods.getMinPriceUSD()));
  302. document.add(
  303. new DoubleField(SearchConstants.GOODS_GO_MINPRICEUSD_FIELD, tradeGoods.getMinPriceUSD(), Store.YES));
  304. }
  305. if (tradeGoods.getCrName() != null) {
  306. document.add(new TextField(SearchConstants.GOODS_CRNAME_FIELD, tradeGoods.getCrName(), Store.YES));
  307. }
  308. if (tradeGoods.getVisitCount() != null) {
  309. document.add(new DoubleDocValuesField(SearchConstants.GOODS_GO_VISIT_COUNT_FIELD, tradeGoods.getVisitCount()));
  310. document.add(new LongField(SearchConstants.GOODS_GO_VISIT_COUNT_FIELD, tradeGoods.getVisitCount(), Store.YES));
  311. }
  312. if (tradeGoods.getUpdateDate() != null) {
  313. document.add(new DoubleDocValuesField(SearchConstants.GOODS_GO_UPDATE_DATE_FIELD, tradeGoods.getUpdateDate().getTime()));
  314. document.add(new LongField(SearchConstants.GOODS_GO_UPDATE_DATE_FIELD, tradeGoods.getUpdateDate().getTime(), Store.YES));
  315. }
  316. if (tradeGoods.getMinDelivery() != null) {
  317. document.add(new DoubleDocValuesField(SearchConstants.GOODS_GO_MINDELIVERY_FIELD, tradeGoods.getMinDelivery()));
  318. document.add(new LongField(SearchConstants.GOODS_GO_MINDELIVERY_FIELD, tradeGoods.getMinDelivery(), Store.YES));
  319. }
  320. primaryKey += tradeGoods.getId();
  321. } else {
  322. // 批次 id 为 null 时,存默认值,以便于后期搜索时做空值过滤
  323. document.add(new StringField(SearchConstants.GOODS_GO_ID_FIELD, NULL_VALUE, Store.YES));
  324. primaryKey += NULL_VALUE;
  325. }
  326. if (goods.getStore() != null) {
  327. com.uas.search.model.Store store = goods.getStore();
  328. if (store.getUuid() != null) {
  329. document.add(new TextField(SearchConstants.GOODS_ST_UUID_FIELD, store.getUuid(), Store.YES));
  330. }
  331. if (store.getType() != null) {
  332. document.add(new TextField(SearchConstants.GOODS_ST_TYPE_FIELD, store.getType(), Store.YES));
  333. }
  334. }
  335. if(goods.getComponent() != null){
  336. Component component = goods.getComponent();
  337. document.add(new StringField(SearchConstants.GOODS_CMP_ID_FIELD, String.valueOf(component.getId()), Store.YES));
  338. document.add(new StringField(SearchConstants.GOODS_CMP_CODE_FIELD, component.getCode().toLowerCase(), Store.YES));
  339. document.add(new BinaryDocValuesField(SearchConstants.GOODS_CMP_CODE_FIELD, new BytesRef(component.getCode())));
  340. if (component.getDescription() != null) {
  341. document.add(new TextField(SearchConstants.GOODS_CMP_DESCRIPTION_FIELD, component.getDescription(), Store.YES));
  342. }
  343. if (component.getVisitCount() != null) {
  344. document.add(new DoubleDocValuesField(SearchConstants.GOODS_CMP_VISIT_COUNT_FIELD, component.getVisitCount()));
  345. document.add(new LongField(SearchConstants.GOODS_CMP_VISIT_COUNT_FIELD, component.getVisitCount(), Store.YES));
  346. }
  347. if (component.getSearchCount() != null) {
  348. document.add(new DoubleDocValuesField(SearchConstants.GOODS_CMP_SEARCH_COUNT_FIELD, component.getSearchCount()));
  349. document.add(new LongField(SearchConstants.GOODS_CMP_SEARCH_COUNT_FIELD, component.getSearchCount(), Store.YES));
  350. }
  351. if (component.getWeight() != null) {
  352. document.add(new DoubleDocValuesField(SearchConstants.GOODS_CMP_WEIGHT_FIELD, component.getWeight()));
  353. document.add(new DoubleField(SearchConstants.GOODS_CMP_WEIGHT_FIELD, component.getWeight(), Store.YES));
  354. }
  355. Kind kind = component.getKind();
  356. if (kind.getId() != null) {
  357. document.add(new StringField(SearchConstants.GOODS_KI_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
  358. }
  359. if (kind.getNameCn() != null) {
  360. document.add(new TextField(SearchConstants.GOODS_KI_NAME_CN_FIELD, kind.getNameCn(), Store.YES));
  361. document.add(new StringField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
  362. document.add(new BinaryDocValuesField(SearchConstants.GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new BytesRef( kind.getNameCn())));
  363. }
  364. if (kind.getLevel() != null) {
  365. document.add(new NumericDocValuesField(SearchConstants.GOODS_KI_LEVEL_FIELD, kind.getLevel()));
  366. document.add(new LongField(SearchConstants.GOODS_KI_LEVEL_FIELD, kind.getLevel(), Store.YES));
  367. }
  368. if (kind.getIsLeaf() != null) {
  369. document.add(
  370. new StringField(SearchConstants.GOODS_KI_ISLEAF_FIELD, String.valueOf(kind.getIsLeaf()), Store.YES));
  371. }
  372. if (kind.getVisitCount() != null) {
  373. document.add(new DoubleDocValuesField(SearchConstants.GOODS_KI_VISIT_COUNT_FIELD, kind.getVisitCount()));
  374. document.add(new LongField(SearchConstants.GOODS_KI_VISIT_COUNT_FIELD, kind.getVisitCount(), Store.YES));
  375. }
  376. if (kind.getSearchCount() != null) {
  377. document.add(new DoubleDocValuesField(SearchConstants.GOODS_KI_SEARCH_COUNT_FIELD, kind.getSearchCount()));
  378. document.add(new LongField(SearchConstants.GOODS_KI_SEARCH_COUNT_FIELD, kind.getSearchCount(), Store.YES));
  379. }
  380. Brand brand = component.getBrand();
  381. if (brand.getId() != null) {
  382. document.add(new StringField(SearchConstants.GOODS_BR_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
  383. }
  384. if (brand.getNameCn() != null) {
  385. document.add(new TextField(SearchConstants.GOODS_BR_NAME_CN_FIELD, brand.getNameCn(), Store.YES));
  386. document.add(new StringField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
  387. document.add(new BinaryDocValuesField(SearchConstants.GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
  388. }
  389. if (brand.getNameEn() != null) {
  390. document.add(new TextField(SearchConstants.GOODS_BR_NAME_EN_FIELD, brand.getNameEn(), Store.YES));
  391. document.add(new StringField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
  392. document.add(new BinaryDocValuesField(SearchConstants.GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
  393. }
  394. if (brand.getUuid() != null) {
  395. document.add(new StringField(SearchConstants.GOODS_BR_UUID_FIELD, brand.getUuid(), Store.YES));
  396. }
  397. if (brand.getVisitCount() != null) {
  398. document.add(new DoubleDocValuesField(SearchConstants.GOODS_BR_VISIT_COUNT_FIELD, brand.getVisitCount()));
  399. document.add(new LongField(SearchConstants.GOODS_BR_VISIT_COUNT_FIELD, brand.getVisitCount(), Store.YES));
  400. }
  401. if (brand.getSearchCount() != null) {
  402. document.add(new DoubleDocValuesField(SearchConstants.GOODS_BR_SEARCH_COUNT_FIELD, brand.getSearchCount()));
  403. document.add(new LongField(SearchConstants.GOODS_BR_SEARCH_COUNT_FIELD, brand.getSearchCount(), Store.YES));
  404. }
  405. if (brand.getWeight() != null) {
  406. document.add(new DoubleDocValuesField(SearchConstants.GOODS_BR_WEIGHT_FIELD, brand.getWeight()));
  407. document.add(new DoubleField(SearchConstants.GOODS_BR_WEIGHT_FIELD, brand.getWeight(), Store.YES));
  408. }
  409. primaryKey += "_" + component.getId();
  410. } else {
  411. // 器件 id 为 null 时,存默认值,以便于后期搜索时做空值过滤
  412. document.add(new StringField(SearchConstants.GOODS_CMP_ID_FIELD, NULL_VALUE, Store.YES));
  413. primaryKey += "_" + NULL_VALUE;
  414. }
  415. if(goods.getProducts() != null){
  416. Products products = goods.getProducts();
  417. if (products.getId() != null) {
  418. document.add(new StringField(SearchConstants.GOODS_PR_ID_FIELD, String.valueOf(products.getId()), Store.YES));
  419. }
  420. if(products.getPcmpCode() != null){
  421. document.add(new StringField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, products.getPcmpCode().toLowerCase(), Store.YES));
  422. document.add(new BinaryDocValuesField(SearchConstants.GOODS_PR_PCMPCODE_FIELD, new BytesRef(products.getPcmpCode())));
  423. }
  424. }
  425. document.add(new StringField(SearchConstants.GOODS_PRIMARY_KEY_FIELD, primaryKey, Store.YES));
  426. return document;
  427. }
  428. /**
  429. * PCBGoods 对象转为 Document
  430. *
  431. * @param pcbGoods
  432. * @return
  433. */
  434. public static Document toDocument(PCBGoods pcbGoods) {
  435. if (pcbGoods == null ||
  436. (pcbGoods.getTradeGoods() != null && pcbGoods.getTradeGoods().getId() == null) ||
  437. pcbGoods.getPcb() == null || pcbGoods.getPcb().getId() == null ||
  438. pcbGoods.getPcb().getKind() == null ||
  439. pcbGoods.getPcb().getBrand() == null ||
  440. pcbGoods.getPcb().getProducts() == null || pcbGoods.getPcb().getProducts().getId() == null) {
  441. return null;
  442. }
  443. String primaryKey = "";
  444. Document document = new Document();
  445. if(pcbGoods.getTradeGoods() != null){
  446. TradeGoods tradeGoods = pcbGoods.getTradeGoods();
  447. document.add(new StringField(SearchConstants.PCB_GOODS_GO_ID_FIELD, String.valueOf(tradeGoods.getId()), Store.YES));
  448. if (tradeGoods.getReserve() != null) {
  449. document.add(new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_RESERVE_FIELD, tradeGoods.getReserve()));
  450. document.add(new DoubleField(SearchConstants.PCB_GOODS_GO_RESERVE_FIELD, tradeGoods.getReserve(), Store.YES));
  451. }
  452. if (tradeGoods.getStatus() != null) {
  453. document.add(new StringField(SearchConstants.PCB_GOODS_GO_STATUS_FIELD, String.valueOf(tradeGoods.getStatus()), Store.YES));
  454. }
  455. if (tradeGoods.getMinPriceRMB() != null) {
  456. document.add(
  457. new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_MINPRICERMB_FIELD, tradeGoods.getMinPriceRMB()));
  458. document.add(
  459. new DoubleField(SearchConstants.PCB_GOODS_GO_MINPRICERMB_FIELD, tradeGoods.getMinPriceRMB(), Store.YES));
  460. }
  461. if (tradeGoods.getMinPriceUSD() != null) {
  462. document.add(
  463. new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_MINPRICEUSD_FIELD, tradeGoods.getMinPriceUSD()));
  464. document.add(
  465. new DoubleField(SearchConstants.PCB_GOODS_GO_MINPRICEUSD_FIELD, tradeGoods.getMinPriceUSD(), Store.YES));
  466. }
  467. if (tradeGoods.getCrName() != null) {
  468. document.add(new TextField(SearchConstants.PCB_GOODS_CRNAME_FIELD, tradeGoods.getCrName(), Store.YES));
  469. }
  470. if (tradeGoods.getVisitCount() != null) {
  471. document.add(new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_VISIT_COUNT_FIELD, tradeGoods.getVisitCount()));
  472. document.add(new LongField(SearchConstants.PCB_GOODS_GO_VISIT_COUNT_FIELD, tradeGoods.getVisitCount(), Store.YES));
  473. }
  474. if (tradeGoods.getUpdateDate() != null) {
  475. document.add(new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_UPDATE_DATE_FIELD, tradeGoods.getUpdateDate().getTime()));
  476. document.add(new LongField(SearchConstants.PCB_GOODS_GO_UPDATE_DATE_FIELD, tradeGoods.getUpdateDate().getTime(), Store.YES));
  477. }
  478. if (tradeGoods.getMinDelivery() != null) {
  479. document.add(new DoubleDocValuesField(SearchConstants.PCB_GOODS_GO_MINDELIVERY_FIELD, tradeGoods.getMinDelivery()));
  480. document.add(new LongField(SearchConstants.PCB_GOODS_GO_MINDELIVERY_FIELD, tradeGoods.getMinDelivery(), Store.YES));
  481. }
  482. primaryKey += tradeGoods.getId();
  483. } else {
  484. // 批次 id 为 null 时,存默认值,以便于后期搜索时做空值过滤
  485. document.add(new StringField(SearchConstants.PCB_GOODS_GO_ID_FIELD, NULL_VALUE, Store.YES));
  486. primaryKey += NULL_VALUE;
  487. }
  488. PCB pcb = pcbGoods.getPcb();
  489. document.add(new StringField(SearchConstants.PCB_GOODS_PCB_ID_FIELD, String.valueOf(pcb.getId()), Store.YES));
  490. Kind kind = pcb.getKind();
  491. if (kind.getId() != null) {
  492. document.add(new StringField(SearchConstants.PCB_GOODS_KI_ID_FIELD, String.valueOf(kind.getId()), Store.YES));
  493. }
  494. if (kind.getNameCn() != null) {
  495. document.add(new TextField(SearchConstants.PCB_GOODS_KI_NAME_CN_FIELD, kind.getNameCn(), Store.YES));
  496. document.add(new StringField(SearchConstants.PCB_GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, kind.getNameCn().toLowerCase(), Store.YES));
  497. document.add(new BinaryDocValuesField(SearchConstants.PCB_GOODS_KI_NAME_CN_UNTOKENIZED_FIELD, new BytesRef(kind.getNameCn())));
  498. }
  499. if (kind.getLevel() != null) {
  500. document.add(new NumericDocValuesField(SearchConstants.PCB_GOODS_KI_LEVEL_FIELD, kind.getLevel()));
  501. document.add(new LongField(SearchConstants.PCB_GOODS_KI_LEVEL_FIELD, kind.getLevel(), Store.YES));
  502. }
  503. if (kind.getIsLeaf() != null) {
  504. document.add(
  505. new StringField(SearchConstants.PCB_GOODS_KI_ISLEAF_FIELD, String.valueOf(kind.getIsLeaf()), Store.YES));
  506. }
  507. Brand brand = pcb.getBrand();
  508. if (brand.getId() != null) {
  509. document.add(new StringField(SearchConstants.PCB_GOODS_BR_ID_FIELD, String.valueOf(brand.getId()), Store.YES));
  510. }
  511. if (brand.getNameCn() != null) {
  512. document.add(new TextField(SearchConstants.PCB_GOODS_BR_NAME_CN_FIELD, brand.getNameCn(), Store.YES));
  513. document.add(new StringField(SearchConstants.PCB_GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, brand.getNameCn().toLowerCase(), Store.YES));
  514. document.add(new BinaryDocValuesField(SearchConstants.PCB_GOODS_BR_NAME_CN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameCn())));
  515. }
  516. if (brand.getNameEn() != null) {
  517. document.add(new TextField(SearchConstants.PCB_GOODS_BR_NAME_EN_FIELD, brand.getNameEn(), Store.YES));
  518. document.add(new StringField(SearchConstants.PCB_GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, brand.getNameEn().toLowerCase(), Store.YES));
  519. document.add(new BinaryDocValuesField(SearchConstants.PCB_GOODS_BR_NAME_EN_UNTOKENIZED_FIELD, new BytesRef(brand.getNameEn())));
  520. }
  521. if (brand.getUuid() != null) {
  522. document.add(new StringField(SearchConstants.PCB_GOODS_BR_UUID_FIELD, brand.getUuid(), Store.YES));
  523. }
  524. primaryKey += "_" + pcb.getId();
  525. Products products = pcb.getProducts();
  526. document.add(new StringField(SearchConstants.PCB_GOODS_PR_ID_FIELD, String.valueOf(products.getId()), Store.YES));
  527. if (products.getPcmpCode() != null) {
  528. document.add(new StringField(SearchConstants.PCB_GOODS_PR_PCMPCODE_FIELD, products.getPcmpCode().toLowerCase(), Store.YES));
  529. document.add(new BinaryDocValuesField(SearchConstants.PCB_GOODS_PR_PCMPCODE_FIELD, new BytesRef(products.getPcmpCode())));
  530. }
  531. document.add(new StringField(SearchConstants.PCB_GOODS_PRIMARY_KEY_FIELD, primaryKey, Store.YES));
  532. return document;
  533. }
  534. /**
  535. * Order对象转为Document
  536. *
  537. * @param order
  538. * Order对象
  539. * @return 转换的Document
  540. */
  541. public static Document toDocument(Order order) {
  542. if (order == null || order.getId() == null || StringUtils.isEmpty(order.getCode()) || order.getBuyeruu() == null
  543. || StringUtils.isEmpty(order.getBuyername()) || order.getBuyerEnterprise() == null
  544. || order.getBuyerEnterprise().getUu() == null
  545. || StringUtils.isEmpty(order.getBuyerEnterprise().getEnName()) || order.getCreatetime() == null
  546. || order.getStatus() == null) {
  547. return null;
  548. }
  549. Document document = new Document();
  550. document.add(new StringField(SearchConstants.ORDER_ID_FIELD, String.valueOf(order.getId()), Store.YES));
  551. // 利用正则搜索,code等不会被分词为多个词的字段存为TextField
  552. document.add(new TextField(SearchConstants.ORDER_CODE_FIELD, order.getCode(), Store.YES));
  553. document.add(
  554. new StringField(SearchConstants.ORDER_BUYERUU_FIELD, String.valueOf(order.getBuyeruu()), Store.YES));
  555. // 利用正则搜索,name等会被分词为多个词的字段存为StringField(不然会有边界问题,影响准确度)
  556. document.add(new StringField(SearchConstants.ORDER_BUYERNAME_FIELD, order.getBuyername(), Store.YES));
  557. document.add(new StringField(SearchConstants.ORDER_BUYERENUU_FIELD,
  558. String.valueOf(order.getBuyerEnterprise().getUu()), Store.YES));
  559. document.add(new StringField(SearchConstants.ORDER_BUYERENNAME_FIELD, order.getBuyerEnterprise().getEnName(),
  560. Store.YES));
  561. if (order.getSellerEnterprise() != null) {
  562. if (order.getSellerEnterprise().getUu() != null) {
  563. document.add(new StringField(SearchConstants.ORDER_SELLERENUU_FIELD,
  564. String.valueOf(order.getSellerEnterprise().getUu()), Store.YES));
  565. }
  566. if (order.getSellerEnterprise().getEnName() != null) {
  567. document.add(new StringField(SearchConstants.ORDER_SELLERENNAME_FIELD,
  568. order.getSellerEnterprise().getEnName(), Store.YES));
  569. }
  570. }
  571. document.add(new LongField(SearchConstants.CREATETIME_FIELD, order.getCreatetime().getTime(), Store.YES));
  572. document.add(new StringField(SearchConstants.ORDER_STATUS_FIELD, String.valueOf(order.getStatus()), Store.YES));
  573. // 明细以json的格式存储
  574. if (!CollectionUtils.isEmpty(order.getDetails())) {
  575. document.add(new TextField(SearchConstants.ORDER_DETAILS_FIELD, JSONObject.toJSONString(order.getDetails()),
  576. Store.YES));
  577. }
  578. return document;
  579. }
  580. /**
  581. * OrderInvoice对象转为Document
  582. *
  583. * @param orderInvoice
  584. * OrderInvoice对象
  585. * @return 转换的Document
  586. */
  587. public static Document toDocument(OrderInvoice orderInvoice) {
  588. if (orderInvoice == null || orderInvoice.getId() == null || StringUtils.isEmpty(orderInvoice.getCode())
  589. || orderInvoice.getBuyeruu() == null || StringUtils.isEmpty(orderInvoice.getBuyername())
  590. || orderInvoice.getBuyerEnterprise() == null || orderInvoice.getBuyerEnterprise().getUu() == null
  591. || StringUtils.isEmpty(orderInvoice.getBuyerEnterprise().getEnName())
  592. || orderInvoice.getCreatetime() == null || orderInvoice.getStatus() == null) {
  593. return null;
  594. }
  595. Document document = new Document();
  596. document.add(new StringField(SearchConstants.ORDER_INVOICE_ID_FIELD, String.valueOf(orderInvoice.getId()),
  597. Store.YES));
  598. document.add(new TextField(SearchConstants.ORDER_INVOICE_CODE_FIELD, orderInvoice.getCode(), Store.YES));
  599. document.add(new StringField(SearchConstants.ORDER_INVOICE_BUYERUU_FIELD,
  600. String.valueOf(orderInvoice.getBuyeruu()), Store.YES));
  601. document.add(
  602. new StringField(SearchConstants.ORDER_INVOICE_BUYERNAME_FIELD, orderInvoice.getBuyername(), Store.YES));
  603. document.add(new StringField(SearchConstants.ORDER_INVOICE_BUYERENUU_FIELD,
  604. String.valueOf(orderInvoice.getBuyerEnterprise().getUu()), Store.YES));
  605. document.add(new StringField(SearchConstants.ORDER_INVOICE_BUYERENNAME_FIELD,
  606. orderInvoice.getBuyerEnterprise().getEnName(), Store.YES));
  607. document.add(
  608. new LongField(SearchConstants.CREATETIME_FIELD, orderInvoice.getCreatetime().getTime(), Store.YES));
  609. document.add(new StringField(SearchConstants.ORDER_INVOICE_STATUS_FIELD,
  610. String.valueOf(orderInvoice.getStatus()), Store.YES));
  611. if (!CollectionUtils.isEmpty(orderInvoice.getDetails())) {
  612. document.add(new TextField(SearchConstants.ORDER_INVOICE_DETAILS_FIELD,
  613. JSONObject.toJSONString(orderInvoice.getDetails()), Store.YES));
  614. }
  615. return document;
  616. }
  617. /**
  618. * Purchase对象转为Document
  619. *
  620. * @param purchase
  621. * Purchase对象
  622. * @return 转换的Document
  623. */
  624. public static Document toDocument(Purchase purchase) {
  625. if (purchase == null || purchase.getId() == null || StringUtils.isEmpty(purchase.getCode())
  626. || purchase.getSellerenuu() == null || StringUtils.isEmpty(purchase.getSellerenname())
  627. || purchase.getCreatetime() == null || purchase.getStatus() == null) {
  628. return null;
  629. }
  630. Document document = new Document();
  631. document.add(new StringField(SearchConstants.PURCHASE_ID_FIELD, String.valueOf(purchase.getId()), Store.YES));
  632. document.add(new TextField(SearchConstants.PURCHASE_CODE_FIELD, purchase.getCode(), Store.YES));
  633. document.add(new StringField(SearchConstants.PURCHASE_SELLERENUU_FIELD,
  634. String.valueOf(purchase.getSellerenuu()), Store.YES));
  635. document.add(
  636. new StringField(SearchConstants.PURCHASE_SELLERENNAME_FIELD, purchase.getSellerenname(), Store.YES));
  637. document.add(new LongField(SearchConstants.CREATETIME_FIELD, purchase.getCreatetime().getTime(), Store.YES));
  638. document.add(new StringField(SearchConstants.PURCHASE_STATUS_FIELD, String.valueOf(purchase.getStatus()),
  639. Store.YES));
  640. if (!CollectionUtils.isEmpty(purchase.getDetails())) {
  641. document.add(new TextField(SearchConstants.PURCHASE_DETAILS_FIELD,
  642. JSONObject.toJSONString(purchase.getDetails()), Store.YES));
  643. }
  644. return document;
  645. }
  646. /**
  647. * PurchaseInvoice对象转为Document
  648. *
  649. * @param purchaseInvoice
  650. * PurchaseInvoice对象
  651. * @return 转换的Document
  652. */
  653. public static Document toDocument(PurchaseInvoice purchaseInvoice) {
  654. if (purchaseInvoice == null || purchaseInvoice.getId() == null || StringUtils.isEmpty(purchaseInvoice.getCode())
  655. || purchaseInvoice.getSellerenuu() == null || StringUtils.isEmpty(purchaseInvoice.getSellerenname())
  656. || purchaseInvoice.getCreatetime() == null || purchaseInvoice.getStatus() == null) {
  657. return null;
  658. }
  659. Document document = new Document();
  660. document.add(new StringField(SearchConstants.PURCHASE_INVOICE_ID_FIELD, String.valueOf(purchaseInvoice.getId()),
  661. Store.YES));
  662. document.add(new TextField(SearchConstants.PURCHASE_INVOICE_CODE_FIELD, purchaseInvoice.getCode(), Store.YES));
  663. document.add(new StringField(SearchConstants.PURCHASE_INVOICE_SELLERENUU_FIELD,
  664. String.valueOf(purchaseInvoice.getSellerenuu()), Store.YES));
  665. document.add(new StringField(SearchConstants.PURCHASE_INVOICE_SELLERENNAME_FIELD,
  666. purchaseInvoice.getSellerenname(), Store.YES));
  667. document.add(
  668. new LongField(SearchConstants.CREATETIME_FIELD, purchaseInvoice.getCreatetime().getTime(), Store.YES));
  669. document.add(new StringField(SearchConstants.PURCHASE_INVOICE_STATUS_FIELD,
  670. String.valueOf(purchaseInvoice.getStatus()), Store.YES));
  671. if (!CollectionUtils.isEmpty(purchaseInvoice.getDetails())) {
  672. document.add(new TextField(SearchConstants.PURCHASE_INVOICE_DETAILS_FIELD,
  673. JSONObject.toJSONString(purchaseInvoice.getDetails()), Store.YES));
  674. }
  675. return document;
  676. }
  677. }