Forráskód Böngészése

商户接单/拒单/取消

Veronique 2 éve
szülő
commit
e75ed44e18

+ 167 - 0
conf/script/1000/orderApi/BE_Order_AcceptOrder_Douyin.groovy

@@ -0,0 +1,167 @@
+import com.dderp.business.dao.OrderDao
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.StoreService
+import com.dderp.common.api.SupplierInitService
+import com.dderp.common.api.flycat.DouyinService
+import com.dderp.common.api.flycat.OrderSearchService
+import com.dderp.common.api.flycat.OrderService
+import com.dderp.common.api.flycat.OrderStepService
+import com.dderp.common.datas.BusinessOrderStatus
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
+import com.dderp.common.datas.ReadOrderOption
+import com.dderp.common.datas.business.PlatformType
+import com.dderp.common.entity.base.InvokeCallParams
+import com.dderp.common.entity.base.InvokeCallResult
+import com.dderp.common.entity.base.ProcessStringItem
+import com.dderp.common.entity.geo.GeoPoiLocation
+import com.dderp.common.entity.order.*
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StorePlatform
+import com.dderp.common.entity.store.ViewStoreInfo
+import com.dySweetFishPlugin.elasticsearch.ESClient
+import com.dySweetFishPlugin.sql.TableIdService
+import com.dySweetFishPlugin.sql.dao.TunaService
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+import org.elasticsearch.action.bulk.BulkRequestBuilder
+import org.elasticsearch.action.bulk.BulkResponse
+import org.elasticsearch.action.index.IndexRequestBuilder
+import org.elasticsearch.action.support.WriteRequest
+import org.elasticsearch.action.update.UpdateRequestBuilder
+import org.elasticsearch.common.xcontent.XContentType
+import org.rex.RMap
+
+import javax.annotation.Resource
+import java.math.RoundingMode
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Order_AcceptOrder_Douyin implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource
+    private JsonConvert jsonConvert
+
+    @Resource
+    private TableIdService tableIdService
+
+    @Resource
+    private StoreService storeService
+
+    @Resource
+    private ESClient esClient
+
+    @Resource
+    private SupplierInitService supplierInitService
+
+    @Resource
+    private OrderStepService orderStepService
+
+    @Resource
+    private OrderService orderService
+
+    @Resource
+    private OrderSearchService orderSearchService
+
+    @Resource
+    private DouyinService douyinService
+
+    @Resource
+    private TunaService tunaService
+
+    private OrderDao orderDao
+
+    @Override
+    String scriptName() {
+        return "订单商户接单"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.ORDER_API
+    }
+
+    @Override
+    RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
+        return super.beforeExecute(source)
+    }
+
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+        String incomePlatformOrderCode = invokeOrder["order_id"] as String
+        String platformStoreId = invokeOrder["poi_id"] as String
+
+        StorePlatform storePlatform = storeService.getStorePlatformByInvokeInfo(platformStoreId, "DYLK", PlatformType.order.value, supplierCode)
+        if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+
+        RMap searchParams = new RMap();
+        searchParams.set("incomePlatformId", platformStoreId)
+        searchParams.set("incomePlatformOrderCode", incomePlatformOrderCode)
+
+        RetResult<List<BusinessOrder>> orderResult = orderSearchService.searchBusinessOrderList(searchParams, currentUser, dataSourceId, supplierCode, null)
+        if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
+
+        BusinessOrder esOrder = orderResult.result.get(0) //这么查只可能有一个
+        esOrder.setOrderStatus(BusinessOrderStatus.accept.value)
+        BusinessOrder.update(esOrder, currentUser.id)
+
+        OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, 0, "[" + storePlatform.platformName + "]商家接单完成", storePlatform.platformCode, currentUser)
+
+
+        //持久化
+        //订单主表
+        BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
+
+        UpdateRequestBuilder orderRequest = esClient.getClient().prepareUpdate(
+                supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
+                ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE,
+                String.valueOf(esOrder.getId()))
+                .setDoc(jsonBuilder()
+                        .startObject()
+                        .field("orderStatus", esOrder.orderStatus)
+                        .field("updateBy", esOrder.getUpdateBy())
+                        .field("updateTimeLong", esOrder.getUpdateTimeLong())
+                        .endObject())
+        bulkRequest.add(orderRequest)
+        //订单脚印
+        IndexRequestBuilder orderStepRequest = esClient.getClient()
+                .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
+                        ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
+                .setId(String.valueOf(orderStep.id))
+                .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
+        bulkRequest.add(orderStepRequest)
+
+
+        BulkResponse bulkResponse = bulkRequest.get();
+        orderDao = tunaService.generate(OrderDao.class)
+        if (bulkResponse.hasFailures()) {
+            logger.error("商户接单出错:" + bulkResponse.buildFailureMessage());
+            return RetResult.<InvokeCallResult> errorT().retinfo("商户接单出错:" + esOrder.orderName);
+        } else {
+            logger.info("商户接单成功");
+            //写数据库
+            orderDao.acceptBusinessOrder(esOrder,
+                    [orderStep],
+                    dataSourceId,
+                    String.valueOf(supplierCode))
+
+            return RetResult.<InvokeCallResult> successT().result(InvokeCallResult.success().data(jsonConvert.convertTo(esOrder)))
+        }
+
+    }
+}

+ 130 - 0
conf/script/1000/orderApi/BE_Order_AcceptOrder_Request.groovy

@@ -0,0 +1,130 @@
+import com.dderp.business.dao.OrderDao
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.StoreService
+import com.dderp.common.api.SupplierInitService
+import com.dderp.common.api.flycat.DouyinService
+import com.dderp.common.api.flycat.OrderSearchService
+import com.dderp.common.api.flycat.OrderService
+import com.dderp.common.api.flycat.OrderStepService
+import com.dderp.common.datas.BusinessOrderStatus
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
+import com.dderp.common.entity.base.InvokeCallParams
+import com.dderp.common.entity.base.InvokeCallResult
+import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.order.OrderStep
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StorePlatform
+import com.dySweetFishPlugin.elasticsearch.ESClient
+import com.dySweetFishPlugin.sql.TableIdService
+import com.dySweetFishPlugin.sql.dao.TunaService
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+import org.elasticsearch.action.bulk.BulkRequestBuilder
+import org.elasticsearch.action.bulk.BulkResponse
+import org.elasticsearch.action.index.IndexRequestBuilder
+import org.elasticsearch.action.support.WriteRequest
+import org.elasticsearch.action.update.UpdateRequestBuilder
+import org.elasticsearch.common.xcontent.XContentType
+
+import javax.annotation.Resource
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Order_AcceptOrder_Request implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource
+    private JsonConvert jsonConvert
+
+    @Resource
+    private TableIdService tableIdService
+
+    @Resource
+    private StoreService storeService
+
+    @Resource
+    private ESClient esClient
+
+    @Resource
+    private SupplierInitService supplierInitService
+
+    @Resource
+    private OrderStepService orderStepService
+
+    @Resource
+    private OrderService orderService
+
+    @Resource
+    private OrderSearchService orderSearchService
+
+    @Resource
+    private DouyinService douyinService
+
+    @Resource
+    private TunaService tunaService
+
+    private OrderDao orderDao
+
+    @Override
+    String scriptName() {
+        return "订单商户接单"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.ORDER_API
+    }
+
+    @Override
+    RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
+        return super.beforeExecute(source)
+    }
+    //params:{idOrder:xxx}
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+        long idOrder = invokeOrder["idOrder"] as Long
+        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
+        if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
+
+        BusinessOrder esOrder = orderResult.result
+
+        StorePlatform storePlatform = storeService.getStorePlatformInfo(esOrder.incomePlatformId, supplierCode)
+        if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+
+        //根据订单来源平台,回调平台的接单接口
+        switch (storePlatform.platformCode) {
+            case "DYLK": {
+                //抖音来客
+                def postBody = [
+                        order_id:
+                                esOrder.incomePlatformOrderCode
+                ]
+                String responseStr = douyinService.postInvoker("/goodlife/v1/trade/buy/merchant_confirm_order/", jsonConvert.convertTo(postBody))
+                def response = jsonSlurper.parseText(responseStr)
+                if (response["data"]["error_code"] as Integer == 0) {
+                    return RetResult.<InvokeCallResult> successT()
+                } else {
+                    //todo 抖音侧调用失败,怎么处理?
+                    logger.error("[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String)
+                    return RetResult.<InvokeCallResult> errorT().retinfo("[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String)
+                }
+            }
+        }
+        return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+    }
+}

+ 47 - 27
conf/script/1000/orderApi/BE_Order_AcceptOrder.groovy

@@ -9,16 +9,12 @@ import com.dderp.common.api.flycat.OrderStepService
 import com.dderp.common.datas.BusinessOrderStatus
 import com.dderp.common.datas.ERPModule
 import com.dderp.common.datas.ESKeys
-import com.dderp.common.datas.ReadOrderOption
-import com.dderp.common.datas.business.PlatformType
 import com.dderp.common.entity.base.InvokeCallParams
 import com.dderp.common.entity.base.InvokeCallResult
-import com.dderp.common.entity.base.ProcessStringItem
-import com.dderp.common.entity.geo.GeoPoiLocation
-import com.dderp.common.entity.order.*
+import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.order.OrderStep
 import com.dderp.common.entity.site.ERPTokenUser
 import com.dderp.common.entity.store.StorePlatform
-import com.dderp.common.entity.store.ViewStoreInfo
 import com.dySweetFishPlugin.elasticsearch.ESClient
 import com.dySweetFishPlugin.sql.TableIdService
 import com.dySweetFishPlugin.sql.dao.TunaService
@@ -35,14 +31,13 @@ import org.elasticsearch.action.update.UpdateRequestBuilder
 import org.elasticsearch.common.xcontent.XContentType
 
 import javax.annotation.Resource
-import java.math.RoundingMode
 import java.time.LocalDateTime
 import java.time.ZoneOffset
 
 import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
 
 @SuppressWarnings("unused")
-class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+class BE_Order_CancelOrder implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
 
     private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
 
@@ -73,6 +68,9 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
     @Resource
     private DouyinService douyinService
 
+    @Resource(name = "APP_HOME")
+    private String appHome
+
     @Resource
     private TunaService tunaService
 
@@ -80,7 +78,7 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
 
     @Override
     String scriptName() {
-        return "订单商户接单"
+        return "商户发起取消订单"
     }
 
     @Override
@@ -92,7 +90,7 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
     RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
         return super.beforeExecute(source)
     }
-//params:{idOrder:xxx}
+    //params:{idOrder:xxx, refundReason:[501,502], description:"超出配送范围"}
     RetResult<InvokeCallResult> execute(InvokeCallParams source) {
         //秒级时间戳,groovy里面不让用system
         long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
@@ -106,34 +104,56 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
         RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
         if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
 
+        def refundCodeJsonFile = new File(appHome + File.separator +
+                "conf" + File.separator +
+                "script" + File.separator +
+                supplierCode + File.separator +
+                "scriptFiles" + File.separator +
+                "refundOrderReason.json")
+        def refundCodeArray = jsonSlurper.parse(refundCodeJsonFile)
+
         BusinessOrder esOrder = orderResult.result
-        esOrder.setOrderStatus(BusinessOrderStatus.accept.value)
+        def legalReasons = (refundCodeArray.find { it["orderStatus"] == esOrder.orderStatus })["refundReason"] as ArrayList
+
+        for (Integer reason in invokeOrder["refundReason"] as ArrayList<Integer>) {
+            if (legalReasons.find { it["code"] as Integer == reason } == null) {
+                return RetResult.<InvokeCallResult> errorT().retinfo("订单状态[" + BusinessOrderStatus.getName(esOrder.orderStatus) +
+                        "],不允许以[" + reason + "]取消订单")
+            }
+        }
+
+        esOrder.setVoidFlag(1)
         BusinessOrder.update(esOrder, currentUser.id)
 
         StorePlatform storePlatform = storeService.getStorePlatformInfo(esOrder.incomePlatformId, supplierCode)
         if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
 
-        OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, 0, "[" + storePlatform.platformName + "]商家接单完成", storePlatform.platformCode, currentUser)
+        OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, 0,
+                "[" + storePlatform.platformName + "]商家取消订单: " + invokeOrder["description"], storePlatform.platformCode, currentUser)
 
+        //todo 判断订单目前状态,如果已生成配送单据,则要同步将配送单据取消
 
-        def callSuccess = ["success": false, "errorMsg": ""]
+        def callSuccess = [success: false, errorMsg: ""]
         //根据订单来源平台,回调平台的接单接口
         switch (storePlatform.platformCode) {
             case "DYLK": {
                 //抖音来客
-                def postBody = {
-                    order_id:
-                    esOrder.incomePlatformOrderCode
-                }
-                String responseStr = douyinService.postInvoker("/goodlife/v1/trade/buy/merchant_confirm_order/", jsonConvert.convertTo(postBody))
+                def postBody = [
+                        order_id     : esOrder.incomePlatformOrderCode,
+                        refund_reason: [
+                                reason_code: invokeOrder["refundReason"],
+                                desc       : invokeOrder["description"]
+                        ]
+                ]
+                String responseStr = douyinService.postInvoker("/goodlife/v1/after_sale/order/apply_refund/", jsonConvert.convertTo(postBody))
                 def response = jsonSlurper.parseText(responseStr)
-                if (response["data"]["error_code"] as Integer == 0) {
+                if (response["extra"]["error_code"] as Integer == 0) {
                     callSuccess["success"] = true
                 } else {
                     //todo 抖音侧调用失败,怎么处理?
-                    logger.error("[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String)
+                    logger.error("[抖音来客]商户接单平台接口调用失败:" + response["extra"]["description"] as String)
                     callSuccess["success"] = false
-                    callSuccess["errorMsg"] = "[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String
+                    callSuccess["errorMsg"] = "[抖音来客]商户接单平台接口调用失败:" + response["extra"]["description"] as String
                 }
 
                 break;
@@ -151,7 +171,7 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
                     String.valueOf(esOrder.getId()))
                     .setDoc(jsonBuilder()
                             .startObject()
-                            .field("orderStatus", esOrder.orderStatus)
+                            .field("voidFlag", esOrder.voidFlag)
                             .field("updateBy", esOrder.getUpdateBy())
                             .field("updateTimeLong", esOrder.getUpdateTimeLong())
                             .endObject())
@@ -168,12 +188,12 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
             BulkResponse bulkResponse = bulkRequest.get();
             orderDao = tunaService.generate(OrderDao.class)
             if (bulkResponse.hasFailures()) {
-                logger.error("商户单出错:" + bulkResponse.buildFailureMessage());
-                return RetResult.<InvokeCallResult> errorT().retinfo("商户单出错:" + esOrder.orderName);
+                logger.error("商户取消订单出错:" + bulkResponse.buildFailureMessage());
+                return RetResult.<InvokeCallResult> errorT().retinfo("商户取消订单出错:" + esOrder.orderName);
             } else {
-                logger.info("商户单成功");
+                logger.info("商户取消订单成功");
                 //写数据库
-                orderDao.acceptBusinessOrder(esOrder,
+                orderDao.voidBusinessOrder(esOrder,
                         [orderStep],
                         dataSourceId,
                         String.valueOf(supplierCode))
@@ -182,7 +202,7 @@ class BE_Order_AcceptOrder implements BusinessExecutor<InvokeCallParams, InvokeC
                 return RetResult.<InvokeCallResult> successT().result(InvokeCallResult.success().data(jsonConvert.convertTo(esOrder)))
             }
         } else {
-            return RetResult.<InvokeCallResult> errorT().retinfo("商户单出错:" + callSuccess["errorMsg"]);
+            return RetResult.<InvokeCallResult> errorT().retinfo("商户取消订单出错:" + callSuccess["errorMsg"]);
         }
     }
 }

+ 166 - 0
conf/script/1000/orderApi/BE_Order_RejectOrder_Douyin.groovy

@@ -0,0 +1,166 @@
+import com.dderp.business.dao.OrderDao
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.StoreService
+import com.dderp.common.api.SupplierInitService
+import com.dderp.common.api.flycat.DouyinService
+import com.dderp.common.api.flycat.OrderSearchService
+import com.dderp.common.api.flycat.OrderService
+import com.dderp.common.api.flycat.OrderStepService
+import com.dderp.common.datas.BusinessOrderStatus
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
+import com.dderp.common.datas.business.PlatformType
+import com.dderp.common.entity.base.InvokeCallParams
+import com.dderp.common.entity.base.InvokeCallResult
+import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.order.OrderStep
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StorePlatform
+import com.dySweetFishPlugin.elasticsearch.ESClient
+import com.dySweetFishPlugin.sql.TableIdService
+import com.dySweetFishPlugin.sql.dao.TunaService
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+import org.elasticsearch.action.bulk.BulkRequestBuilder
+import org.elasticsearch.action.bulk.BulkResponse
+import org.elasticsearch.action.index.IndexRequestBuilder
+import org.elasticsearch.action.support.WriteRequest
+import org.elasticsearch.action.update.UpdateRequestBuilder
+import org.elasticsearch.common.xcontent.XContentType
+import org.rex.RMap
+
+import javax.annotation.Resource
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Order_RejectOrder_Douyin implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource
+    private JsonConvert jsonConvert
+
+    @Resource
+    private TableIdService tableIdService
+
+    @Resource
+    private StoreService storeService
+
+    @Resource
+    private ESClient esClient
+
+    @Resource
+    private SupplierInitService supplierInitService
+
+    @Resource
+    private OrderStepService orderStepService
+
+    @Resource
+    private OrderService orderService
+
+    @Resource
+    private OrderSearchService orderSearchService
+
+    @Resource
+    private DouyinService douyinService
+
+    @Resource
+    private TunaService tunaService
+
+    private OrderDao orderDao
+
+    @Override
+    String scriptName() {
+        return "订单商户拒单"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.ORDER_API
+    }
+
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+        String incomePlatformOrderCode = invokeOrder["order_id"] as String
+        String platformStoreId = invokeOrder["poi_id"] as String
+
+        StorePlatform storePlatform = storeService.getStorePlatformByInvokeInfo(platformStoreId, "DYLK", PlatformType.order.value, supplierCode)
+        if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+
+        RMap searchParams = new RMap();
+        searchParams.set("incomePlatformId", platformStoreId)
+        searchParams.set("incomePlatformOrderCode", incomePlatformOrderCode)
+
+        RetResult<List<BusinessOrder>> orderResult = orderSearchService.searchBusinessOrderList(searchParams, currentUser, dataSourceId, supplierCode, null)
+        if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
+
+        BusinessOrder esOrder = orderResult.result.get(0) //这么查只可能有一个
+
+        if (esOrder.orderStatus != BusinessOrderStatus.init.value)
+            return RetResult.<InvokeCallResult> errorT().retinfo("订单状态[" +
+                    BusinessOrderStatus.getName(esOrder.orderStatus) + "],不允许拒单操作")
+
+        //todo 目前不知道商户拒单是个什么逻辑,暂且认为等同于订单取消
+//        esOrder.setOrderStatus(BusinessOrderStatus.accept.value)
+        esOrder.setVoidFlag(1)
+        BusinessOrder.update(esOrder, currentUser.id)
+
+        OrderStep orderStep = orderStepService.parseOrderStep(esOrder.id, 0,
+                "[" + storePlatform.platformName + "]商家拒绝接单: " + invokeOrder["description"], storePlatform.platformCode, currentUser)
+
+        //持久化
+        //订单主表
+        BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
+
+        UpdateRequestBuilder orderRequest = esClient.getClient().prepareUpdate(
+                supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
+                ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE,
+                String.valueOf(esOrder.getId()))
+                .setDoc(jsonBuilder()
+                        .startObject()
+                        .field("voidFlag", esOrder.voidFlag)
+                        .field("updateBy", esOrder.getUpdateBy())
+                        .field("updateTimeLong", esOrder.getUpdateTimeLong())
+                        .endObject())
+        bulkRequest.add(orderRequest)
+        //订单脚印
+        IndexRequestBuilder orderStepRequest = esClient.getClient()
+                .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_ORDER_STEP_INDEX, 0),
+                        ESKeys.ES_DELIVER_ORDER_STEP_TYPE)
+                .setId(String.valueOf(orderStep.id))
+                .setSource(jsonConvert.convertTo(orderStep), XContentType.JSON)
+        bulkRequest.add(orderStepRequest)
+
+
+        BulkResponse bulkResponse = bulkRequest.get();
+        orderDao = tunaService.generate(OrderDao.class)
+        if (bulkResponse.hasFailures()) {
+            logger.error("商户拒绝接单出错:" + bulkResponse.buildFailureMessage());
+            return RetResult.<InvokeCallResult> errorT().retinfo("商户拒绝接单出错:" + esOrder.orderName);
+        } else {
+            logger.info("商户拒绝接单成功");
+            //写数据库
+            orderDao.voidBusinessOrder(esOrder,
+                    [orderStep],
+                    dataSourceId,
+                    String.valueOf(supplierCode))
+
+
+            return RetResult.<InvokeCallResult> successT().result(InvokeCallResult.success().data(jsonConvert.convertTo(esOrder)))
+        }
+
+    }
+}

+ 132 - 0
conf/script/1000/orderApi/BE_Order_RejectOrder_Request.groovy

@@ -0,0 +1,132 @@
+import com.dderp.business.dao.OrderDao
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.StoreService
+import com.dderp.common.api.SupplierInitService
+import com.dderp.common.api.flycat.DouyinService
+import com.dderp.common.api.flycat.OrderSearchService
+import com.dderp.common.api.flycat.OrderService
+import com.dderp.common.api.flycat.OrderStepService
+import com.dderp.common.datas.BusinessOrderStatus
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
+import com.dderp.common.entity.base.InvokeCallParams
+import com.dderp.common.entity.base.InvokeCallResult
+import com.dderp.common.entity.order.BusinessOrder
+import com.dderp.common.entity.order.OrderStep
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StorePlatform
+import com.dySweetFishPlugin.elasticsearch.ESClient
+import com.dySweetFishPlugin.sql.TableIdService
+import com.dySweetFishPlugin.sql.dao.TunaService
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+import org.elasticsearch.action.bulk.BulkRequestBuilder
+import org.elasticsearch.action.bulk.BulkResponse
+import org.elasticsearch.action.index.IndexRequestBuilder
+import org.elasticsearch.action.support.WriteRequest
+import org.elasticsearch.action.update.UpdateRequestBuilder
+import org.elasticsearch.common.xcontent.XContentType
+
+import javax.annotation.Resource
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Order_RejectOrder_Request implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource
+    private JsonConvert jsonConvert
+
+    @Resource
+    private TableIdService tableIdService
+
+    @Resource
+    private StoreService storeService
+
+    @Resource
+    private ESClient esClient
+
+    @Resource
+    private SupplierInitService supplierInitService
+
+    @Resource
+    private OrderStepService orderStepService
+
+    @Resource
+    private OrderService orderService
+
+    @Resource
+    private OrderSearchService orderSearchService
+
+    @Resource
+    private DouyinService douyinService
+
+    @Resource
+    private TunaService tunaService
+
+    private OrderDao orderDao
+
+    @Override
+    String scriptName() {
+        return "订单商户拒单"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.ORDER_API
+    }
+
+    //params:{idOrder:xxx, rejectReason:[501,502], description:"超出配送范围"}
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+        long idOrder = invokeOrder["idOrder"] as Long
+        RetResult<BusinessOrder> orderResult = orderSearchService.getBusinessOrder(idOrder, currentUser, dataSourceId, supplierCode, null)
+        if (!orderResult.isSuccess()) return RetResult.<InvokeCallResult> errorT().retinfo(orderResult.retinfo)
+
+        BusinessOrder esOrder = orderResult.result
+        if (esOrder.orderStatus != BusinessOrderStatus.init.value)
+            return RetResult.<InvokeCallResult> errorT().retinfo("订单状态[" +
+                    BusinessOrderStatus.getName(esOrder.orderStatus) + "],不允许拒单操作")
+
+        StorePlatform storePlatform = storeService.getStorePlatformInfo(esOrder.incomePlatformId, supplierCode)
+        if (storePlatform == null) return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+
+        //根据订单来源平台,回调平台的接单接口
+        switch (storePlatform.platformCode) {
+            case "DYLK": {
+                //抖音来客
+                def postBody = [
+                        order_id     : esOrder.incomePlatformOrderCode,
+                        reject_reason: [
+                                reason_code: invokeOrder["rejectReason"],
+                                desc       : invokeOrder["description"]
+                        ]
+                ]
+                String responseStr = douyinService.postInvoker("/goodlife/v1/after_sale/order/merchant_reject/", jsonConvert.convertTo(postBody))
+                def response = jsonSlurper.parseText(responseStr)
+                if (response["extra"]["error_code"] as Integer == 0) {
+                    return RetResult.<InvokeCallResult> successT()
+                } else {
+                    //todo 抖音侧调用失败,怎么处理?
+                    logger.error("[抖音来客]商户拒单平台接口调用失败:" + response["extra"]["description"] as String)
+                    return RetResult.<InvokeCallResult> errorT().retinfo("[抖音来客]商户拒单平台接口调用失败:" + response["data"]["description"] as String)
+                }
+            }
+        }
+        return RetResult.<InvokeCallResult> errorT().retinfo("订单来源平台未知!")
+    }
+}

+ 29 - 13
conf/script/1000/orderSearch/BE_ERP_BusinessOrder_Search.groovy

@@ -67,7 +67,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                             .must(QueryBuilders.typeQuery(childESType))
                             .must(QueryBuilders.termsQuery("idOrder", ERPUtils.longArrayToStrArray(idOrders)))
                 })
-                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .executeNonePage()
     }
 
@@ -84,7 +84,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                             .must(QueryBuilders.termsQuery("idOrder", ERPUtils.longArrayToStrArray(idOrders)))
                 })
                 .convertLongExecutor(convertLong) //这里直接写{it.idOrder},只要所有的子类有这个值,groovy应该是可以的,只是看着难受,让调用接口传入转换方法
-                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .execute()
     }
 
@@ -99,7 +99,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                             .must(QueryBuilders.typeQuery(childESType))
                             .must(QueryBuilders.termQuery("idOrder", idOrder))
                 })
-                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .executeNonePage()
     }
 
@@ -143,6 +143,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                 .byEndTime_Create()
                 .byClientName()
                 .byIdClient()
+                .byPlatform()
                 .byVoidFlag()
                 .build()
 
@@ -150,7 +151,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
         //合计金额,所以主表从orderMoney中开始
 
         SearchResponse searchResponse = esClient.getClient()
-                .prepareSearch(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .prepareSearch(supplierService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .setQuery(bqb)
                 .addAggregation(AggregationBuilders.count("sub_count").field("id"))
                 .addAggregation(AggregationBuilders.sum("orderMoneyTotal_Sum").field("orderMoneyTotal"))
@@ -197,10 +198,11 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                             .byEndTime_Create()
                             .byClientName()
                             .byIdClient()
+                            .byPlatform()
                             .byVoidFlag()
                             .build()
                 })
-                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .sortBuilder({
                     switch (orderBySort) {
                         case 'asc': return SortBuilders.fieldSort(orderByField).order(SortOrder.ASC)
@@ -242,7 +244,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                                 .byIdOrders(l.toArray(String[]::new))
                                 .build()
                     })
-                    .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                    .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                     .executeNonePage()
             readOrderOptions(subOrderList, source.dataSourceId, source.supplierCode, source.options)
             if (!subOrderList.isEmpty()) {
@@ -269,7 +271,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                     //这里还需要判断数据权限
                     return qb.build()
                 })
-                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .execute()
 
         if (businessOrder == null) {
@@ -296,7 +298,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                     //获取完成的数据情况
                     return search(null).byOrderCode(orderCode).build()
                 })
-                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_ERP_PRINT_ORDER_INDEX, 1))
+                .index(supplierService.getDateYearESIndex(source.supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 1))
                 .execute()
 
         if (businessOrder == null) {
@@ -336,7 +338,7 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
     //groovy没法用java中类似SendOrderESConditionBuilder的静态方法构造内部类,强制编译不报错,运行还是报错无适配的构造函数,但用常规的类好使,估计是内部类有什么说法
 
     ESConditionBuilder search(RMap searchData) {
-        return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_ERP_PRINT_ORDER_TYPE)))
+        return new ESConditionBuilder(searchData, QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE)))
     }
 
     //这里是做一个示例,表示通过查部件子表查询订单
@@ -371,21 +373,21 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
 
         ESConditionBuilder byIdOrders(String[] idOrders) {
             if (idOrders.length > 0) {
-                qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_ERP_PRINT_ORDER_TYPE).addIds(idOrders))
+                qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(idOrders))
             }
             return this
         }
 
         ESConditionBuilder byIdOrders(List<Long> idOrders) {
             if (!idOrders.isEmpty()) {
-                qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_ERP_PRINT_ORDER_TYPE).addIds(ERPUtils.longArrayToStrArray(ERPUtils.longListToArray(idOrders))))
+                qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(ERPUtils.longArrayToStrArray(ERPUtils.longListToArray(idOrders))))
             }
             return this
         }
 
         ESConditionBuilder byIdOrder(long idOrder) {
             //这里不要判断idOrder是否大于0,防止条件漏了
-            qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_ERP_PRINT_ORDER_TYPE).addIds(String.valueOf(idOrder)))
+            qb = qb.must(QueryBuilders.idsQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE).addIds(String.valueOf(idOrder)))
             return this
         }
 
@@ -501,13 +503,27 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
             return this
         }
 
+        ESConditionBuilder byPlatform() {
+            if (ERPUtils.mapContainKey(searchData, "incomePlatformId")) {
+                long incomePlatformId = searchData.getLong("incomePlatformId")
+                //这里不管是否大于0,都查询
+                qb = qb.must(QueryBuilders.termQuery("incomePlatformId", incomePlatformId))
+            }
+
+            if (ERPUtils.mapContainKey(searchData, "incomePlatformOrderCode")) {
+                String incomePlatformOrderCode = searchData.getString("incomePlatformOrderCode")
+                qb = qb.must(QueryBuilders.termQuery("incomePlatformOrderCode.raw", incomePlatformOrderCode))
+            }
+            return this
+        }
+
         ESConditionBuilder byIdClient(long idClient) {
             qb = qb.must(QueryBuilders.termQuery("idClient", idClient))
             return this
         }
 
         ESConditionBuilder byOrderParentQuery(QueryBuilder qbParent) {
-            qb = qb.must(JoinQueryBuilders.hasParentQuery(ESKeys.ES_ERP_PRINT_ORDER_TYPE, qbParent, false))
+            qb = qb.must(JoinQueryBuilders.hasParentQuery(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, qbParent, false))
             return this
         }
 

+ 192 - 0
conf/script/1000/scriptFiles/refundOrderReason.json

@@ -0,0 +1,192 @@
+[
+  {
+    "orderStatus": 0,
+    "refundReason": [
+      {
+        "code": 501,
+        "desc": "用户信息错误"
+      },
+      {
+        "code": 502,
+        "desc": "商品已经售完"
+      },
+      {
+        "code": 503,
+        "desc": "商家已经打烊"
+      },
+      {
+        "code": 504,
+        "desc": "商家现在太忙"
+      },
+      {
+        "code": 505,
+        "desc": "超出配送范围"
+      }
+    ]
+  },
+  {
+    "orderStatus": 1,
+    "refundReason": [
+      {
+        "code": 501,
+        "desc": "用户信息错误"
+      },
+      {
+        "code": 502,
+        "desc": "商品已经售完"
+      },
+      {
+        "code": 503,
+        "desc": "商家已经打烊"
+      },
+      {
+        "code": 504,
+        "desc": "商家现在太忙"
+      },
+      {
+        "code": 505,
+        "desc": "超出配送范围"
+      },
+      {
+        "code": 506,
+        "desc": "无骑手接单"
+      },
+      {
+        "code": 507,
+        "desc": "用户自身原因要求取消"
+      }
+    ]
+  },
+  {
+    "orderStatus": 11,
+    "refundReason": [
+      {
+        "code": 501,
+        "desc": "用户信息错误"
+      },
+      {
+        "code": 502,
+        "desc": "商品已经售完"
+      },
+      {
+        "code": 503,
+        "desc": "商家已经打烊"
+      },
+      {
+        "code": 504,
+        "desc": "商家现在太忙"
+      },
+      {
+        "code": 507,
+        "desc": "用户自身原因要求取消"
+      },
+      {
+        "code": 508,
+        "desc": "骑手取餐慢"
+      },
+      {
+        "code": 520,
+        "desc": "骑手无法完成配送"
+      }
+    ]
+  },
+  {
+    "orderStatus": 12,
+    "refundReason": [
+      {
+        "code": 501,
+        "desc": "用户信息错误"
+      },
+      {
+        "code": 502,
+        "desc": "商品已经售完"
+      },
+      {
+        "code": 503,
+        "desc": "商家已经打烊"
+      },
+      {
+        "code": 504,
+        "desc": "商家现在太忙"
+      },
+      {
+        "code": 507,
+        "desc": "用户自身原因要求取消"
+      },
+      {
+        "code": 508,
+        "desc": "骑手取餐慢"
+      },
+      {
+        "code": 520,
+        "desc": "骑手无法完成配送"
+      }
+    ]
+  },
+  {
+    "orderStatus": 13,
+    "refundReason": [
+      {
+        "code": 501,
+        "desc": "用户信息错误"
+      },
+      {
+        "code": 502,
+        "desc": "商品已经售完"
+      },
+      {
+        "code": 503,
+        "desc": "商家已经打烊"
+      },
+      {
+        "code": 504,
+        "desc": "商家现在太忙"
+      },
+      {
+        "code": 507,
+        "desc": "用户自身原因要求取消"
+      },
+      {
+        "code": 508,
+        "desc": "骑手取餐慢"
+      },
+      {
+        "code": 520,
+        "desc": "骑手无法完成配送"
+      }
+    ]
+  },
+  {
+    "orderStatus": 14,
+    "refundReason": [
+      {
+        "code": 510,
+        "desc": "配送时间长"
+      },
+      {
+        "code": 511,
+        "desc": "送错商品"
+      },
+      {
+        "code": 512,
+        "desc": "少送商品"
+      },
+      {
+        "code": 513,
+        "desc": "商品出现质量问题"
+      },
+      {
+        "code": 514,
+        "desc": "商家无法开发票"
+      },
+      {
+        "code": 515,
+        "desc": "商品撒漏/破损"
+      },
+      {
+        "code": 516,
+        "desc": "骑手虚假完成配送"
+      }
+    ]
+  }
+]

+ 8 - 0
conf/script/1000/scriptFiles/rejectOrderReason.json

@@ -0,0 +1,8 @@
+// 错误码含义如下
+{
+  "501": "用户信息错误",
+  "502": "商品已经售完",
+  "503": "商家已经打烊",
+  "504": "商家现在太忙",
+  "505": "超出配送范围"
+}

+ 2 - 2
conf/script/1000/storeApi/BE_Store_GenerateStoreAuthUrl_Douyin.groovy

@@ -58,8 +58,8 @@ class BE_Store_GenerateStoreAuthUrl_Douyin implements BusinessExecutor<ProcessId
     }
 
     RetResult<ScriptStringResult> execute(ProcessIdItem source) {
-//        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)) //秒数
-        long currentTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli() //毫秒数
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)) //秒数
+//        long currentTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli() //毫秒数
 
         Map<String, String> query = new HashMap<>();
         query.put("client_key", dyAppId)

+ 4 - 0
conf/sqlroot/com/dderp/business/dao/OrderDao.dql

@@ -77,4 +77,8 @@ updateTime, updateTimeLong ) values ( #{idorder}, #{idworkman}, #{workman}, #{wo
 
 -- [acceptBusinessOrder]
 update $table$ set orderStatus = #{orderstatus}, updateBy = #{updateby},updateTime = #{updatetime},updateTimeLong = #{updatetimelong}
+where id = #{id};
+
+-- [voidBusinessOrder]
+update $table$ set voidFlag = #{voidflag}, updateBy = #{updateby}, updateTime = #{updatetime}, updateTimeLong = #{updatetimelong}
 where id = #{id};

+ 9 - 0
ddBusiness/src/main/java/com/dderp/business/dao/OrderDao.java

@@ -56,4 +56,13 @@ public interface OrderDao extends DaoRepository {
     int acceptBusinessOrder(BusinessOrder businessOrder,
                             List<OrderStep> stepList,
                             @DatabaseShardingBy String dataSourceId, String tableKey);
+
+
+    @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = OrderDao.class, sql = "voidBusinessOrder", table = "deBusinessOrder", tableParam = 4, params = {1}, sort = 1)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 4, params = {2}, sort = 2)
+    int voidBusinessOrder(BusinessOrder businessOrder,
+                            List<OrderStep> stepList,
+                            @DatabaseShardingBy String dataSourceId, String tableKey);
 }

+ 0 - 51
ddBusiness/src/main/java/com/dderp/business/service/StoreServiceImpl.java

@@ -667,57 +667,6 @@ public class StoreServiceImpl extends BaseService implements StoreService {
     }
 
     @Override
-    public RetResult<StorePlatform> addStorePlatform(StorePlatform storePlatform, ERPTokenUser currentUser, String dataSourceId, long supplierCode) {
-        StorePlatform esInfo = this.getESOneInfo(esClient, jsonConvert,
-                StorePlatform.class,
-                (a) -> {
-                    BoolQueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_PLATFORM_INFO_TYPE));
-                    qb.must(QueryBuilders.termQuery("idPlatformInfo", storePlatform.getIdPlatformInfo()));
-                    return qb;
-                },
-                keysService.getESKey(ESKeys.ES_DELIVER_PLATFORM_INFO_INDEX, supplierCode),
-                null);
-        if (esInfo != null)
-            return RetResult.<StorePlatform>errorT().retinfo("此平台已开通:" + storePlatform.getPlatformName());
-
-        storePlatform.setId(tableIdService.getTableIdMulti("tbStorePlatform.id", 1, dataSourceId, String.valueOf(supplierCode)));
-        StorePlatform.create(storePlatform, currentUser.getId());
-        storePlatform.setEnableStatue(0);
-
-        BulkRequestBuilder bulkRequest = esClient.getClient().prepareBulk().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
-
-        bulkRequest.add(esClient.getClient().prepareIndex(
-                        keysService.getESKey(ESKeys.ES_DELIVER_STORE_PLATFORM_INDEX, supplierCode), ESKeys.ES_DELIVER_STORE_PLATFORM_TYPE)
-                .setId(String.valueOf(storePlatform.getId()))
-                .setSource(jsonConvert.convertTo(storePlatform), XContentType.JSON));
-
-        storePlatform.getRequireList().forEach(x -> {
-            x.setId(tableIdService.getTableIdMulti("tbStorePlatformRequire.id", 1, dataSourceId, String.valueOf(supplierCode)));
-            x.setIdStore(storePlatform.getIdStore());
-            x.setIdStorePlatform(storePlatform.getId());
-            StorePlatformRequire.create(x, currentUser.getId());
-
-            bulkRequest.add(esClient.getClient().prepareIndex(
-                            keysService.getESKey(ESKeys.ES_DELIVER_STORE_PLATFORM_INDEX, supplierCode), ESKeys.ES_DELIVER_STORE_PLATFORM_REQUIRE_TYPE)
-                    .setId(String.valueOf(x.getId()))
-                    .setParent(String.valueOf(storePlatform.getId()))
-                    .setSource(jsonConvert.convertTo(storePlatform), XContentType.JSON));
-        });
-
-        BulkResponse bulkResponse = bulkRequest.get();
-
-        if (bulkResponse.hasFailures()) {
-            logger.error("门店开通平台出错:" + bulkResponse.buildFailureMessage());
-            return RetResult.<StorePlatform>errorT().retinfo("门店开通平台出错:" + storePlatform.getPlatformName());
-        } else {
-            logger.info("门店开通平台成功");
-            //写数据库
-            storeDao.addStorePlatform(storePlatform, storePlatform.getRequireList(), dataSourceId, supplierCode);
-            return RetResult.successT();
-        }
-    }
-
-    @Override
     public RetResult<StorePlatform> configStorePlatform(StorePlatform storePlatform, ERPTokenUser currentUser, String dataSourceId, long supplierCode) {
         StorePlatform esInfo = this.getStorePlatformInfo(storePlatform.getId(), supplierCode);
         if (esInfo == null) {

+ 0 - 2
ddCommon/src/main/java/com/dderp/common/api/StoreService.java

@@ -67,8 +67,6 @@ public interface StoreService extends ScriptService {
 
     StorePlatform getStorePlatformByInvokeInfo(String platformStoreId, String platformCode, int platformType, long supplierCode);
 
-    RetResult<StorePlatform> addStorePlatform(StorePlatform storePlatform, ERPTokenUser currentUser, String dataSourceId, long supplierCode);
-
     RetResult<StorePlatform> configStorePlatform(StorePlatform storePlatform, ERPTokenUser currentUser, String dataSourceId, long supplierCode);
     //endregion
 

+ 0 - 15
ddWebCore/src/main/java/com/dderp/webcore/rest/StoreRest.java

@@ -234,21 +234,6 @@ public class StoreRest extends BaseService {
     //endregion
 
     //region 门店平台
-    @RestMapping(name = "addStorePlatform", auth = true, sort = 21, comment = "门店开通平台", methods = {"POST"})
-    @WebApiBean(result = true, type = StorePlatform.class)
-    public CompletableFuture<RMap> addStorePlatform(
-            @RestParam(name = "storePlatform", comment = "门店平台信息") StorePlatform storePlatform,
-            @RestParam(name = "&", comment = "当前用户,不需要传入") ERPTokenUser currentUser,
-            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
-            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
-        return CompletableFuture.supplyAsync(
-                () -> {
-                    RetResult<StorePlatform> result = storeService.addStorePlatform(storePlatform, currentUser, dataSourceId, Long.parseLong(supplierCode));
-                    if (!result.isSuccess()) return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
-                    return RMapUtils.successV2(result.getResult(), null, null);
-                }, getExecutor()
-        );
-    }
 
     @RestMapping(name = "configStorePlatform", auth = true, sort = 22, comment = "修改门店平台", methods = {"POST"})
     @WebApiBean(result = true, type = StorePlatform.class)

+ 26 - 0
ddWebCore/src/main/java/com/dderp/webcore/servlet/OrderCallServlet.java

@@ -3,8 +3,11 @@ package com.dderp.webcore.servlet;
 import com.dderp.common.api.NoSqlKeysService;
 import com.dderp.common.api.StoreService;
 import com.dderp.common.api.flycat.DouyinService;
+import com.dderp.common.api.flycat.OrderService;
 import com.dderp.common.datas.ERPHeader;
 import com.dderp.common.datas.RedisKeys;
+import com.dderp.common.entity.base.InvokeCallParams;
+import com.dderp.common.entity.base.InvokeCallResult;
 import com.dderp.common.entity.invoke.douyin.DouyinCallBody;
 import com.dderp.common.entity.order.BusinessOrder;
 import com.dderp.common.entity.site.ERPTokenUser;
@@ -21,6 +24,8 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ForkJoinPool;
@@ -45,6 +50,9 @@ public class OrderCallServlet extends HttpServlet {
     @Resource
     private StoreService storeService;
 
+    @Resource
+    private OrderService orderService;
+
     @Resource(name = "property.douyin.appSecret")
     private String douyinAppSecret;
 
@@ -133,10 +141,28 @@ public class OrderCallServlet extends HttpServlet {
             }
             case "life_takeout_order_merchant_receive": {
                 //商户接单消息
+                CompletableFuture.runAsync(() -> {
+                    InvokeCallParams callParams = new InvokeCallParams();
+                    callParams.setBusinessMethod("Order_AcceptOrder_Douyin");
+                    callParams.setParams(callBody.getContent());
+                    RetResult<InvokeCallResult> result = orderService.callOrder(callParams, currentUser, dataSourceId, supplierCode);
+                    if (result.isSuccess())
+                        logger.info("[抖音来客]商户接单成功");
+                    else logger.error("[抖音来客]商户接单失败:" + result.getRetinfo());
+                });
                 break;
             }
             case "life_takeout_order_merchant_refuse": {
                 //商户拒单消息
+                CompletableFuture.runAsync(() -> {
+                    InvokeCallParams callParams = new InvokeCallParams();
+                    callParams.setBusinessMethod("Order_RejectOrder_Douyin");
+                    callParams.setParams(callBody.getContent());
+                    RetResult<InvokeCallResult> result = orderService.callOrder(callParams, currentUser, dataSourceId, supplierCode);
+                    if (result.isSuccess())
+                        logger.info("[抖音来客]商户拒单成功");
+                    else logger.error("[抖音来客]商户拒单失败:" + result.getRetinfo());
+                });
                 break;
             }
             case "life_trade_refund_complete": {