BE_Order_CreateOrder_Douyin.groovy 12 KB

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