Explorar o código

新tokenService
新增订单折扣信息

Veronique %!s(int64=2) %!d(string=hai) anos
pai
achega
bd601c8feb
Modificáronse 29 ficheiros con 943 adicións e 31 borrados
  1. 9 0
      conf/KeyId.xml
  2. 35 0
      conf/apiFiles/orderProcess.xml
  3. 43 0
      conf/esTemplate/orderdiscount.json
  4. 6 0
      conf/esTemplate/platforminfo.json
  5. 6 4
      conf/platform.properties
  6. 7 2
      conf/rediskeys.properties
  7. 1 0
      conf/script/1000/init/Init_16_BusinessOrder.groovy
  8. 35 1
      conf/script/1000/orderApi/BE_Order_CreateOrder_DYLK.groovy
  9. 2 1
      conf/script/1000/orderApi/BE_Order_DeliveryChange_DYLK.groovy
  10. 4 0
      conf/script/1000/orderSearch/BE_ERP_BusinessOrder_Search.groovy
  11. 103 0
      conf/script/1000/platformToken/BE_Invoke_GetInvoker_DYLK.groovy
  12. 106 0
      conf/script/1000/platformToken/BE_Invoke_PostInvoker_DYLK.groovy
  13. 141 0
      conf/script/1000/platformToken/BE_Token_RefreshAccessToken_DYLK.groovy
  14. 3 3
      conf/script/1000/storeApi/BE_Store_GenerateStoreAuthUrl_DYLK.groovy
  15. 9 0
      conf/sqlroot/com/dderp/business/dao/OrderDao.dql
  16. 2 2
      conf/sqlroot/com/dderp/business/dao/PlatformDao.dql
  17. 31 2
      conf/初始化业务表.sql
  18. 7 5
      ddBusiness/src/main/java/com/dderp/business/dao/OrderDao.java
  19. 3 3
      ddBusiness/src/main/java/com/dderp/business/service/flycat/IncomePlatformServiceImpl.java
  20. 230 0
      ddBusiness/src/main/java/com/dderp/business/service/flycat/PlatformAccessTokenServiceImpl.java
  21. 13 0
      ddCommon/src/main/java/com/dderp/common/api/flycat/PlatformAccessTokenService.java
  22. 2 1
      ddCommon/src/main/java/com/dderp/common/datas/ERPModule.java
  23. 1 0
      ddCommon/src/main/java/com/dderp/common/datas/ESKeys.java
  24. 13 0
      ddCommon/src/main/java/com/dderp/common/datas/RedisKeys.java
  25. 11 0
      ddCommon/src/main/java/com/dderp/common/entity/order/BusinessOrder.java
  26. 94 0
      ddCommon/src/main/java/com/dderp/common/entity/order/OrderDiscount.java
  27. 24 6
      ddCommon/src/main/java/com/dderp/common/entity/platform/PlatformInfo.java
  28. 1 0
      ddWebCore/src/main/java/com/dderp/webcore/rest/flycat/OrderRest.java
  29. 1 1
      ddWebCore/src/main/java/com/dderp/webcore/servlet/OrderCallServlet.java

+ 9 - 0
conf/KeyId.xml

@@ -406,4 +406,13 @@
             <TableWhere/>
         </Table>
     </Item>
+
+    <Item>
+        <IDName>deOrderDiscount.id</IDName>
+        <Table>
+            <TableName>v_deorderdiscount</TableName>
+            <IDFieldName>id</IDFieldName>
+            <TableWhere/>
+        </Table>
+    </Item>
 </Items>

+ 35 - 0
conf/apiFiles/orderProcess.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<apis>
+    <api>
+        <!-- 接口名称 -->
+        <methodName>门店接单</methodName>
+        <!-- 排序 -->
+        <sort>10</sort>
+        <!-- 使用的脚本业务名称 不要BE_ -->
+        <businessMethod>Order_AcceptOrder_Request</businessMethod>
+        <!-- 是否需要token,留着空表示不需要,需要token的写上获取token的方法,不能不要该节点 -->
+        <tokenFrom></tokenFrom>
+        <!-- 是否需要分页,留着空表示不需要,随便写的啥表示需要分页参数,不能不要该节点 -->
+        <pageFrom></pageFrom>
+
+        <!--
+            参数信息,paramOnly和params是互斥的,有的时候我们需要的参数是单个类的json就完事,但是又懒得一个一个写param,可以只用paramOnly标识,里面输入带包类名,
+            然后在类里面用@ApiPlce("脚本业务名称")标记上需要的字段即可,不能不要该节点,使用params时,paramOnly写空即可。
+        -->
+        <paramOnly></paramOnly>
+        <!--
+            参数信息,
+        -->
+        <params>
+            <param>
+                <!-- 参数说明 -->
+                <paramComment>订单id</paramComment>
+                <!-- 参数名称 -->
+                <paramKey>idOrder</paramKey>
+                <!-- 参数类型 "Integer", "Long", "Double", "Float", "Boolean", "String" 为基础类型 -->
+                <paramKind>Long</paramKind>
+            </param>
+        </params>
+
+    </api>
+</apis>

+ 43 - 0
conf/esTemplate/orderdiscount.json

@@ -0,0 +1,43 @@
+{
+  "orderdiscount": {
+    "_parent": {
+      "type": "info"
+    },
+    "properties": {
+      "id": {
+        "type": "long"
+      },
+      "idOrder": {
+        "type": "long"
+      },
+      "discountName": {
+        "type": "text",
+        "index": "not_analyzed"
+      },
+      "discountType": {
+        "type": "integer"
+      },
+      "discountAmount": {
+        "type": "integer"
+      },
+      "merchantDiscountAmount": {
+        "type": "integer"
+      },
+      "platformDiscountAmount": {
+        "type": "integer"
+      },
+      "createBy": {
+        "type": "long"
+      },
+      "createTimeLong": {
+        "type": "long"
+      },
+      "updateBy": {
+        "type": "long"
+      },
+      "updateTimeLong": {
+        "type": "long"
+      }
+    }
+  }
+}

+ 6 - 0
conf/esTemplate/platforminfo.json

@@ -40,6 +40,12 @@
       "voidFlag": {
         "type": "integer"
       },
+      "needAccessToken": {
+        "type": "integer"
+      },
+      "refreshTokenSeconds": {
+        "type": "integer"
+      },
       "createBy": {
         "type": "long"
       },

+ 6 - 4
conf/platform.properties

@@ -1,9 +1,11 @@
 #抖音来客
 #请求地址
-douyin.reqUrl=https://open.douyin.com
+DYLK.reqUrl=https://open.douyin.com
 #商户授权url地址
-douyin.storeBindUrl=https://auth.dylk.com/auth-isv
+DYLK.storeBindUrl=https://auth.dylk.com/auth-isv
 #appId
-douyin.appId=awd61ulpox5tdzhe
+DYLK.appId=awd61ulpox5tdzhe
 #appSecret
-douyin.appSecret=ab3e8b197052198143df8cdcba350fb6
+DYLK.appSecret=ab3e8b197052198143df8cdcba350fb6
+#token刷新间隔,秒
+DYLK.tokenRefreshSeconds=5400

+ 7 - 2
conf/rediskeys.properties

@@ -114,11 +114,16 @@ redis.deliver.platforminfo = dydeliver:deliver:platforminfo
 redis.deliver.platformrequire = dydeliver:deliver:platformrequire
 #门店品牌
 redis.deliver.storebrand = dydeliver:deliver:storebrand
-#抖音上一次刷新token的时间
+#抖音上一次刷新token的时间,将废弃
 redis.douyin.lasttokendate = dydeliver:douyin:lasttokendate
-#抖音当前的token
+#抖音当前的token,将废弃
 redis.douyin.accesstoken = dydeliver:douyin:accesstoken
 
+#平台上一次刷新token的时间
+redis.platform.lasttokendate = dydeliver:platform:lasttokendate
+#平台当前的token
+redis.platform.accesstoken = dydeliver:platform:accesstoken
+
 redis.erp.order.shop.sequence = dydeliver:erp:order:shop:sequence
 
 redis.erp.working.order = dydeliver:erp:working:order

+ 1 - 0
conf/script/1000/init/Init_16_BusinessOrder.groovy

@@ -15,6 +15,7 @@ static def createRunnable(ESClient esClient, RedisService redisService, Supplier
                 Utility.ofMap(ESKeys.ES_DELIVER_BUSINESS_ORDER_TYPE, "businessorder.json",
                         ESKeys.ES_DELIVER_ORDER_DELIVERY_INFO_TYPE, "orderdeliveryinfo.json",
                         ESKeys.ES_DELIVER_ORDER_FINANCES_TYPE, "orderfinances.json",
+                        ESKeys.ES_DELIVER_ORDER_DISCOUNT_TYPE, "orderdiscount.json",
                         ESKeys.ES_DELIVER_ORDER_DETAIL_ITEM_TYPE, "orderdetailitem.json",
                         ESKeys.ES_DELIVER_ORDER_AFTER_SALE_BILL_TYPE, "orderaftersalebill.json",
                         ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE, "orderrideritem.json"))

+ 35 - 1
conf/script/1000/orderApi/BE_Order_CreateOrder_DYLK.groovy

@@ -139,6 +139,27 @@ class BE_Order_CreateOrder_DYLK implements BusinessExecutor<InvokeCallParams, In
 
         businessOrder.setOrderFinances(orderFinances)
 
+        //订单折扣信息,归属于金额信息系列
+        List<OrderDiscount> discountList = new ArrayList<>()
+        long idDiscount = tableIdService.getTableIdMulti("deOrderDiscount.id", (invokeOrder["amount_info"]["discounts"] as ArrayList).size(),
+                dataSourceId, String.valueOf(supplierCode))
+        (invokeOrder["amount_info"]["discounts"] as ArrayList).each { discount ->
+            OrderDiscount orderDiscount = new OrderDiscount()
+            orderDiscount.setId(idDiscount)
+            orderDiscount.setIdOrder(businessOrder.id)
+            orderDiscount.setDiscountName("")
+            orderDiscount.setDiscountType(discount["discount_type"] as int)
+            orderDiscount.setDiscountAmount(discount["discount_amount"] as int)
+            orderDiscount.setMerchantDiscountAmount(discount["merchant_discount_amount"] as int)
+            orderDiscount.setPlatformDiscountAmount(discount["platform_discount_amount"] as int)
+            OrderDiscount.create(orderDiscount, currentUser.id)
+
+            discountList.add(orderDiscount)
+
+            idDiscount++
+        }
+        businessOrder.setOrderDiscountList(discountList)
+
         //订单配送类信息
         OrderDeliveryInfo orderDeliveryInfo = new OrderDeliveryInfo()
         orderDeliveryInfo.setId(tableIdService.getTableIdMulti("deOrderDeliveryInfo.id", 1, dataSourceId, String.valueOf(supplierCode)))
@@ -147,7 +168,7 @@ class BE_Order_CreateOrder_DYLK implements BusinessExecutor<InvokeCallParams, In
         orderDeliveryInfo.setDeliverCity(invokeOrder["receiver_info"]["city"] as String)
         orderDeliveryInfo.setDeliverDistract(invokeOrder["receiver_info"]["district"] as String)
 //        orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_address"] as String)
-        orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_name"] as String + " " + invokeOrder["receiver_info"]["door_plate_num"] as String )
+        orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_name"] as String + " " + invokeOrder["receiver_info"]["door_plate_num"] as String)
         orderDeliveryInfo.setGeoPoiLocation(new GeoPoiLocation(invokeOrder["receiver_info"]["lng"] as double, invokeOrder["receiver_info"]["lat"] as double))
         orderDeliveryInfo.setGeoLocationSerial(jsonConvert.convertTo(orderDeliveryInfo.geoPoiLocation))
         orderDeliveryInfo.setReceiveMan(invokeOrder["receiver_info"]["receiver_name"] as String)
@@ -196,6 +217,18 @@ class BE_Order_CreateOrder_DYLK implements BusinessExecutor<InvokeCallParams, In
                 .setParent(String.valueOf(orderFinances.idOrder))
                 .setSource(jsonConvert.convertTo(orderFinances), XContentType.JSON)
         bulkRequest.add(financesRequest)
+
+        //订单折扣信息
+        discountList.each {
+            IndexRequestBuilder discountRequest = esClient.getClient()
+                    .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
+                            ESKeys.ES_DELIVER_ORDER_DISCOUNT_TYPE)
+                    .setId(String.valueOf(it.id))
+                    .setParent(String.valueOf(it.idOrder))
+                    .setSource(jsonConvert.convertTo(it), XContentType.JSON)
+            bulkRequest.add(discountRequest)
+        }
+
         //订单配送信息
         IndexRequestBuilder deliveryRequest = esClient.getClient()
                 .prepareIndex(supplierInitService.getDateYearESIndex(supplierCode, ESKeys.ES_DELIVER_BUSINESS_ORDER_INDEX, 0),
@@ -233,6 +266,7 @@ class BE_Order_CreateOrder_DYLK implements BusinessExecutor<InvokeCallParams, In
             //写数据库
             orderDao.addBusinessOrder(businessOrder,
                     businessOrder.orderFinances,
+                    businessOrder.orderDiscountList,
                     businessOrder.orderDeliveryInfo,
                     businessOrder.detailItemList,
                     [orderStep],

+ 2 - 1
conf/script/1000/orderApi/BE_Order_DeliveryChange_DYLK.groovy

@@ -168,7 +168,8 @@ class BE_Order_DeliveryChange_DYLK implements BusinessExecutor<InvokeCallParams,
             orderDeliveryInfo.setDeliverProvince(dyOrder["receiver_info"]["province"] as String)
             orderDeliveryInfo.setDeliverCity(dyOrder["receiver_info"]["city"] as String)
             orderDeliveryInfo.setDeliverDistract(dyOrder["receiver_info"]["district"] as String)
-            orderDeliveryInfo.setDeliverAddress(dyOrder["receiver_info"]["location_address"] as String)
+//            orderDeliveryInfo.setDeliverAddress(dyOrder["receiver_info"]["location_address"] as String)
+            orderDeliveryInfo.setDeliverAddress(invokeOrder["receiver_info"]["location_name"] as String + " " + invokeOrder["receiver_info"]["door_plate_num"] as String)
             orderDeliveryInfo.setGeoPoiLocation(new GeoPoiLocation(dyOrder["receiver_info"]["lng"] as double, dyOrder["receiver_info"]["lat"] as double))
             orderDeliveryInfo.setGeoLocationSerial(jsonConvert.convertTo(orderDeliveryInfo.geoPoiLocation))
             orderDeliveryInfo.setReceiveMan(dyOrder["receiver_info"]["receiver_name"] as String)

+ 4 - 0
conf/script/1000/orderSearch/BE_ERP_BusinessOrder_Search.groovy

@@ -144,6 +144,10 @@ class BE_ERP_BusinessOrder_Search implements BusinessExecutor<ProcessSearchOptio
                         orderList.each { o ->
                             o.orderFinances = childInfoList.find { c -> c.idOrder == o.id }
                         }
+                        List<OrderDiscount> childInfoList1 = searchOrderChildInfoList(OrderDiscount.class, ESKeys.ES_DELIVER_ORDER_DISCOUNT_TYPE, idOrders, supplierCode)
+                        orderList.each { o ->
+                            o.orderDiscountList = childInfoList1.findAll { c -> c.idOrder == o.id }
+                        }
                         break
                     case ReadOrderOption.ORDER_RIDER:
                         Map<Long, List<OrderRiderItem>> orderItemMap = searchOrderChildInfoMap(OrderRiderItem.class, ESKeys.ES_DELIVER_ORDER_RIDER_ITEM_TYPE, idOrders, supplierCode, { it.idOrder })

+ 103 - 0
conf/script/1000/platformToken/BE_Invoke_GetInvoker_DYLK.groovy

@@ -0,0 +1,103 @@
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.flycat.PlatformAccessTokenService
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.entity.base.ProcessMapItem
+import com.dderp.common.entity.base.ScriptStringResult
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.http.HttpTools
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.service.RetResult
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+import org.rex.RMap
+
+import javax.annotation.Resource
+import java.nio.charset.StandardCharsets
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+@SuppressWarnings("unused")
+class BE_Invoke_GetInvoker_DYLK implements BusinessExecutor<ProcessMapItem, ScriptStringResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    private Map<String, String> platPropertiesMap = new HashMap<>()
+
+    @Resource(name = "APP_HOME")
+    String homePath
+
+    @Resource
+    JsonConvert jsonConvert
+
+    @Resource
+    PlatformAccessTokenService tokenService
+
+    @Override
+    String scriptName() {
+        return "[抖音来客]通用get请求"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.PLATFORM_TOKEN
+    }
+
+    @Override
+    RetResult<ProcessMapItem> beforeExecute(ProcessMapItem source) {
+        //取到该平台的properties
+        //这地方严格来说是有问题的,supplierCode的区分没有加进去,做得好的话应该是properties文件用supplierCode区分开
+
+        //各平台默认需要以下几个参数
+        //appId
+        //appSecret
+        //reqUrl  接口请求地址
+        //storeBindUrl  生成门店绑定url时候的请求地址
+        final File df = new File(homePath, "conf/" + "platform.properties");
+        if (df.isFile()) {
+            try {
+                Properties ps = new Properties();
+                InputStream ins = new FileInputStream(df);
+                ps.load(new InputStreamReader(ins, StandardCharsets.UTF_8));
+                ins.close();
+                ps.forEach((x, y) ->
+                        platPropertiesMap.putIfAbsent((String) x, (String) y)
+                );
+            } catch (IOException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+        return super.beforeExecute(source)
+    }
+
+    RetResult<ScriptStringResult> execute(ProcessMapItem source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        RMap params = source.itemData
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+
+        Map<String, String> header = new HashMap<>();
+        header.put("access-token", tokenService.getAccessToken("DYLK", dataSourceId, supplierCode as String));
+        header.put("log_id", String.valueOf(new Date().getTime()));
+        header.put("Content-Type", "application/json");
+
+        String resp
+        try {
+            resp = HttpTools.getHttpContentAsync(platPropertiesMap.get("reqUrl") +
+                    params.getString("subUrl"), header, params.getString("body")).get(20, TimeUnit.SECONDS)
+
+            ScriptStringResult stringResult = new ScriptStringResult()
+            stringResult.setResultStr(resp)
+            return RetResult.<ScriptStringResult> successT().result(stringResult)
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error("请求抖音来客接口[" + params.getString("subUrl") + "]失败", e);
+        }
+        return RetResult.errorT();
+
+    }
+}

+ 106 - 0
conf/script/1000/platformToken/BE_Invoke_PostInvoker_DYLK.groovy

@@ -0,0 +1,106 @@
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.flycat.PlatformAccessTokenService
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.entity.base.ProcessMapItem
+import com.dderp.common.entity.base.ProcessStringItem
+import com.dderp.common.entity.base.ScriptMapResult
+import com.dderp.common.entity.base.ScriptStringResult
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.http.HttpTools
+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.rex.RMap
+
+import javax.annotation.Resource
+import java.nio.charset.StandardCharsets
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+@SuppressWarnings("unused")
+class BE_Invoke_PostInvoker_DYLK implements BusinessExecutor<ProcessMapItem, ScriptStringResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    private Map<String, String> platPropertiesMap = new HashMap<>()
+
+    @Resource(name = "APP_HOME")
+    String homePath
+
+    @Resource
+    JsonConvert jsonConvert
+
+    @Resource
+    PlatformAccessTokenService tokenService
+
+    @Override
+    String scriptName() {
+        return "[抖音来客]通用post请求"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.PLATFORM_TOKEN
+    }
+
+    @Override
+    RetResult<ProcessMapItem> beforeExecute(ProcessMapItem source) {
+        //取到该平台的properties
+        //这地方严格来说是有问题的,supplierCode的区分没有加进去,做得好的话应该是properties文件用supplierCode区分开
+
+        //各平台默认需要以下几个参数
+        //appId
+        //appSecret
+        //reqUrl  接口请求地址
+        //storeBindUrl  生成门店绑定url时候的请求地址
+        final File df = new File(homePath, "conf/" + "platform.properties");
+        if (df.isFile()) {
+            try {
+                Properties ps = new Properties();
+                InputStream ins = new FileInputStream(df);
+                ps.load(new InputStreamReader(ins, StandardCharsets.UTF_8));
+                ins.close();
+                ps.forEach((x, y) ->
+                        platPropertiesMap.putIfAbsent((String) x, (String) y)
+                );
+            } catch (IOException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+        return super.beforeExecute(source)
+    }
+
+    RetResult<ScriptStringResult> execute(ProcessMapItem source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        RMap params = source.itemData
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+
+        Map<String, String> header = new HashMap<>();
+        header.put("access-token", tokenService.getAccessToken("DYLK", dataSourceId, supplierCode as String));
+        header.put("log_id", String.valueOf(new Date().getTime()));
+        header.put("Content-Type", "application/json");
+
+        String resp
+        try {
+            resp = HttpTools.postHttpContentAsync(platPropertiesMap.get("reqUrl") +
+                    params.getString("subUrl"), header, params.getString("body")).get(20, TimeUnit.SECONDS)
+
+            ScriptStringResult stringResult = new ScriptStringResult()
+            stringResult.setResultStr(resp)
+            return RetResult.<ScriptStringResult> successT().result(stringResult)
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error("请求抖音来客接口[" + params.getString("subUrl") + "]失败", e);
+        }
+        return RetResult.errorT();
+
+    }
+}

+ 141 - 0
conf/script/1000/platformToken/BE_Token_RefreshAccessToken_DYLK.groovy

@@ -0,0 +1,141 @@
+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.IncomePlatformService
+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.flycat.BusinessOrderStatus
+import com.dderp.common.datas.ERPModule
+import com.dderp.common.datas.ESKeys
+import com.dderp.common.datas.flycat.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.base.ScriptMapResult
+import com.dderp.common.entity.base.ScriptStringResult
+import com.dderp.common.entity.order.*
+import com.dderp.common.entity.site.ERPTokenUser
+import com.dderp.common.entity.store.StorePlatform
+import com.dderp.common.http.HttpTools
+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.nio.charset.StandardCharsets
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder
+
+@SuppressWarnings("unused")
+class BE_Token_RefreshAccessToken_DYLK implements BusinessExecutor<ProcessStringItem, ScriptMapResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    private Map<String, String> platPropertiesMap = new HashMap<>()
+
+    @Resource(name = "APP_HOME")
+    String homePath;
+
+    @Resource
+    JsonConvert jsonConvert
+
+    @Override
+    String scriptName() {
+        return "[抖音来客]刷新Access-Token"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.PLATFORM_TOKEN
+    }
+
+    @Override
+    RetResult<ProcessStringItem> beforeExecute(ProcessStringItem source) {
+        //取到该平台的properties
+        //这地方严格来说是有问题的,supplierCode的区分没有加进去,做得好的话应该是properties文件用supplierCode区分开
+
+        //各平台默认需要以下几个参数
+        //appId
+        //appSecret
+        //reqUrl  接口请求地址
+        //storeBindUrl  生成门店绑定url时候的请求地址
+        final File df = new File(homePath, "conf/" + "platform.properties");
+        if (df.isFile()) {
+            try {
+                Properties ps = new Properties();
+                InputStream ins = new FileInputStream(df);
+                ps.load(new InputStreamReader(ins, StandardCharsets.UTF_8));
+                ins.close();
+                ps.forEach((x, y) ->
+                        platPropertiesMap.putIfAbsent((String) x, (String) y)
+                );
+            } catch (IOException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+        return super.beforeExecute(source)
+    }
+
+    RetResult<ScriptMapResult> execute(ProcessStringItem source) {
+        //秒级时间戳,groovy里面不让用system
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+        String dataSourceId = source.dataSourceId
+        long supplierCode = source.supplierCode
+        ERPTokenUser currentUser = source.currentUser
+
+        def tokenRequest = [
+                client_key   : platPropertiesMap.get("appId"),
+                client_secret: platPropertiesMap.get("appSecret"),
+                grant_type   : "client_credential"
+        ]
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Content-Type", "application/json");
+
+        try {
+            String responseStr = HttpTools.postHttpContentAsync(platPropertiesMap.get("reqUrl") + "/oauth/client_token/", header,
+                    jsonConvert.convertTo(tokenRequest)).get(5, TimeUnit.SECONDS);
+
+            def jsonSlurper = new JsonSlurper()
+            def invokeResp = jsonSlurper.parseText(responseStr)
+
+            if (invokeResp["data"]["error_code"] as int == 0) {
+                String accessToken = invokeResp["data"]["access_token"] as String
+
+                RMap<String, String> resultMap = new RMap<>()
+                resultMap.set("accessToken", accessToken)
+                resultMap.set("appId", platPropertiesMap.get("appId"))
+                resultMap.set("appSecret", platPropertiesMap.get("appSecret"))
+
+                ScriptMapResult mapResult = new ScriptMapResult()
+                mapResult.setResultMap(resultMap)
+
+                return RetResult.<ScriptMapResult> successT().result(mapResult)
+            }
+
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error(e.getMessage(), e);
+        }
+        return RetResult.errorT();
+
+    }
+}

+ 3 - 3
conf/script/1000/storeApi/BE_Store_GenerateStoreAuthUrl_DYLK.groovy

@@ -19,13 +19,13 @@ class BE_Store_GenerateStoreAuthUrl_DYLK implements BusinessExecutor<ProcessIdIt
 
     private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
 
-    @Resource(name = "property.douyin.appId")
+    @Resource(name = "property.DYLK.appId")
     String dyAppId
 
-    @Resource(name = "property.douyin.appSecret")
+    @Resource(name = "property.DYLK.appSecret")
     String dyAppSecret
 
-    @Resource(name = "property.douyin.storeBindUrl")
+    @Resource(name = "property.DYLK.storeBindUrl")
     String dyStoreBindUrl
 
     @Resource

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

@@ -140,6 +140,15 @@ storeRealCollection = #{storerealcollection},omeServiceFee = #{omeservicefee},up
  deliverTimeliness = #{delivertimeliness},bookingDeliverTime = #{bookingdelivertime},bookingDeliverTimeLong = #{bookingdelivertimelong},customerInvoiceInfo = #{customerinvoiceinfo},
  updateBy = #{updateby},updateTime = #{updatetime},updateTimeLong = #{updatetimelong} where id = #{id};
 
+ -- [addOrderDiscount]
+ insert into $table$ (id, idOrder, discountName, discountType,
+ discountAmount, merchantDiscountAmount, platformDiscountAmount,
+ createBy, createTime, createTimeLong,
+ updateBy, updateTime, updateTimeLong ) values ( #{id}, #{idorder}, #{discountname}, #{discounttype},
+ #{discountamount}, #{merchantdiscountamount}, #{platformdiscountamount},
+ #{createby}, #{createtime}, #{createtimelong},
+ #{updateby}, #{updatetime}, #{updatetimelong} );
+
 
   -- [expressCreateOrder]
   update $table$ set

+ 2 - 2
conf/sqlroot/com/dderp/business/dao/PlatformDao.dql

@@ -26,12 +26,12 @@ order by #{orderBy}
 -- [addPlatformInfo]
 insert into $table$ (
 id, platformCode, platformName, platformType,
-voidFlag, createBy, createTime,
+voidFlag, needAccessToken, refreshTokenSeconds, createBy, createTime,
 createTimeLong, updateBy, updateTime,
 updateTimeLong )
 values (
 #{id}, #{platformcode}, #{platformname}, #{platformtype},
-#{voidflag}, #{createby}, #{createtime},
+#{voidflag},  #{needaccesstoken}, #{refreshtokenseconds}, #{createby}, #{createtime},
 #{createtimelong}, #{updateby}, #{updatetime},
 #{updatetimelong} );
 

+ 31 - 2
conf/初始化业务表.sql

@@ -252,7 +252,7 @@ create table deOrderDeliveryInfo1000_current(
                                                 deliverCity	varchar(50) default '',
                                                 deliverDistract	varchar(100) default '',
                                                 deliverAddress	varchar(500) default '',
-                                                geoLocationSerial	varchar(100) default '',
+                                                geoLocationSerial	varchar(1000) default '',
                                                 receiveMan	varchar(100) default '',
                                                 contractPhone	varchar(100) default '',
                                                 deliverTimeliness	int default 0,
@@ -418,4 +418,33 @@ ALTER TABLE `tbstoreplatform1000`
     ADD COLUMN `platformShopAddress` varchar(300) NULL AFTER `platformShopName`,
     ADD COLUMN `platformShopPhone` varchar(20) NULL AFTER `platformShopAddress`,
     ADD COLUMN `platformShopGeoLat` varchar(50) NULL AFTER `platformShopPhone`,
-    ADD COLUMN `platformShopGeoLng` varchar(50) NULL AFTER `platformShopGeoLat`;
+    ADD COLUMN `platformShopGeoLng` varchar(50) NULL AFTER `platformShopGeoLat`;
+
+
+drop table if exists deOrderDiscount1000_current;
+create table deOrderDiscount1000_current(
+                                            id	bigint  default 0,
+                                            idOrder	bigint  default 0,
+                                            discountName	varchar(50) default '',
+                                            discountType	int default 0,
+                                            discountAmount	int default 0,
+                                            merchantDiscountAmount	int default 0,
+                                            platformDiscountAmount	int default 0,
+                                            createBy	bigint  default 0,
+                                            createTime	datetime default NOW(),
+                                            createTimeLong	bigint  default 0,
+                                            updateBy	bigint  default 0,
+                                            updateTime	datetime default NOW(),
+                                            updateTimeLong	bigint  default 0,
+                                            primary key (id)
+)
+    ENGINE = INNODB
+    AUTO_INCREMENT = 1
+    DEFAULT CHARSET = utf8
+    COMMENT = '';
+
+CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = `dbadmin`@`%` SQL SECURITY DEFINER VIEW `v_deorderdiscount1000` AS  select `deorderdiscount1000_current`.`id` AS `id` from `deorderdiscount1000_current`;
+
+ALTER TABLE `tbplatforminfo1000`
+    ADD COLUMN `needAccessToken` int(11) NULL AFTER `voidFlag`,
+    ADD COLUMN `refreshTokenSeconds` int(11) NULL AFTER `needAccessToken`;

+ 7 - 5
ddBusiness/src/main/java/com/dderp/business/dao/OrderDao.java

@@ -35,13 +35,15 @@ public interface OrderDao extends DaoRepository {
 
     @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = OrderTableShardingStrategy.class)
     @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
-    @SqlId(clazz = OrderDao.class, sql = "addBusinessOrder", table = "deBusinessOrder", tableParam = 7, params = {1}, sort = 1)
-    @SqlId(clazz = OrderDao.class, sql = "addOrderFinances", table = "deOrderFinances", tableParam = 7, params = {2}, sort = 2)
-    @SqlId(clazz = OrderDao.class, sql = "addOrderDeliveryInfo", table = "deOrderDeliveryInfo", tableParam = 7, params = {3}, sort = 3)
-    @SqlId(clazz = OrderDao.class, sql = "addOrderDetailItem", table = "deOrderDetailItem", tableParam = 7, params = {4}, sort = 4)
-    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 7, params = {5}, sort = 5)
+    @SqlId(clazz = OrderDao.class, sql = "addBusinessOrder", table = "deBusinessOrder", tableParam = 8, params = {1}, sort = 1)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderFinances", table = "deOrderFinances", tableParam = 8, params = {2}, sort = 2)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderDiscount", table = "deOrderDiscount", tableParam = 8, params = {3}, sort = 3)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderDeliveryInfo", table = "deOrderDeliveryInfo", tableParam = 8, params = {4}, sort = 4)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderDetailItem", table = "deOrderDetailItem", tableParam = 8, params = {5}, sort = 5)
+    @SqlId(clazz = OrderDao.class, sql = "addOrderStep", table = "deOrderStep", tableParam = 8, params = {6}, sort = 6)
     int addBusinessOrder(BusinessOrder businessOrder,
                          OrderFinances orderFinances,
+                         List<OrderDiscount> discounts,
                          OrderDeliveryInfo orderDeliveryInfo,
                          List<OrderDetailItem> items,
                          List<OrderStep> stepList,

+ 3 - 3
ddBusiness/src/main/java/com/dderp/business/service/flycat/IncomePlatformServiceImpl.java

@@ -37,13 +37,13 @@ public class IncomePlatformServiceImpl extends BaseService implements IncomePlat
     @Resource
     private JsonConvert jsonConvert;
 
-    @Resource(name = "property.douyin.appId")
+    @Resource(name = "property.DYLK.appId")
     private String dyAppId;
 
-    @Resource(name = "property.douyin.appSecret")
+    @Resource(name = "property.DYLK.appSecret")
     private String dyAppSecret;
 
-    @Resource(name = "property.douyin.reqUrl")
+    @Resource(name = "property.DYLK.reqUrl")
     private String dyReqUrl;
 
 

+ 230 - 0
ddBusiness/src/main/java/com/dderp/business/service/flycat/PlatformAccessTokenServiceImpl.java

@@ -0,0 +1,230 @@
+package com.dderp.business.service.flycat;
+
+import com.dderp.common.api.NoSqlKeysService;
+import com.dderp.common.api.PlatformService;
+import com.dderp.common.api.flycat.PlatformAccessTokenService;
+import com.dderp.common.base.BaseService;
+import com.dderp.common.datas.ERPModule;
+import com.dderp.common.datas.RedisKeys;
+import com.dderp.common.datas.flycat.PlatformType;
+import com.dderp.common.entity.base.*;
+import com.dderp.common.entity.platform.PlatformInfo;
+import com.dderp.common.tool.ERPUtils;
+import com.dySweetFishPlugin.redis.RedisService;
+import com.dySweetFishPlugin.tool.lang.ThreadFactoryWithNamePrefix;
+import com.sweetfish.convert.json.JsonConvert;
+import com.sweetfish.service.Local;
+import com.sweetfish.service.RetResult;
+import com.sweetfish.util.AnyValue;
+import com.sweetfish.util.AutoLoad;
+import com.sweetfish.util.ResourceType;
+import org.apache.commons.lang3.StringUtils;
+import org.rex.DB;
+import org.rex.RMap;
+import org.rex.db.exception.DBException;
+
+import javax.annotation.Resource;
+import java.time.Instant;
+import java.util.*;
+import java.util.concurrent.*;
+
+@AutoLoad(false)
+@Local
+@ResourceType(PlatformAccessTokenService.class)
+public class PlatformAccessTokenServiceImpl extends BaseService implements PlatformAccessTokenService {
+
+    @Resource
+    private RedisService redisService;
+
+    @Resource
+    private PlatformService platformService;
+    private final ConcurrentHashMap<String, ThreadPoolExecutor> threadPoolMap = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, String> sysDataBaseItem = new ConcurrentHashMap<>();
+    private String runEnvironment;
+
+    @Resource
+    private JsonConvert jsonConvert;
+
+
+    @Resource
+    private NoSqlKeysService keysService;
+
+//    @Resource(name = "property.DYLK.appId")
+//    private String dyAppId;
+//
+//    @Resource(name = "property.DYLK.appSecret")
+//    private String dyAppSecret;
+//
+//    @Resource(name = "property.DYLK.reqUrl")
+//    private String dyReqUrl;
+
+
+    @Override
+    public void start(AnyValue config) {
+        boolean master = false;
+        AnyValue masterValue = config.getAnyValue("master");
+        if (masterValue != null) {
+            master = masterValue.getBoolValue("value");
+        }
+
+        AnyValue environmentValue = config.getAnyValue("environment");
+        if (environmentValue != null) {
+            runEnvironment = environmentValue.getValue("value");
+        } else {
+            runEnvironment = "dev";
+        }
+
+
+        if (master) {
+            if (StringUtils.equalsIgnoreCase(runEnvironment, "dev")) {
+                //开发环境,什么也不做
+
+            } else {
+                List<DataBaseMultiItemEx> dataList = null;
+                try {
+                    dataList = DB.getList("select * from sys_DataBaseMultiItem where voidFlag = 0 order by id", DataBaseMultiItemEx.class);
+                } catch (DBException e) {
+                    throw new RuntimeException(e);
+                }
+                dataList.forEach((x) -> sysDataBaseItem.put(x.getDataBaseAlias(), x.getShardingKey()));
+
+                sysDataBaseItem.forEach((dataSourceId, supplierCode) -> {
+                    List<PlatformInfo> platformInfoList = platformService.getRedisPlatformList(PlatformType.order.getValue(), Long.parseLong(supplierCode));
+                    platformInfoList.forEach(platformInfo -> {
+                        if (platformInfo.getNeedAccessToken() == 1) {
+                            ScheduledThreadPoolExecutor dyAccessTokenThread = new ScheduledThreadPoolExecutor(1,
+                                    new ThreadFactoryWithNamePrefix("[" + platformInfo.getPlatformName() + "Access_Token线程池]"));
+
+                            long tokenInitialDelay = 30;
+
+                            long tokenRefreshSeconds = platformInfo.getRefreshTokenSeconds();
+                            if (tokenRefreshSeconds <= 0) tokenRefreshSeconds = 5400;
+
+                            //判断上次刷新token的时间,
+                            if (redisService.exists(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_LASTTOKENDATE, Long.parseLong(supplierCode), true) +
+                                    platformInfo.getPlatformCode())) {
+                                long lastTime = Long.parseLong(redisService.get(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_LASTTOKENDATE,
+                                        Long.parseLong(supplierCode), true) + platformInfo.getPlatformCode()));
+                                int diffSeconds = (int) ((System.currentTimeMillis() - lastTime) / 1000);
+
+                                if (diffSeconds <= tokenRefreshSeconds) {
+                                    tokenInitialDelay = tokenRefreshSeconds - diffSeconds;
+                                    if (tokenInitialDelay < 30) {
+                                        tokenInitialDelay = 30;
+                                    }
+                                }
+                            }
+
+                            dyAccessTokenThread.scheduleWithFixedDelay(() -> {
+                                scanRefreshToken(platformInfo.getPlatformCode(), dataSourceId, supplierCode);
+                                //写入当前时间
+                                redisService.set(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_LASTTOKENDATE, Long.parseLong(supplierCode), true) + platformInfo.getPlatformCode(),
+                                        String.valueOf(Date.from(Instant.now()).getTime()));
+                            }, tokenInitialDelay, tokenRefreshSeconds, TimeUnit.SECONDS);
+
+                            threadPoolMap.put(platformInfo.getPlatformCode(), dyAccessTokenThread);
+                        }
+                    });
+                });
+            }
+        }
+    }
+
+    @Override
+    public void destroy(AnyValue config) {
+        threadPoolMap.forEach((platformCode, threadPoolExecutor) -> {
+            if (threadPoolExecutor != null) {
+                threadPoolExecutor.shutdownNow();
+            }
+        });
+    }
+
+    private void scanRefreshToken(String platFormCode, String dataSourceId, String supplierCode) {
+        RMap tokenMap = null;
+        String accessToken = null;
+        //抖音有可能获取不到token,这里循环获取,直到有值?
+        do {
+            tokenMap = this.requestAccessToken(platFormCode, dataSourceId, supplierCode);
+            accessToken = tokenMap.getString("accessToken");
+        } while ((accessToken == null) || (StringUtils.isEmpty(accessToken)));
+
+        redisService.hset(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_ACCESSTOKEN, Long.parseLong(supplierCode)),
+                platFormCode, tokenMap);
+        logger.info("[" + platFormCode + "]服务刷新token:" + accessToken);
+    }
+
+    //map中将会返回 appId/appSecret/accessToken
+    private RMap requestAccessToken(String platFormCode, String dataSourceId, String supplierCode) {
+        RetResult<ScriptMapResult> retResult = this.handleScript("Token_RefreshAccessToken_" + platFormCode, ERPModule.PLATFORM_TOKEN,
+                dataSourceId, Long.parseLong(supplierCode),
+                () -> {
+                    return ProcessStringItem.newBuilder().itemValue(platFormCode)
+                            .currentUser(ERPUtils.getSysTokenUser())
+                            .dataSourceId(dataSourceId)
+                            .supplierCode(Long.parseLong(supplierCode))
+                            .build();
+                });
+
+        if (!retResult.isSuccess()) return null;
+        return retResult.getResult().getResultMap();
+    }
+
+    @Override
+    public String getAccessToken(String platformCode, String dataSourceId, String supplierCode) {
+        PlatformInfo platformInfo = platformService.getPlatformInfoByCode(platformCode, false, Long.parseLong(supplierCode));
+        if (platformInfo == null) return null;
+        if (platformInfo.getNeedAccessToken() != 1) return null;
+
+        String tokenMap = redisService.hget(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_ACCESSTOKEN, Long.parseLong(supplierCode)), platformCode);
+        if (StringUtils.isBlank(tokenMap)) {
+            //token不存在,直接刷新一下
+            this.scanRefreshToken(platformCode, dataSourceId, supplierCode);
+            tokenMap = redisService.hget(keysService.getRedisKey(RedisKeys.KEY_PLATFORM_ACCESSTOKEN, Long.parseLong(supplierCode)), platformCode);
+        }
+
+        RMap map = jsonConvert.convertFrom(RMap.class, tokenMap);
+
+        return map.getString("accessToken");
+    }
+
+
+    @Override
+    public String postInvoker(String platformCode, String subUrl, String body, String dataSourceId, String supplierCode) {
+        RetResult<ScriptStringResult> retResult = this.handleScript("Invoke_PostInvoker_" + platformCode, ERPModule.PLATFORM_TOKEN,
+                dataSourceId, Long.parseLong(supplierCode),
+                () -> {
+                    RMap reqMap = new RMap();
+                    reqMap.set("subUrl", subUrl);
+                    reqMap.set("body", body);
+                    return ProcessMapItem.newBuilder()
+                            .itemData(reqMap)
+                            .currentUser(ERPUtils.getSysTokenUser())
+                            .dataSourceId(dataSourceId)
+                            .supplierCode(Long.parseLong(supplierCode))
+                            .build();
+                });
+
+        if (!retResult.isSuccess()) return null;
+        return retResult.getResult().getResultStr();
+    }
+
+    @Override
+    public String getInvoker(String platformCode, String subUrl, String body, String dataSourceId, String supplierCode) {
+        RetResult<ScriptStringResult> retResult = this.handleScript("Invoke_GetInvoker_" + platformCode, ERPModule.PLATFORM_TOKEN,
+                dataSourceId, Long.parseLong(supplierCode),
+                () -> {
+                    RMap reqMap = new RMap();
+                    reqMap.set("subUrl", subUrl);
+                    reqMap.set("body", body);
+                    return ProcessMapItem.newBuilder()
+                            .itemData(reqMap)
+                            .currentUser(ERPUtils.getSysTokenUser())
+                            .dataSourceId(dataSourceId)
+                            .supplierCode(Long.parseLong(supplierCode))
+                            .build();
+                });
+
+        if (!retResult.isSuccess()) return null;
+        return retResult.getResult().getResultStr();
+    }
+}

+ 13 - 0
ddCommon/src/main/java/com/dderp/common/api/flycat/PlatformAccessTokenService.java

@@ -0,0 +1,13 @@
+package com.dderp.common.api.flycat;
+
+import com.sweetfish.service.Service;
+
+public interface PlatformAccessTokenService extends Service {
+
+     String getAccessToken(String platformCode, String dataSourceId, String supplierCode);
+
+    String postInvoker(String platformCode, String subUrl, String body, String dataSourceId, String supplierCode);
+
+    String getInvoker(String platformCode, String subUrl, String body, String dataSourceId, String supplierCode);
+
+}

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

@@ -39,7 +39,8 @@ public enum ERPModule {
     EXPRESS_API(200, "expressApi", "配送平台接口", "", "expressApi"),
 
     ORDER_API(300, "orderApi", "订单平台接口", "", "orderApi"),
-    STORE_API(400, "storeAPi", "平台门店接口", "", "storeApi");
+    STORE_API(400, "storeAPi", "平台门店接口", "", "storeApi"),
+    PLATFORM_TOKEN(500, "platformToken", "平台access-token管理", "", "platformToken");
 
 
     private int value;

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

@@ -112,6 +112,7 @@ public class ESKeys {
     public static final String ES_DELIVER_ORDER_DELIVERY_INFO_TYPE = "orderdeliveryinfo";
     public static final String ES_DELIVER_ORDER_FINANCES_TYPE = "orderfinances";
     public static final String ES_DELIVER_ORDER_DETAIL_ITEM_TYPE = "orderdetailitem";
+    public static final String ES_DELIVER_ORDER_DISCOUNT_TYPE = "orderdiscount";
 
     public static final String ES_DELIVER_ORDER_RIDER_ITEM_TYPE = "orderrideritem";
     public static final String ES_DELIVER_ORDER_AFTER_SALE_BILL_TYPE = "orderaftersalebill";

+ 13 - 0
ddCommon/src/main/java/com/dderp/common/datas/RedisKeys.java

@@ -312,14 +312,27 @@ public class RedisKeys {
 
     /**
      * 抖音access-token上次刷新的时间
+     * 将废弃
      */
     public static final String KEY_DOUYIN_LASTTOKENDATE = "redis.douyin.lasttokendate";
 
     /**
      * 抖音access-token
+     * 将废弃
      */
     public static final String KEY_DOUYIN_ACCESSTOKEN = "redis.douyin.accesstoken";
 
+
+    /**
+     * 平台access-token上次刷新的时间
+     */
+    public static final String KEY_PLATFORM_LASTTOKENDATE = "redis.platform.lasttokendate";
+
+    /**
+     * 平台access-token
+     */
+    public static final String KEY_PLATFORM_ACCESSTOKEN = "redis.platform.accesstoken";
+
     /**
      * 订单流水号
      */

+ 11 - 0
ddCommon/src/main/java/com/dderp/common/entity/order/BusinessOrder.java

@@ -116,6 +116,9 @@ public class BusinessOrder extends BaseEntity {
     @Comment("订单金额信息")
     private OrderFinances orderFinances;
 
+    @Comment("订单折扣详情")
+    private List<OrderDiscount> orderDiscountList;
+
     @Comment("订单详情")
     private List<OrderDetailItem> detailItemList;
 
@@ -342,4 +345,12 @@ public class BusinessOrder extends BaseEntity {
     public void setOutGoingPlatformBillCode(String outGoingPlatformBillCode) {
         this.outGoingPlatformBillCode = outGoingPlatformBillCode;
     }
+
+    public List<OrderDiscount> getOrderDiscountList() {
+        return orderDiscountList;
+    }
+
+    public void setOrderDiscountList(List<OrderDiscount> orderDiscountList) {
+        this.orderDiscountList = orderDiscountList;
+    }
 }

+ 94 - 0
ddCommon/src/main/java/com/dderp/common/entity/order/OrderDiscount.java

@@ -0,0 +1,94 @@
+package com.dderp.common.entity.order;
+
+import com.dderp.common.entity.base.BaseEntity;
+import com.sweetfish.util.Comment;
+import org.rex.db.RColumn;
+
+public class OrderDiscount extends BaseEntity {
+    @RColumn("id")
+    @Comment("")
+    private long id;
+
+    @RColumn("idorder")
+    @Comment("")
+    private long idOrder;
+
+    @Comment("折扣名称")
+    @RColumn("discountname")
+    private String discountName;
+
+    @RColumn("discounttype")
+    @Comment("折扣类型\n" +
+            "1. 优惠券(例如,满减券等)\n" +
+            "2. 活动(例如,秒杀、商品立减等)\n" +
+            "3. 支付优惠")
+    private int discountType;
+
+    @RColumn("discountamount")
+    @Comment("折扣金额")
+    private int discountAmount;
+
+    @RColumn("merchantdiscountamount")
+    @Comment("商户承担的折扣金额")
+    private int merchantDiscountAmount;
+
+    @RColumn("platformdiscountamount")
+    @Comment("平台承担的折扣金额")
+    private int platformDiscountAmount;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getIdOrder() {
+        return idOrder;
+    }
+
+    public void setIdOrder(long idOrder) {
+        this.idOrder = idOrder;
+    }
+
+    public String getDiscountName() {
+        return discountName;
+    }
+
+    public void setDiscountName(String discountName) {
+        this.discountName = discountName;
+    }
+
+    public int getDiscountType() {
+        return discountType;
+    }
+
+    public void setDiscountType(int discountType) {
+        this.discountType = discountType;
+    }
+
+    public int getDiscountAmount() {
+        return discountAmount;
+    }
+
+    public void setDiscountAmount(int discountAmount) {
+        this.discountAmount = discountAmount;
+    }
+
+    public int getMerchantDiscountAmount() {
+        return merchantDiscountAmount;
+    }
+
+    public void setMerchantDiscountAmount(int merchantDiscountAmount) {
+        this.merchantDiscountAmount = merchantDiscountAmount;
+    }
+
+    public int getPlatformDiscountAmount() {
+        return platformDiscountAmount;
+    }
+
+    public void setPlatformDiscountAmount(int platformDiscountAmount) {
+        this.platformDiscountAmount = platformDiscountAmount;
+    }
+}

+ 24 - 6
ddCommon/src/main/java/com/dderp/common/entity/platform/PlatformInfo.java

@@ -1,10 +1,8 @@
 package com.dderp.common.entity.platform;
 
-import com.alibaba.fastjson.JSON;
 import com.dderp.common.entity.base.BaseEntity;
 import com.dderp.common.tdoc.ApiPlace;
 import com.sweetfish.util.Comment;
-import org.apache.commons.lang3.StringUtils;
 import org.rex.db.RColumn;
 
 import java.util.ArrayList;
@@ -41,11 +39,19 @@ public class PlatformInfo extends BaseEntity {
     @Comment("平台接入需求list的序列化字符")
     private String requireListSerial;
 
-    @Comment("禁用标记")
     @RColumn("voidflag")
+    @Comment("禁用标记")
     @ApiPlace("/platform/voidPlatformInfo")
     private int voidFlag;
 
+    @Comment("对接该平台是否需要accessToken 0不需要1需要")
+    @RColumn("needaccesstoken")
+    private int needAccessToken;
+
+    @Comment("平台accessToken刷新间隔-秒")
+    @RColumn("refreshtokenseconds")
+    private int refreshTokenSeconds;
+
     @Comment("平台接入需求")
     @ApiPlace("/platform/addPlatformInfo")
     @ApiPlace("/platform/updatePlatformInfo")
@@ -105,9 +111,21 @@ public class PlatformInfo extends BaseEntity {
 
     public void setRequireListSerial(String requireListSerial) {
         this.requireListSerial = requireListSerial;
+    }
+
+    public int getNeedAccessToken() {
+        return needAccessToken;
+    }
+
+    public void setNeedAccessToken(int needAccessToken) {
+        this.needAccessToken = needAccessToken;
+    }
+
+    public int getRefreshTokenSeconds() {
+        return refreshTokenSeconds;
+    }
 
-        if (StringUtils.isNotBlank(this.requireListSerial)) {
-            this.requireList = JSON.parseArray(this.requireListSerial, PlatformRequire.class);
-        }
+    public void setRefreshTokenSeconds(int refreshTokenSeconds) {
+        this.refreshTokenSeconds = refreshTokenSeconds;
     }
 }

+ 1 - 0
ddWebCore/src/main/java/com/dderp/webcore/rest/flycat/OrderRest.java

@@ -67,6 +67,7 @@ public class OrderRest extends BaseService {
     }
 
     @RestMapping(name = "callOrder", auth = true, sort = 2, logging = 4, comment = "订单接口", methods = {"POST"})
+    @WebApiFile(fileName = "orderProcess.xml")
     public CompletableFuture<InvokeCallResult> callOrder(
             @RestBody(comment = "提交数据") InvokeCallParams callParams,
             @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,

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

@@ -56,7 +56,7 @@ public class OrderCallServlet extends HttpServlet {
     @Resource
     private OrderService orderService;
 
-    @Resource(name = "property.douyin.appSecret")
+    @Resource(name = "property.DYLK.appSecret")
     private String douyinAppSecret;
 
     private JsonConvert orderWriteConvert;