Bläddra i källkod

Merge remote-tracking branch 'origin/master'

jlutt@163.com 2 år sedan
förälder
incheckning
04ba844881

+ 188 - 0
conf/script/1000/orderApi/BE_Order_AcceptOrder.groovy

@@ -0,0 +1,188 @@
+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 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> {
+
+    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
+        esOrder.setOrderStatus(BusinessOrderStatus.accept.value)
+        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)
+
+
+        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 response = jsonSlurper.parseText(responseStr)
+                if (response["data"]["error_code"] as Integer == 0) {
+                    callSuccess["success"] = true
+                } else {
+                    //todo 抖音侧调用失败,怎么处理?
+                    logger.error("[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String)
+                    callSuccess["success"] = false
+                    callSuccess["errorMsg"] = "[抖音来客]商户接单平台接口调用失败:" + response["data"]["description"] as String
+                }
+
+                break;
+            }
+        }
+
+        if (callSuccess["success"]) {
+            //持久化
+            //订单主表
+            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)))
+            }
+        } else {
+            return RetResult.<InvokeCallResult> errorT().retinfo("商户接单出错:" + callSuccess["errorMsg"]);
+        }
+    }
+}

+ 1 - 1
conf/script/1000/orderApi/BE_Order_CreateOrder_Douyin.groovy

@@ -168,7 +168,7 @@ class BE_Order_CreateOrder_Douyin implements BusinessExecutor<ProcessStringItem,
 
         businessOrder.setDetailItemList(itemList)
 
-        OrderStep orderStep = orderStepService.parseOrderStep(businessOrder.id, 0, "抖音来客顾客完成下单,平台接单完成", "DYLK", currentUser)
+        OrderStep orderStep = orderStepService.parseOrderStep(businessOrder.id, 0, "[抖音来客]顾客完成付款下单", "DYLK", currentUser)
 
         //持久化
         //订单主表

+ 1 - 0
conf/script/1000/storeApi/BE_Store_BindStorePlatform_Douyin.groovy

@@ -87,6 +87,7 @@ class BE_Store_BindStorePlatform_Douyin implements BusinessExecutor<ProcessStrin
         StorePlatform storePlatform = new StorePlatform()
         storePlatform.setId(tableIdService.getTableIdMulti("tbStorePlatform.id", 1, dataSourceId, String.valueOf(supplierCode)))
         storePlatform.setIdStore(idStore)
+        storePlatform.setPlatformStoreId(invokeContent["poi_id"] as String)
         storePlatform.setIdPlatformInfo(platformInfo.id)
         storePlatform.setPlatformName(platformInfo.platformName)
         storePlatform.setPlatformCode(platformInfo.platformCode)

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

@@ -58,7 +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().toEpochSecond(ZoneOffset.ofHours(8)) //秒数
+        long currentTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli() //毫秒数
 
         Map<String, String> query = new HashMap<>();
         query.put("client_key", dyAppId)
@@ -66,7 +67,7 @@ class BE_Store_GenerateStoreAuthUrl_Douyin implements BusinessExecutor<ProcessId
         query.put("charset", "UTF-8")
         query.put("solution_key", "5")
         query.put("out_shop_id", String.valueOf(source.id))
-        query.put("permission_keys", String.join("1,2,4,5,6,7,8,10,11,15,16"));
+        query.put("permission_keys", "1,2,4,5,6,7,8,10,11,15,16")
 //        query.put("extra", dto.getExtra());
 
         String signResult = DouyinTools.SignV2(dyAppSecret, "", query);

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

@@ -74,3 +74,7 @@ updateTime, updateTimeLong ) values ( #{idorder}, #{idworkman}, #{workman}, #{wo
 #{workmemo}, #{workexplain}, #{createby},
 #{createtime}, #{createtimelong}, #{updateby},
 #{updatetime}, #{updatetimelong} );
+
+-- [acceptBusinessOrder]
+update $table$ set orderStatus = #{orderstatus}, updateBy = #{updateby},updateTime = #{updatetime},updateTimeLong = #{updatetimelong}
+where id = #{id};

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

@@ -47,4 +47,13 @@ public interface OrderDao extends DaoRepository {
                          List<OrderDetailItem> items,
                          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 = "acceptBusinessOrder", table = "deBusinessOrder", tableParam = 4, params = {1}, sort = 1)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 4, params = {2}, sort = 2)
+    int acceptBusinessOrder(BusinessOrder businessOrder,
+                            List<OrderStep> stepList,
+                            @DatabaseShardingBy String dataSourceId, String tableKey);
 }

+ 32 - 23
ddBusiness/src/main/java/com/dderp/business/service/StoreServiceImpl.java

@@ -42,6 +42,7 @@ import org.rex.RMap;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 
@@ -79,7 +80,7 @@ public class StoreServiceImpl extends BaseService implements StoreService {
     public List<StoreBrand> queryStoreBrandList(RMap params, PageFlipper pageFlipper, long supplierCode) {
         return searchESList(esClient, jsonConvert,
                 StoreBrand.class,
-                null,
+                params,
                 ((sd) -> {
                     BoolQueryBuilder qb = QueryBuilders.boolQuery();
                     qb = qb.must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_STORE_BRAND_INDEX));
@@ -100,6 +101,7 @@ public class StoreServiceImpl extends BaseService implements StoreService {
                     return qb;
                 }),
                 keysService.getESKey(ESKeys.ES_DELIVER_STORE_BRAND_TYPE, supplierCode),
+                pageFlipper,
                 (() -> SortBuilders.fieldSort("id").order(SortOrder.DESC)));
     }
 
@@ -312,29 +314,32 @@ public class StoreServiceImpl extends BaseService implements StoreService {
                 (() -> SortBuilders.fieldSort("id").order(SortOrder.DESC))
         );
 
-        long[] idStoreArray = idStores.stream().mapToLong(Long::valueOf).toArray();
-        String idStoreStr = idStores.stream().map(String::valueOf).collect(Collectors.joining(","));
-        Map<Long, List<StorePlatform>> storePlatformMap = searchESMapList(idStoreArray, esClient, jsonConvert,
-                StorePlatform.class,
-                null,
-                ((sd) -> {
-                    BoolQueryBuilder qb = QueryBuilders.boolQuery();
-                    qb = qb.must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_STORE_PLATFORM_TYPE))
-                            .must(QueryBuilders.termsQuery("idStore", idStoreStr.split(",")));
+        List<ViewStoreInfo> viewStoreInfoList = new ArrayList<>();
 
-                    return qb;
-                }),
-                (StorePlatform::getIdStore),
-                new String[]{keysService.getESKey(ESKeys.ES_DELIVER_STORE_INFO_INDEX, supplierCode)},
-                (SortBuilderExecutor) null);
+        if (idStores.size() > 0) {
+            long[] idStoreArray = idStores.stream().mapToLong(Long::valueOf).toArray();
+            String idStoreStr = idStores.stream().map(String::valueOf).collect(Collectors.joining(","));
+            Map<Long, List<StorePlatform>> storePlatformMap = searchESMapList(idStoreArray, esClient, jsonConvert,
+                    StorePlatform.class,
+                    null,
+                    ((sd) -> {
+                        BoolQueryBuilder qb = QueryBuilders.boolQuery();
+                        qb = qb.must(QueryBuilders.typeQuery(ESKeys.ES_DELIVER_STORE_PLATFORM_TYPE))
+                                .must(QueryBuilders.termsQuery("idStore", idStoreStr.split(",")));
 
-        List<ViewStoreInfo> viewStoreInfoList = new ArrayList<>();
+                        return qb;
+                    }),
+                    (StorePlatform::getIdStore),
+                    new String[]{keysService.getESKey(ESKeys.ES_DELIVER_STORE_INFO_INDEX, supplierCode)},
+                    (SortBuilderExecutor) null);
+
+            storeInfoList.forEach(x -> {
+                x.setPlatformList(storePlatformMap.get(x.getId()));
+                ViewStoreInfo viewStoreInfo = new ViewStoreInfo(x);
+                viewStoreInfoList.add(viewStoreInfo);
+            });
+        }
 
-        storeInfoList.forEach(x -> {
-            x.setPlatformList(storePlatformMap.get(x.getId()));
-            ViewStoreInfo viewStoreInfo = new ViewStoreInfo(x);
-            viewStoreInfoList.add(viewStoreInfo);
-        });
 
         return viewStoreInfoList;
     }
@@ -397,6 +402,9 @@ public class StoreServiceImpl extends BaseService implements StoreService {
         if (esInfo != null) return RetResult.<StoreInfo>errorT().retinfo("已存在同名的门店");
 
         storeInfo.setId(tableIdService.getTableIdMulti("tbStoreInfo.id", 1, dataSourceId, String.valueOf(supplierCode)));
+        if (storeInfo.getLocation() != null) {
+            storeInfo.setLocationStr(jsonConvert.convertTo(storeInfo.getLocation()));
+        }
         StoreInfo.create(storeInfo, currentUser.getId());
         storeInfo.setEnableInvoice(0);
 
@@ -429,13 +437,14 @@ public class StoreServiceImpl extends BaseService implements StoreService {
     }
 
     @Override
-    public RetResult<StorePlatform> bindStorePlatformDouyin(String requestContent, String dataSourceId, long supplierCode) {
-        return handleScript("Store_BindStorePlatformDouyin", ERPModule.STORE_API,
+    public RetResult<StorePlatform> bindStorePlatformDouyin(String requestContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
+        return handleScript("Store_BindStorePlatform_Douyin", ERPModule.STORE_API,
                 dataSourceId, supplierCode,
                 () -> ProcessStringItem.newBuilder()
                         .itemValue(requestContent)
                         .dataSourceId(dataSourceId)
                         .supplierCode(supplierCode)
+                        .currentUser(currentUser)
                         .build()
         );
     }

+ 6 - 4
ddBusiness/src/main/java/com/dderp/business/service/flycat/DouyinServiceImpl.java

@@ -8,7 +8,7 @@ import com.dderp.common.entity.base.ProcessStringItem;
 import com.dderp.common.entity.invoke.douyin.DouyinTokenRequest;
 import com.dderp.common.entity.invoke.douyin.DouyinTokenResponse;
 import com.dderp.common.entity.order.BusinessOrder;
-import com.dderp.common.entity.store.StorePlatform;
+import com.dderp.common.entity.site.ERPTokenUser;
 import com.dderp.common.http.HttpTools;
 import com.dySweetFishPlugin.redis.RedisService;
 import com.dySweetFishPlugin.tool.lang.ThreadFactoryWithNamePrefix;
@@ -149,7 +149,8 @@ public class DouyinServiceImpl extends BaseService implements DouyinService {
         return token;
     }
 
-    private String postInvoker(String subUrl, String body) {
+    @Override
+    public String postInvoker(String subUrl, String body) {
         Map<String, String> header = new HashMap<>();
         header.put("access-token", getAccessToken());
         header.put("log_id", String.valueOf(new Date().getTime()));
@@ -158,19 +159,20 @@ public class DouyinServiceImpl extends BaseService implements DouyinService {
         try {
             return HttpTools.postHttpContentAsync(reqUrl + subUrl, header, body).get(20, TimeUnit.SECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
-            logger.error("请求抖音接口[" + subUrl + "]失败", e);
+            logger.error("请求抖音来客接口[" + subUrl + "]失败", e);
             return null;
         }
     }
 
     @Override
-    public RetResult<BusinessOrder> importOrderFromDouyin(String requestContent, String dataSourceId, long supplierCode) {
+    public RetResult<BusinessOrder> importOrderFromDouyin(String requestContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
         return handleScript("Order_CreateOrder_Douyin", ERPModule.ORDER_API,
                 dataSourceId, supplierCode,
                 () -> ProcessStringItem.newBuilder()
                         .itemValue(requestContent)
                         .dataSourceId(dataSourceId)
                         .supplierCode(supplierCode)
+                        .currentUser(currentUser)
                         .build()
         );
     }

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

@@ -1,6 +1,5 @@
 package com.dderp.common.api;
 
-import com.dderp.common.entity.base.ProcessStringItem;
 import com.dderp.common.entity.base.ScriptStringResult;
 import com.dderp.common.entity.site.ERPTokenUser;
 import com.dderp.common.entity.store.*;
@@ -45,7 +44,7 @@ public interface StoreService extends ScriptService {
     RetResult<ScriptStringResult> generateStoreAuthUrl_Douyin(long idStore, String dataSourceId, long supplierCode);
 
 
-    RetResult<StorePlatform> bindStorePlatformDouyin(String requestContent, String dataSourceId, long supplierCode);
+    RetResult<StorePlatform> bindStorePlatformDouyin(String requestContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
 
     /**
      * 获取门店开票信息

+ 3 - 2
ddCommon/src/main/java/com/dderp/common/api/flycat/DouyinService.java

@@ -1,12 +1,13 @@
 package com.dderp.common.api.flycat;
 
 import com.dderp.common.entity.order.BusinessOrder;
-import com.dderp.common.entity.store.StorePlatform;
+import com.dderp.common.entity.site.ERPTokenUser;
 import com.sweetfish.service.RetResult;
 import com.sweetfish.service.Service;
 
 public interface DouyinService extends Service {
-    RetResult<BusinessOrder> importOrderFromDouyin(String requestContent, String dataSourceId, long supplierCode);
+    String postInvoker(String subUrl, String body);
+    RetResult<BusinessOrder> importOrderFromDouyin(String requestContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
 
 
 

+ 1 - 1
ddCommon/src/main/java/com/dderp/common/datas/BusinessOrderStatus.java

@@ -16,7 +16,7 @@ public enum BusinessOrderStatus {
     /**
      * 平台商户已接单
      */
-    receive("商户接单",1),
+    accept("商户接单", 1),
 
     /**
      * 选择了配送平台,下单,等待配送平台回调

+ 37 - 19
ddWebCore/src/main/java/com/dderp/webcore/servlet/OrderCallServlet.java

@@ -6,11 +6,14 @@ import com.dderp.common.api.flycat.DouyinService;
 import com.dderp.common.datas.ERPHeader;
 import com.dderp.common.datas.RedisKeys;
 import com.dderp.common.entity.invoke.douyin.DouyinCallBody;
+import com.dderp.common.entity.order.BusinessOrder;
 import com.dderp.common.entity.site.ERPTokenUser;
+import com.dderp.common.entity.store.StorePlatform;
 import com.dySweetFishPlugin.redis.RedisService;
 import com.sweetfish.convert.json.JsonConvert;
 import com.sweetfish.net.WorkThread;
 import com.sweetfish.net.http.*;
+import com.sweetfish.service.RetResult;
 import com.sweetfish.util.AnyValue;
 import com.sweetfish.util.AutoLoad;
 import org.apache.commons.codec.digest.DigestUtils;
@@ -18,8 +21,7 @@ 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;
 
@@ -69,34 +71,34 @@ public class OrderCallServlet extends HttpServlet {
     //当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
 
     @HttpMapping(url = "/order/douyinCall", methods = {"POST"}, comment = "回调入口")
-    public void sfCall(HttpRequest request, HttpResponse response) {
+    public void douyinCall(HttpRequest request, HttpResponse response) {
         //简单的入口,估计也没多少接口提供出去,这里多加一层方法包一下,是担心后续会修改
         logger.info(request);
         String body = request.getBodyUTF8();
-        Map<String, Object> bodyMap = jsonConvert.convertFrom(HashMap.class, body);
+//        Map<String, Object> bodyMap = jsonConvert.convertFrom(HashMap.class, body);
 
-        response.finish(bodyMap.get("content"));
+//        response.finish(bodyMap.get("content"));
 
-        /*  以上为接口接入验证代码,以下为正式带验签代码  */
+        /*  以上为接口接入验证代码,以下为正式带验签代码 */
         String douyinSign = request.getHeader("X-Douyin-Signature");
         String douyinMsgId = request.getHeader("Msg-Id");
         String dataSourceId = request.getHeader(ERPHeader.HTTPHEADER_DATASOURCE);
         long supplierCode = Long.parseLong(request.getHeader(ERPHeader.HTTPHEADER_SUPPLIER));
 
-        if (redisService.exists(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode))) {
+        if (redisService.exists(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode, true) + douyinMsgId)) {
             //重复消息,不处理
-            response.finish();
+            logger.info("收到重复推送信息,不予处理[" + douyinMsgId + "]");
+            response.finish(200, "success");
             return;
         }
         //1小时过期,应该够了吧
-        redisService.expire(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode), 3600);
-
+        redisService.setex(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode, true) + douyinMsgId, 3600, 1);
 
         String signData = douyinAppSecret + body;
         String sign = DigestUtils.sha1Hex(signData);
         if (!sign.equals(douyinSign)) {
             logger.error("[抖音来客]Webhooks推送消息验签失败");
-            response.finish();
+            response.finish(200, "success");
             return;
         }
 
@@ -104,40 +106,56 @@ public class OrderCallServlet extends HttpServlet {
         logger.info("[抖音来客]Webhooks推送消息:[" + callBody.getEvent() + "]");
         logger.info(callBody.getContent());
 
+        //造一个系统后台用户
+        ERPTokenUser currentUser = new ERPTokenUser();
+        currentUser.setId(-100);
+        currentUser.setUserName("抖音来客");
+
         switch (callBody.getEvent()) {
             case "life_saas_cooperate_auth_with_bind": {
                 //能力授权&门店绑定消息
-                storeService.bindStorePlatformDouyin(callBody.getContent(), dataSourceId, supplierCode);
+                CompletableFuture.runAsync(() -> {
+                    RetResult<StorePlatform> result = storeService.bindStorePlatformDouyin(callBody.getContent(), dataSourceId, supplierCode, currentUser);
+                    if (result.isSuccess()) logger.info("[抖音来客]平台门店绑定成功");
+                    else logger.error("[抖音来客]平台门店绑定失败:" + result.getRetinfo());
+                });
                 break;
             }
             case "life_takeout_order_pay_success": {
                 //用户下单消息
-                douyinService.importOrderFromDouyin(callBody.getContent(), dataSourceId, supplierCode);
+                CompletableFuture.runAsync(() -> {
+                    RetResult<BusinessOrder> result = douyinService.importOrderFromDouyin(callBody.getContent(), dataSourceId, supplierCode, currentUser);
+                    if (result.isSuccess())
+                        logger.info("[抖音来客]客户下单成功,订单编号[" + result.getResult().getOrderCode() + "]");
+                    else logger.error("[抖音来客]客户下单失败:" + result.getRetinfo());
+                });
                 break;
             }
-            case "life_takeout_order_merchant_receive":{
+            case "life_takeout_order_merchant_receive": {
                 //商户接单消息
                 break;
             }
-            case "life_takeout_order_merchant_refuse":{
+            case "life_takeout_order_merchant_refuse": {
                 //商户拒单消息
                 break;
             }
-            case "life_trade_refund_complete":{
+            case "life_trade_refund_complete": {
                 //订单已取消消息
                 break;
             }
-            case "life_trade_takeout_order_finish":{
+            case "life_trade_takeout_order_finish": {
                 //订单完成消息
                 break;
             }
-            case "life_trade_takeout_order_modify":{
+            case "life_trade_takeout_order_modify": {
                 //订单修改消息,主要是修改配送信息
                 break;
             }
         }
 
         //无论如何,最终还得返回个200
-        response.finish();
+        response.finish(200, "success");
+
+
     }
 }