BE_Express_CallBack_Invoke_SFTC.groovy 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  1. import com.dderp.business.dao.OrderDao
  2. import com.dderp.common.api.BusinessExecutor
  3. import com.dderp.common.api.ERPLockDataService
  4. import com.dderp.common.api.StoreService
  5. import com.dderp.common.api.SupplierInitService
  6. import com.dderp.common.api.flycat.OrderSearchService
  7. import com.dderp.common.api.flycat.OrderStepService
  8. import com.dderp.common.datas.ERPModule
  9. import com.dderp.common.datas.ESKeys
  10. import com.dderp.common.datas.RedisKeys
  11. import com.dderp.common.datas.flycat.BusinessOrderStatus
  12. import com.dderp.common.datas.flycat.OrderRiderStatus
  13. import com.dderp.common.entity.base.InvokeCallParams
  14. import com.dderp.common.entity.base.InvokeCallResult
  15. import com.dderp.common.entity.order.BusinessOrder
  16. import com.dderp.common.entity.order.OrderRiderItem
  17. import com.dderp.common.entity.order.OrderStep
  18. import com.dySweetFishPlugin.elasticsearch.ESClient
  19. import com.dySweetFishPlugin.sql.TableIdService
  20. import com.dySweetFishPlugin.sql.dao.OperatorWait
  21. import com.dySweetFishPlugin.sql.dao.TunaService
  22. import com.sweetfish.convert.json.JsonConvert
  23. import com.sweetfish.service.RetResult
  24. import groovy.json.JsonSlurper
  25. import org.apache.commons.lang3.StringUtils
  26. import org.apache.logging.log4j.LogManager
  27. import org.apache.logging.log4j.Logger
  28. import org.elasticsearch.action.bulk.BulkRequestBuilder
  29. import org.elasticsearch.action.bulk.BulkResponse
  30. import org.elasticsearch.action.index.IndexRequestBuilder
  31. import org.elasticsearch.action.support.WriteRequest
  32. import org.elasticsearch.action.update.UpdateRequest
  33. import org.elasticsearch.common.xcontent.XContentType
  34. import javax.annotation.Resource
  35. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
  36. class BE_Express_CallBack_Invoke_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  37. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  38. @Resource
  39. JsonConvert jsonConvert
  40. @Resource
  41. ERPLockDataService lockDataService
  42. @Resource
  43. StoreService storeService
  44. @Resource
  45. OrderSearchService orderSearchService
  46. @Resource
  47. OrderStepService orderStepService
  48. @Resource
  49. TableIdService tableIdService
  50. @Resource
  51. TunaService tunaService
  52. @Resource
  53. ESClient esClient
  54. @Resource
  55. SupplierInitService supplierService
  56. private OrderDao orderDao
  57. //执行逻辑,为代码看清楚点,不要担心这里的代码重复,主要是把逻辑写清楚,免得后期维护麻烦,反正每次通知只有一种情况
  58. def invokeCallFunc = [
  59. "rider_status@10" : { invokeOrder, InvokeCallParams source ->
  60. //region 配送员接单/改派
  61. long orderId = invokeOrder["shop_order_id"] as long
  62. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  63. source.currentUser, source.dataSourceId, source.supplierCode)
  64. if (!orderResult.isSuccess()) {
  65. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  66. }
  67. BusinessOrder businessOrder = orderResult.result
  68. OrderRiderItem orderRiderItem = new OrderRiderItem(
  69. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  70. idOrder: businessOrder.id,
  71. idPlatform: businessOrder.outGoingPlatformId,
  72. platformCode: 'SFTC',
  73. platformName: businessOrder.outGoingPlatformName,
  74. platformOrderId: invokeOrder["sf_order_id"],
  75. operatorName: invokeOrder["operator_name"],
  76. operatorPhone: invokeOrder["operator_phone"],
  77. riderLng: invokeOrder["rider_lng"],
  78. riderLat: invokeOrder["rider_lat"],
  79. itemContent: ""
  80. )
  81. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  82. List<OrderStep> stepList = new ArrayList<>()
  83. //配送员接单/改派
  84. businessOrder.orderStatus = BusinessOrderStatus.riderReceiving.value
  85. orderRiderItem.riderStatus = OrderRiderStatus.accept.value
  86. orderRiderItem.statusDesc = OrderRiderStatus.accept.name
  87. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  88. "配送接单",
  89. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")接单",
  90. source.currentUser))
  91. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  92. if (iData >= 0) {
  93. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  94. try {
  95. UpdateRequest orderRequest = new UpdateRequest(
  96. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  97. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  98. .doc(jsonBuilder()
  99. .startObject()
  100. .field("orderStatus", businessOrder.orderStatus)
  101. .endObject())
  102. bulkRequest.add(orderRequest)
  103. IndexRequestBuilder itemRequest = esClient.getClient()
  104. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  105. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  106. .setId(String.valueOf(orderRiderItem.id))
  107. .setParent(String.valueOf(orderRiderItem.idOrder))
  108. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  109. bulkRequest.add(itemRequest)
  110. stepList.each { orderStep ->
  111. IndexRequestBuilder orderStepRequest = esClient.getClient()
  112. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  113. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  114. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  115. bulkRequest.add(orderStepRequest)
  116. }
  117. //写入到es索引中
  118. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  119. if (bulkResponse.hasFailures()) {
  120. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  121. }
  122. } catch (Exception e) {
  123. logger.error("订单配送发单错误:" + e.getMessage(), e)
  124. }
  125. }
  126. //endregion
  127. return RetResult.<InvokeCallResult> successT().result(
  128. InvokeCallResult.success()
  129. )
  130. },
  131. "rider_status@12" : { invokeOrder, InvokeCallParams source ->
  132. //region 配送员到店
  133. long orderId = invokeOrder["shop_order_id"] as long
  134. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  135. source.currentUser, source.dataSourceId, source.supplierCode)
  136. if (!orderResult.isSuccess()) {
  137. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  138. }
  139. BusinessOrder businessOrder = orderResult.result
  140. OrderRiderItem orderRiderItem = new OrderRiderItem(
  141. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  142. idOrder: businessOrder.id,
  143. idPlatform: businessOrder.outGoingPlatformId,
  144. platformCode: 'SFTC',
  145. platformName: businessOrder.outGoingPlatformName,
  146. platformOrderId: invokeOrder["sf_order_id"],
  147. operatorName: invokeOrder["operator_name"],
  148. operatorPhone: invokeOrder["operator_phone"],
  149. riderLng: invokeOrder["rider_lng"],
  150. riderLat: invokeOrder["rider_lat"],
  151. itemContent: ""
  152. )
  153. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  154. List<OrderStep> stepList = new ArrayList<>()
  155. //配送员到店
  156. businessOrder.orderStatus = BusinessOrderStatus.riderComing.value
  157. orderRiderItem.riderStatus = OrderRiderStatus.store.value
  158. orderRiderItem.statusDesc = OrderRiderStatus.store.name
  159. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  160. "配送到店",
  161. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")到店",
  162. source.currentUser))
  163. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  164. if (iData >= 0) {
  165. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  166. try {
  167. UpdateRequest orderRequest = new UpdateRequest(
  168. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  169. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  170. .doc(jsonBuilder()
  171. .startObject()
  172. .field("orderStatus", businessOrder.orderStatus)
  173. .endObject())
  174. bulkRequest.add(orderRequest)
  175. IndexRequestBuilder itemRequest = esClient.getClient()
  176. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  177. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  178. .setId(String.valueOf(orderRiderItem.id))
  179. .setParent(String.valueOf(orderRiderItem.idOrder))
  180. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  181. bulkRequest.add(itemRequest)
  182. stepList.each { orderStep ->
  183. IndexRequestBuilder orderStepRequest = esClient.getClient()
  184. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  185. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  186. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  187. bulkRequest.add(orderStepRequest)
  188. }
  189. //写入到es索引中
  190. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  191. if (bulkResponse.hasFailures()) {
  192. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  193. }
  194. } catch (Exception e) {
  195. logger.error("订单配送发单错误:" + e.getMessage(), e)
  196. }
  197. }
  198. //endregion
  199. return RetResult.<InvokeCallResult> successT().result(
  200. InvokeCallResult.success()
  201. )
  202. },
  203. "rider_status@15" : { invokeOrder, InvokeCallParams source ->
  204. //region 配送员配送中
  205. long orderId = invokeOrder["shop_order_id"] as long
  206. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  207. source.currentUser, source.dataSourceId, source.supplierCode)
  208. if (!orderResult.isSuccess()) {
  209. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  210. }
  211. BusinessOrder businessOrder = orderResult.result
  212. OrderRiderItem orderRiderItem = new OrderRiderItem(
  213. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  214. idOrder: businessOrder.id,
  215. idPlatform: businessOrder.outGoingPlatformId,
  216. platformCode: 'SFTC',
  217. platformName: businessOrder.outGoingPlatformName,
  218. platformOrderId: invokeOrder["sf_order_id"],
  219. operatorName: invokeOrder["operator_name"],
  220. operatorPhone: invokeOrder["operator_phone"],
  221. riderLng: invokeOrder["rider_lng"],
  222. riderLat: invokeOrder["rider_lat"],
  223. itemContent: ""
  224. )
  225. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  226. List<OrderStep> stepList = new ArrayList<>()
  227. //配送员配送中
  228. businessOrder.orderStatus = BusinessOrderStatus.riderTaking.value
  229. orderRiderItem.riderStatus = OrderRiderStatus.working.value
  230. orderRiderItem.statusDesc = OrderRiderStatus.working.name
  231. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  232. "开始配送",
  233. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送",
  234. source.currentUser))
  235. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  236. if (iData >= 0) {
  237. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  238. try {
  239. UpdateRequest orderRequest = new UpdateRequest(
  240. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  241. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  242. .doc(jsonBuilder()
  243. .startObject()
  244. .field("orderStatus", businessOrder.orderStatus)
  245. .endObject())
  246. bulkRequest.add(orderRequest)
  247. IndexRequestBuilder itemRequest = esClient.getClient()
  248. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  249. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  250. .setId(String.valueOf(orderRiderItem.id))
  251. .setParent(String.valueOf(orderRiderItem.idOrder))
  252. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  253. bulkRequest.add(itemRequest)
  254. stepList.each { orderStep ->
  255. IndexRequestBuilder orderStepRequest = esClient.getClient()
  256. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  257. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  258. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  259. bulkRequest.add(orderStepRequest)
  260. }
  261. //写入到es索引中
  262. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  263. if (bulkResponse.hasFailures()) {
  264. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  265. }
  266. } catch (Exception e) {
  267. logger.error("订单配送发单错误:" + e.getMessage(), e)
  268. }
  269. }
  270. //endregion
  271. return RetResult.<InvokeCallResult> successT().result(
  272. InvokeCallResult.success()
  273. )
  274. },
  275. "order_complete@17" : { invokeOrder, InvokeCallParams source ->
  276. //region 订单完成
  277. long orderId = invokeOrder["shop_order_id"] as long
  278. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  279. source.currentUser, source.dataSourceId, source.supplierCode)
  280. if (!orderResult.isSuccess()) {
  281. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  282. }
  283. BusinessOrder businessOrder = orderResult.result
  284. List<OrderStep> stepList = new ArrayList<>()
  285. OrderRiderItem orderRiderItem = new OrderRiderItem(
  286. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  287. idOrder: businessOrder.id,
  288. idPlatform: businessOrder.outGoingPlatformId,
  289. platformCode: 'SFTC',
  290. platformName: businessOrder.outGoingPlatformName,
  291. platformOrderId: invokeOrder["sf_order_id"],
  292. operatorName: invokeOrder["operator_name"],
  293. operatorPhone: invokeOrder["operator_phone"],
  294. riderLng: invokeOrder["rider_lng"],
  295. riderLat: invokeOrder["rider_lat"],
  296. itemContent: ""
  297. )
  298. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  299. businessOrder.orderStatus = BusinessOrderStatus.riderComplete.value
  300. orderRiderItem.riderStatus = OrderRiderStatus.complete.value
  301. orderRiderItem.statusDesc = OrderRiderStatus.complete.name
  302. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  303. "配送完成",
  304. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + "(" + orderRiderItem.operatorPhone + ")配送完成",
  305. source.currentUser))
  306. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  307. if (iData >= 0) {
  308. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  309. try {
  310. UpdateRequest orderRequest = new UpdateRequest(
  311. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  312. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  313. .doc(jsonBuilder()
  314. .startObject()
  315. .field("orderStatus", businessOrder.orderStatus)
  316. .endObject())
  317. bulkRequest.add(orderRequest)
  318. IndexRequestBuilder itemRequest = esClient.getClient()
  319. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  320. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  321. .setId(String.valueOf(orderRiderItem.id))
  322. .setParent(String.valueOf(orderRiderItem.idOrder))
  323. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  324. bulkRequest.add(itemRequest)
  325. stepList.each { orderStep ->
  326. IndexRequestBuilder orderStepRequest = esClient.getClient()
  327. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  328. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  329. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  330. bulkRequest.add(orderStepRequest)
  331. }
  332. //写入到es索引中
  333. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  334. if (bulkResponse.hasFailures()) {
  335. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  336. }
  337. } catch (Exception e) {
  338. logger.error("订单配送发单错误:" + e.getMessage(), e)
  339. }
  340. }
  341. //endregion
  342. return RetResult.<InvokeCallResult> successT().result(
  343. InvokeCallResult.success()
  344. )
  345. },
  346. "rider_recall@22" : { invokeOrder, InvokeCallParams source ->
  347. //region 配送员撤单
  348. //当订单被骑士撤单的时候,顺丰同城会将订单撤撤单状态进行回调通知。
  349. //注:顺丰同城撤单是指订单由A骑士接单后,因A骑士自身原因无法继续配送,故会将订单撤回抢单池,允许其他骑士继续抢单直至订单完结
  350. //此消息并不会完全配送撤单,需要修正一下订单状态、轨迹和脚印
  351. long orderId = invokeOrder["shop_order_id"] as long
  352. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  353. source.currentUser, source.dataSourceId, source.supplierCode)
  354. if (!orderResult.isSuccess()) {
  355. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  356. }
  357. BusinessOrder businessOrder = orderResult.result
  358. List<OrderStep> stepList = new ArrayList<>()
  359. OrderRiderItem orderRiderItem = new OrderRiderItem(
  360. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  361. idOrder: businessOrder.id,
  362. idPlatform: businessOrder.outGoingPlatformId,
  363. platformCode: 'SFTC',
  364. platformName: businessOrder.outGoingPlatformName,
  365. platformOrderId: invokeOrder["sf_order_id"],
  366. operatorName: "",
  367. operatorPhone: "",
  368. riderLng: "",
  369. riderLat: "",
  370. itemContent: invokeOrder["status_desc"]
  371. )
  372. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  373. businessOrder.orderStatus = BusinessOrderStatus.delivery.value
  374. orderRiderItem.riderStatus = OrderRiderStatus.riderReCall.value
  375. orderRiderItem.statusDesc = OrderRiderStatus.riderReCall.name
  376. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  377. "配送撤单",
  378. "[" + businessOrder.outGoingPlatformName + "]" + "配送员撤单",
  379. source.currentUser))
  380. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  381. if (iData >= 0) {
  382. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  383. try {
  384. UpdateRequest orderRequest = new UpdateRequest(
  385. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  386. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  387. .doc(jsonBuilder()
  388. .startObject()
  389. .field("orderStatus", businessOrder.orderStatus)
  390. .endObject())
  391. bulkRequest.add(orderRequest)
  392. IndexRequestBuilder itemRequest = esClient.getClient()
  393. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  394. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  395. .setId(String.valueOf(orderRiderItem.id))
  396. .setParent(String.valueOf(orderRiderItem.idOrder))
  397. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  398. bulkRequest.add(itemRequest)
  399. stepList.each { orderStep ->
  400. IndexRequestBuilder orderStepRequest = esClient.getClient()
  401. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  402. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  403. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  404. bulkRequest.add(orderStepRequest)
  405. }
  406. //写入到es索引中
  407. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  408. if (bulkResponse.hasFailures()) {
  409. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  410. }
  411. } catch (Exception e) {
  412. logger.error("订单配送发单错误:" + e.getMessage(), e)
  413. }
  414. }
  415. //endregion
  416. return RetResult.<InvokeCallResult> successT().result(
  417. InvokeCallResult.success()
  418. )
  419. },
  420. "rider_exception@91": { invokeOrder, InvokeCallParams source ->
  421. //region 订单异常回调
  422. //当订单发生异常操作的时候,顺丰同城会将订单相关的异常进行回调通知。(订单异常不是订单终态,只有取消和完成才是订单终态,骑手会和商家或用户线下沟通选择将配送物品送回商家或订单取消)
  423. //异常回调不改变订单状态
  424. long orderId = invokeOrder["shop_order_id"] as long
  425. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  426. source.currentUser, source.dataSourceId, source.supplierCode)
  427. if (!orderResult.isSuccess()) {
  428. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  429. }
  430. BusinessOrder businessOrder = orderResult.result
  431. List<OrderStep> stepList = new ArrayList<>()
  432. OrderRiderItem orderRiderItem = new OrderRiderItem(
  433. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  434. idOrder: businessOrder.id,
  435. idPlatform: businessOrder.outGoingPlatformId,
  436. platformCode: 'SFTC',
  437. platformName: businessOrder.outGoingPlatformName,
  438. platformOrderId: invokeOrder["sf_order_id"],
  439. operatorName: invokeOrder["operator_name"],
  440. operatorPhone: invokeOrder["operator_phone"],
  441. riderLng: "",
  442. riderLat: "",
  443. itemContent: invokeOrder["ex_content"]
  444. )
  445. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  446. orderRiderItem.riderStatus = OrderRiderStatus.exception.value
  447. switch (invokeOrder["ex_id"] as int) {
  448. case 4003:
  449. orderRiderItem.statusDesc = "骑士上报异常:" + "托寄物丢失或损坏"
  450. break
  451. case 1001:
  452. orderRiderItem.statusDesc = "骑士上报异常:" + "商家出货慢"
  453. break
  454. case 2010:
  455. orderRiderItem.statusDesc = "骑士上报异常:" + "顾客拒绝实名认证"
  456. break
  457. case 3004:
  458. orderRiderItem.statusDesc = "骑士上报异常:" + "实名认证校验失败"
  459. break
  460. case 1007:
  461. orderRiderItem.statusDesc = "骑士上报异常:" + "更改取货地址"
  462. break
  463. case 2001:
  464. orderRiderItem.statusDesc = "骑士上报异常:" + "顾客电话无法接通"
  465. break
  466. case 2004:
  467. orderRiderItem.statusDesc = "骑士上报异常:" + "更改期望送达时间"
  468. break
  469. case 2005:
  470. orderRiderItem.statusDesc = "骑士上报异常:" + "顾客拒收"
  471. break
  472. case 2008:
  473. orderRiderItem.statusDesc = "骑士上报异常:" + "顾客不在家"
  474. break
  475. case 2009:
  476. orderRiderItem.statusDesc = "骑士上报异常:" + "更改送货地址"
  477. break
  478. case 4001:
  479. orderRiderItem.statusDesc = "骑士上报异常:" + "配送地址错误"
  480. break
  481. default:
  482. orderRiderItem.statusDesc = "骑士上报异常:" + "其他"
  483. break
  484. }
  485. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  486. "配送异常",
  487. "[" + businessOrder.outGoingPlatformName + "]" + orderRiderItem.operatorName + " " + orderRiderItem.statusDesc,
  488. source.currentUser))
  489. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  490. if (iData >= 0) {
  491. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  492. try {
  493. IndexRequestBuilder itemRequest = esClient.getClient()
  494. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  495. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  496. .setId(String.valueOf(orderRiderItem.id))
  497. .setParent(String.valueOf(orderRiderItem.idOrder))
  498. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  499. bulkRequest.add(itemRequest)
  500. stepList.each { orderStep ->
  501. IndexRequestBuilder orderStepRequest = esClient.getClient()
  502. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  503. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  504. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  505. bulkRequest.add(orderStepRequest)
  506. }
  507. //写入到es索引中
  508. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  509. if (bulkResponse.hasFailures()) {
  510. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  511. }
  512. } catch (Exception e) {
  513. logger.error("订单配送发单错误:" + e.getMessage(), e)
  514. }
  515. }
  516. //endregion
  517. return RetResult.<InvokeCallResult> successT().result(
  518. InvokeCallResult.success()
  519. )
  520. },
  521. "sf_cancel@2" : { invokeOrder, InvokeCallParams source ->
  522. //region 顺丰原因订单取消回调
  523. //当订单在顺丰侧被取消时,会由顺丰同城回调对接方回调地址告知订单被取消。
  524. //一般情况下订单被顺丰侧取消原因为:用户拒收,订单超时严重未完成等等操作原因会在返回error_msg中返回。若仍有疑问,可与调度或骑士联系获取更多信息。
  525. long orderId = invokeOrder["shop_order_id"] as long
  526. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(orderId,
  527. source.currentUser, source.dataSourceId, source.supplierCode)
  528. if (!orderResult.isSuccess()) {
  529. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  530. }
  531. BusinessOrder businessOrder = orderResult.result
  532. List<OrderStep> stepList = new ArrayList<>()
  533. OrderRiderItem orderRiderItem = new OrderRiderItem(
  534. id: tableIdService.getTableIdMulti("deOrderRiderItems.id", 1, source.dataSourceId, String.valueOf(source.supplierCode)),
  535. idOrder: businessOrder.id,
  536. idPlatform: businessOrder.outGoingPlatformId,
  537. platformCode: 'SFTC',
  538. platformName: businessOrder.outGoingPlatformName,
  539. platformOrderId: invokeOrder["sf_order_id"],
  540. operatorName: invokeOrder["operator_name"],
  541. operatorPhone: invokeOrder["operator_phone"],
  542. riderLng: invokeOrder["rider_lng"],
  543. riderLat: invokeOrder["rider_lat"],
  544. itemContent: invokeOrder["cancel_reason"]
  545. )
  546. OrderRiderItem.create(orderRiderItem, source.currentUser.id)
  547. businessOrder.orderStatus = BusinessOrderStatus.accept.value
  548. orderRiderItem.riderStatus = OrderRiderStatus.cancel.value
  549. orderRiderItem.statusDesc = OrderRiderStatus.cancel.name
  550. stepList.add(orderStepService.parseOrderStep(businessOrder.id,
  551. "配送取消",
  552. "[" + businessOrder.outGoingPlatformName + "]" + "配送取消:" + invokeOrder["cancel_reason"],
  553. source.currentUser))
  554. int iData = orderDao.expressRiderOrder(businessOrder, orderRiderItem, stepList, source.dataSourceId, source.supplierCode + "_1")
  555. if (iData >= 0) {
  556. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  557. try {
  558. UpdateRequest orderRequest = new UpdateRequest(
  559. supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  560. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, String.valueOf(businessOrder.id))
  561. .doc(jsonBuilder()
  562. .startObject()
  563. .field("orderStatus", businessOrder.orderStatus)
  564. .endObject())
  565. bulkRequest.add(orderRequest)
  566. IndexRequestBuilder itemRequest = esClient.getClient()
  567. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1),
  568. ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE)
  569. .setId(String.valueOf(orderRiderItem.id))
  570. .setParent(String.valueOf(orderRiderItem.idOrder))
  571. .setSource(jsonConvert.convertTo(orderRiderItem), XContentType.JSON)
  572. bulkRequest.add(itemRequest)
  573. stepList.each { orderStep ->
  574. IndexRequestBuilder orderStepRequest = esClient.getClient()
  575. .prepareIndex(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 1),
  576. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  577. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  578. bulkRequest.add(orderStepRequest)
  579. }
  580. //写入到es索引中
  581. BulkResponse bulkResponse = bulkRequest.execute().actionGet()
  582. if (bulkResponse.hasFailures()) {
  583. logger.error("订单配送发单错误:" + bulkResponse.buildFailureMessage())
  584. }
  585. } catch (Exception e) {
  586. logger.error("订单配送发单错误:" + e.getMessage(), e)
  587. }
  588. }
  589. //endregion
  590. return RetResult.<InvokeCallResult> successT().result(
  591. InvokeCallResult.success()
  592. )
  593. },
  594. "bindnotify@0" : { invokeOrder, InvokeCallParams source ->
  595. storeService.bindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
  596. return RetResult.<InvokeCallResult> successT().result(
  597. InvokeCallResult.success()
  598. )
  599. },
  600. "cancelbindnotify@0" : { invokeOrder, InvokeCallParams source ->
  601. storeService.unBindStorePlatform(source.params, "SFTC", source.dataSourceId, source.supplierCode, source.currentUser)
  602. return RetResult.<InvokeCallResult> successT().result(
  603. InvokeCallResult.success()
  604. )
  605. }
  606. ]
  607. @Override
  608. String scriptName() {
  609. return "顺丰同城数据回调"
  610. }
  611. @Override
  612. ERPModule module() {
  613. return ERPModule.EXPRESS_API
  614. }
  615. @Override
  616. OperatorWait getAWait(InvokeCallParams source) {
  617. return OperatorWait.ASNYC
  618. }
  619. @Override
  620. void start(long supplierCode) {
  621. orderDao = tunaService.generate(OrderDao.class)
  622. }
  623. @Override
  624. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  625. //此回调post的数据看着没有子表,直接用groovy自带的json即可,如果有子表,还是应该建立一个类进行转换
  626. //锁定下数据,防止重复提交
  627. def jsonSlurper = new JsonSlurper()
  628. def invokeOrder = jsonSlurper.parseText(source.params)
  629. String urlIndex = invokeOrder["url_index"] as String
  630. //这里除了店铺授权和店铺取消授权,其它都是订单,if-else先写着
  631. if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
  632. //店铺授权回调
  633. String shopId = invokeOrder["shop_id"] as String
  634. if (lockDataService.hLockAdd(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode) > 1) {
  635. return RetResult.<InvokeCallParams> errorT().retinfo(shopId + "提交工作中,请稍后刷新即可,无需重复操作")
  636. }
  637. } else if (StringUtils.equalsIgnoreCase("cancelbindnotify", urlIndex)) {
  638. //店铺取消授权回调
  639. String shopId = invokeOrder["shop_id"] as String
  640. if (lockDataService.hLockAdd(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode) > 1) {
  641. return RetResult.<InvokeCallParams> errorT().retinfo(shopId + "提交工作中,请稍后刷新即可,无需重复操作")
  642. }
  643. } else {
  644. String invokeOrderId = invokeOrder["shop_order_id"] as String
  645. if (lockDataService.hLockAdd(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
  646. return RetResult.<InvokeCallParams> errorT().retinfo(invokeOrderId + "提交工作中,请稍后刷新即可,无需重复操作")
  647. }
  648. }
  649. return RetResult.<InvokeCallParams> successT().result(source)
  650. }
  651. @Override
  652. void afterExecute(boolean executeError, InvokeCallParams source, InvokeCallResult dest) {
  653. def jsonSlurper = new JsonSlurper()
  654. def invokeOrder = jsonSlurper.parseText(source.params)
  655. String urlIndex = invokeOrder["url_index"] as String
  656. if (StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) {
  657. //店铺授权回调
  658. String shopId = invokeOrder["shop_id"] as String
  659. lockDataService.hLockDel(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode)
  660. } else if (StringUtils.equalsIgnoreCase("cancelbindnotify", urlIndex)) {
  661. //店铺取消授权回调
  662. String shopId = invokeOrder["shop_id"] as String
  663. lockDataService.hLockDel(shopId, RedisKeys.KEY_ERP_WORKING_SF_STORE, source.supplierCode)
  664. } else {
  665. String invokeOrderId = invokeOrder["shop_order_id"] as String
  666. lockDataService.hLockDel(invokeOrderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
  667. }
  668. }
  669. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  670. def jsonSlurper = new JsonSlurper()
  671. def invokeOrder = jsonSlurper.parseText(source.params)
  672. logger.info(source.params)
  673. //https://openic.sf-express.com/open/api/docs/index#/apidoc
  674. //顺丰订单的逻辑,只有取消和完成才是订单终态
  675. String urlIndex = invokeOrder["url_index"]
  676. int orderStatus = 0
  677. if ((!StringUtils.equalsIgnoreCase("bindnotify", urlIndex)) && (!StringUtils.equalsIgnoreCase("cancelbindnotify", urlIndex))) {
  678. orderStatus = invokeOrder["order_status"] as int
  679. }
  680. return invokeCallFunc.get(urlIndex + "@" + orderStatus).call(invokeOrder, source)
  681. }
  682. }