BE_Order_CreateOrder_DYLK.groovy 15 KB

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