BE_ERP_BusinessOrder_Search.groovy 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. import com.dderp.common.api.BusinessExecutor
  2. import com.dderp.common.api.SupplierInitService
  3. import com.dderp.common.datas.ERPModule
  4. import com.dderp.common.datas.ESKeys
  5. import com.dderp.common.datas.ReadOrderOption
  6. import com.dderp.common.datas.TokenUserFrom
  7. import com.dderp.common.entity.base.ProcessSearchOptionsItem
  8. import com.dderp.common.entity.order.*
  9. import com.dderp.common.entity.site.ERPTokenUser
  10. import com.dderp.common.tool.ERPUtils
  11. import com.dySweetFishPlugin.elasticsearch.ESClient
  12. import com.dySweetFishPlugin.tool.lang.DateUtil
  13. import com.sweetfish.convert.json.JsonConvert
  14. import com.sweetfish.service.RetResult
  15. import org.apache.commons.lang3.StringUtils
  16. import org.apache.logging.log4j.LogManager
  17. import org.apache.logging.log4j.Logger
  18. import org.apache.lucene.search.join.ScoreMode
  19. import org.elasticsearch.action.search.SearchResponse
  20. import org.elasticsearch.index.query.BoolQueryBuilder
  21. import org.elasticsearch.index.query.Operator
  22. import org.elasticsearch.index.query.QueryBuilder
  23. import org.elasticsearch.index.query.QueryBuilders
  24. import org.elasticsearch.join.query.JoinQueryBuilders
  25. import org.elasticsearch.search.aggregations.AggregationBuilders
  26. import org.elasticsearch.search.aggregations.metrics.sum.InternalSum
  27. import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount
  28. import org.elasticsearch.search.sort.SortBuilders
  29. import org.elasticsearch.search.sort.SortOrder
  30. import org.rex.RMap
  31. import javax.annotation.Resource
  32. import java.math.RoundingMode
  33. import java.util.function.ToLongFunction
  34. @SuppressWarnings(["rawtypes", "unused"])
  35. class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptionsItem<ReadOrderOption>, BusinessOrder> {
  36. protected final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  37. @Resource
  38. SupplierInitService supplierService
  39. @Resource
  40. ESClient esClient
  41. @Resource
  42. JsonConvert jsonConvert
  43. @Override
  44. String scriptName() {
  45. return "ERP-外卖订单-查询"
  46. }
  47. @Override
  48. ERPModule module() {
  49. return ERPModule.ERP_ORDER_SEARCH
  50. }
  51. def <T> List<T> searchOrderChildInfoList(Class<T> clazz, String childESType, long[] idOrders, long supplierCode) {
  52. return ESList.<T> getESList()
  53. .esClient(esClient)
  54. .jsonConvert(jsonConvert)
  55. .clazz(clazz)
  56. .queryBuilder({
  57. //获取完成的数据情况
  58. return QueryBuilders.boolQuery()
  59. .must(QueryBuilders.typeQuery(childESType))
  60. .must(QueryBuilders.termsQuery("idOrder", ERPUtils.longArrayToStrArray(idOrders)))
  61. })
  62. .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  63. .executeNonePage()
  64. }
  65. def <T> Map<Long, List<T>> searchOrderChildInfoMap(Class<T> clazz, String childESType, long[] idOrders, long supplierCode, ToLongFunction<T> convertLong) {
  66. return ESMap.<T> getESMap()
  67. .srcIds(idOrders)
  68. .esClient(esClient)
  69. .jsonConvert(jsonConvert)
  70. .clazz(clazz)
  71. .queryBuilder({
  72. //获取完成的数据情况
  73. return QueryBuilders.boolQuery()
  74. .must(QueryBuilders.typeQuery(childESType))
  75. .must(QueryBuilders.termsQuery("idOrder", ERPUtils.longArrayToStrArray(idOrders)))
  76. })
  77. .convertLongExecutor(convertLong) //这里直接写{it.idOrder},只要所有的子类有这个值,groovy应该是可以的,只是看着难受,让调用接口传入转换方法
  78. .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  79. .execute()
  80. }
  81. def <T> List<T> getOrderChildInfoList(Class<T> clazz, String childESType, long idOrder, long supplierCode) {
  82. return ESList.<T> getESList()
  83. .esClient(esClient)
  84. .jsonConvert(jsonConvert)
  85. .clazz(clazz)
  86. .queryBuilder({
  87. //获取完成的数据情况
  88. return QueryBuilders.boolQuery()
  89. .must(QueryBuilders.typeQuery(childESType))
  90. .must(QueryBuilders.termQuery("idOrder", idOrder))
  91. })
  92. .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  93. .executeNonePage()
  94. }
  95. def <T> T getOrderChildInfo(Class<T> clazz, String childESType, long idOrder, long supplierCode) {
  96. return ESOne.<T> getESOneInfo()
  97. .esClient(esClient)
  98. .jsonConvert(jsonConvert)
  99. .clazz(clazz)
  100. .queryBuilder({
  101. //获取完成的数据情况
  102. return QueryBuilders.boolQuery()
  103. .must(QueryBuilders.typeQuery(childESType))
  104. .must(QueryBuilders.termQuery("idOrder", idOrder))
  105. })
  106. .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  107. .execute()
  108. }
  109. def readOrderOptions(List<BusinessOrder> orderList, long supplierCode,
  110. ReadOrderOption... options) {
  111. long[] idOrders = orderList*.id.toArray() as long[]
  112. if ((options != null) && (options.length > 0) && (idOrders.length > 0)) {
  113. //防止搞坏事,options传重复数据过来,先去重
  114. options.toUnique().each { opt ->
  115. switch (opt) {
  116. case ReadOrderOption.ORDER_PRODUCT:
  117. Map<Long, List<OrderDetailItem>> orderItemMap = searchOrderChildInfoMap(OrderDetailItem.class, ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE, idOrders, supplierCode, { it.idOrder })
  118. orderList.each { order ->
  119. order.detailItemList = orderItemMap.get(order.id)
  120. }
  121. break
  122. case ReadOrderOption.ORDER_DELIVERY:
  123. List<OrderDeliveryInfo> childInfoList = searchOrderChildInfoList(OrderDeliveryInfo.class, ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE, idOrders, supplierCode)
  124. orderList.each { o ->
  125. o.orderDeliveryInfo = childInfoList.find { c -> c.idOrder == o.id }
  126. }
  127. break
  128. case ReadOrderOption.ORDER_FINANCES:
  129. List<OrderFinances> childInfoList = searchOrderChildInfoList(OrderFinances.class, ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE, idOrders, supplierCode)
  130. orderList.each { o ->
  131. o.orderFinances = childInfoList.find { c -> c.idOrder == o.id }
  132. }
  133. List<OrderDiscount> childInfoList1 = searchOrderChildInfoList(OrderDiscount.class, ESKeys.ES_DELIVER_ORDER_DISCOUNT_TYPE, idOrders, supplierCode)
  134. orderList.each { o ->
  135. o.orderDiscountList = childInfoList1.findAll { c -> c.idOrder == o.id }
  136. }
  137. break
  138. case ReadOrderOption.ORDER_RIDER:
  139. Map<Long, List<OrderRiderItem>> orderItemMap = searchOrderChildInfoMap(OrderRiderItem.class, ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE, idOrders, supplierCode, { it.idOrder })
  140. orderList.each { order ->
  141. order.riderItemList = orderItemMap.get(order.id)
  142. }
  143. break
  144. }
  145. }
  146. }
  147. }
  148. def readOrderOptions(BusinessOrder businessOrder, long supplierCode,
  149. ReadOrderOption... options) {
  150. if ((options != null) && (options.length > 0)) {
  151. //防止搞坏事,options传重复数据过来,先去重
  152. options.toUnique().each { opt ->
  153. switch (opt) {
  154. case ReadOrderOption.ORDER_PRODUCT:
  155. businessOrder.detailItemList = getOrderChildInfoList(OrderDetailItem.class, ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE, businessOrder.id, supplierCode)
  156. break
  157. case ReadOrderOption.ORDER_DELIVERY:
  158. businessOrder.orderDeliveryInfo = getOrderChildInfo(OrderDeliveryInfo.class, ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE, businessOrder.id, supplierCode)
  159. break
  160. case ReadOrderOption.ORDER_FINANCES:
  161. businessOrder.orderFinances = getOrderChildInfo(OrderFinances.class, ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE, businessOrder.id, supplierCode)
  162. break
  163. case ReadOrderOption.ORDER_RIDER:
  164. businessOrder.riderItemList = getOrderChildInfoList(OrderRiderItem.class, ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE, businessOrder.id, supplierCode)
  165. break
  166. }
  167. }
  168. }
  169. }
  170. def readOrderTotal(RMap searchData, ERPTokenUser currentUser, long supplierCode, ReadOrderOption... options) {
  171. if (!(ReadOrderOption.ORDER_TOTAL in options)) {
  172. return null
  173. }
  174. //这里的查询需要和主表一致
  175. BoolQueryBuilder bqb = searchByFinance(searchData)
  176. .byOrderParentQuery(
  177. search(searchData)
  178. .byOrderStates()
  179. .byKeyWord()
  180. .byOrderCode()
  181. .byIdPlatformIn()
  182. .byIdPlatformOut()
  183. .byVoidFlagIn()
  184. .byVoidFlagOut()
  185. .byDeliverAddress_QuerySlave()
  186. .byItemName_QuerySlave()
  187. .byIdStore()
  188. .byBeginTime_Create()
  189. .byEndTime_Create()
  190. .build()
  191. )
  192. .build()
  193. //合计金额,所以主表从orderMoney中开始
  194. SearchResponse searchResponse = esClient.getClient()
  195. .prepareSearch(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  196. .setQuery(bqb)
  197. .addAggregation(AggregationBuilders.count("sub_count").field("id"))
  198. .addAggregation(AggregationBuilders.sum("orderMoneySum").field("orderMoney"))
  199. .addAggregation(AggregationBuilders.sum("deliverFeeSum").field("deliverFee"))
  200. .addAggregation(AggregationBuilders.sum("orderPlatformSubsidySum").field("orderPlatformSubsidy"))
  201. .addAggregation(AggregationBuilders.sum("storeDiscountSum").field("storeDiscount"))
  202. .addAggregation(AggregationBuilders.sum("customerPaidSum").field("customerPaid"))
  203. .addAggregation(AggregationBuilders.sum("platformServiceFeeSum").field("platformServiceFee"))
  204. .addAggregation(AggregationBuilders.sum("storeRealCollectionSum").field("storeRealCollection"))
  205. .addAggregation(AggregationBuilders.sum("omeServiceFeeSum").field("omeServiceFee"))
  206. .execute().actionGet()
  207. ValueCount orderCountSum = searchResponse.getAggregations().get("sub_count")
  208. InternalSum orderMoneySum = searchResponse.getAggregations().get("orderMoneySum")
  209. InternalSum deliverFeeSum = searchResponse.getAggregations().get("deliverFeeSum")
  210. InternalSum orderPlatformSubsidySum = searchResponse.getAggregations().get("orderPlatformSubsidySum")
  211. InternalSum storeDiscountSum = searchResponse.getAggregations().get("storeDiscountSum")
  212. InternalSum customerPaidSum = searchResponse.getAggregations().get("customerPaidSum")
  213. InternalSum platformServiceFeeSum = searchResponse.getAggregations().get("platformServiceFeeSum")
  214. InternalSum storeRealCollectionSum = searchResponse.getAggregations().get("storeRealCollectionSum")
  215. InternalSum omeServiceFeeSum = searchResponse.getAggregations().get("omeServiceFeeSum")
  216. RMap<String, Number> collectionData = new RMap<>()
  217. collectionData.put("orderCountSum", orderCountSum.getValue())
  218. collectionData.put("orderMoneySum", BigDecimal.valueOf(orderMoneySum.getValue()).setScale(2, RoundingMode.HALF_UP))
  219. collectionData.put("deliverFeeSum", BigDecimal.valueOf(deliverFeeSum.getValue()).setScale(2, RoundingMode.HALF_UP))
  220. collectionData.put("orderPlatformSubsidySum", BigDecimal.valueOf(orderPlatformSubsidySum.getValue()).setScale(2, RoundingMode.HALF_UP))
  221. collectionData.put("storeDiscountSum", BigDecimal.valueOf(storeDiscountSum.getValue()).setScale(0, RoundingMode.HALF_UP))
  222. collectionData.put("customerPaidSum", BigDecimal.valueOf(customerPaidSum.getValue()).setScale(0, RoundingMode.HALF_UP))
  223. collectionData.put("platformServiceFeeSum", BigDecimal.valueOf(platformServiceFeeSum.getValue()).setScale(0, RoundingMode.HALF_UP))
  224. collectionData.put("storeRealCollectionSum", BigDecimal.valueOf(storeRealCollectionSum.getValue()).setScale(0, RoundingMode.HALF_UP))
  225. collectionData.put("omeServiceFeeSum", BigDecimal.valueOf(omeServiceFeeSum.getValue()).setScale(0, RoundingMode.HALF_UP))
  226. return collectionData
  227. }
  228. private RetResult<List<BusinessOrder>> queryByConditions(ProcessSearchOptionsItem<ReadOrderOption> source) {
  229. String orderByField = "createTimeLong"
  230. String orderBySort = "desc"
  231. if (StringUtils.isNotBlank(source.orderBy)) {
  232. orderByField = source.orderBy.split(",")[0].trim()
  233. orderBySort = source.orderBy.split(",")[1].trim().toLowerCase()
  234. }
  235. if ((source.currentUser.userFrom == TokenUserFrom.APP_STORE_ADMIN.value) || (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value)) {
  236. if (source.searchData == null) {
  237. source.searchData = new RMap()
  238. }
  239. source.searchData.put("idStore", source.currentUser.idBindOrg)
  240. }
  241. List<BusinessOrder> orderList = ESList.<BusinessOrder> getESList()
  242. .esClient(esClient)
  243. .jsonConvert(jsonConvert)
  244. .clazz(BusinessOrder.class)
  245. .queryBuilder({
  246. return search(source.searchData)
  247. .byOrderStates()
  248. .byKeyWord()
  249. .byOrderCode()
  250. .byIdPlatformIn()
  251. .byIdPlatformOut()
  252. .byVoidFlagIn()
  253. .byVoidFlagOut()
  254. .byDeliverAddress_QuerySlave()
  255. .byItemName_QuerySlave()
  256. .byIdStore()
  257. .byBeginTime_Create()
  258. .byEndTime_Create()
  259. .build()
  260. })
  261. .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  262. .sortBuilder({
  263. switch (orderBySort) {
  264. case 'asc': return SortBuilders.fieldSort(orderByField).order(SortOrder.ASC)
  265. case 'desc': return SortBuilders.fieldSort(orderByField).order(SortOrder.DESC)
  266. }
  267. })
  268. .dataExecutor(null)
  269. .executePage(source.pageFlipper)
  270. readOrderOptions(orderList, source.supplierCode, source.options)
  271. RMap<String, Number> collectionData = readOrderTotal(source.searchData, source.currentUser, source.supplierCode, source.options)
  272. return RetResult.<List<BusinessOrder>> successT().result(orderList).page(source.pageFlipper).attachRMap(collectionData)
  273. }
  274. private RetResult<List<BusinessOrder>> queryByIds(ProcessSearchOptionsItem<ReadOrderOption> source) {
  275. if (!ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_IDS)) {
  276. return RetResult.<List<BusinessOrder>> errorT().retinfo("无效的ids参数")
  277. }
  278. String[] idOrders = source.searchData.get(ERPUtils.PARAM_SEARCH_IDS)
  279. //ES规定,addIds或者terms中的数据长度好像是1024个限制,这里为了安全,把list拆分一下
  280. //待测试下,collate分隔之后的类型,不行的话还是得List<List<String>>
  281. //测试后,结果是List<List<>>,不明白数组为什么转成List
  282. List<List<String>> idOrderArrayList = idOrders.collate(500)
  283. List<BusinessOrder> orderList = new ArrayList<>()
  284. idOrderArrayList.each { l ->
  285. List<BusinessOrder> subOrderList = ESList.<BusinessOrder> getESList()
  286. .esClient(esClient)
  287. .jsonConvert(jsonConvert)
  288. .clazz(BusinessOrder.class)
  289. .queryBuilder({
  290. return search(source.searchData)
  291. .byIdOrders(l.toArray(String[]::new))
  292. .build()
  293. })
  294. .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  295. .executeNonePage()
  296. readOrderOptions(subOrderList, source.supplierCode, source.options)
  297. if (!subOrderList.isEmpty()) {
  298. orderList.addAll(subOrderList)
  299. }
  300. }
  301. return RetResult.<List<BusinessOrder>> successT().result(orderList)
  302. }
  303. private RetResult<BusinessOrder> queryById(ProcessSearchOptionsItem<ReadOrderOption> source) {
  304. if (!ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_ID)) {
  305. return RetResult.<BusinessOrder> errorT().retinfo("无效的id参数")
  306. }
  307. long idOrder = source.searchData.getLong(ERPUtils.PARAM_SEARCH_ID)
  308. BusinessOrder businessOrder = ESOne.<BusinessOrder> getESOneInfo()
  309. .esClient(esClient)
  310. .jsonConvert(jsonConvert)
  311. .clazz(BusinessOrder.class)
  312. .queryBuilder({
  313. //获取完成的数据情况
  314. ESConditionBuilder qb = search(null).byIdOrder(idOrder)
  315. //这里还需要判断数据权限
  316. if ((source.currentUser.userFrom == TokenUserFrom.APP_STORE_ADMIN.value) || (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value)) {
  317. //如果是客户自行导入的
  318. qb = qb.byIdStore(source.currentUser.idBindOrg)
  319. }
  320. return qb.build()
  321. })
  322. .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  323. .execute()
  324. if (businessOrder == null) {
  325. return RetResult.<BusinessOrder> errorT().retinfo("无效的订单")
  326. }
  327. readOrderOptions(businessOrder, source.supplierCode, source.options)
  328. return RetResult.<BusinessOrder> successT().result(businessOrder)
  329. }
  330. private RetResult<BusinessOrder> queryByCode(ProcessSearchOptionsItem<ReadOrderOption> source) {
  331. if (!ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_CODE)) {
  332. return RetResult.<BusinessOrder> errorT().retinfo("无效的id参数")
  333. }
  334. String orderCode = source.searchData.getString(ERPUtils.PARAM_SEARCH_CODE)
  335. BusinessOrder businessOrder = ESOne.<BusinessOrder> getESOneInfo()
  336. .esClient(esClient)
  337. .jsonConvert(jsonConvert)
  338. .clazz(BusinessOrder.class)
  339. .queryBuilder({
  340. //获取完成的数据情况
  341. return search(null).byOrderCode(orderCode).build()
  342. })
  343. .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
  344. .execute()
  345. if (businessOrder == null) {
  346. return RetResult.<BusinessOrder> errorT().retinfo("无效的订单")
  347. }
  348. readOrderOptions(businessOrder, source.supplierCode, source.options)
  349. return RetResult.<BusinessOrder> successT().result(businessOrder)
  350. }
  351. @Override
  352. RetResult<BusinessOrder> execute(ProcessSearchOptionsItem<ReadOrderOption> source) {
  353. //可以参考一些都能运的代码,但那个硬编码需要多一些,这里直接判断搜索条件里面都有没有对应的条件
  354. if (ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_ID)) {
  355. return queryById(source)
  356. } else if (ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_CODE)) {
  357. return queryByCode(source)
  358. }
  359. return RetResult.<BusinessOrder> errorT().retinfo("无效的查询方式execute,查多数据应该使用executeList")
  360. }
  361. @Override
  362. RetResult<List<BusinessOrder>> executeList(ProcessSearchOptionsItem<ReadOrderOption> source) {
  363. if (ERPUtils.mapContainKey(source.searchData, ERPUtils.PARAM_SEARCH_IDS)) {
  364. return queryByIds(source)
  365. } else {
  366. return queryByConditions(source)
  367. }
  368. }
  369. //region 条件构造
  370. //groovy没法用java中类似SendOrderESConditionBuilder的静态方法构造内部类,强制编译不报错,运行还是报错无适配的构造函数,但用常规的类好使,估计是内部类有什么说法
  371. ESConditionBuilder search(RMap searchData) {
  372. return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE)))
  373. }
  374. ESConditionBuilder searchByItem(RMap searchData) {
  375. return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE)))
  376. }
  377. ESConditionBuilder searchByFinance(RMap searchData) {
  378. return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE)))
  379. }
  380. //这里是做一个示例,表示通过查部件子表查询订单
  381. ESConditionBuilder searchByOrderRider(RMap searchData) {
  382. return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)))
  383. }
  384. //endregion
  385. class ESConditionBuilder {
  386. RMap searchData
  387. BoolQueryBuilder qb
  388. ESConditionBuilder() {
  389. }
  390. ESConditionBuilder(RMap searchData) {
  391. this.searchData = searchData
  392. }
  393. ESConditionBuilder(RMap searchData, BoolQueryBuilder qb) {
  394. this.searchData = searchData
  395. this.qb = qb
  396. }
  397. //上面没法用java类似的静态方法返回条件,运行期还是报错没有适配的构造函数
  398. //注意这里如果定义成闭包,不能用this做流式写法,参考https://groovy-lang.org/closures.html#closure-owner
  399. //但是用了owner,返回的类型是Object,还得做转换,所以这里直接用java的写法
  400. ESConditionBuilder byIdOrders(String[] idOrders) {
  401. if (idOrders.length > 0) {
  402. qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(idOrders))
  403. }
  404. return this
  405. }
  406. ESConditionBuilder byIdOrders(List<Long> idOrders) {
  407. if (!idOrders.isEmpty()) {
  408. qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(ERPUtils.longArrayToStrArray(ERPUtils.longListToArray(idOrders))))
  409. }
  410. return this
  411. }
  412. //子表查订单ids
  413. ESConditionBuilder byChildIdOrders(long[] idOrders) {
  414. qb = qb.must(QueryBuilders.termsQuery("idOrder", idOrders))
  415. return this
  416. }
  417. ESConditionBuilder byIdOrder(long idOrder) {
  418. //这里不要判断idOrder是否大于0,防止条件漏了
  419. qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(String.valueOf(idOrder)))
  420. return this
  421. }
  422. ESConditionBuilder byIdPlatformIn() {
  423. if (ERPUtils.mapContainKey(searchData, "incomePlatformId")) {
  424. long idPlatformIn = searchData.getLong("incomePlatformId")
  425. if (idPlatformIn > 0L) {
  426. qb = qb.must(QueryBuilders.termQuery("incomePlatformId", idPlatformIn))
  427. }
  428. }
  429. return this
  430. }
  431. ESConditionBuilder byIdPlatformOut() {
  432. if (ERPUtils.mapContainKey(searchData, "outGoingPlatformId")) {
  433. long idPlatformOut = searchData.getLong("outGoingPlatformId")
  434. if (idPlatformOut > 0L) {
  435. qb = qb.must(QueryBuilders.termQuery("outGoingPlatformId", idPlatformOut))
  436. }
  437. }
  438. return this
  439. }
  440. ESConditionBuilder byKeyWord() {
  441. if (ERPUtils.mapContainKey(searchData, "keyWord")) {
  442. String keyWord = searchData.getString("keyWord")
  443. //下面的关系不要弄错了,一定是must里面在should,如果一直should不用must包起来,则导致搜索条件是全部或者的关系,主表搜索只会搜索有子表的记录,结果就是全部数据都会命中
  444. QueryBuilder qbDeliveryInfoKeyWord = QueryBuilders.boolQuery()
  445. .must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE))
  446. .must(QueryBuilders.boolQuery()
  447. .should(QueryBuilders.matchQuery("deliverAddress", keyWord).analyzer("query_ansj").operator(Operator.AND))
  448. .should(QueryBuilders.termQuery("deliverAddress.number", keyWord.toLowerCase()))
  449. .should(QueryBuilders.matchQuery("deliverAddress.letter", keyWord.toLowerCase()).operator(Operator.AND))
  450. )
  451. QueryBuilder qbKeyWord = QueryBuilders.boolQuery()
  452. .should(QueryBuilders.termQuery("orderCode", keyWord.toLowerCase()))
  453. .should(QueryBuilders.termQuery("incomePlatformOrderCode", keyWord.toLowerCase()))
  454. .should(QueryBuilders.termQuery("outGoingPlatformOrderCode", keyWord.toLowerCase()))
  455. .should(QueryBuilders.matchQuery("orderName", keyWord).operator(Operator.AND))
  456. .should(QueryBuilders.matchQuery("storeName", keyWord).operator(Operator.AND))
  457. .should(JoinQueryBuilders.hasChildQuery(ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE, qbDeliveryInfoKeyWord, ScoreMode.None))
  458. qb = qb.must(qbKeyWord)
  459. }
  460. return this
  461. }
  462. ESConditionBuilder byOrderStates() {
  463. if (ERPUtils.mapContainKey(searchData, "orderStates")) {
  464. String orderStates = searchData.getString("orderStates")
  465. qb = qb.must(QueryBuilders.termsQuery("orderState", orderStates.split(",")))
  466. }
  467. return this
  468. }
  469. ESConditionBuilder byOrderStates(String orderStates) {
  470. qb = qb.must(QueryBuilders.termsQuery("orderState", orderStates.split(",")))
  471. return this
  472. }
  473. ESConditionBuilder byOrderState(int orderState) {
  474. qb = qb.must(QueryBuilders.termQuery("orderState", orderState))
  475. return this
  476. }
  477. ESConditionBuilder byVoidFlagIn() {
  478. if (ERPUtils.mapContainKey(searchData, "voidFlagIn")) {
  479. int voidFlag = searchData.getInt("voidFlagIn")
  480. if (voidFlag >= 0) {
  481. qb = qb.must(QueryBuilders.termQuery("voidFlagIn", voidFlag))
  482. }
  483. }
  484. return this
  485. }
  486. ESConditionBuilder byVoidFlagOut() {
  487. if (ERPUtils.mapContainKey(searchData, "voidFlagOut")) {
  488. int voidFlag = searchData.getInt("voidFlagOut")
  489. if (voidFlag >= 0) {
  490. qb = qb.must(QueryBuilders.termQuery("voidFlagOut", voidFlag))
  491. }
  492. }
  493. return this
  494. }
  495. ESConditionBuilder byOrderCode() {
  496. if (ERPUtils.mapContainKey(searchData, "orderCode")) {
  497. String orderCode = searchData.getString("orderCode")
  498. qb = qb.must(QueryBuilders.termQuery("orderCode", orderCode.toLowerCase()))
  499. }
  500. return this
  501. }
  502. ESConditionBuilder byOrderCode(String orderCode) {
  503. qb = qb.must(QueryBuilders.termQuery("orderCode", orderCode.toLowerCase()))
  504. return this
  505. }
  506. ESConditionBuilder byBeginTime_Create() {
  507. if (ERPUtils.mapContainKey(searchData, "beginTime")) {
  508. String beginTimeStr = searchData.getString("beginTime")
  509. long beginTime
  510. if (beginTimeStr.contains("-")) {
  511. beginTime = DateUtil.getStartOfDay(DateUtil.asDate(beginTimeStr, "yyyy-MM-dd")).getTime()
  512. } else {
  513. beginTime = DateUtil.getStartOfDay(new Date(searchData.getLong("beginTime"))).getTime()
  514. }
  515. qb = qb.must(QueryBuilders.rangeQuery("createTimeLong").gte(beginTime))
  516. }
  517. return this
  518. }
  519. ESConditionBuilder byEndTime_Create() {
  520. if (ERPUtils.mapContainKey(searchData, "endTime")) {
  521. String endTimeStr = searchData.getString("endTime")
  522. long endTime
  523. if (endTimeStr.contains("-")) {
  524. endTime = DateUtil.getEndOfDay(DateUtil.asDate(endTimeStr, "yyyy-MM-dd")).getTime()
  525. } else {
  526. endTime = DateUtil.getEndOfDay(new Date(searchData.getLong("endTime"))).getTime()
  527. }
  528. qb = qb.must(QueryBuilders.rangeQuery("createTimeLong").lte(endTime))
  529. }
  530. return this
  531. }
  532. /**
  533. * 主表为order,查子表的查DeliverAddress
  534. * @return 查询构造器
  535. */
  536. ESConditionBuilder byDeliverAddress_QuerySlave() {
  537. if (ERPUtils.mapContainKey(searchData, "deliverAddress")) {
  538. String deliverAddress = searchData.getString("deliverAddress")
  539. BoolQueryBuilder qbDeliverAddress = QueryBuilders.boolQuery()
  540. .should(QueryBuilders.matchQuery("deliverAddress", deliverAddress).analyzer("query_ansj").operator(Operator.AND))
  541. .should(QueryBuilders.termQuery("deliverAddress.number", deliverAddress.toLowerCase()))
  542. .should(QueryBuilders.matchQuery("deliverAddress.letter", deliverAddress.toLowerCase()).operator(Operator.AND))
  543. qb = qb.must(JoinQueryBuilders.hasChildQuery(ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE, qbDeliverAddress, ScoreMode.None))
  544. }
  545. return this
  546. }
  547. /**
  548. * 主表为order,查子表的查itemName
  549. * @return 查询构造器
  550. */
  551. ESConditionBuilder byItemName_QuerySlave() {
  552. if (ERPUtils.mapContainKey(searchData, "itemName")) {
  553. String itemName = searchData.getString("itemName")
  554. BoolQueryBuilder qbItemName = QueryBuilders.boolQuery()
  555. .should(QueryBuilders.matchQuery("itemName", itemName).analyzer("query_ansj").operator(Operator.AND))
  556. .should(QueryBuilders.termQuery("itemName.number", itemName.toLowerCase()))
  557. .should(QueryBuilders.matchQuery("itemName.letter", itemName.toLowerCase()).operator(Operator.AND))
  558. qb = qb.must(JoinQueryBuilders.hasChildQuery(ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE, qbItemName, ScoreMode.None))
  559. }
  560. return this
  561. }
  562. ESConditionBuilder byIdStore() {
  563. if (ERPUtils.mapContainKey(searchData, "idStore")) {
  564. long idStore = searchData.getLong("idStore")
  565. if (idStore > 0)
  566. qb = qb.must(QueryBuilders.termQuery("idStore", idStore))
  567. }
  568. return this
  569. }
  570. ESConditionBuilder byIdStore(long idStore) {
  571. qb = qb.must(QueryBuilders.termQuery("idStore", idStore))
  572. return this
  573. }
  574. ESConditionBuilder byOrderParentQuery(QueryBuilder qbParent) {
  575. qb = qb.must(JoinQueryBuilders.hasParentQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, qbParent, false))
  576. return this
  577. }
  578. BoolQueryBuilder build() {
  579. return qb
  580. }
  581. }
  582. }