BE_Order_DeliveryChange_DYLK.groovy 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import com.dderp.business.dao.OrderDao
  2. import com.dderp.common.api.BusinessExecutor
  3. import com.dderp.common.api.StoreService
  4. import com.dderp.common.api.SupplierInitService
  5. import com.dderp.common.api.flycat.OrderSearchService
  6. import com.dderp.common.api.flycat.OrderService
  7. import com.dderp.common.api.flycat.OrderStepService
  8. import com.dderp.common.api.flycat.PlatformAccessTokenService
  9. import com.dderp.common.datas.ERPModule
  10. import com.dderp.common.datas.ESKeys
  11. import com.dderp.common.datas.ReadOrderOption
  12. import com.dderp.common.datas.flycat.PlatformType
  13. import com.dderp.common.entity.base.InvokeCallParams
  14. import com.dderp.common.entity.base.InvokeCallResult
  15. import com.dderp.common.entity.geo.GeoPoiLocation
  16. import com.dderp.common.entity.order.BusinessOrder
  17. import com.dderp.common.entity.order.OrderDeliveryInfo
  18. import com.dderp.common.entity.order.OrderStep
  19. import com.dderp.common.entity.site.ERPTokenUser
  20. import com.dderp.common.entity.store.StorePlatform
  21. import com.dderp.common.tool.ERPUtils
  22. import com.dySweetFishPlugin.elasticsearch.ESClient
  23. import com.dySweetFishPlugin.sql.TableIdService
  24. import com.dySweetFishPlugin.sql.dao.TunaService
  25. import com.sweetfish.convert.json.JsonConvert
  26. import com.sweetfish.service.RetResult
  27. import groovy.json.JsonSlurper
  28. import org.apache.logging.log4j.LogManager
  29. import org.apache.logging.log4j.Logger
  30. import org.elasticsearch.action.bulk.BulkRequestBuilder
  31. import org.elasticsearch.action.bulk.BulkResponse
  32. import org.elasticsearch.action.index.IndexRequestBuilder
  33. import org.elasticsearch.action.support.WriteRequest
  34. import org.elasticsearch.action.update.UpdateRequestBuilder
  35. import org.elasticsearch.common.xcontent.XContentType
  36. import org.rex.RMap
  37. import javax.annotation.Resource
  38. import java.time.LocalDateTime
  39. import java.time.ZoneOffset
  40. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
  41. @SuppressWarnings("unused")
  42. class BE_Order_DeliveryChange_DYLK implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  43. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  44. @Resource
  45. private JsonConvert jsonConvert
  46. @Resource
  47. private TableIdService tableIdService
  48. @Resource
  49. private StoreService storeService
  50. @Resource
  51. private ESClient esClient
  52. @Resource
  53. private SupplierInitService supplierInitService
  54. @Resource
  55. private OrderStepService orderStepService
  56. @Resource
  57. private OrderService orderService
  58. @Resource
  59. private OrderSearchService orderSearchService
  60. @Resource
  61. private PlatformAccessTokenService tokenService
  62. @Resource
  63. private TunaService tunaService
  64. private OrderDao orderDao
  65. @Override
  66. String scriptName() {
  67. return "[抖音来客]订单配送信息修改"
  68. }
  69. @Override
  70. ERPModule module() {
  71. return ERPModule.ORDER_API
  72. }
  73. @Override
  74. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  75. return super.beforeExecute(source)
  76. }
  77. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  78. //秒级时间戳,groovy里面不让用system
  79. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  80. String dataSourceId = source.dataSourceId
  81. long supplierCode = source.supplierCode
  82. ERPTokenUser currentUser = source.currentUser
  83. def jsonSlurper = new JsonSlurper()
  84. def invokeOrder = jsonSlurper.parseText(source.params)
  85. String incomePlatformOrderCode = invokeOrder["order_id"] as String
  86. String platformStoreId = invokeOrder["poi_id"] as String
  87. String platformAccountId = invokeOrder["account_id"] as String
  88. ArrayList<Integer> options = invokeOrder["op_list"] as ArrayList
  89. StorePlatform storePlatform = storeService.getStorePlatformByInvokeInfo(platformStoreId, "DYLK", PlatformType.order.value, supplierCode)
  90. if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
  91. if (storePlatform.enableStatue == 0) {
  92. logger.info("[" + storePlatform.platformName + "]门店[" + storePlatform.platformStoreId + "]已被禁用,消息已忽略")
  93. return RetResult.<InvokeCallResult> errorT().retinfo("[" + storePlatform.platformName + "]门店[" + storePlatform.platformStoreId + "]已被禁用")
  94. }
  95. RMap searchParams = new RMap();
  96. searchParams.set("incomePlatformId", storePlatform.id)
  97. searchParams.set("incomePlatformOrderCode", incomePlatformOrderCode)
  98. RetResult<List<BusinessOrder>> orderResult = orderSearchService.searchBusinessOrderList(searchParams, currentUser, dataSourceId, supplierCode, ReadOrderOption.ORDER_DELIVERY)
  99. if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
  100. BusinessOrder esOrder = orderResult.result.get(0) //这么查只可能有一个
  101. OrderDeliveryInfo orderDeliveryInfo = esOrder.orderDeliveryInfo
  102. //这里的逻辑是,抖音给了我订单配送信息改变的通知,然后我再次调用订单查询接口获取最新的订单信息
  103. //不得不说略显傻B
  104. def postBody = [
  105. order_id : incomePlatformOrderCode,
  106. account_id: platformAccountId
  107. ]
  108. String responseStr = tokenService.getInvoker("DYLK", "/goodlife/v1/hermes/trade/order/query/", jsonConvert.convertTo(postBody),
  109. dataSourceId, String.valueOf(supplierCode))
  110. def response = jsonSlurper.parseText(responseStr)
  111. StringBuilder sb = new StringBuilder()
  112. if (response["extra"]["error_code"] as Integer == 0) {
  113. def dyOrder = (response["data"]["orders"] as ArrayList).get(0)
  114. if (options.contains(1)) {
  115. sb.append("收货人:" + orderDeliveryInfo.receiveMan + "->" + dyOrder["receiver_info"]["receiver_name"] as String)
  116. }
  117. if (options.contains(2)) {
  118. sb.append("收货人电话:" + orderDeliveryInfo.contractPhone + "->" + dyOrder["receiver_info"]["secret_number"] as String + "(" + dyOrder["receiver_info"]["receiver_phone"] as String + ")")
  119. }
  120. String address = "[" + dyOrder["receiver_info"]["city"] + "]" + dyOrder["receiver_info"]["province"] +
  121. dyOrder["receiver_info"]["city"] +
  122. dyOrder["receiver_info"]["district"] +
  123. dyOrder["receiver_info"]["town"] +
  124. dyOrder["receiver_info"]["location_address"] +
  125. dyOrder["receiver_info"]["location_name"] + "-" +
  126. dyOrder["receiver_info"]["receiver_name"]
  127. if (options.contains(3) ||
  128. options.contains(4) ||
  129. options.contains(5) ||
  130. options.contains(6) ||
  131. options.contains(7) ||
  132. options.contains(8) ||
  133. options.contains(9)) {
  134. sb.append("收货地址:" + esOrder.deliverAddressAll + "->" + address)
  135. }
  136. //抖音传过来的格式为起始时间戳(单位秒)- 截止时间戳(单位秒),示例:1669370006-1669371206,目前先取起始时间
  137. long suggestTimeLong = (dyOrder["order"]["sys_expect_time"] as String).split("-")[0] as long
  138. orderDeliveryInfo.setDeliverProvince(dyOrder["receiver_info"]["province"] as String)
  139. orderDeliveryInfo.setDeliverCity(dyOrder["receiver_info"]["city"] as String)
  140. orderDeliveryInfo.setDeliverDistract(dyOrder["receiver_info"]["district"] as String)
  141. // orderDeliveryInfo.setDeliverAddress(dyOrder["receiver_info"]["location_address"] as String)
  142. orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_name"] as String + " " + invokeOrder["receiver_info"]["door_plate_num"] as String)
  143. orderDeliveryInfo.setGeoPoiLocation(new GeoPoiLocation(dyOrder["receiver_info"]["lng"] as double, dyOrder["receiver_info"]["lat"] as double))
  144. orderDeliveryInfo.setGeoLocationSerial(jsonConvert.convertTo(orderDeliveryInfo.geoPoiLocation))
  145. orderDeliveryInfo.setReceiveMan(dyOrder["receiver_info"]["receiver_name"] as String)
  146. orderDeliveryInfo.setContractPhone(dyOrder["receiver_info"]["secret_number"] as String + "(" + dyOrder["receiver_info"]["receiver_phone"] as String + ")")
  147. orderDeliveryInfo.setDeliverTimeliness(dyOrder["order"]["is_book"] as int - 1) //抖音1表示即时单,2表示预订单
  148. orderDeliveryInfo.setBookingDeliverTimeLong(suggestTimeLong * 1000)
  149. orderDeliveryInfo.setBookingDeliverTime(new Date(orderDeliveryInfo.bookingDeliverTimeLong))
  150. orderDeliveryInfo.setCustomerMemo(dyOrder["order"]["remark"] as String)
  151. BigDecimal deliverFee = ERPUtils.money(dyOrder["amount_info"]["freight_pay_amount"] as int)
  152. esOrder.setDeliverFee(deliverFee)
  153. esOrder.setDeliverAddressAll(address)
  154. } else {
  155. //todo 抖音侧调用失败,怎么处理?
  156. logger.error("[抖音来客]获取订单信息接口调用失败:" + response["extra"]["description"] as String)
  157. return RetResult.<InvokeCallResult> errorT().retinfo("[抖音来客]获取订单信息接口调用失败:" + response["extra"]["description"] as String)
  158. }
  159. OrderDeliveryInfo.update(orderDeliveryInfo, currentUser.id)
  160. BusinessOrder.update(esOrder, currentUser.id)
  161. OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, "订单修改信息",
  162. sb.toString(), currentUser)
  163. //持久化
  164. //订单主表
  165. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  166. UpdateRequestBuilder orderRequest = esClient.getClient().prepareUpdate(
  167. supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  168. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE,
  169. String.valueOf(esOrder.getId()))
  170. .setDoc(jsonBuilder()
  171. .startObject()
  172. .field("deliverFee", esOrder.deliverFee)
  173. .field("deliverAddressAll", esOrder.deliverAddressAll)
  174. .field("updateBy", esOrder.getUpdateBy())
  175. .field("updateTimeLong", esOrder.getUpdateTimeLong())
  176. .endObject())
  177. bulkRequest.add(orderRequest)
  178. //订单配送信息
  179. UpdateRequestBuilder deliverRequest = esClient.getClient().prepareUpdate(
  180. supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  181. ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE,
  182. String.valueOf(orderDeliveryInfo.getId()))
  183. .setRouting(String.valueOf(esOrder.id))
  184. .setDoc(jsonBuilder()
  185. .startObject()
  186. .field("deliverProvince", orderDeliveryInfo.deliverProvince)
  187. .field("deliverCity", orderDeliveryInfo.deliverCity)
  188. .field("deliverDistract", orderDeliveryInfo.deliverDistract)
  189. .field("deliverAddress", orderDeliveryInfo.deliverAddress)
  190. .field("geoLocationSerial", orderDeliveryInfo.geoLocationSerial)
  191. .field("receiveMan", orderDeliveryInfo.receiveMan)
  192. .field("contractPhone", orderDeliveryInfo.contractPhone)
  193. .field("deliverTimeliness", orderDeliveryInfo.deliverTimeliness)
  194. .field("bookingDeliverTimeLong", orderDeliveryInfo.bookingDeliverTimeLong)
  195. .field("updateBy", orderDeliveryInfo.getUpdateBy())
  196. .field("updateTimeLong", orderDeliveryInfo.getUpdateTimeLong())
  197. .endObject())
  198. bulkRequest.add(deliverRequest)
  199. //订单脚印
  200. IndexRequestBuilder orderStepRequest = esClient.getClient()
  201. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
  202. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  203. .setId(String.valueOf(orderStep.id))
  204. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  205. bulkRequest.add(orderStepRequest)
  206. BulkResponse bulkResponse = bulkRequest.get();
  207. orderDao = tunaService.generate(OrderDao.class)
  208. if (bulkResponse.hasFailures()) {
  209. logger.error("订单修改信息出错:" + bulkResponse.buildFailureMessage());
  210. return RetResult.<InvokeCallResult> errorT().retinfo("订单修改信息出错:" + esOrder.orderName);
  211. } else {
  212. logger.info("订单修改信息成功");
  213. //写数据库
  214. orderDao.updateOrderDelivery(esOrder,
  215. orderDeliveryInfo,
  216. [orderStep],
  217. dataSourceId,
  218. String.valueOf(supplierCode))
  219. return RetResult.<InvokeCallResult> successT()
  220. }
  221. }
  222. }