OrderSearchServiceImpl.java 10 KB

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