BE_Order_CreateOrder_Douyin.groovy 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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.OrderStepService
  6. import com.dderp.common.datas.BusinessOrderStatus
  7. import com.dderp.common.datas.ERPModule
  8. import com.dderp.common.datas.ESKeys
  9. import com.dderp.common.datas.business.PlatformType
  10. import com.dderp.common.entity.base.ProcessStringItem
  11. import com.dderp.common.entity.geo.GeoPoiLocation
  12. import com.dderp.common.entity.order.BusinessOrder
  13. import com.dderp.common.entity.order.OrderDeliveryInfo
  14. import com.dderp.common.entity.order.OrderDetailItem
  15. import com.dderp.common.entity.order.OrderFinances
  16. import com.dderp.common.entity.order.OrderStep
  17. import com.dderp.common.entity.site.ERPTokenUser
  18. import com.dderp.common.entity.store.StorePlatform
  19. import com.dderp.common.entity.store.ViewStoreInfo
  20. import com.dySweetFishPlugin.elasticsearch.ESClient
  21. import com.dySweetFishPlugin.sql.TableIdService
  22. import com.dySweetFishPlugin.sql.dao.TunaService
  23. import com.sweetfish.convert.json.JsonConvert
  24. import com.sweetfish.service.RetResult
  25. import groovy.json.JsonSlurper
  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.common.xcontent.XContentType
  33. import javax.annotation.Resource
  34. import java.math.RoundingMode
  35. import java.time.LocalDateTime
  36. import java.time.ZoneOffset
  37. @SuppressWarnings("unused")
  38. class BE_Order_CreateOrder_Douyin implements BusinessExecutor<ProcessStringItem, BusinessOrder> {
  39. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  40. @Resource
  41. private JsonConvert jsonConvert
  42. @Resource
  43. private TableIdService tableIdService
  44. @Resource
  45. private StoreService storeService
  46. @Resource
  47. private ESClient esClient
  48. @Resource
  49. private SupplierInitService supplierInitService
  50. @Resource
  51. private OrderStepService orderStepService
  52. @Resource
  53. private TunaService tunaService
  54. private OrderDao orderDao
  55. @Override
  56. String scriptName() {
  57. return "抖音来客创建订单"
  58. }
  59. @Override
  60. ERPModule module() {
  61. return ERPModule.ORDER_API
  62. }
  63. RetResult<BusinessOrder> execute(ProcessStringItem source) {
  64. //秒级时间戳,groovy里面不让用system
  65. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  66. String dataSourceId = source.dataSourceId
  67. long supplierCode = source.supplierCode
  68. ERPTokenUser currentUser = source.currentUser
  69. def jsonSlurper = new JsonSlurper()
  70. def invokeOrder = jsonSlurper.parseText(source.itemValue)
  71. BusinessOrder businessOrder = new BusinessOrder()
  72. businessOrder.setId(tableIdService.getTableIdMulti("deBusinessOrder.id", 1, dataSourceId, String.valueOf(supplierCode)))
  73. businessOrder.setOrderName(invokeOrder["merchant"]["account_name"] as String)
  74. businessOrder.setOrderCode(tableIdService.getTableCodeMulti("deBusinessOrder.code", dataSourceId, String.valueOf(supplierCode)))
  75. businessOrder.setOrderStatus(BusinessOrderStatus.init.value)
  76. StorePlatform storePlatform = storeService.getStorePlatformByInvokeInfo(invokeOrder["poi"]["poi_id"] as String,
  77. "DYLK", PlatformType.order.value, supplierCode)
  78. businessOrder.setIncomePlatformId(storePlatform.id)
  79. businessOrder.setIncomePlatformName(storePlatform.platformName)
  80. businessOrder.setIncomePlatformOrderCode(invokeOrder["order"]["order_id"] as String)
  81. businessOrder.setIncomePlatformOrderTimeLong(invokeOrder["order"]["pay_time"] as long * 1000)//抖音传过来的时间戳单位是秒
  82. businessOrder.setIncomePlatformOrderTime(new Date(businessOrder.incomePlatformOrderTimeLong))
  83. //抖音传过来的格式为起始时间戳(单位秒)- 截止时间戳(单位秒),示例:1669370006-1669371206,目前先取起始时间
  84. long suggestTimeLong = (invokeOrder["order"]["sys_expect_time"] as String).split("-")[0] as long
  85. businessOrder.setSuggestDeliverTimeLong(suggestTimeLong * 1000)
  86. businessOrder.setSuggestDeliverTime(new Date(businessOrder.suggestDeliverTimeLong))
  87. ViewStoreInfo viewStoreInfo = storeService.getViewStoreInfo(storePlatform.idStore, supplierCode, false, false, false);
  88. businessOrder.setIdStore(viewStoreInfo.storeInfo.id)
  89. businessOrder.setStoreName(viewStoreInfo.storeInfo.storeName)
  90. BigDecimal deliverFee = new BigDecimal((invokeOrder["amount_info"]["freight_pay_amount"] as int) / 100).setScale(2, RoundingMode.CEILING)
  91. businessOrder.setDeliverFee(deliverFee)
  92. String address = "[" + invokeOrder["receiver_info"]["city"] + "]" + invokeOrder["receiver_info"]["province"] +
  93. invokeOrder["receiver_info"]["city"] +
  94. invokeOrder["receiver_info"]["district"] +
  95. invokeOrder["receiver_info"]["town"] +
  96. invokeOrder["receiver_info"]["location_address"] +
  97. invokeOrder["receiver_info"]["location_name"] + "-" +
  98. invokeOrder["receiver_info"]["receiver_name"]
  99. businessOrder.setDeliverAddressAll(address)
  100. //订单金额类信息
  101. OrderFinances orderFinances = new OrderFinances()
  102. orderFinances.setId(tableIdService.getTableIdMulti("deBusinessOrder.id", 1, dataSourceId, String.valueOf(supplierCode)))
  103. orderFinances.setIdOrder(businessOrder.id)
  104. orderFinances.setOrderMoney(new BigDecimal((invokeOrder["amount_info"]["origin_amount"] as int) / 100).setScale(2, RoundingMode.CEILING))
  105. orderFinances.setDeliverFee(deliverFee)
  106. orderFinances.setCustomerPaid(new BigDecimal((invokeOrder["amount_info"]["pay_amount"] as int) / 100).setScale(2, RoundingMode.CEILING))
  107. orderFinances.setStoreRealCollection(new BigDecimal((invokeOrder["amount_info"]["estimated_order_income"] as int) / 100).setScale(2, RoundingMode.CEILING))
  108. businessOrder.setOrderFinances(orderFinances)
  109. //订单配送类信息
  110. OrderDeliveryInfo orderDeliveryInfo = new OrderDeliveryInfo()
  111. orderDeliveryInfo.setId(tableIdService.getTableIdMulti("deOrderDeliveryInfo.id", 1, dataSourceId, String.valueOf(supplierCode)))
  112. orderDeliveryInfo.setIdOrder(businessOrder.id)
  113. orderDeliveryInfo.setDeliverProvince(invokeOrder["receiver_info"]["province"] as String)
  114. orderDeliveryInfo.setDeliverCity(invokeOrder["receiver_info"]["city"] as String)
  115. orderDeliveryInfo.setDeliverDistract(invokeOrder["receiver_info"]["district"] as String)
  116. orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_address"] as String)
  117. orderDeliveryInfo.setGeoPoiLocation(new GeoPoiLocation(invokeOrder["receiver_info"]["lng"] as double, invokeOrder["receiver_info"]["lat"] as double))
  118. orderDeliveryInfo.setReceiveMan(invokeOrder["receiver_info"]["receiver_name"] as String)
  119. orderDeliveryInfo.setContractPhone(invokeOrder["receiver_info"]["secret_number"] as String + "(" + invokeOrder["receiver_info"]["receiver_phone"] as String + ")")
  120. orderDeliveryInfo.setDeliverTimeliness(invokeOrder["order"]["is_book"] as int - 1) //抖音1表示即时单,2表示预订单
  121. orderDeliveryInfo.setBookingDeliverTimeLong(suggestTimeLong * 1000)
  122. orderDeliveryInfo.setBookingDeliverTime(new Date(orderDeliveryInfo.bookingDeliverTimeLong))
  123. orderDeliveryInfo.setCustomerMemo(invokeOrder["order"]["remark"] as String)
  124. businessOrder.setOrderDeliveryInfo(orderDeliveryInfo)
  125. //订单明细详情
  126. List<OrderDetailItem> itemList = new ArrayList<>()
  127. long itemId = tableIdService.getTableIdMulti("deOrderDetailItem.id", (invokeOrder["products"] as ArrayList).size(),
  128. dataSourceId, String.valueOf(supplierCode))
  129. (invokeOrder["products"] as ArrayList).each {
  130. OrderDetailItem item = new OrderDetailItem()
  131. item.setId(itemId)
  132. item.setIdOrder(businessOrder.id)
  133. item.setItemName(it["product_name"] as String)
  134. item.setItemCount(it["num"] as int)
  135. item.setItemMoney(it["origin_amount"] as BigDecimal)
  136. itemList.add(item)
  137. }
  138. businessOrder.setDetailItemList(itemList)
  139. OrderStep orderStep = orderStepService.parseOrderStep(businessOrder.id, 0, "抖音来客顾客完成下单,平台接单完成", "DYLK", currentUser)
  140. //持久化
  141. //订单主表
  142. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  143. IndexRequestBuilder orderRequest = esClient.getClient()
  144. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  145. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE)
  146. .setId(String.valueOf(businessOrder.id))
  147. .setSource(jsonConvert.convertTo(businessOrder), XContentType.JSON)
  148. bulkRequest.add(orderRequest)
  149. //订单金额信息
  150. IndexRequestBuilder financesRequest = esClient.getClient()
  151. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  152. ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE)
  153. .setId(String.valueOf(orderFinances.id))
  154. .setParent(String.valueOf(orderFinances.idOrder))
  155. .setSource(jsonConvert.convertTo(orderFinances), XContentType.JSON)
  156. bulkRequest.add(financesRequest)
  157. //订单配送信息
  158. IndexRequestBuilder deliveryRequest = esClient.getClient()
  159. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  160. ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE)
  161. .setId(String.valueOf(orderDeliveryInfo.id))
  162. .setParent(String.valueOf(orderDeliveryInfo.idOrder))
  163. .setSource(jsonConvert.convertTo(orderDeliveryInfo), XContentType.JSON)
  164. bulkRequest.add(deliveryRequest)
  165. //订单明细详情
  166. itemList.each {
  167. IndexRequestBuilder itemRequest = esClient.getClient()
  168. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  169. ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE)
  170. .setId(String.valueOf(it.id))
  171. .setParent(String.valueOf(it.idOrder))
  172. .setSource(jsonConvert.convertTo(it), XContentType.JSON)
  173. bulkRequest.add(itemRequest)
  174. }
  175. //订单脚印
  176. IndexRequestBuilder orderStepRequest = esClient.getClient()
  177. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
  178. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  179. .setId(String.valueOf(orderStep.id))
  180. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  181. bulkRequest.add(orderStepRequest)
  182. BulkResponse bulkResponse = bulkRequest.get();
  183. orderDao = tunaService.generate(OrderDao.class)
  184. if (bulkResponse.hasFailures()) {
  185. logger.error("新建订单出错[抖音来客]:" + bulkResponse.buildFailureMessage());
  186. return RetResult.<BusinessOrder> errorT().retinfo("新建订单出错[抖音来客]:" + businessOrder.orderName);
  187. } else {
  188. logger.info("新建订单成功[抖音来客]");
  189. //写数据库
  190. orderDao.addBusinessOrder(businessOrder,
  191. businessOrder.orderFinances,
  192. businessOrder.orderDeliveryInfo,
  193. businessOrder.detailItemList,
  194. [orderStep],
  195. dataSourceId,
  196. String.valueOf(supplierCode))
  197. return RetResult.<BusinessOrder> successT().result(businessOrder)
  198. }
  199. }
  200. }