BE_Express_CallBack_Invoke_SFTC.groovy 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. import com.dderp.business.dao.OrderDao
  2. import com.dderp.common.api.*
  3. import com.dderp.common.api.flycat.OrderSearchService
  4. import com.dderp.common.api.flycat.OrderStepService
  5. import com.dderp.common.datas.ERPModule
  6. import com.dderp.common.datas.ESKeys
  7. import com.dderp.common.datas.RedisKeys
  8. import com.dderp.common.datas.flycat.BusinessOrderStatus
  9. import com.dderp.common.datas.flycat.OrderRiderStatus
  10. import com.dderp.common.entity.base.InvokeCallParams
  11. import com.dderp.common.entity.base.InvokeCallResult
  12. import com.dderp.common.entity.order.BusinessOrder
  13. import com.dderp.common.entity.order.OrderRiderItem
  14. import com.dderp.common.entity.order.OrderStep
  15. import com.dySweetFishPlugin.elasticsearch.ESClient
  16. import com.dySweetFishPlugin.sql.TableIdService
  17. import com.dySweetFishPlugin.sql.dao.OperatorWait
  18. import com.dySweetFishPlugin.sql.dao.TunaService
  19. import com.sweetfish.convert.json.JsonConvert
  20. import com.sweetfish.service.RetResult
  21. import groovy.json.JsonSlurper
  22. import org.apache.commons.lang3.StringUtils
  23. import org.apache.logging.log4j.LogManager
  24. import org.apache.logging.log4j.Logger
  25. import org.elasticsearch.action.bulk.BulkRequestBuilder
  26. import org.elasticsearch.action.bulk.BulkResponse
  27. import org.elasticsearch.action.index.IndexRequestBuilder
  28. import org.elasticsearch.action.support.WriteRequest
  29. import org.elasticsearch.action.update.UpdateRequest
  30. import org.elasticsearch.common.xcontent.XContentType
  31. import javax.annotation.Resource
  32. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
  33. class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  34. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  35. @Resource
  36. JsonConvert jsonConvert
  37. @Resource
  38. ERPLockDataService lockDataService
  39. @Resource
  40. NoSqlKeysService keysService
  41. @Resource
  42. StoreService storeService
  43. @Resource
  44. OrderSearchService orderSearchService
  45. @Resource
  46. OrderStepService orderStepService
  47. @Resource
  48. TableIdService tableIdService
  49. @Resource
  50. TunaService tunaService
  51. @Resource
  52. ESClient esClient
  53. @Resource
  54. SupplierInitService supplierService
  55. private OrderDao orderDao
  56. @Override
  57. String scriptName() {
  58. return "顺丰同城数据回调"
  59. }
  60. @Override
  61. ERPModule module() {
  62. return ERPModule.EXPRESS_API
  63. }
  64. @Override
  65. OperatorWait getAWait(InvokeCallParams source) {
  66. return OperatorWait.ASNYC
  67. }
  68. @Override
  69. void start(long supplierCode) {
  70. orderDao = tunaService.generate(OrderDao.class)
  71. }
  72. @Override
  73. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  74. //此回调post的数据看着没有子表,直接用groovy自带的json即可,如果有子表,还是应该建立一个类进行转换
  75. //锁定下数据,防止重复提交
  76. def jsonSlurper = new JsonSlurper()
  77. def invokeOrder = jsonSlurper.parseText(source.params)
  78. String urlIndex = invokeOrder["url_index"] as String
  79. //这里除了店铺授权和店铺取消授权,其它都是订单,if-else先写着
  80. if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
  81. //店铺授权回调
  82. String shopId = invokeOrder["shop_id"] as String
  83. if (lockDataService.hLockAdd(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode) > 1) {
  84. return RetResult.<InvokeCallParams> errorT().retinfo(shopId + "提交工作中,请稍后刷新即可,无需重复操作")
  85. }
  86. } else if (StringUtils.equalsIgnoreCase("cancelbindnotify", urlIndex)) {
  87. //店铺取消授权回调
  88. String shopId = invokeOrder["shop_id"] as String
  89. if (lockDataService.hLockAdd(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode) > 1) {
  90. return RetResult.<InvokeCallParams> errorT().retinfo(shopId + "提交工作中,请稍后刷新即可,无需重复操作")
  91. }
  92. } else {
  93. String invokeOrderId = invokeOrder["shop_order_id"] as String
  94. if (lockDataService.hLockAdd(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
  95. return RetResult.<InvokeCallParams> errorT().retinfo(invokeOrderId + "提交工作中,请稍后刷新即可,无需重复操作")
  96. }
  97. }
  98. return RetResult.<InvokeCallParams> successT().result(source)
  99. }
  100. @Override
  101. void afterExecute(boolean executeError, InvokeCallParams source, InvokeCallResult dest) {
  102. def jsonSlurper = new JsonSlurper()
  103. def invokeOrder = jsonSlurper.parseText(source.params)
  104. String urlIndex = invokeOrder["url_index"] as String
  105. if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
  106. //店铺授权回调
  107. String shopId = invokeOrder["shop_id"] as String
  108. lockDataService.hLockDel(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode)
  109. } else if (StringUtils.equalsIgnoreCase("cancelbindnotify", urlIndex)) {
  110. //店铺取消授权回调
  111. String shopId = invokeOrder["shop_id"] as String
  112. lockDataService.hLockDel(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode)
  113. } else {
  114. String invokeOrderId = invokeOrder["shop_order_id"] as String
  115. lockDataService.hLockDel(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
  116. }
  117. }
  118. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  119. def jsonSlurper = new JsonSlurper()
  120. def invokeOrder = jsonSlurper.parseText(source.params)
  121. logger.info(source.params)
  122. String urlIndex = invokeOrder["url_index"]
  123. if (StringUtils.equalsIgnoreCase("rider_status", urlIndex)) {
  124. //region 配送状态更改回调
  125. long orderId = invokeOrder["shop_order_id"] as long
  126. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  127. source.currentUser, source.dataSourceId, source.supplierCode)
  128. if (!orderResult.isSuccess()) {
  129. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  130. }
  131. BusinessOrder businessOrder = orderResult.result
  132. OrderRiderItem orderRiderItem = new OrderRiderItem(
  133. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  134. idOrder: businessOrder.id,
  135. idPlatform: businessOrder.outGoingPlatformId,
  136. platformCode: 'SFTC',
  137. platformName: businessOrder.outGoingPlatformName,
  138. platformOrderId: invokeOrder["sf_order_id"],
  139. operatorName: invokeOrder["operator_name"],
  140. operatorPhone: invokeOrder["operator_phone"],
  141. riderLng: invokeOrder["rider_lng"],
  142. riderLat: invokeOrder["rider_lat"]
  143. )
  144. List<OrderStep> stepList = new ArrayList<>()
  145. int sfOrderStatus = invokeOrder["order_status"] as int
  146. if (sfOrderStatus == 10) {
  147. //配送员接单/改派
  148. businessOrder.orderStatus = BusinessOrderStatus.riderReceiving.value
  149. orderRiderItem.riderStatus = OrderRiderStatus.accept.value
  150. orderRiderItem.statusDesc = OrderRiderStatus.accept.name
  151. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  152. "配送接单",
  153. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")接单",
  154. source.currentUser))
  155. } else if (sfOrderStatus == 12) {
  156. //配送员到店
  157. businessOrder.orderStatus = BusinessOrderStatus.riderComing.value
  158. orderRiderItem.riderStatus = OrderRiderStatus.store.value
  159. orderRiderItem.statusDesc = OrderRiderStatus.store.name
  160. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  161. "配送到店",
  162. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")到店",
  163. source.currentUser))
  164. } else if (sfOrderStatus == 15) {
  165. //配送员配送中
  166. businessOrder.orderStatus = BusinessOrderStatus.riderTaking.value
  167. orderRiderItem.riderStatus = OrderRiderStatus.working.value
  168. orderRiderItem.statusDesc = OrderRiderStatus.working.name
  169. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  170. "开始配送",
  171. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送",
  172. source.currentUser))
  173. }
  174. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  175. if (iData >= 0) {
  176. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  177. try {
  178. UpdateRequest orderRequest = new UpdateRequest(
  179. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  180. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  181. .doc(jsonBuilder()
  182. .startObject()
  183. .field("orderStatus", businessOrder.orderStatus)
  184. .endObject())
  185. bulkRequest.add(orderRequest)
  186. IndexRequestBuilder itemRequest = esClient.getClient()
  187. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  188. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  189. .setId(String.valueOf(orderRiderItem.id))
  190. .setParent(String.valueOf(orderRiderItem.idOrder))
  191. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  192. bulkRequest.add(itemRequest)
  193. stepList.each { orderStep ->
  194. IndexRequestBuilder orderStepRequest = esClient.getClient()
  195. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  196. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  197. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  198. bulkRequest.add(orderStepRequest)
  199. }
  200. //写入到es索引中
  201. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  202. if (bulkResponse.hasFailures()) {
  203. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  204. }
  205. } catch (Exception e) {
  206. logger.error("订单配送发单错误:" + e.getMessage(), e)
  207. }
  208. }
  209. //endregion
  210. } else if (StringUtils.equalsIgnoreCase("order_complete", urlIndex)) {
  211. //region 订单完成
  212. long orderId = invokeOrder["shop_order_id"] as long
  213. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  214. source.currentUser, source.dataSourceId, source.supplierCode)
  215. if (!orderResult.isSuccess()) {
  216. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  217. }
  218. BusinessOrder businessOrder = orderResult.result
  219. List<OrderStep> stepList = new ArrayList<>()
  220. OrderRiderItem orderRiderItem = new OrderRiderItem(
  221. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  222. idOrder: businessOrder.id,
  223. idPlatform: businessOrder.outGoingPlatformId,
  224. platformCode: 'SFTC',
  225. platformName: businessOrder.outGoingPlatformName,
  226. platformOrderId: invokeOrder["sf_order_id"],
  227. operatorName: invokeOrder["operator_name"],
  228. operatorPhone: invokeOrder["operator_phone"],
  229. riderLng: invokeOrder["rider_lng"],
  230. riderLat: invokeOrder["rider_lat"]
  231. )
  232. businessOrder.orderStatus = BusinessOrderStatus.riderComplete.value
  233. orderRiderItem.riderStatus = OrderRiderStatus.complete.value
  234. orderRiderItem.statusDesc = OrderRiderStatus.complete.name
  235. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  236. "配送完成",
  237. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送完成",
  238. source.currentUser))
  239. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  240. if (iData >= 0) {
  241. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  242. try {
  243. UpdateRequest orderRequest = new UpdateRequest(
  244. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  245. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  246. .doc(jsonBuilder()
  247. .startObject()
  248. .field("orderStatus", businessOrder.orderStatus)
  249. .endObject())
  250. bulkRequest.add(orderRequest)
  251. IndexRequestBuilder itemRequest = esClient.getClient()
  252. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  253. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  254. .setId(String.valueOf(orderRiderItem.id))
  255. .setParent(String.valueOf(orderRiderItem.idOrder))
  256. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  257. bulkRequest.add(itemRequest)
  258. stepList.each { orderStep ->
  259. IndexRequestBuilder orderStepRequest = esClient.getClient()
  260. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  261. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  262. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  263. bulkRequest.add(orderStepRequest)
  264. }
  265. //写入到es索引中
  266. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  267. if (bulkResponse.hasFailures()) {
  268. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  269. }
  270. } catch (Exception e) {
  271. logger.error("订单配送发单错误:" + e.getMessage(), e)
  272. }
  273. }
  274. //endregion
  275. } else if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
  276. storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
  277. }
  278. return RetResult.<InvokeCallResult> successT().result(
  279. InvokeCallResult.success()
  280. )
  281. }
  282. }