فهرست منبع

继续顺丰同城的接口

jlutt@163.com 2 سال پیش
والد
کامیت
eb6bc6555d

+ 1 - 0
conf/rediskeys.properties

@@ -115,6 +115,7 @@ redis.deliver.platformrequire = dydeliver:deliver:platformrequire
 #门店品牌
 redis.deliver.storebrand = dydeliver:deliver:storebrand
 
+redis.erp.working.order = dydeliver:erp:working:order
 redis.erp.working.express.sf.order = dydeliver:erp:working:express:sf:order
 redis.erp.working.express.sf.store = dydeliver:erp:working:express:sf:store
 

+ 9 - 2
conf/script/1000/business/BE_PlateForm_CodeList.groovy

@@ -4,7 +4,6 @@ import com.dderp.common.datas.ERPModule
 import com.dderp.common.entity.base.InvokeCallParams
 import com.dderp.common.entity.base.InvokeCallResult
 import com.sweetfish.service.RetResult
-import groovy.json.JsonOutput
 import groovy.json.JsonSlurper
 import org.apache.logging.log4j.LogManager
 import org.apache.logging.log4j.Logger
@@ -45,7 +44,15 @@ class BE_PlateForm_CodeList implements BusinessExecutor<InvokeCallParams, Invoke
 
     @Override
     RetResult<InvokeCallResult> execute(InvokeCallParams source) {
-        String codeJson = JSON.toJSONString(platformCodeArray);// JsonOutput.toJson(platformCodeArray)
+        //JsonOutput不知道怎么改编码。。。中文用unicode编码输出了,虽然也能用,但log不方便。。。
+        //查了一下
+        // https://stackoverflow.com/questions/38569874/how-to-use-groovy-jsonoutput-tojson-with-data-encoded-with-utf-8
+        // https://docs.groovy-lang.org/latest/html/api/groovy/json/JsonGenerator.Options.html
+        // new JsonGenerator.Options()
+        //        .disableUnicodeEscaping()
+        //        .build()
+        //        .toJson(platformCodeArray)
+        String codeJson = JSON.toJSONString(platformCodeArray)// JsonOutput.toJson(platformCodeArray)
         logger.info(codeJson)
 
         return RetResult.<InvokeCallResult> successT().result(

+ 13 - 0
conf/script/1000/commons/GroovyExtensions.groovy

@@ -1,3 +1,5 @@
+import com.dderp.common.entity.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatform
 import org.apache.commons.lang3.StringUtils
 
 class GroovyExtensions {
@@ -16,5 +18,16 @@ class GroovyExtensions {
                 }
             }
         }
+
+        StoreInfo.metaClass {
+            requireItem = { String platformCode, String requireCode ->
+                def storeInfo = delegate as StoreInfo
+                StorePlatform storePlatform = storeInfo.platformList.find { StringUtils.equalsIgnoreCase(it.platformCode, platformCode) }
+                if (storePlatform == null) {
+                    return null
+                }
+                return storePlatform.requireList.find {StringUtils.equalsIgnoreCase(it.platformRequireCode, requireCode)}
+            }
+        }
     }
 }

+ 129 - 0
conf/script/1000/expressApi/BE_Express_CancelOrder_SFTC.groovy

@@ -0,0 +1,129 @@
+import com.alibaba.fastjson2.JSON
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.ERPLockDataService
+import com.dderp.common.datas.ERPModule
+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.base.ProcessStringItem
+import com.dderp.common.entity.express.SFCreateOrderResult
+import com.dderp.common.entity.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatformRequire
+import com.dderp.common.http.HttpTools
+import com.dySweetFishPlugin.sql.dao.OperatorWait
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.commons.lang3.StringUtils
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+
+import javax.annotation.Resource
+import java.nio.charset.StandardCharsets
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+class BE_Express_CancelOrder_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource(name = "property.sftc.appId")
+    long sfAppId
+
+    @Resource(name = "property.sftc.appKey")
+    String sfAppKey
+
+    @Resource(name = "property.sftc.apiUrl")
+    String sfApiUrl
+
+    @Resource
+    ERPLockDataService lockDataService
+
+    @Override
+    String scriptName() {
+        return "顺丰同城取消订单"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.EXPRESS_API
+    }
+
+    @Override
+    OperatorWait getAWait() {
+        return OperatorWait.ASNYC
+    }
+
+    @Override
+    RetResult<InvokeCallParams> beforeExecute(InvokeCallParams source) {
+        //锁定下订单数据
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        String orderId = invokeOrder["orderId"] as String
+
+        //todo 获取订单信息
+        if (lockDataService.hLockAdd(orderId, RedisKeys.KEY_ERP_WORKING_ORDER, source.supplierCode) > 1) {
+            return RetResult.<InvokeCallParams> errorT().retinfo(orderId + "提交工作中,请稍后刷新即可,无需重复操作")
+        }
+        return RetResult.<InvokeCallParams> successT().result(source)
+    }
+
+    @Override
+    RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
+        //检查订单信息
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        String orderId = invokeOrder["orderId"] as String
+        //todo 获取订单信息
+
+        return RetResult.<InvokeCallParams> successT().result(source)
+    }
+
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //todo
+
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        //转成顺丰需要提交的信息
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+
+        def sfOrder = [
+                dev_id: sfAppId,
+                order_id: invokeOrder[""],
+                shop_id: invokeOrder[""],
+                push_time: currentTime
+        ]
+
+        String postData = JSON.toJSONString(sfOrder)
+        logger.info("请求数据: " + postData)
+        String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
+
+        String url = sfApiUrl + "cancelorder?sign=" + sign
+
+        CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
+                5000,
+                StandardCharsets.UTF_8,
+                postData,
+                ["Content-Type": "application/json;charset=utf-8"])
+        try {
+            String orderResult = apiResult.get(6000, TimeUnit.SECONDS)
+
+            def sfOrderJson = jsonSlurper.parseText(orderResult)
+
+            logger.info(sfOrderJson)
+
+            return RetResult.<InvokeCallResult> successT()
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error(e.getMessage(), e)
+
+            return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
+        }
+    }
+}
+

+ 3 - 3
conf/script/1000/expressApi/BE_Express_CreateOrder_SFTC.groovy

@@ -35,8 +35,8 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<ProcessStringItem,
     @Resource(name = "property.sftc.appKey")
     String sfAppKey
 
-    @Resource(name = "property.sftc.createOrderUrl")
-    String sfCreateOrderUrl
+    @Resource(name = "property.sftc.apiUrl")
+    String sfApiUrl
 
     @Resource
     JsonConvert jsonConvert
@@ -102,7 +102,7 @@ class BE_Express_CreateOrder_SFTC implements BusinessExecutor<ProcessStringItem,
         logger.info("请求数据: " + postData)
         String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
 
-        String url = sfCreateOrderUrl + "sign=" + sign
+        String url = sfApiUrl + "createorder?sign=" + sign
 
         CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
                 5000,

+ 117 - 0
conf/script/1000/expressApi/BE_Express_ListOrderFeed_SFTC.groovy

@@ -0,0 +1,117 @@
+import com.alibaba.fastjson2.JSON
+import com.dderp.common.api.BusinessExecutor
+import com.dderp.common.api.ERPLockDataService
+import com.dderp.common.datas.ERPModule
+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.base.ProcessStringItem
+import com.dderp.common.entity.express.SFCreateOrderResult
+import com.dderp.common.entity.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatformRequire
+import com.dderp.common.http.HttpTools
+import com.dySweetFishPlugin.sql.dao.OperatorWait
+import com.sweetfish.service.RetResult
+import groovy.json.JsonSlurper
+import org.apache.commons.lang3.StringUtils
+import org.apache.logging.log4j.LogManager
+import org.apache.logging.log4j.Logger
+
+import javax.annotation.Resource
+import java.nio.charset.StandardCharsets
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+class BE_Express_ListOrderFeed_SFTC implements BusinessExecutor<InvokeCallParams, InvokeCallResult> {
+
+    private final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
+
+    @Resource(name = "property.sftc.appId")
+    long sfAppId
+
+    @Resource(name = "property.sftc.appKey")
+    String sfAppKey
+
+    @Resource(name = "property.sftc.apiUrl")
+    String sfApiUrl
+
+    @Override
+    String scriptName() {
+        return "顺丰同城订单状态流查询"
+    }
+
+    @Override
+    ERPModule module() {
+        return ERPModule.EXPRESS_API
+    }
+
+    @Override
+    OperatorWait getAWait() {
+        return OperatorWait.AWAIT
+    }
+
+
+    @Override
+    RetResult<InvokeCallParams> checkExecute(InvokeCallParams source) {
+        //检查订单信息
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        String orderId = invokeOrder["orderId"] as String
+        //todo 获取订单信息
+
+        return RetResult.<InvokeCallParams> successT().result(source)
+    }
+
+    RetResult<InvokeCallResult> execute(InvokeCallParams source) {
+        //todo
+        def jsonSlurper = new JsonSlurper()
+        def invokeOrder = jsonSlurper.parseText(source.params)
+
+        //转成顺丰需要提交的信息
+        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))
+
+        def sfOrder = [
+                dev_id: sfAppId,
+                order_id: invokeOrder["sfOrderId"],
+                shop_id: invokeOrder[""],
+                push_time: currentTime
+        ]
+
+
+        String postData = JSON.toJSONString(sfOrder)
+
+        logger.info("请求数据: " + postData)
+        String sign = ExpressApiSign.sfGenerateOpenSign(postData, sfAppId, sfAppKey)
+
+        String url = sfApiUrl + "listorderfeed?sign=" + sign
+
+        CompletableFuture<String> apiResult = HttpTools.postHttpContentAsync(url,
+                5000,
+                StandardCharsets.UTF_8,
+                postData,
+                ["Content-Type": "application/json;charset=utf-8"])
+        try {
+            String orderResult = apiResult.get(6000, TimeUnit.SECONDS)
+            //直接输出orderResult一方面unicode编码,一方面有些数据不要,只要结果里面的feed即可这里在转换一下
+
+            def sfOrderJson = jsonSlurper.parseText(orderResult)
+            if (sfOrderJson["error_code"] != 0) {
+                return RetResult.<InvokeCallResult> errorT().retinfo(sfOrderJson["error_msg"] as String)
+            }
+            return RetResult.<InvokeCallResult> successT().result(
+                    InvokeCallResult.success().data(JSON.toJSONString(sfOrderJson["result"]["feed"]))
+            )
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            logger.error(e.getMessage(), e)
+
+            return RetResult.<InvokeCallResult> errorT().retinfo(e.getMessage())
+        }
+    }
+}
+
+

+ 11 - 18
conf/script/1000/expressApi/BE_Express_StoreBind_SFTC.groovy

@@ -1,16 +1,12 @@
 import com.dderp.common.api.BusinessExecutor
-import com.dderp.common.api.ERPLockDataService
-import com.dderp.common.api.NoSqlKeysService
 import com.dderp.common.datas.ERPModule
-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.store.StoreInfo
+import com.dderp.common.entity.store.StorePlatformRequire
 import com.dySweetFishPlugin.sql.dao.OperatorWait
-import com.sweetfish.convert.json.JsonConvert
 import com.sweetfish.service.RetResult
 import groovy.json.JsonSlurper
-import org.apache.commons.lang3.StringUtils
 import org.apache.logging.log4j.LogManager
 import org.apache.logging.log4j.Logger
 
@@ -23,18 +19,12 @@ class BE_Express_StoreBind_SFTC implements BusinessExecutor<InvokeCallParams, In
     @Resource(name = "property.sftc.appId")
     long sfAppId
 
+    @Resource(name = "property.sftc.appKey")
+    String sfAppKey
+
     @Resource(name = "property.sftc.storeBindUrl")
     String sfStoreBindUrl
 
-    @Resource
-    JsonConvert jsonConvert
-
-    @Resource
-    ERPLockDataService lockDataService
-
-    @Resource
-    NoSqlKeysService keysService
-
     @Override
     String scriptName() {
         return "顺丰同城店铺绑定地址"
@@ -59,7 +49,7 @@ class BE_Express_StoreBind_SFTC implements BusinessExecutor<InvokeCallParams, In
         long idStore = invokeData["id"] as long
         //todo 调用store服务获取门店信息,检查
 
-        return RetResult.<InvokeCallParams>successT().result(source)
+        return RetResult.<InvokeCallParams> successT().result(source)
     }
 
     RetResult<InvokeCallResult> execute(InvokeCallParams source) {
@@ -71,11 +61,14 @@ class BE_Express_StoreBind_SFTC implements BusinessExecutor<InvokeCallParams, In
         //todo 调用store服务获取门店信息,检查
         StoreInfo storeInfo = new StoreInfo()
 
-        //查找storeInfo中的顺丰同城店铺id
-
+        //查找顺丰店铺id
+        StorePlatformRequire storePlatformRequire = storeInfo.requireItem("SFTC", "shopId")
+        if (storePlatformRequire == null) {
+            return RetResult.<InvokeCallResult> errorT().retinfo("门店未设置顺丰店铺id")
+        }
 
         return RetResult.<InvokeCallResult> successT().result(
-                InvokeCallResult.success()
+                InvokeCallResult.success().data(sfStoreBindUrl + "?" + "dev_id" + sfAppId + "&out_shop_id=" + storePlatformRequire.itemValue)
         )
     }
 }

+ 1 - 1
conf/sftc.properties

@@ -1,5 +1,5 @@
 sftc.appId = 1688762808
 sftc.appKey = 48bbf2d69b43a38cac9df1a7e753a784
 
-sftc.createOrderUrl = https://openic.sf-express.com/open/api/external/createorder?
+sftc.apiUrl = https://openic.sf-express.com/open/api/external/
 sftc.storeBindUrl = https://openic.sf-express.com/artascope/cx/receipt/getpage/product/artascope/page/storeBinding

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

@@ -305,6 +305,8 @@ public class RedisKeys {
 
     //region 锁定数据
 
+    public static final String KEY_ERP_WORKING_ORDER = "redis.erp.working.order";
+
     //顺丰同城订单
     public static final String KEY_ERP_WORKING_SF_ORDER = "redis.erp.working.express.sf.order";
 

+ 21 - 4
ddWebCore/src/main/java/com/dderp/webcore/rest/flycat/ExpressOutRest.java

@@ -3,13 +3,13 @@ package com.dderp.webcore.rest.flycat;
 import com.dderp.common.api.flycat.ExpressOutService;
 import com.dderp.common.base.BaseService;
 import com.dderp.common.datas.ERPHeader;
+import com.dderp.common.datas.HttpCode;
+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.site.ERPTokenUser;
 import com.dySweetFishPlugin.sql.RMapUtils;
-import com.sweetfish.net.http.RestHeader;
-import com.sweetfish.net.http.RestMapping;
-import com.sweetfish.net.http.RestParam;
-import com.sweetfish.net.http.RestService;
+import com.sweetfish.net.http.*;
 import com.sweetfish.service.Local;
 import com.sweetfish.service.RetResult;
 import com.sweetfish.util.AutoLoad;
@@ -39,4 +39,21 @@ public class ExpressOutRest extends BaseService {
                 }, getExecutor()
         );
     }
+
+    @RestMapping(name = "callExpress", auth = false, sort = 1, logging = 4, comment = "配送快递接口", methods = {"POST"})
+    public CompletableFuture<InvokeCallResult> callExpress(
+            @RestBody(comment = "提交数据") InvokeCallParams callParams,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<InvokeCallResult> infoResult = expressOutService.callExpress(callParams, currentUser, dataSourceId, Long.parseLong(supplierCode));
+                    if (infoResult.isSuccess()) {
+                        return infoResult.getResult();
+                    }
+                    return InvokeCallResult.error(HttpCode.BAD_REQUEST.value(), infoResult.getRetinfo());
+                }, getExecutor()
+        );
+    }
 }