BE_Express_CreateOrder_SFTC.groovy 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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.datas.ERPModule
  5. import com.dderp.common.datas.RedisKeys
  6. import com.dderp.common.entity.base.InvokeCallParams
  7. import com.dderp.common.entity.base.InvokeCallResult
  8. import com.dderp.common.entity.express.*
  9. import com.dderp.common.http.HttpTools
  10. import com.dySweetFishPlugin.sql.dao.OperatorWait
  11. import com.sweetfish.convert.json.JsonConvert
  12. import com.sweetfish.service.RetResult
  13. import groovy.json.JsonSlurper
  14. import org.apache.logging.log4j.LogManager
  15. import org.apache.logging.log4j.Logger
  16. import javax.annotation.Resource
  17. import java.nio.charset.StandardCharsets
  18. import java.time.LocalDateTime
  19. import java.time.ZoneOffset
  20. import java.util.concurrent.CompletableFuture
  21. import java.util.concurrent.ExecutionException
  22. import java.util.concurrent.TimeUnit
  23. import java.util.concurrent.TimeoutException
  24. @SuppressWarnings("unused")
  25. class BE_Express_CreateOrder_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  26. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  27. @Resource(name = "property.sftc.appId")
  28. long sfAppId
  29. @Resource(name = "property.sftc.appKey")
  30. String sfAppKey
  31. @Resource(name = "property.sftc.apiUrl")
  32. String sfApiUrl
  33. @Resource
  34. JsonConvert jsonConvert
  35. @Resource
  36. ERPLockDataService lockDataService
  37. @Override
  38. String scriptName() {
  39. return "顺丰同城创建订单"
  40. }
  41. @Override
  42. ERPModule module() {
  43. return ERPModule.EXPRESS_API
  44. }
  45. @Override
  46. OperatorWait getAWait(InvokeCallParams source) {
  47. return OperatorWait.ASNYC
  48. }
  49. @Override
  50. RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
  51. //检查订单信息
  52. def jsonSlurper = new JsonSlurper()
  53. def invokeOrder = jsonSlurper.parseText(source.params)
  54. String orderId = invokeOrder["orderId"] as String
  55. //todo 获取订单信息
  56. return RetResult.<InvokeCallParams> successT().result(source)
  57. }
  58. @Override
  59. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  60. //锁定下订单数据
  61. def jsonSlurper = new JsonSlurper()
  62. def invokeOrder = jsonSlurper.parseText(source.params)
  63. String orderId = invokeOrder["orderId"] as String
  64. //todo 获取订单信息
  65. if (lockDataService.hLockAdd(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
  66. return RetResult.<InvokeCallParams> errorT().retinfo(orderId + "提交工作中,请稍后刷新即可,无需重复操作")
  67. }
  68. return RetResult.<InvokeCallParams> successT().result(source)
  69. }
  70. @Override
  71. void afterExecute(boolean executeError, InvokeCallParams source, InvokeCallResult dest) {
  72. //锁定下订单数据
  73. def jsonSlurper = new JsonSlurper()
  74. def invokeOrder = jsonSlurper.parseText(source.params)
  75. String orderId = invokeOrder["orderId"] as String
  76. lockDataService.hLockDel(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode)
  77. }
  78. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  79. //秒级时间戳,groovy里面不让用system
  80. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  81. long testTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli()
  82. SFOrder sfOrder = new SFOrder(
  83. dev_id: sfAppId,
  84. shop_id: "3243279847393",
  85. shop_type: 1,
  86. shop_order_id: "JY" + testTime + "L",
  87. order_sequence: "测试",
  88. lbs_type: 2,
  89. order_time: currentTime,
  90. push_time: currentTime,
  91. vehicle: 0,
  92. four_wheeler_type: 10,
  93. rider_pick_method: 1,
  94. version: 19,
  95. order_detail: new SFOrderDetail(
  96. total_price: 30100L,
  97. product_type: 6,
  98. weight_gram: 3000L,
  99. product_num: 15,
  100. product_type_num: 5,
  101. product_detail: [
  102. new SFOrderProductDetail(
  103. product_name: "测试商品1",
  104. product_num: 1
  105. ),
  106. new SFOrderProductDetail(
  107. product_name: "测试商品2",
  108. product_num: 3
  109. ),
  110. ]
  111. ),
  112. receive: new SFOrderReceive(
  113. user_name: "顺丰同城",
  114. user_phone: "18237171439",
  115. user_lng: "116.339392",
  116. user_lat: "40.002349",
  117. user_address: "北京市海淀区学清嘉创大厦A座15层"
  118. )
  119. )
  120. String postData = JSON.toJSONString(sfOrder)
  121. logger.info("请求数据: " + postData)
  122. String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
  123. String url = sfApiUrl + "createorder?sign=" + sign
  124. CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
  125. 5000,
  126. StandardCharsets.UTF_8,
  127. postData,
  128. ["Content-Type": "application/json;charset=utf-8"])
  129. try {
  130. String orderResult = apiResult.get(6000, TimeUnit.SECONDS)
  131. def jsonSlurper = new JsonSlurper()
  132. def sfOrderJson = jsonSlurper.parseText(orderResult)
  133. logger.info(sfOrderJson)
  134. SFCreateOrderResult createOrderResult = jsonConvert.convertFromO(SFCreateOrderResult.class, orderResult)
  135. logger.info(orderResult)
  136. logger.info(jsonConvert.convertTo(createOrderResult))
  137. return RetResult.<InvokeCallResult> successT()
  138. } catch (InterruptedException | ExecutionException | TimeoutException e) {
  139. logger.error(e.getMessage(), e)
  140. return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
  141. }
  142. }
  143. }