BE_Order_PartRefund_DYLK.groovy 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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.IncomePlatformService
  7. import com.dderp.common.api.flycat.OrderSearchService
  8. import com.dderp.common.api.flycat.OrderService
  9. import com.dderp.common.api.flycat.OrderStepService
  10. import com.dderp.common.datas.ERPModule
  11. import com.dderp.common.datas.ESKeys
  12. import com.dderp.common.datas.ReadOrderOption
  13. import com.dderp.common.datas.flycat.PlatformType
  14. import com.dderp.common.datas.flycat.RefundRequestStatus
  15. import com.dderp.common.datas.flycat.VoidFlagStatus
  16. import com.dderp.common.entity.base.InvokeCallParams
  17. import com.dderp.common.entity.base.InvokeCallResult
  18. import com.dderp.common.entity.order.BusinessOrder
  19. import com.dderp.common.entity.order.OrderAfterSaleBill
  20. import com.dderp.common.entity.order.OrderFinances
  21. import com.dderp.common.entity.order.OrderRefundRequest
  22. import com.dderp.common.entity.order.OrderStep
  23. import com.dderp.common.entity.site.ERPTokenUser
  24. import com.dderp.common.entity.store.StorePlatform
  25. import com.dySweetFishPlugin.elasticsearch.ESClient
  26. import com.dySweetFishPlugin.sql.TableIdService
  27. import com.dySweetFishPlugin.sql.dao.TunaService
  28. import com.sweetfish.convert.json.JsonConvert
  29. import com.sweetfish.service.RetResult
  30. import groovy.json.JsonSlurper
  31. import org.apache.logging.log4j.LogManager
  32. import org.apache.logging.log4j.Logger
  33. import org.elasticsearch.action.bulk.BulkRequestBuilder
  34. import org.elasticsearch.action.bulk.BulkResponse
  35. import org.elasticsearch.action.index.IndexRequestBuilder
  36. import org.elasticsearch.action.support.WriteRequest
  37. import org.elasticsearch.action.update.UpdateRequestBuilder
  38. import org.elasticsearch.common.xcontent.XContentType
  39. import org.rex.RMap
  40. import javax.annotation.Resource
  41. import java.math.RoundingMode
  42. import java.time.LocalDateTime
  43. import java.time.ZoneOffset
  44. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
  45. @SuppressWarnings("unused")
  46. class BE_Order_PartRefund_DYLK implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
  47. private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  48. @Resource
  49. private JsonConvert jsonConvert
  50. @Resource
  51. private TableIdService tableIdService
  52. @Resource
  53. private StoreService storeService
  54. @Resource
  55. private ESClient esClient
  56. @Resource
  57. private SupplierInitService supplierInitService
  58. @Resource
  59. private OrderStepService orderStepService
  60. @Resource
  61. private OrderService orderService
  62. @Resource
  63. private OrderSearchService orderSearchService
  64. @Resource
  65. private IncomePlatformService douyinService
  66. @Resource
  67. private TunaService tunaService
  68. private OrderDao orderDao
  69. @Override
  70. String scriptName() {
  71. return "[抖音来客]订单部分退款完成"
  72. }
  73. @Override
  74. ERPModule module() {
  75. return ERPModule.ORDER_API
  76. }
  77. @Override
  78. RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
  79. return super.beforeExecute(source)
  80. }
  81. RetResult<InvokeCallResult> execute(InvokeCallParams source) {
  82. //秒级时间戳,groovy里面不让用system
  83. long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
  84. String dataSourceId = source.dataSourceId
  85. long supplierCode = source.supplierCode
  86. ERPTokenUser currentUser = source.currentUser
  87. def jsonSlurper = new JsonSlurper()
  88. def invokeOrder = jsonSlurper.parseText(source.params)
  89. String incomePlatformOrderCode = invokeOrder["order_id"] as String
  90. String platformStoreId = invokeOrder["poi_id"] as String
  91. StorePlatform storePlatform = storeService.getStorePlatformByInvokeInfo(platformStoreId, "DYLK", PlatformType.order.value, supplierCode)
  92. if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
  93. if (storePlatform.enableStatue == 0) {
  94. logger.info("[" + storePlatform.platformName + "]门店[" + storePlatform.platformStoreId + "]已被禁用,消息已忽略")
  95. return RetResult.<InvokeCallResult> errorT().retinfo("[" + storePlatform.platformName + "]门店[" + storePlatform.platformStoreId + "]已被禁用")
  96. }
  97. RMap searchParams = new RMap();
  98. searchParams.set("incomePlatformId", storePlatform.id)
  99. searchParams.set("incomePlatformOrderCode", incomePlatformOrderCode)
  100. RetResult<List<BusinessOrder>> orderResult = orderSearchService.searchBusinessOrderList(searchParams, currentUser, dataSourceId, supplierCode, ReadOrderOption.ORDER_FINANCES)
  101. if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
  102. BusinessOrder esOrder = orderResult.result.get(0) //这么查只可能有一个
  103. //构造订单售后单
  104. OrderAfterSaleBill afterSaleBill = new OrderAfterSaleBill()
  105. String refundReasonCodes = (invokeOrder["reasons"] as ArrayList).collect { it["code"] as String }.join(",")
  106. String refundReasonMsg = (invokeOrder["reasons"] as ArrayList).collect { it["msg"] as String }.join(",")
  107. afterSaleBill.setId(tableIdService.getTableIdMulti("deOrderAfterSaleBill.id", 1, dataSourceId, String.valueOf(supplierCode)))
  108. afterSaleBill.setIdOrder(esOrder.id)
  109. afterSaleBill.setIdStore(esOrder.idStore)
  110. afterSaleBill.setBillCode(tableIdService.getTableCodeMulti("deOrderAfterSaleBill.code", dataSourceId, String.valueOf(supplierCode)))
  111. afterSaleBill.setIdStorePlatform(storePlatform.id)
  112. afterSaleBill.setOutPlatformStoreId(storePlatform.platformStoreId)
  113. afterSaleBill.setPlatformCode(storePlatform.platformCode)
  114. afterSaleBill.setPlatformType(storePlatform.platformType)
  115. afterSaleBill.setPlatformName(storePlatform.platformName)
  116. afterSaleBill.setOutAfterSaleId(invokeOrder["after_sale_id"] as String)
  117. afterSaleBill.setRefundReasonCodes(refundReasonCodes)
  118. afterSaleBill.setRefundReasonMsgs(refundReasonMsg)
  119. afterSaleBill.setApplySource(invokeOrder["apply_source"] as String)
  120. afterSaleBill.setFullRefunded(invokeOrder["is_full_refunded"] as boolean)
  121. afterSaleBill.setUserRefundAmount(invokeOrder["user_refund_amount"] as int)
  122. afterSaleBill.setTotalUserRefundAmount(invokeOrder["total_user_refund_amount"] as int)
  123. afterSaleBill.setProdCountAfterRefund(invokeOrder["sku_type_num_after_refund"] as int)
  124. afterSaleBill.setProductsRemainDetail(invokeOrder["products_after_refund"] as String)
  125. afterSaleBill.setProductsRefundDetail(invokeOrder["products_refund"] as String)
  126. OrderAfterSaleBill.create(afterSaleBill, currentUser.id)
  127. //todo 订单金额变化
  128. esOrder.orderFinances.orderMoney = ERPUtils.money(invokeOrder["amount_change"]["sale_price"] as int)
  129. esOrder.orderFinances.deliverFee = ERPUtils.money(invokeOrder["amount_change"]["merchant_deliver_freight_fee"] as int)
  130. esOrder.orderFinances.storeDiscount = ERPUtils.money(invokeOrder["amount_change"]["activities_fee_amount"] as int)
  131. esOrder.orderFinances.customerRefunded = ERPUtils.money(invokeOrder["total_user_refund_amount"] as int)
  132. esOrder.orderFinances.platformServiceFee = ERPUtils.money(invokeOrder["amount_change"]["commission_amount"] as int)
  133. esOrder.orderFinances.storeRealCollection = ERPUtils.money(invokeOrder["amount_change"]["estimated_order_income"] as int)
  134. OrderFinances.update(esOrder.orderFinances, currentUser.id)
  135. OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, "订单已部分退款,原因:" + refundReasonMsg,
  136. "退款金额: " + ERPUtils.money(invokeOrder["user_refund_amount"] as int) +
  137. " 商户预计收入: " + esOrder.orderFinances.storeRealCollection, currentUser)
  138. //持久化
  139. //订单主表
  140. BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
  141. UpdateRequestBuilder orderFinancesRequest = esClient.getClient().prepareUpdate(
  142. supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  143. ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE,
  144. String.valueOf(esOrder.orderFinances.getId()))
  145. .setRouting(String.valueOf(esOrder.id))
  146. .setDoc(jsonBuilder()
  147. .startObject()
  148. .field("orderMoney", esOrder.orderFinances.orderMoney)
  149. .field("deliverFee", esOrder.orderFinances.deliverFee)
  150. .field("storeDiscount", esOrder.orderFinances.storeDiscount)
  151. .field("customerRefunded", esOrder.orderFinances.customerRefunded)
  152. .field("platformServiceFee", esOrder.orderFinances.platformServiceFee)
  153. .field("storeRealCollection", esOrder.orderFinances.storeRealCollection)
  154. .field("updateBy", esOrder.orderFinances.getUpdateBy())
  155. .field("updateTimeLong", esOrder.orderFinances.getUpdateTimeLong())
  156. .endObject())
  157. bulkRequest.add(orderFinancesRequest)
  158. //订单售后单
  159. IndexRequestBuilder afterSaleBillRequest = esClient.getClient()
  160. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
  161. ESKeys.ES_DELIVER_ORDER_AFTER_SALE_BILL_TYPE)
  162. .setId(String.valueOf(afterSaleBill.id))
  163. .setParent(String.valueOf(esOrder.id))
  164. .setSource(jsonConvert.convertTo(afterSaleBill), XContentType.JSON)
  165. bulkRequest.add(afterSaleBillRequest)
  166. //订单脚印
  167. IndexRequestBuilder orderStepRequest = esClient.getClient()
  168. .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
  169. ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
  170. .setId(String.valueOf(orderStep.id))
  171. .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
  172. bulkRequest.add(orderStepRequest)
  173. BulkResponse bulkResponse = bulkRequest.get();
  174. orderDao = tunaService.generate(OrderDao.class)
  175. if (bulkResponse.hasFailures()) {
  176. logger.error("部分退款出错:" + bulkResponse.buildFailureMessage());
  177. return RetResult.<InvokeCallResult> errorT().retinfo("部分退款出错:" + esOrder.orderName);
  178. } else {
  179. logger.info("部分退款成功");
  180. //写数据库
  181. orderDao.partRefundOrder(esOrder.orderFinances,
  182. afterSaleBill,
  183. [orderStep],
  184. dataSourceId,
  185. String.valueOf(supplierCode))
  186. return RetResult.<InvokeCallResult> successT()
  187. }
  188. }
  189. }