BE_Order_CreateOrder_DYLK.groovy 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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.ERPModule
  8. import com.dderp.common.datas.ESKeys
  9. import com.dderp.common.datas.flycat.BusinessOrderStatus
  10. import com.dderp.common.datas.flycat.PlatformType
  11. import com.dderp.common.entity.base.InvokeCallParams
  12. import com.dderp.common.entity.base.InvokeCallResult
  13. import com.dderp.common.entity.geo.GeoPoiLocation
  14. import com.dderp.common.entity.order.*
  15. import com.dderp.common.entity.site.ERPTokenUser
  16. import com.dderp.common.entity.store.StoreInfo
  17. import com.dderp.common.entity.store.StorePlatform
  18. import com.dySweetFishPlugin.elasticsearch.ESClient
  19. import com.dySweetFishPlugin.sql.TableIdService
  20. import com.dySweetFishPlugin.sql.dao.TunaService
  21. import com.sweetfish.convert.json.JsonConvert
  22. import com.sweetfish.service.RetResult
  23. import groovy.json.JsonSlurper
  24. import org.apache.logging.log4j.LogManager
  25. import org.apache.logging.log4j.Logger
  26. import org.elasticsearch.action.bulk.BulkRequestBuilder
  27. import org.elasticsearch.action.bulk.BulkResponse
  28. import org.elasticsearch.action.index.IndexRequestBuilder
  29. import org.elasticsearch.action.support.WriteRequest
  30. import org.elasticsearch.common.xcontent.XContentType
  31. import javax.annotation.Resource
  32. import java.math.RoundingMode
  33. import java.time.LocalDateTime
  34. import java.time.ZoneOffset
  35. @SuppressWarnings("unused")
  36. class BE_Order_CreateOrder_DYLK implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  37. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  38. @Resource
  39. private JsonConvert jsonConvert
  40. @Resource
  41. private TableIdService tableIdService
  42. @Resource
  43. private StoreService storeService
  44. @Resource
  45. private ESClient esClient
  46. @Resource
  47. private SupplierInitService supplierInitService
  48. @Resource
  49. private OrderStepService orderStepService
  50. @Resource
  51. private OrderService orderService
  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<InvokeCallResult> execute(InvokeCallParams 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.params)
  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. StoreInfo storeInfo = storeService.getStoreInfo(storePlatform.idStore, supplierCode, false, false, false);
  88. businessOrder.setIdStore(storeInfo.id)
  89. businessOrder.setStoreName(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. long sequence = orderService.getOrderSequence(viewStoreInfo.storeInfo.id, storePlatform.idPlatformInfo, supplierCode)
  102. businessOrder.setOrderSequence(sequence)
  103. //订单金额类信息
  104. OrderFinances orderFinances = new OrderFinances()
  105. orderFinances.setId(tableIdService.getTableIdMulti("deBusinessOrder.id", 1, dataSourceId, String.valueOf(supplierCode)))
  106. orderFinances.setIdOrder(businessOrder.id)
  107. orderFinances.setOrderMoney(new BigDecimal((invokeOrder["amount_info"]["origin_amount"] as int) / 100).setScale(2, RoundingMode.CEILING))
  108. orderFinances.setDeliverFee(deliverFee)
  109. orderFinances.setCustomerPaid(new BigDecimal((invokeOrder["amount_info"]["pay_amount"] as int) / 100).setScale(2, RoundingMode.CEILING))
  110. orderFinances.setStoreRealCollection(new BigDecimal((invokeOrder["amount_info"]["estimated_order_income"] as int) / 100).setScale(2, RoundingMode.CEILING))
  111. businessOrder.setOrderFinances(orderFinances)
  112. //订单配送类信息
  113. OrderDeliveryInfo orderDeliveryInfo = new OrderDeliveryInfo()
  114. orderDeliveryInfo.setId(tableIdService.getTableIdMulti("deOrderDeliveryInfo.id", 1, dataSourceId, String.valueOf(supplierCode)))
  115. orderDeliveryInfo.setIdOrder(businessOrder.id)
  116. orderDeliveryInfo.setDeliverProvince(invokeOrder["receiver_info"]["province"] as String)
  117. orderDeliveryInfo.setDeliverCity(invokeOrder["receiver_info"]["city"] as String)
  118. orderDeliveryInfo.setDeliverDistract(invokeOrder["receiver_info"]["district"] as String)
  119. orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_address"] as String)
  120. orderDeliveryInfo.setGeoPoiLocation(new GeoPoiLocation(invokeOrder["receiver_info"]["lng"] as double, invokeOrder["receiver_info"]["lat"] as double))
  121. orderDeliveryInfo.setReceiveMan(invokeOrder["receiver_info"]["receiver_name"] as String)
  122. orderDeliveryInfo.setContractPhone(invokeOrder["receiver_info"]["secret_number"] as String + "(" + invokeOrder["receiver_info"]["receiver_phone"] as String + ")")
  123. orderDeliveryInfo.setDeliverTimeliness(invokeOrder["order"]["is_book"] as int - 1) //抖音1表示即时单,2表示预订单
  124. orderDeliveryInfo.setBookingDeliverTimeLong(suggestTimeLong * 1000)
  125. orderDeliveryInfo.setBookingDeliverTime(new Date(orderDeliveryInfo.bookingDeliverTimeLong))
  126. orderDeliveryInfo.setCustomerMemo(invokeOrder["order"]["remark"] as String)
  127. businessOrder.setOrderDeliveryInfo(orderDeliveryInfo)
  128. //订单明细详情
  129. List<OrderDetailItem> itemList = new ArrayList<>()
  130. long itemId = tableIdService.getTableIdMulti("deOrderDetailItem.id", (invokeOrder["products"] as ArrayList).size(),
  131. dataSourceId, String.valueOf(supplierCode))
  132. (invokeOrder["products"] as ArrayList).each {
  133. OrderDetailItem item = new OrderDetailItem()
  134. item.setId(itemId)
  135. item.setIdOrder(businessOrder.id)
  136. item.setItemName(it["product_name"] as String)
  137. item.setItemCount(it["num"] as int)
  138. item.setItemMoney(it["origin_amount"] as BigDecimal)
  139. item.setItemDetail(jsonConvert.convertTo(it["commodities"]))
  140. itemList.add(item)
  141. }
  142. businessOrder.setDetailItemList(itemList)
  143. OrderStep orderStep = orderStepService.parseOrderStep(businessOrder.id, "[抖音来客]顾客完成付款下单", "DYLK", currentUser)
  144. //持久化
  145. //订单主表
  146. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  147. IndexRequestBuilder orderRequest = esClient.getClient()
  148. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  149. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE)
  150. .setId(String.valueOf(businessOrder.id))
  151. .setSource(jsonConvert.convertTo(businessOrder), XContentType.JSON)
  152. bulkRequest.add(orderRequest)
  153. //订单金额信息
  154. IndexRequestBuilder financesRequest = esClient.getClient()
  155. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  156. ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE)
  157. .setId(String.valueOf(orderFinances.id))
  158. .setParent(String.valueOf(orderFinances.idOrder))
  159. .setSource(jsonConvert.convertTo(orderFinances), XContentType.JSON)
  160. bulkRequest.add(financesRequest)
  161. //订单配送信息
  162. IndexRequestBuilder deliveryRequest = esClient.getClient()
  163. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  164. ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE)
  165. .setId(String.valueOf(orderDeliveryInfo.id))
  166. .setParent(String.valueOf(orderDeliveryInfo.idOrder))
  167. .setSource(jsonConvert.convertTo(orderDeliveryInfo), XContentType.JSON)
  168. bulkRequest.add(deliveryRequest)
  169. //订单明细详情
  170. itemList.each {
  171. IndexRequestBuilder itemRequest = esClient.getClient()
  172. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  173. ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE)
  174. .setId(String.valueOf(it.id))
  175. .setParent(String.valueOf(it.idOrder))
  176. .setSource(jsonConvert.convertTo(it), XContentType.JSON)
  177. bulkRequest.add(itemRequest)
  178. }
  179. //订单脚印
  180. IndexRequestBuilder orderStepRequest = esClient.getClient()
  181. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
  182. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  183. .setId(String.valueOf(orderStep.id))
  184. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  185. bulkRequest.add(orderStepRequest)
  186. BulkResponse bulkResponse = bulkRequest.get();
  187. orderDao = tunaService.generate(OrderDao.class)
  188. if (bulkResponse.hasFailures()) {
  189. logger.error("新建订单出错[抖音来客]:" + bulkResponse.buildFailureMessage());
  190. return RetResult.<InvokeCallResult> errorT().retinfo("新建订单出错[抖音来客]:" + businessOrder.orderName);
  191. } else {
  192. logger.info("新建订单成功[抖音来客]");
  193. //写数据库
  194. orderDao.addBusinessOrder(businessOrder,
  195. businessOrder.orderFinances,
  196. businessOrder.orderDeliveryInfo,
  197. businessOrder.detailItemList,
  198. [orderStep],
  199. dataSourceId,
  200. String.valueOf(supplierCode))
  201. return RetResult.<InvokeCallResult> successT()
  202. }
  203. }
  204. }