BE_Order_CancelOrder.groovy 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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.DouyinService
  6. import com.dderp.common.api.flycat.OrderSearchService
  7. import com.dderp.common.api.flycat.OrderService
  8. import com.dderp.common.api.flycat.OrderStepService
  9. import com.dderp.common.datas.BusinessOrderStatus
  10. import com.dderp.common.datas.ERPModule
  11. import com.dderp.common.datas.ESKeys
  12. import com.dderp.common.entity.base.InvokeCallParams
  13. import com.dderp.common.entity.base.InvokeCallResult
  14. import com.dderp.common.entity.order.BusinessOrder
  15. import com.dderp.common.entity.order.OrderStep
  16. import com.dderp.common.entity.site.ERPTokenUser
  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.action.update.UpdateRequestBuilder
  31. import org.elasticsearch.common.xcontent.XContentType
  32. import javax.annotation.Resource
  33. import java.time.LocalDateTime
  34. import java.time.ZoneOffset
  35. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
  36. @SuppressWarnings("unused")
  37. class BE_Order_CancelOrder 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 OrderSearchService orderSearchService
  55. @Resource
  56. private DouyinService douyinService
  57. @Resource(name = "APP_HOME")
  58. private String appHome
  59. @Resource
  60. private TunaService tunaService
  61. private OrderDao orderDao
  62. @Override
  63. String scriptName() {
  64. return "商户发起取消订单"
  65. }
  66. @Override
  67. ERPModule module() {
  68. return ERPModule.ORDER_API
  69. }
  70. @Override
  71. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  72. return super.beforeExecute(source)
  73. }
  74. //params:{idOrder:xxx, refundReason:[501,502], description:"超出配送范围"}
  75. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  76. //秒级时间戳,groovy里面不让用system
  77. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  78. String dataSourceId = source.dataSourceId
  79. long supplierCode = source.supplierCode
  80. ERPTokenUser currentUser = source.currentUser
  81. def jsonSlurper = new JsonSlurper()
  82. def invokeOrder = jsonSlurper.parseText(source.params)
  83. long idOrder = invokeOrder["idOrder"] as Long
  84. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
  85. if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
  86. def refundCodeJsonFile = new File(appHome + File.separator +
  87. "conf" + File.separator +
  88. "script" + File.separator +
  89. supplierCode + File.separator +
  90. "scriptFiles" + File.separator +
  91. "refundOrderReason.json")
  92. def refundCodeArray = jsonSlurper.parse(refundCodeJsonFile)
  93. BusinessOrder esOrder = orderResult.result
  94. def legalReasons = (refundCodeArray.find { it["orderStatus"] == esOrder.orderStatus })["refundReason"] as ArrayList
  95. for (Integer reason in invokeOrder["refundReason"] as ArrayList<Integer>) {
  96. if (legalReasons.find { it["code"] as Integer == reason } == null) {
  97. return RetResult.<InvokeCallResult> errorT().retinfo("订单状态[" + BusinessOrderStatus.getName(esOrder.orderStatus) +
  98. "],不允许以[" + reason + "]取消订单")
  99. }
  100. }
  101. esOrder.setVoidFlag(1)
  102. BusinessOrder.update(esOrder, currentUser.id)
  103. StorePlatform storePlatform = storeService.getStorePlatformInfo(esOrder.incomePlatformId, supplierCode)
  104. if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
  105. OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, 0,
  106. "[" + storePlatform.platformName + "]商家取消订单: " + invokeOrder["description"], storePlatform.platformCode, currentUser)
  107. //todo 判断订单目前状态,如果已生成配送单据,则要同步将配送单据取消
  108. def callSuccess = [success: false, errorMsg: ""]
  109. //根据订单来源平台,回调平台的接单接口
  110. switch (storePlatform.platformCode) {
  111. case "DYLK": {
  112. //抖音来客
  113. def postBody = [
  114. order_id : esOrder.incomePlatformOrderCode,
  115. refund_reason: [
  116. reason_code: invokeOrder["refundReason"],
  117. desc : invokeOrder["description"]
  118. ]
  119. ]
  120. String responseStr = douyinService.postInvoker("/goodlife/v1/after_sale/order/apply_refund/", jsonConvert.convertTo(postBody))
  121. def response = jsonSlurper.parseText(responseStr)
  122. if (response["extra"]["error_code"] as Integer == 0) {
  123. callSuccess["success"] = true
  124. } else {
  125. //todo 抖音侧调用失败,怎么处理?
  126. logger.error("[抖音来客]商户接单平台接口调用失败:" + response["extra"]["description"] as String)
  127. callSuccess["success"] = false
  128. callSuccess["errorMsg"] = "[抖音来客]商户接单平台接口调用失败:" + response["extra"]["description"] as String
  129. }
  130. break;
  131. }
  132. }
  133. if (callSuccess["success"]) {
  134. //持久化
  135. //订单主表
  136. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  137. UpdateRequestBuilder orderRequest = esClient.getClient().prepareUpdate(
  138. supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  139. ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE,
  140. String.valueOf(esOrder.getId()))
  141. .setDoc(jsonBuilder()
  142. .startObject()
  143. .field("voidFlag", esOrder.voidFlag)
  144. .field("updateBy", esOrder.getUpdateBy())
  145. .field("updateTimeLong", esOrder.getUpdateTimeLong())
  146. .endObject())
  147. bulkRequest.add(orderRequest)
  148. //订单脚印
  149. IndexRequestBuilder orderStepRequest = esClient.getClient()
  150. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
  151. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  152. .setId(String.valueOf(orderStep.id))
  153. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  154. bulkRequest.add(orderStepRequest)
  155. BulkResponse bulkResponse = bulkRequest.get();
  156. orderDao = tunaService.generate(OrderDao.class)
  157. if (bulkResponse.hasFailures()) {
  158. logger.error("商户取消订单出错:" + bulkResponse.buildFailureMessage());
  159. return RetResult.<InvokeCallResult> errorT().retinfo("商户取消订单出错:" + esOrder.orderName);
  160. } else {
  161. logger.info("商户取消订单成功");
  162. //写数据库
  163. orderDao.voidBusinessOrder(esOrder,
  164. [orderStep],
  165. dataSourceId,
  166. String.valueOf(supplierCode))
  167. return RetResult.<InvokeCallResult> successT().result(InvokeCallResult.success().data(jsonConvert.convertTo(esOrder)))
  168. }
  169. } else {
  170. return RetResult.<InvokeCallResult> errorT().retinfo("商户取消订单出错:" + callSuccess["errorMsg"]);
  171. }
  172. }
  173. }