OrderSearchServiceImpl.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package com.dderp.business.service.flycat;
  2. import com.dderp.common.api.flycat.OrderSearchService;
  3. import com.dderp.common.base.BaseService;
  4. import com.dderp.common.datas.ERPModule;
  5. import com.dderp.common.datas.ReadOrderOption;
  6. import com.dderp.common.entity.base.ProcessSearchOptionsItem;
  7. import com.dderp.common.entity.order.BusinessOrder;
  8. import com.dderp.common.entity.site.ERPTokenUser;
  9. import com.dderp.common.tool.ERPUtils;
  10. import com.sweetfish.service.Local;
  11. import com.sweetfish.service.RetResult;
  12. import com.sweetfish.source.PageFlipper;
  13. import com.sweetfish.util.AnyValue;
  14. import com.sweetfish.util.AutoLoad;
  15. import com.sweetfish.util.ObjectPool;
  16. import com.sweetfish.util.ResourceType;
  17. import org.rex.RMap;
  18. import java.util.List;
  19. /**
  20. * 订单搜索服务
  21. * 前端页面上调用搜索可以做到完全脚本化,因为它的查询总是返回json即可,查询功能也基本固定
  22. * 但服务之间调用搜索就很麻烦做到这一点了,不能只调用callScript,原因如下
  23. * 1、InvokeCallParams功能太单一,服务间调用条件太多,一个对象搞不定
  24. * 2、InvokeCallResult在脚本中序列化后,还需要调用方反序列化,多了一步无效的json操作
  25. * 3、服务之间调用返回值确实不一样,有的需要订单主表,有的需要订单带部件,有的只要部件,而且带不带子表无法固定,
  26. * 所以为了兼顾上面说的几点,有一些硬编码必不可少
  27. * 可以把订单所有的对象抽象为两类操作,一种为获取单个对象,一种为获取数组,这样只要结构不动的情况下,可以做到脚本化,而如果结构动,反正是要编译的
  28. * 另外要少写一些固定的代码,条件全部用RMap传递,groovy里面初始化一个map对象还是很方便的
  29. */
  30. @AutoLoad(false)
  31. @Local
  32. @ResourceType(OrderSearchService.class)
  33. public class OrderSearchServiceImpl extends BaseService implements OrderSearchService {
  34. private final ObjectPool<RMap<String, Long>> idsMap = new ObjectPool<>(100,
  35. () -> new RMap<>(),
  36. null,
  37. (t) -> {
  38. t.clear();
  39. return true;
  40. });
  41. @Override
  42. public void init(AnyValue config) {
  43. super.init(config);
  44. }
  45. @Override
  46. public void destroy(AnyValue config) {
  47. super.destroy(config);
  48. }
  49. /**
  50. * 查询单个订单信息
  51. * <br>在groovy里面使用可以按下面的方法调用
  52. * <br>RetResult<PrintOrder> orderResult = orderSearchService.searchBusinessOrder(new RMap<>(ERPUtils.PARAM_SEARCH_ID: 100L), currentUser, dataSourceId, supplierCode)
  53. * <br>或者在java里面封装一个
  54. * <br> getBusinessOrder(long id)的方法,提供给其它服务调用,写法差不多,简化不了一行代码
  55. *
  56. * @param searchData 查询条件
  57. * @param currentUser 操作人
  58. * @param dataSourceId 分库
  59. * @param supplierCode 分表
  60. * @param options 子表读取规则
  61. * @return 订单信息
  62. */
  63. @SuppressWarnings("rawtypes")
  64. public RetResult<BusinessOrder> searchBusinessOrder(RMap searchData,
  65. ERPTokenUser currentUser,
  66. String dataSourceId,
  67. long supplierCode,
  68. ReadOrderOption[] options) {
  69. return handleScript("ERP_BusinessOrder_Search", ERPModule.ERP_ORDER_SEARCH,
  70. dataSourceId, supplierCode,
  71. () -> ProcessSearchOptionsItem.<ReadOrderOption>newBuilder()
  72. .searchData(searchData)
  73. .options(options)
  74. .currentUser(currentUser)
  75. .dataSourceId(dataSourceId)
  76. .supplierCode(supplierCode)
  77. .build()
  78. );
  79. }
  80. /**
  81. * 获取单个订单信息
  82. * 对searchBusinessOrder的简单封装
  83. *
  84. * @param idOrder 订单id
  85. * @param currentUser 操作人
  86. * @param dataSourceId 分库
  87. * @param supplierCode 分表
  88. * @param options 子表读取规则
  89. * @return 订单信息
  90. */
  91. public RetResult<BusinessOrder> getBusinessOrder(long idOrder,
  92. ERPTokenUser currentUser,
  93. String dataSourceId,
  94. long supplierCode,
  95. ReadOrderOption[] options) {
  96. RMap<String, Long> longRMap = idsMap.get();
  97. try {
  98. longRMap.put(ERPUtils.PARAM_SEARCH_ID, idOrder);
  99. //searchBusinessOrder是同步调用的,所以可以这样try finally,如果有异步情况,则在完成里面调用,参考doId之类的实现
  100. return searchBusinessOrder(longRMap, currentUser, dataSourceId, supplierCode, options);
  101. } finally {
  102. idsMap.accept(longRMap);
  103. }
  104. }
  105. /**
  106. * 多订单查询,无需分页参数,
  107. * <br>在groovy里面使用可以按下面的方法调用,比如通过多id获取订单
  108. * <br>RetResult<List<PrintOrder></PrintOrder>> orderResult = orderSearchService.searchPrintOrderList(new RMap<>(ERPUtils.PARAM_SEARCH_IDS: "1,2,3"), currentUser, dataSourceId, supplierCode)
  109. * <br>或者在java里面封装一个
  110. * <br> getPrintOrder(long id)的方法,提供给其它服务调用,写法差不多,简化不了一行代码
  111. *
  112. * @param searchData 查询条件
  113. * @param currentUser 操作人
  114. * @param dataSourceId 分库
  115. * @param supplierCode 分表
  116. * @param options 子表读取规则
  117. * @return 订单列表
  118. */
  119. @SuppressWarnings("rawtypes")
  120. public RetResult<List<BusinessOrder>> searchBusinessOrderList(RMap searchData,
  121. ERPTokenUser currentUser,
  122. String dataSourceId,
  123. long supplierCode,
  124. ReadOrderOption[] options) {
  125. return handleScriptList("ERP_BusinessOrder_Search", ERPModule.ERP_ORDER_SEARCH,
  126. dataSourceId, supplierCode,
  127. () -> ProcessSearchOptionsItem.<ReadOrderOption>newBuilder()
  128. .searchData(searchData)
  129. .options(options)
  130. .currentUser(currentUser)
  131. .dataSourceId(dataSourceId)
  132. .supplierCode(supplierCode)
  133. .build()
  134. );
  135. }
  136. /**
  137. * 多订单分页查询
  138. *
  139. * @param searchData 查询条件
  140. * @param currentUser 操作人
  141. * @param orderBy 排序
  142. * @param pageFlipper 分页
  143. * @param dataSourceId 分库
  144. * @param supplierCode 分表
  145. * @param options 子表读取规则
  146. * @return 订单列表
  147. */
  148. @SuppressWarnings("rawtypes")
  149. public RetResult<List<BusinessOrder>> searchBusinessOrderList(RMap searchData,
  150. ERPTokenUser currentUser,
  151. String orderBy,
  152. PageFlipper pageFlipper,
  153. String dataSourceId,
  154. long supplierCode,
  155. ReadOrderOption[] options) {
  156. return handleScriptList("ERP_BusinessOrder_Search", ERPModule.ERP_ORDER_SEARCH,
  157. dataSourceId, supplierCode,
  158. () -> ProcessSearchOptionsItem.<ReadOrderOption>newBuilder()
  159. .searchData(searchData)
  160. .pageFlipper(pageFlipper)
  161. .orderBy(orderBy)
  162. .options(options)
  163. .currentUser(currentUser)
  164. .dataSourceId(dataSourceId)
  165. .supplierCode(supplierCode)
  166. .build()
  167. );
  168. }
  169. }