BE_Express_PreCreateOrder_SFTC.groovy 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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.ReadOrderOption
  8. import com.dderp.common.datas.TokenUserFrom
  9. import com.dderp.common.entity.base.InvokeCallParams
  10. import com.dderp.common.entity.base.InvokeCallResult
  11. import com.dderp.common.entity.order.BusinessOrder
  12. import com.dderp.common.entity.store.StoreInfo
  13. import com.dderp.common.entity.store.StorePlatform
  14. import com.dderp.common.http.HttpTools
  15. import com.dySweetFishPlugin.sql.dao.OperatorWait
  16. import com.sweetfish.convert.json.JsonConvert
  17. import com.sweetfish.service.RetResult
  18. import groovy.json.JsonSlurper
  19. import org.apache.commons.lang3.StringUtils
  20. import org.apache.logging.log4j.LogManager
  21. import org.apache.logging.log4j.Logger
  22. import javax.annotation.Resource
  23. import java.nio.charset.StandardCharsets
  24. import java.time.LocalDateTime
  25. import java.time.ZoneOffset
  26. import java.util.concurrent.CompletableFuture
  27. import java.util.concurrent.ExecutionException
  28. import java.util.concurrent.TimeUnit
  29. import java.util.concurrent.TimeoutException
  30. @SuppressWarnings("unused")
  31. class BE_Express_PreCreateOrder_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  32. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  33. @Resource(name = "property.sftc.appId")
  34. long sfAppId
  35. @Resource(name = "property.sftc.appKey")
  36. String sfAppKey
  37. @Resource(name = "property.sftc.apiUrl")
  38. String sfApiUrl
  39. @Resource
  40. JsonConvert jsonConvert
  41. @Resource
  42. ERPLockDataService lockDataService
  43. @Resource
  44. OrderSearchService orderSearchService
  45. @Resource
  46. StoreService storeService
  47. @Override
  48. String scriptName() {
  49. return "顺丰同城预创建订单--价格计算"
  50. }
  51. @Override
  52. ERPModule module() {
  53. return ERPModule.EXPRESS_API
  54. }
  55. @Override
  56. OperatorWait getAWait(InvokeCallParams source) {
  57. return OperatorWait.SYNC
  58. }
  59. @Override
  60. RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
  61. //检查订单信息
  62. def jsonSlurper = new JsonSlurper()
  63. def invokeOrder = jsonSlurper.parseText(source.params)
  64. String idOrder = invokeOrder["idOrder"] as String
  65. if (source.currentUser == null) {
  66. return RetResult.<InvokeCallParams> errorT().retinfo("请登录")
  67. }
  68. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(idOrder), source.currentUser, source.dataSourceId, source.supplierCode)
  69. if (!orderResult.isSuccess()) {
  70. return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
  71. }
  72. BusinessOrder businessOrder = orderResult.result
  73. if (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value) {
  74. if (businessOrder.idStore != source.currentUser.idBindOrg) {
  75. return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
  76. }
  77. }
  78. StoreInfo storeInfo = storeService.getStoreInfo(businessOrder.idStore, source.supplierCode, false, false, true)
  79. StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase("SFTC", it.platformCode) }
  80. if (storePlatform == null) {
  81. return RetResult.<InvokeCallParams> errorT().retinfo("商家未授权顺丰同城")
  82. }
  83. return RetResult.<InvokeCallParams> successT().result(source)
  84. }
  85. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  86. //预创建订单,并非真正发单;用来验证是否可以发单并在成功时返回时效、计价等信息,也可用来验证地址以及时间是否在顺丰的配送范围内
  87. def jsonSlurper = new JsonSlurper()
  88. def invokeOrder = jsonSlurper.parseText(source.params)
  89. String idOrder = invokeOrder["idOrder"] as String
  90. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(Long.parseLong(idOrder), source.currentUser, source.dataSourceId, source.supplierCode, ReadOrderOption.ORDER_FINANCES, ReadOrderOption.ORDER_DELIVERY)
  91. if (!orderResult.isSuccess()) {
  92. return RetResult.<InvokeCallResult> errorT().retinfo("无效的订单信息")
  93. }
  94. BusinessOrder businessOrder = orderResult.result
  95. StoreInfo storeInfo = storeService.getStoreInfo(businessOrder.idStore, source.supplierCode, false, false, true)
  96. StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase("SFTC", it.platformCode) }
  97. if (storePlatform == null) {
  98. return RetResult.<InvokeCallResult> errorT().retinfo("商家未授权顺丰同城")
  99. }
  100. //秒级时间戳,groovy里面不让用system
  101. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  102. def sfOrder = [
  103. dev_id : sfAppId,
  104. shop_id : storePlatform.platformStoreId,
  105. shop_type : 1,
  106. user_address : businessOrder.orderDeliveryInfo.deliverAddress,
  107. push_time : currentTime,
  108. return_flag : 511,
  109. multi_pickup_info: [
  110. [
  111. pickup_shop_address: storeInfo.storeProvince + storeInfo.storeCity + storeInfo.storeDistrict + storeInfo.storeAddress
  112. ]
  113. ]
  114. ]
  115. String postData = JSON.toJSONString(sfOrder)
  116. logger.info("请求数据: " + postData)
  117. String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
  118. String url = sfApiUrl + "precreateorder?sign=" + sign
  119. CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
  120. 5000,
  121. StandardCharsets.UTF_8,
  122. postData,
  123. ["Content-Type": "application/json;charset=utf-8"])
  124. try {
  125. String sfOrderResult = apiResult.get(6000, TimeUnit.SECONDS)
  126. def sfOrderJson = jsonSlurper.parseText(sfOrderResult)
  127. //统一返回,避免前端获取值不同
  128. def preDeliveryInfo = [
  129. //配送金额
  130. totalPrice: sfOrderJson["result"]["total_price"],
  131. //配送距离
  132. distanceMeter: sfOrderJson["result"]["delivery_distance_meter"]
  133. ]
  134. return RetResult.<InvokeCallResult> successT().result(
  135. InvokeCallResult.success().data(JSON.toJSONString(preDeliveryInfo))
  136. )
  137. } catch (InterruptedException | ExecutionException | TimeoutException e) {
  138. logger.error(e.getMessage(), e)
  139. return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
  140. }
  141. }
  142. }