BE_Express_CreateOrder_SFTC.groovy 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import com.alibaba.fastjson2.JSON
  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.flycat.OrderSearchService
  6. import com.dderp.common.datas.ERPModule
  7. import com.dderp.common.datas.RedisKeys
  8. import com.dderp.common.entity.base.InvokeCallParams
  9. import com.dderp.common.entity.base.InvokeCallResult
  10. import com.dderp.common.entity.order.BusinessOrder
  11. import com.dderp.common.entity.store.StoreInfo
  12. import com.dderp.common.entity.store.StorePlatformRequire
  13. import com.dderp.common.http.HttpTools
  14. import com.dySweetFishPlugin.sql.dao.OperatorWait
  15. import com.sweetfish.convert.json.JsonConvert
  16. import com.sweetfish.service.RetResult
  17. import groovy.json.JsonSlurper
  18. import org.apache.logging.log4j.LogManager
  19. import org.apache.logging.log4j.Logger
  20. import javax.annotation.Resource
  21. import java.nio.charset.StandardCharsets
  22. import java.time.LocalDateTime
  23. import java.time.ZoneOffset
  24. import java.util.concurrent.CompletableFuture
  25. import java.util.concurrent.ExecutionException
  26. import java.util.concurrent.TimeUnit
  27. import java.util.concurrent.TimeoutException
  28. @SuppressWarnings("unused")
  29. class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  30. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  31. @Resource(name = "property.sftc.appId")
  32. long sfAppId
  33. @Resource(name = "property.sftc.appKey")
  34. String sfAppKey
  35. @Resource(name = "property.sftc.apiUrl")
  36. String sfApiUrl
  37. @Resource
  38. JsonConvert jsonConvert
  39. @Resource
  40. ERPLockDataService lockDataService
  41. @Resource
  42. OrderSearchService orderSearchService
  43. @Resource
  44. StoreService storeService
  45. @Override
  46. String scriptName() {
  47. return "顺丰同城创建订单"
  48. }
  49. @Override
  50. ERPModule module() {
  51. return ERPModule.EXPRESS_API
  52. }
  53. @Override
  54. OperatorWait getAWait(InvokeCallParams source) {
  55. return OperatorWait.ASNYC
  56. }
  57. @Override
  58. RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
  59. //检查订单信息
  60. def jsonSlurper = new JsonSlurper()
  61. def invokeOrder = jsonSlurper.parseText(source.params)
  62. String orderId = invokeOrder["orderId"] as String
  63. //todo 获取订单信息
  64. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(orderId), source.currentUser, source.dataSourceId, source.supplierCode)
  65. if (!orderResult.isSuccess()) {
  66. return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
  67. }
  68. return RetResult.<InvokeCallParams> successT().result(source)
  69. }
  70. @Override
  71. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  72. //锁定下订单数据
  73. def jsonSlurper = new JsonSlurper()
  74. def invokeOrder = jsonSlurper.parseText(source.params)
  75. String orderId = invokeOrder["orderId"] as String
  76. if (lockDataService.hLockAdd(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
  77. return RetResult.<InvokeCallParams> errorT().retinfo(orderId + "提交工作中,请稍后刷新即可,无需重复操作")
  78. }
  79. return RetResult.<InvokeCallParams> successT().result(source)
  80. }
  81. @Override
  82. void afterExecute(boolean executeError, InvokeCallParams source, InvokeCallResult dest) {
  83. //锁定下订单数据
  84. def jsonSlurper = new JsonSlurper()
  85. def invokeOrder = jsonSlurper.parseText(source.params)
  86. String orderId = invokeOrder["orderId"] as String
  87. lockDataService.hLockDel(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
  88. }
  89. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  90. //检查订单信息
  91. def jsonSlurper = new JsonSlurper()
  92. def invokeOrder = jsonSlurper.parseText(source.params)
  93. String orderId = invokeOrder["orderId"] as String
  94. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(orderId), source.currentUser, source.dataSourceId, source.supplierCode)
  95. if (!orderResult.isSuccess()) {
  96. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  97. }
  98. BusinessOrder businessOrder = orderResult.result
  99. StoreInfo storeInfo = storeService.getStoreInfo(businessOrder.idStore, source.supplierCode, false, false, true)
  100. if (storeInfo == null) {
  101. return RetResult.<InvokeCallResult> errorT().retinfo("无效的门店信息")
  102. }
  103. StorePlatformRequire storePlatformRequire = storeInfo.requireItem("SFTC", "shopId")
  104. if (storePlatformRequire == null) {
  105. return RetResult.<InvokeCallResult> errorT().retinfo("门店未设置顺丰店铺id")
  106. }
  107. //秒级时间戳,groovy里面不让用system
  108. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  109. long testTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli()
  110. def sfOrder = [
  111. dev_id : sfAppId,
  112. shop_id : storePlatformRequire.itemValue,
  113. shop_type : 1,
  114. shop_order_id : businessOrder.orderCode,
  115. order_source : businessOrder.incomePlatformName,
  116. order_sequence: String.valueOf(businessOrder.orderSequence),
  117. order_time : currentTime,
  118. push_time : currentTime,
  119. version : 19,
  120. order_detail : [
  121. total_price : 30100L,
  122. product_type : 1,
  123. weight_gram : 3000L,
  124. product_num : 15,
  125. product_type_num: 5,
  126. product_detail : businessOrder.detailItemList.collect { detailItem ->
  127. def productDetail = [
  128. product_name: detailItem.itemName,
  129. product_num : detailItem.itemCount
  130. ]
  131. return productDetail
  132. }
  133. ],
  134. receive : [
  135. user_name : businessOrder.orderDeliveryInfo.receiveMan,
  136. user_phone : businessOrder.orderDeliveryInfo.contractPhone,
  137. user_lng : String.valueOf(businessOrder.orderDeliveryInfo.geoPoiLocation.longitude),
  138. user_lat : String.valueOf(businessOrder.orderDeliveryInfo.geoPoiLocation.latitude),
  139. user_address: businessOrder.orderDeliveryInfo.deliverAddress
  140. ]
  141. ]
  142. String postData = JSON.toJSONString(sfOrder)
  143. logger.info("请求数据: " + postData)
  144. String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
  145. String url = sfApiUrl + "createorder?sign=" + sign
  146. CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
  147. 5000,
  148. StandardCharsets.UTF_8,
  149. postData,
  150. ["Content-Type": "application/json;charset=utf-8"])
  151. try {
  152. String sfCreateOrderJson = apiResult.get(6000, TimeUnit.SECONDS)
  153. def sfOrderData = jsonSlurper.parseText(sfCreateOrderJson)
  154. logger.info(sfOrderData)
  155. return RetResult.<InvokeCallResult> successT()
  156. } catch (InterruptedException | ExecutionException | TimeoutException e) {
  157. logger.error(e.getMessage(), e)
  158. return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
  159. }
  160. }
  161. }