BE_Order_StoreCancelOrder_Request.groovy 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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.IncomePlatformService
  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.TokenUserFrom
  10. import com.dderp.common.datas.flycat.BusinessOrderStatus
  11. import com.dderp.common.datas.ERPModule
  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.site.ERPTokenUser
  16. import com.dderp.common.entity.store.StorePlatform
  17. import com.dySweetFishPlugin.elasticsearch.ESClient
  18. import com.dySweetFishPlugin.sql.TableIdService
  19. import com.dySweetFishPlugin.sql.dao.TunaService
  20. import com.sweetfish.convert.json.JsonConvert
  21. import com.sweetfish.service.RetResult
  22. import groovy.json.JsonSlurper
  23. import org.apache.logging.log4j.LogManager
  24. import org.apache.logging.log4j.Logger
  25. import javax.annotation.Resource
  26. import java.time.LocalDateTime
  27. import java.time.ZoneOffset
  28. @SuppressWarnings("unused")
  29. class BE_Order_StoreCancelOrder_Request implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  30. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  31. @Resource
  32. private JsonConvert jsonConvert
  33. @Resource
  34. private TableIdService tableIdService
  35. @Resource
  36. private StoreService storeService
  37. @Resource
  38. private ESClient esClient
  39. @Resource
  40. private SupplierInitService supplierInitService
  41. @Resource
  42. private OrderStepService orderStepService
  43. @Resource
  44. private OrderService orderService
  45. @Resource
  46. private OrderSearchService orderSearchService
  47. @Resource
  48. private IncomePlatformService douyinService
  49. @Resource(name = "APP_HOME")
  50. private String appHome
  51. @Resource
  52. private TunaService tunaService
  53. private OrderDao orderDao
  54. @Override
  55. String scriptName() {
  56. return "商户发起取消订单"
  57. }
  58. @Override
  59. ERPModule module() {
  60. return ERPModule.ORDER_API
  61. }
  62. @Override
  63. RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
  64. String dataSourceId = source.dataSourceId
  65. long supplierCode = source.supplierCode
  66. ERPTokenUser currentUser = source.currentUser
  67. def jsonSlurper = new JsonSlurper()
  68. def invokeOrder = jsonSlurper.parseText(source.params)
  69. long idOrder = invokeOrder["idOrder"] as Long
  70. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
  71. if (!orderResult.isSuccess()) return RetResult.<InvokeCallParams> errorT().retinfo(orderResult.retinfo)
  72. BusinessOrder esOrder = orderResult.result
  73. if ((source.currentUser.userFrom == TokenUserFrom.APP_STORE_ADMIN.value) || (source.currentUser.userFrom == TokenUserFrom.PC_STORE_ADMIN.value)) {
  74. if (esOrder.idStore != source.currentUser.idBindOrg) {
  75. return RetResult.<InvokeCallParams> errorT().retinfo("无效的订单信息")
  76. }
  77. }
  78. return super.checkExecute(source)
  79. }
  80. @Override
  81. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  82. return super.beforeExecute(source)
  83. }
  84. //params:{idOrder:xxx, refundReason:[501,502], description:"超出配送范围"}
  85. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  86. //秒级时间戳,groovy里面不让用system
  87. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  88. String dataSourceId = source.dataSourceId
  89. long supplierCode = source.supplierCode
  90. ERPTokenUser currentUser = source.currentUser
  91. def jsonSlurper = new JsonSlurper()
  92. def invokeOrder = jsonSlurper.parseText(source.params)
  93. long idOrder = invokeOrder["idOrder"] as Long
  94. RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
  95. if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
  96. def refundCodeJsonFile = new File(appHome + File.separator +
  97. "conf" + File.separator +
  98. "script" + File.separator +
  99. supplierCode + File.separator +
  100. "scriptFiles" + File.separator +
  101. "refundOrderReasonIn_DYLK.json")
  102. def refundCodeArray = jsonSlurper.parse(refundCodeJsonFile)
  103. BusinessOrder esOrder = orderResult.result
  104. esOrder.orderStatus >= BusinessOrderStatus.orderComplete.value
  105. return RetResult.<InvokeCallResult> errorT().retinfo("订单已完成,不允许发起退单")
  106. def legalReasons = (refundCodeArray.find { it["orderStatus"] == esOrder.orderStatus })["refundReason"] as ArrayList
  107. for (Integer reason in invokeOrder["refundReason"] as ArrayList<Integer>) {
  108. if (legalReasons.find { it["code"] as Integer == reason } == null) {
  109. return RetResult.<InvokeCallResult> errorT().retinfo("订单状态[" + BusinessOrderStatus.getName(esOrder.orderStatus) +
  110. "],不允许以[" + reason + "]取消订单")
  111. }
  112. }
  113. StorePlatform storePlatform = storeService.getStorePlatformInfo(esOrder.incomePlatformId, supplierCode)
  114. if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
  115. //todo 判断订单目前状态,如果已生成配送单据,则要同步将配送单据取消
  116. //根据订单来源平台,回调平台的接单接口
  117. switch (storePlatform.platformCode) {
  118. case "DYLK": {
  119. //抖音来客
  120. def postBody = [
  121. order_id : esOrder.incomePlatformOrderCode,
  122. refund_reason: [
  123. reason_code: invokeOrder["refundReason"],
  124. desc : invokeOrder["description"]
  125. ]
  126. ]
  127. String responseStr = douyinService.dyPostInvoker("/goodlife/v1/after_sale/order/apply_refund/", jsonConvert.convertTo(postBody))
  128. def response = jsonSlurper.parseText(responseStr)
  129. if (response["extra"]["error_code"] as Integer == 0) {
  130. return RetResult.<InvokeCallResult>successT()
  131. } else {
  132. //todo 抖音侧调用失败,怎么处理?
  133. logger.error("[抖音来客]商户发起退单接口调用失败:" + response["extra"]["description"] as String)
  134. return RetResult.<InvokeCallResult>errorT().retinfo("[抖音来客]商户发起退单接口调用失败:" + response["extra"]["description"] as String)
  135. }
  136. }
  137. }
  138. return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
  139. }
  140. }