BE_Order_CreateOrder_DYLK.groovy 13 KB

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